Commit Graph

18368 Commits

Author SHA1 Message Date
Lubomir Rintel
f6e9b1d328 introspection: include short description everywhere 2017-03-17 10:15:11 +01:00
Lubomir Rintel
b0da972f5f doc: sort "connection" settings first in nm-settings manual 2017-03-17 10:15:11 +01:00
Lubomir Rintel
3f6af3360b libnm-core/8021x: add a missing colon in gtk-doc
The universe is now perfect.
2017-03-17 10:15:11 +01:00
Thomas Haller
2d1b85f8d7 core: merge branch 'th/assume-vs-unmanaged-bgo746440'
This branch only does part of what bgo#746440 is about.
But it's a large and necessary step towards the full
solution. It cleanups tracking of whether to assume
a device, treat it as external or fully manage it.

Future work will need to fine tune the behavior.

https://bugzilla.gnome.org/show_bug.cgi?id=746440
https://bugzilla.redhat.com/show_bug.cgi?id=1394579
2017-03-16 18:27:48 +01:00
Thomas Haller
850c977953 device: track system interface state in NMDevice
When deciding whether to touch a device we sometimes look at whether
the active connection is external/assumed. In many cases however,
there is no active connection around (e.g. while moving the device
from state unmanaged to disconnected before assuming).
So in most cases we instead look at the device-state-reason to decide
whether to touch the interface (see nm_device_state_reason_check()).

Often it's desirable to have no state and passing data as function
arguments. However, the state reason has to be passed along several hops
(e.g. a queued state change). Or a change to a master/slave can affect
the slave/master, where we pass on the state reason. Or an intermediate
event might invalidate a previous state reason. Passing the state
whether to touch a device or not as a state-reason is cumbersome
and limited.

Instead, the device should be aware of whats going on. Add a
sys-iface-state with:
  - SYS_IFACE_STATE_EXTERNAL: meaning, NM should not touch it
  - SYS_IFACE_STATE_ASSUME: meaning, NM is gracefully taking over
  - SYS_IFACE_STATE_MANAGED: meaning, the device is managed by NM
  - SYS_IFACE_STATE_REMOVED: the device no longer exists

This replaces most checks of nm_device_state_reason_check() and
nm_active_connection_get_activation_type() by instead looking at
the sys-iface-state of the device.

This patch probably has still issues, but the previous behavior was
not very clear either. We will need to identify those issues in future
tests and tweak the behavior. At least, now there is one flag that
describes how to behave.
2017-03-16 18:27:33 +01:00
Thomas Haller
9395f163f4 manager: always cleanup volatile settings-connection on active-connection removal
This is not only relevant if the active connection is
assumed/external.
2017-03-16 18:27:33 +01:00
Thomas Haller
72de503d39 manager: simplify searching assumed connection
Now we only search for a candiate with matching UUID. No need to
first lookup all activatable connections, just find the candidate
by UUID and see if it is activatable.
2017-03-16 18:27:33 +01:00
Thomas Haller
02f6bfeae2 manager: cleanup find_ac_for_connection() in "nm-manager.c"
- rename find_ac_for_connection() to
  active_connection_find_first_by_connection().
  This function has the unexpected(?) behavior to either
  search by the @connection using pointer identity, or
  by looking up the UUID (depending on whether @connection
  is a NMSettingsConnection).

- Split out a active_connection_find_first() part.
  The name "find-first" makes it clear that we walk the list until
  a matching active-connection is found. That's why I added the
  max_state argument. Otherwise, it would have to be called
  "find-first-non-disconnected".

- drop nm_manager_get_connection_device(). It only had two callers.
  It also used the ambiguity of the @connection argument, but
  only one of the two callers cared about that. Meaning,
  _internal_activate_device() now explicitly does a lookup by
  the NMSettingsConnection.
2017-03-16 18:27:33 +01:00
Thomas Haller
b152c0a19f manager: merge/inline assume_connection() in recheck_assume_connection()
There is only one caller of assume_connection().

The tasks there are not clearly separate and it is clearer just to
have one large recheck_assume_connection() function which proceeds
step by step, instead of breaking it into separate parts and move
them apart in the source code. The latter implies that -- unless
we forward-declare assume_connection() -- the order of definition
with assume_connection,recheck_assume_connection is contrary the
flow of the code.

Having a separate function in this case is not a simplification
so merge it.
2017-03-16 18:27:33 +01:00
Thomas Haller
7a5e0c7fd7 core: once activated an assumed connection make it NM_ACTIVATION_TYPE_MANAGED 2017-03-16 18:27:33 +01:00
Thomas Haller
bde6782591 core: upgrade EXTERNAL activation type when user saves connection
An EXTERNAL activation type comes with a nm-generated, volatile,
in-memory connection. When the user actively modifies that connection, we
shall mark the active connection as fully managed.
2017-03-16 18:27:33 +01:00
Thomas Haller
b32746cec3 core: only assume connections that were managed in a previous run of NetworkManager
Before, we would have the concept of assumed connections, which is used
for (1) externally configured device that NetworkManager should not
touch and (2) connections that NetworkManager should gracefully take
over after a restart (seamlessly, non-destructively).

The behavior was unclear and mixed. It wasn't clear whether the device
is in no-touch mode (1) or gracefully take-over (2).
Previous commits already introduce separate activation types EXTERNAL (1)
and ASSUME (2).

Also, previously, we would for both (1) and (2) try to find a matching
connection and use it. That doesn't make sense for either.

In the external case (1), we should not pretend that an existing connection
is active. Let's always create a new in-memory connection for these
cases. Note that this means, external devices now will always generate
a connection, instead of pretending an existing one is active.

For the assume case (2), we shall not use nm_utils_match_connection() to
guess which connection might be active. It can only the one that was
active on a previous run of NetworkManager. So, use the information from
the state file and try to activate it. If that fails, it is not an
assume activation type. Note, that this means we now most of the time
don't do ASSUME anymore. Most of the time we do EXTERNAL activation
That is because the state information is only available after restart
of NetworkManager.
2017-03-16 18:27:33 +01:00
Thomas Haller
bed2fa1bec core: track external activations types in the active-connection
We need a distinction between external activations and assuming
connections. The former shall have the meaning of devices that are
*not* managed by NetworkManager, the latter are configurations that
are gracefully taken over after restart (but fully managed).

Express that in the activation-type of the active connection.

Also, no longer use the settings NM_SETTINGS_CONNECTION_FLAGS_VOLATILE
flag to determine whether an assumed connection is "external". These
concepts are entirely orthogonal (although in pratice, external
activations are in-memory and flagged as volatile, but the inverse
is not necessarily true).

Also change match_connection_filter() to consider all connections.
Later, we only call nm_utils_match_connection() for the connection
we want to assume -- which will be a regular settings connection,
not a generated one.
2017-03-16 18:27:33 +01:00
Thomas Haller
fa015f2aab core/trivial: rename activation-type related checks for device and active-connection
nm_device_uses_assumed_connection() basically called
nm_active_connection_get_assumed() on the device.

Rename those functions to be closer to the activation-type
flags.

The concepts of "assume", "external", and "assume_or_external"
will make sense with the following commits.
2017-03-16 18:27:33 +01:00
Thomas Haller
3973f8ebcd active-connection: use activation-type for active connection instead of assumed flag 2017-03-16 18:27:33 +01:00
Thomas Haller
8a31e66d2c core: add activation-type property to active-connection
It is still unused, but will be useful to mark a connection
whether it is a full activation or assumed.
2017-03-16 18:27:33 +01:00
Thomas Haller
ae4535ba7b device: set user-explicit unmanaged flag based on loaded device-state
On restart, the device state may be stored in /var/run. Reuse it
to set the managed flag.
2017-03-16 18:27:33 +01:00
Thomas Haller
f84b8f7afc device: pass the user-explict flag to nm_device_realize_start()
No change in behavior yet, because for unrealized devices the
user-explict unmanaged flag is always cleared.

The new option is still unused.
2017-03-16 18:27:33 +01:00
Thomas Haller
90e7c8bf5b core/trivial: rename "nm-generated-assumed" flag to "volatile"
The concept of assumed-connection will change. Currently we mark
connections that are generated and assumed as "nm-generated-assumed".
That has several consequences, one of them being that such a settings
connection gets deleted when the device disconnects.

That is, such a settings connection lingers around as long as it's active,
but once it deactivates it gets automatically deleted. As such, it's
a more volatile concept of an in-memory connection.

The concept of such automatically cleaned up connections is useful beyond
generated-assumed. See the related bug rh#1401515.
2017-03-16 18:27:33 +01:00
Thomas Haller
d43a54c907 device: return nm_device_master_add_slave() whether a slave was added
This is currently not yet used. It will be later.
2017-03-16 18:27:33 +01:00
Thomas Haller
3ce6cbb4a1 core/dispatcher: pass act-request to device dispatcher calls
Currently, we determine NMD_CONNECTION_PROPS_EXTERNAL based
on the settings connection. That is not optimal, because whether
a connection is assumed or externally managed, should be really a
property of the active-connection. So, in the this will change soon
and we would need yet another argument to nm_dispatcher_call().

Instead, drop the settings-connection and applied-connection
arguments and fetch them from the device as needed (but allow
to pass a specific act-request argument to explicitly state
which active connection to use).

Also, rename nm_dispatcher_call() to nm_dispatcher_call_device(),
it this is not a generic dispatcher call, but it is particularly
related to device events. Likewise, rename nm_dispatcher_call_sync()
to nm_dispatcher_call_device_sync().
2017-03-16 18:27:33 +01:00
Thomas Haller
8987de7cc0 core/dispatcher: cleanup nm_dispatcher_call_connectivity()
Remove the redundant action argument. It is clear, that
nm_dispatcher_call_connectivity() is called with action
NM_DISPATCHER_ACTION_CONNECTIVITY_CHANGE.

On the other hand, add the async callbacks. Altough they are
not used at the moment, it seems more correct that an async
API has a callback and a call-id to cancel the invocation.
2017-03-16 18:27:33 +01:00
Thomas Haller
d2064be787 core/dispatcher: add and use nm_dispatcher_call_hostname() 2017-03-16 18:27:33 +01:00
Thomas Haller
2b72cc2693 core/trivial: give names in src/nm-dispatcher.h header an "NM" prefix
Stuff defined in header files should have an NM prefix, although
this is a project-internal header.

Rename.
2017-03-16 18:27:33 +01:00
Thomas Haller
9e60de87f5 core: minor cleanups
Some minor changes that make the code more similar to what will
be done later for the related bug bgo#746440.
2017-03-16 18:27:33 +01:00
Thomas Haller
c59532ee40 shared: trigger -Wenum-conversion warning in NM_IN_SET*() macros
and add NM_IN_SET*_TYPED() macros, which allow to explicitly select
the type of "x".
2017-03-16 18:27:33 +01:00
Thomas Haller
e791a9d242 manager: fix leaking settings connection in active_connection_remove()
We must always unref @connection, not only in case of
nm_settings_has_connection().

Fixes: 74ed416d84
2017-03-16 18:27:33 +01:00
Thomas Haller
5f5743654a core: fix matching routes for assuming connections
If the connection candidate contains a static route
without route-metric, but overrides the default
route-metric, matching would have failed:

  ipv4.route-metric:          200
  ipv4.routes:                { ip = 192.168.5.0/32 }

Then, we must not compare existing routes using the device's
metric, but must use the overwrite from the connection.
2017-03-16 18:27:32 +01:00
Francesco Giudici
b07f6712e9 policy: check for active devices before triggering dns update on hostname change
When hostname changes, resolv.conf should be rewritten to update the
"search" option with the new domain parameters. If no device is
active nor going to activate, skip triggering resolv.conf update.
2017-03-16 18:17:05 +01:00
Lubomir Rintel
81cd300108 cli/general: avoid chopping off the last letter of master device name
...when "nmcli" is called without argument and the master device is the last
entry printed.
2017-03-16 17:11:58 +01:00
Lubomir Rintel
e947739dd6 build: avoid passing enums-to-docbook.pl to itself on its command line 2017-03-16 17:11:29 +01:00
Lubomir Rintel
2198f73b0e build: delete unsuccessfully built artifacts
We use output redirection in numerous places; leaving the half-built
artifacts in place would cause the subsequent builds to succeed when it
should not.
2017-03-16 17:10:51 +01:00
Thomas Haller
6197c27f24 device,default-route-manager: merge branch 'th/default-route-resync' 2017-03-16 15:58:32 +01:00
Thomas Haller
82bfb6c46d default-route-manager: decryptify logging line for default-route-manager
The default route manager logs for each entry relevant information,
in a compact but cryptic way:

  default-route: entry[0/dev:0x5633d5528560:enp0s25:1:+sync]: record:add    0.0.0.0/0 via 192.168.0.1 dev 2 metric 100 mss 0 rt-src user (100)

The flag whether a route is configured or not, was only expressed
via 0|1. Change that to log instead:

  default-route: entry[0/dev:0x5633d5528560:enp0s25:+has:+sync]: record:add    0.0.0.0/0 via 192.168.0.1 dev 2 metric 100 mss 0 rt-src user (100)
2017-03-16 15:58:13 +01:00
Thomas Haller
c3c251ea12 default-route-manager: alyways force a sync of the default route
Whenever we call update for a non-assumed, synced route, we must
force a resync with the platform. Even if according to our internal
book-keeping the route is already configured, the route may have
been removed externally. So we cannot assume that everything is
still up-to-date.

https://bugzilla.redhat.com/show_bug.cgi?id=1431268
2017-03-16 15:56:33 +01:00
Thomas Haller
0057dc332e default-route-manager: use nm_cmp_uint32_p_with_data() instead of reimplementation 2017-03-16 15:35:13 +01:00
Thomas Haller
e181956fdd default-route-manager: add nm_default_route_manager_resync() function 2017-03-16 15:35:13 +01:00
Thomas Haller
70ab174e0e default-route-manager: simplify _platform_changed_cb() handling
There is only one caller of _platform_ipx_route_changed_cb(). Inline it,
it is simpler.
2017-03-16 15:35:13 +01:00
Thomas Haller
0b3ba99409 default-route-manager: simplify determining synced flag in _ipx_update_default_route()
No change in behavior at all. The same logic applies, but this should
be simpler to understand.
2017-03-16 15:35:13 +01:00
Thomas Haller
6466b5da6a device: force restart of IP method during reapply
Scenario:
Have a connection with DHCPv4 and a default-route. When externally
removing the default route (`ip route delete 0.0.0.0/0`) and issuing
`nmcli device reapply $IF`, the default route was not restored.
That was because when externally removing the default route,
we would remove the gateway from priv->con_ip4_config (see
update_ip4_config()). Later, when reapplying the connection,
the IP method doesn't actually change. So we would not restart
DHCP and thus there is no gateway around to add the default route.
The default route would only be restored after receiving a DHCP lease
in the far future.

Fix that, by always restarting the IP method.
2017-03-16 15:35:13 +01:00
Thomas Haller
624347baf7 device: on reapply reset commit_first_time flag
Based on this flag, we decide that:
  - if we are not gonna commit the first time and the
    connection is configured with never-default, we
    would not remove a default route added externally.

During a reapply, we however want to get rid of an externally
configured default route.
2017-03-16 15:35:12 +01:00
Thomas Haller
c2dc1c6fa3 shared/trivial: minor style fixes in "nm-utils/nm-macros-internal.h" 2017-03-16 12:09:22 +01:00
Beniamino Galvani
b278b2cd72 device: ethernet: fix handling of autoconnect retries for non-802.1x
Commit 4a6fd0e83e ("device: honor the connection.autoconnect-retries
for 802.1X") added a reset of the autoconnect retries when the device
changes state, because the retry logic for 802.1x is implemented in
NMDeviceEthernet. For other connections, we should not reset the
retries as NMPolicy handles them.

Fixes: 4a6fd0e83e
2017-03-15 16:45:49 +01:00
Beniamino Galvani
4987ec408a device: fail DHCPv6 if a link-local address is not present
Instead of throwing an assertion, fail DHCPv6 when a IPv6 link-local
address is not configured on the device. There are different reasons
why the assertion may fail: for example the address was removed
externally; or the device is gone (and thus the platform already
received the notification of addresses removal) but the device is still
connecting because its disposal happens in an idle callback.

None of these deserves an assertion, which should only be for
programming errors.

https://bugzilla.redhat.com/show_bug.cgi?id=1432251
2017-03-15 16:33:05 +01:00
Thomas Haller
a1325ebd75 manager: don't schedule devices_inited_cb() a second time
The devices_inited_cb() callback is really supposed to only run
when there is nothing else left in the mainloop to dispatch.

But as we already schedule the idle action with G_PRIORITY_LOW+10
priority, it is very unlikely that there is anything else ready
to run (unless scheduled with an even lower priority, and then it
wouldn't help either because devices_inited_cb() would win again).
2017-03-15 12:16:08 +01:00
Thomas Haller
7cb3928c49 core: merge branch 'th/startup-complete-race-bgo779920'
https://bugzilla.gnome.org/show_bug.cgi?id=779920
2017-03-15 10:40:17 +01:00
Thomas Haller
c8934fbe0d device: remove macro for logging in _set_unmanaged_flags()
The macro is used exactly once. It's simpler to just write the
logging statement down as is.
2017-03-15 10:33:44 +01:00
Thomas Haller
0d1c8bc9eb manager: disconnect NMSetting's startup-complete notification in check_if_startup_complete()
This doesn't really matter, because NMSetting's startup-complete never
switches back to FALSE once reached. Still, cleanup our signal handlers
when no longer needed.

And disconnect the signals before emitting "notify::startup".
2017-03-15 10:33:44 +01:00
Thomas Haller
59dc6298c0 manager: delay startup-complete and devices-inited until idle
As long as there are events in the mainloop that are ready
for dispatch, it's clear that startup-complete is not yet
reached.

https://bugzilla.gnome.org/show_bug.cgi?id=779920
2017-03-15 10:33:44 +01:00
Thomas Haller
4d71327c82 manager: process events of platform cache during nm_manager_start()
Possibly pending messages from the netlink socket were not processed
since the platform instance was created earlier. As nm_manager_start()
may take a long time to run, make sure that there are no pending
messages before querying the devices.
2017-03-15 10:33:44 +01:00