Commit graph

780 commits

Author SHA1 Message Date
Lubomir Rintel
fd06f0498f infiniband: don't crash if the parent interface is not yet there
Just bail politely just like vlans do.

(cherry picked from commit 1a5fec681b)
2015-07-02 23:04:39 +02:00
Lubomir Rintel
a961ffc6a8 devices,platform: fix build with gcc
Warnings about missing initializers.

(cherry picked from commit 295c9818b0)
2015-07-01 16:36:18 +02:00
Thomas Haller
42ac15c86f route-manager: manage IPv4 device-routes with NMRouteManager
When adding an IPv4 address, kernel will also add a device-route.
We don't want that route because it has the wrong metric. Instead,
we add our own route (with a different metric) and remove the
kernel-added one.

This could be avoided if kernel would support an IPv4 address flag
IFA_F_NOPREFIXROUTE like it does for IPv6 (see related bug rh#1221311).

One important thing is, that we want don't want to manage the
device-route on assumed devices. Note that this is correct behavior
if "assumed" means "do-not-touch".
If "assumed" means "seamlessly-takeover", then this is wrong.
Imagine we get a new DHCP address. In this case, we would not manage
the device-route on the assumed device. This cannot be fixed without
splitting unmanaged/assumed with related bug bgo 746440.
This is no regression as we would also not manage device-routes
for assumed devices previously.

We also don't want to remove the device-route if the user added
it externally. Note that here we behave wrongly too, because we
don't record externally added kernel routes in update_ip_config().
This still needs fixing.

Let IPv4 device-routes also be managed by NMRouteManager. NMRouteManager
has a list of all routes and can properly add, remove, and restore
the device route as needed.

One problem is, that the device-route does not get added immediately
with the address. It only appears some time later. This is solved
by NMRouteManager watching platform and if a matchin device-route shows up
within a short time after configuring  addresses, remove it.
If the route appears after the short timeout, assume they were added for
other reasons (e.g. by the user) and don't remove them.

https://bugzilla.gnome.org/show_bug.cgi?id=751264
https://bugzilla.redhat.com/show_bug.cgi?id=1211287
(cherry picked from commit 5f54a323d1)
2015-07-01 16:12:14 +02:00
Thomas Haller
7082f44c2f platform: change NMPlatformGetRouteMode enum to NMPlatformGetRouteFlags flags
By having flags instead of an enum/mode, we can encode more combinations
of filtering the result.

(cherry picked from commit d9dba6b662)
2015-07-01 16:10:50 +02:00
Beniamino Galvani
5fc247347f device: restart ping process when it exits with an error
When ping is launched to check the connectivity to the gateway it may
return earlier than the given timeout in case of error. When this
happens we need to respawn it until the timeout is reached.

While at it, increase maximum timeout value to 600 seconds.

https://bugzilla.redhat.com/show_bug.cgi?id=1128581
(cherry picked from commit e86f8354a7)
2015-07-01 13:51:06 +02:00
Thomas Haller
5e3e45cc82 device: fix cleanup DHCP instance when unmanaging device on removed platform link
When the platform link gets removed outside of NetworkManager, we would
unmanage the device first. By checking the device state reason
NM_DEVICE_STATE_REASON_REMOVED, we would then not deconfigure the
interface, as it is already gone.

This was not correct because we must at least stop the dhcp client.
Otherwise the dhclient process keeps running. That meant, if the device
reappeared later, we would start dhclient again. Then we would find the
PID of the still running instance in the pidfile and kill it only than.

Fix it by replacing the 'deconfigure' boolean by a tri-state
'cleanup_type'.

(cherry picked from commit 3b21738d9c)
2015-07-01 11:41:15 +02:00
Lubomir Rintel
d5677dcd2b device: only reset ipx fields when there L3 configuration is present
Fixes: 79630c11e5
(cherry picked from commit 4843e625a8)
2015-06-28 20:12:20 +02:00
Jiří Klimeš
94931d49a5 device: renew DHCP lease for active "ignore-carrier" devices on carrier-on (bgo #743368)
When carrier appears (e.g. the plug was re-inserted) we re-new addresses,
because the network could change.

https://bugzilla.gnome.org/show_bug.cgi?id=743368
(cherry picked from commit 348452f1e0)
2015-06-26 14:38:08 +02:00
Thomas Haller
35ea2389be team: fix potential crash if team binary doesn't exist
warning: Access to field 'message' results in a dereference of a null pointer (loaded from variable 'error')
   #   552|   			if (!teamd_kill (self, NULL, &error)) {
   #   553|-> 				_LOGW (LOGD_TEAM, "existing teamd config mismatch; failed to kill existing teamd: %s", error->message);
   #   554|   				*reason = NM_DEVICE_STATE_REASON_TEAMD_CONTROL_FAILED;

Fixes: 24a764e831
(cherry picked from commit 4fa01c7dc9)
2015-06-25 20:50:54 +02:00
Beniamino Galvani
2a5eea7e76 device: fix handling of ignore-auto-dns and ignore-auto-routes
Since commit ab6548c621 ("device: better accept external IP
changes"), ipX_config_merge_and_apply() applies the configuration
static settings to an intermediate, initially empty configuration
(priv->con_ipX_config) instead of the composite configuration, and
thus the handling of ignore-auto-routes and ignore-auto-dns options
done in nm_ipX_config_merge_setting() has no effect.

Fix this by clearing the routes and the DNS information when needed
before merging static settings to the composite configuration.

Fixes: ab6548c621
(cherry picked from commit 79630c11e5)
2015-06-25 16:56:01 +02:00
Thomas Haller
fc92787573 device: merge device_ipx_changed() signal handler
(cherry picked from commit 7f8f0d04b0)
2015-06-24 16:40:11 +02:00
Thomas Haller
747af368da platform: pass object type with platform changed signal
(cherry picked from commit b88c309167)
2015-06-24 16:40:11 +02:00
Jiří Klimeš
bbc44c9d4d device: split IP config changes signal handling to IPv4 and IPv6
So that we don't process IPv4 changes for IPv6 and vice versa.

(cherry picked from commit 84b5fa21ed)
2015-06-24 15:30:19 +02:00
Jiří Klimeš
ee022bb688 device: split ensure_ipx_config() into IPv4 and IPv6 (bgo #751430)
Without that we can remove addresses from con-ip6-config due to external
changes *before* it is applied and thus manual IPv6 addresses are not applied
together with ipv6.method=auto.

Testcase:
$ nmcli con add type ether con-name AAA ifname eth0 autoconnect no
$ nmcli con mod AAA ipv4.addresses 1.1.1.1/24 ipv6.addresses 99::99/64
$ nmcli con up AAA

Fixes:Beaker:NetworkManager_Test37_run_once_new_connection
Fixes:Beaker:NetworkManager_Test84_ipv6_addresses_no_when_static_switch_asked

https://bugzilla.gnome.org/show_bug.cgi?id=751430

(cherry picked from commit 0a00eb67dd)
2015-06-24 15:30:12 +02:00
Dan Williams
cf6cd7f28e bridge/bond/team: device availability shouldn't depend on IFF_UP (bgo #746918)
The merge of lr/udev-unmanaged-fd731014 made all devices wait until
udev found them, but that makes these three device types fail activate
when created by NM itself.

Since their availability depended on IFF_UP, they could not be
activated (eg, 'nmcli con up team0') until they were IFF_UP.  But
when they are created by NM, although NM knows the ifindex the
platform ignores the interface until udev finds it.  Thus immediately
after creating the interface in _internal_activate_device() it
won't be known to the platform, so the nm_device_is_available()
check that controls whether the device moves to DISCONNECTED
will fail.  This prevents any activation and emits the message:

"Connection 'foo' is not available on the device %s at this time."

because the device is still in the UNAVAILABLE state.

danw asked why we care about IFF_UP for these devices, and I can't
remember why, and I don't think it makes sense to require now.

https://bugzilla.gnome.org/show_bug.cgi?id=746918
(cherry picked from commit 568a8d1da9)
2015-06-22 17:33:16 +02:00
Lubomir Rintel
af36a41440 core: split route management code out from platform
Create a NMRouteManager singleton.

Refactor, no functional changes apart from change of log domain from
LOGD_PLATFORM to LOGD_CORE.

Subsequent commit will keep track of the conflicting routes, avoid overwriting
older ones with newer ones and apply the new ones when the old ones go away.

(cherry picked from commit 874e4a7595)
2015-06-22 13:15:05 +02:00
Thomas Haller
c38ff0b083 default-route: also configure default-routes for assumed connections
Previously for assumed connections we would never configure a default route.
That has serious problems for example in the following two scenarios:

  - the default-route might have a limited lifetime from a previous
    SLAAC/accept_ra setting. In this case, once we assume the connection
    we must also ensure that we extend the lifetime of the default
    route.
  - the gateway could be received via DHCP/RA and it might change.
    If we ignore default-routes for assumed connection we miss that
    change.

The problem is that the notion of "assumed connection" wrongly combines
two conflicting goals (related bug bgo#746440):
  a) have an external device that is entirely unmanged by NM.
  b) do a seamless takeover of a previously managed connection at start,
     but still fully manage.

This patch changes the handling of default-routes towards meaning b).

https://bugzilla.redhat.com/show_bug.cgi?id=1224291
(cherry picked from commit d51975ed92)
2015-06-22 10:30:30 +02:00
Thomas Haller
d9dac7ab4c default-route: for devices with 'never-default' enforce the default-route only once
Since da708059da, we would pickup the
default-route as configured externally, except at those moments when
NM re-applys the IP configuration of the interface, such as during a
DHCP lease.

That allows the user to add/remove the default-route externally (iproute).
But still, at random times (DHCP lease), we will revert those external
changes.

Extend this, that if the connection is explicitly configured as
'never-default=yes', that it tells NM not to interfere with externally
added default-routes on this device. That means, NM will only remove
any preexisting default-routes when configuring the device a first
time.
On any later attempts, NM will assume whatever is configured there.
That makes sense because the user indicated not wanting NM to
manage a default-route on that device, so if something externally
added a default-route, assume that is what the user wants.

This only affects non-assumed connections, with 'never-default=yes'.

https://bugzilla.redhat.com/show_bug.cgi?id=1205405
(cherry picked from commit 98e50e358b)
2015-06-22 10:30:11 +02:00
Thomas Haller
29f13ecf66 device: fix configuring static ip addresses
When a connection had static IP addresses, an early event
from plaform would clear them from priv->con_ip4_config.

Fix that, by don't initializing priv->con_ip4_config
before we commit the first time.

https://bugzilla.gnome.org/show_bug.cgi?id=749052

Fixes: 557667df12
(cherry picked from commit 843205521f)
2015-06-22 10:23:14 +02:00
Lubomir Rintel
acc230e3c8 device: unschedule ip update if we just scheduled ip configuration
It would subtract the configuration from device confguration that's not yet
applied. This a the race where the loose the address while activating a
connection that has both IPv6 and IPv4 configuration.

Fixes: 557667df12

https://bugzilla.gnome.org/show_bug.cgi?id=746066
(cherry picked from commit 2e99ddb7a7)
2015-06-22 10:23:14 +02:00
Thomas Haller
43b77d7c32 device: always pickup externally configured default routes for a device
Even more eagerly pickup external default routes from the device.
For assumed devices we already picked up the default route.

(a) For assumed devices we already did not enforce the default route at all.
Instead it was always picked up by from the actualy system
configuration. Note that this is the case for assumed-generated
connections and for assuming existing connections.
That means that when NM assumes a connection at startup, it will never
actively manage the default route on that interface. It will only react
on what is present.

(b) For managed devices that have by configuration no default route, still pick up
the default route. That means, that even a device that is managed and
never-default=yes, can have the default route -- if configured externally.

(c) Only during a commit phase (i.e. when we have new configuraiton to be
applied), we enforce the default route or its absence.

(d) During any IP change event from platform, we again pickup whatever
is present. That means if you remove the default route from a managed
interface, NM will not re-add it until anything triggers (c).

This also means, that during the commit phase, we add default routes as
'synced' to the default-route-manager, but the following event from platform,
will change the route entry immediately to 'non-synced'. That is
expected and correct.

(cherry picked from commit da708059da)
2015-06-22 10:23:14 +02:00
Thomas Haller
ab6548c621 device: better accept external IP changes
When receiving IP changes via platform event, remove all missing
addresses and routes from our internal configurations (such as
wwan, vpn, dhcp).

The effect is that on the next commit, those addresses and routes will
not be re-added as they were explicitly removed by the user.

However on a new DHCP lease or similar events, the addresses will
be added anew.

Another important improvement is that the NMIPxConfig of the active
device reflects when addresses or routes get removed externally. Before
we would continue to expose those entires although they were not
actually configured on the device.

https://bugzilla.gnome.org/show_bug.cgi?id=740443
(cherry picked from commit 557667df12)
2015-06-22 10:23:14 +02:00
Thomas Haller
f6da80f153 device: require a direct route for IPv6 gateway
In the IPv4 case, we check whether we have a direct route to the gateway
also by looking at the configured addresses/subnets. That is correct,
because every IPv4 address also implies a subnet route.

For IPv6, we explicitly add all subnet routes manually (noprefixroute),
hence, we have a direct route exactly if we have it in our list.
Regardless of the configured IPv6 prefixes.

(cherry picked from commit 2c06449085)
2015-06-22 10:23:14 +02:00
Thomas Haller
8f01cad71c device: refactor ipx_config_merge_and_apply()
No functional change, but restructure code to make it clearer(?).

(cherry picked from commit 4a83afd530)
2015-06-22 10:23:13 +02:00
Lubomir Rintel
bdf4ea8aa5 trivial: move nm_device_queued_ip_config_change_clear()
Just move it upwards, we'll need it in
nm_device_activate_schedule_ip4_config_result().

(cherry picked from commit a772fde00d)
2015-06-22 10:23:13 +02:00
Thomas Haller
1fb84b1688 platform: refactor virtual methods for link objects in NMPlatform
Change nm_platform_link_get() to return the cached NMPlatformLink
instance. Now what all our implementations (fake and linux) have such a
cache internal object, let's just expose it directly.
Note that the lifetime of the exposed link object is possibly quite
short. A caller must copy the returned value if he intends to preserve
it for later.
Also add nm_platform_link_get_by_ifname() and modify nm_platform_link_get_by_address()
to return the instance.

Certain functions, such as nm_platform_link_get_name(),
nm_platform_link_get_ifindex(), etc. are solely implemented based
on looking at the returned NMPlatformLink object. No longer implement
them as virtual functions but instead implement them in the base class
(nm-platform.c).
This removes code and eliminates the redundancy of the exposed
NMPlatformLink instance and the nm_platform_link_get_*() accessors.
Thereby also fix a bug in NMFakePlatform that tracked the link address
in a separate "address" field, instead of using "link.addr". That was
a case where the redundancy actually led to a bug in fake platform.

Also remove some stub implementations in NMFakePlatform that just
bail out. Instead allow for a missing virtual functions and perform
the "default" action in the accessor.
An example for that is nm_platform_link_get_permanent_address().

(cherry picked from commit e8e455817b)
2015-06-22 09:56:06 +02:00
Dan Williams
5ddfc86eb8 trivial: move some code around in nm-device.c
(cherry picked from commit 86abc34e26)
2015-06-22 09:56:05 +02:00
Thomas Haller
6c68d90d81 device: delay handling of link-changed platform event
When inside a state-change, we set for example the device up.
This triggers a link-changed event, which then causes further
state-changes of the devices.
A state-change in process of a device is not reentrant, so we must
delay the handling of the link-changed event.

(cherry picked from commit 04caae735f)
2015-06-22 09:56:05 +02:00
Thomas Haller
26b39df884 device: drop logging platform error on failure to set permanent MAC address
The platform error is in many cases not meaningful anyway.

(cherry picked from commit baec894139)
2015-06-22 09:54:52 +02:00
Thomas Haller
6a9cd7c113 platform: signal missing firmware in nm_platform_set_up()
Don't use nm_platform_get_error() anymore.

(cherry picked from commit c1a945b95d)
2015-06-22 09:54:52 +02:00
Thomas Haller
6d454c8bdf device: don't check for NM_PLATFORM_ERROR_NOT_FOUND in set_nm_ipv6ll()
Unconditionally log a warning if the function fails.
We are about to drop nm_platform_get_error(), it's anyway unclear
why we don't want to log a warning about non-existing interface.

(cherry picked from commit 8334171a4e)
2015-06-22 09:54:52 +02:00
Thomas Haller
87c1b92cc5 platform: return NMPlatformError from link-add functions
Later remove nm_platform_get_error() and signal errors via return
error codes.

Also, fix nm_platform_infiniband_partition_add() and
nm_platform_vlan_add() to check the type of the existing link
and fail with WRONG_TYPE otherwise.

(cherry picked from commit d7fe907c32)
2015-06-22 09:54:52 +02:00
Thomas Haller
0def11cf47 platform: expose GUdevDevice instance for platform links
(cherry picked from commit b74e620f2d)
2015-06-22 09:54:52 +02:00
Thomas Haller
42a93b79ed platform: no longer expose udi field in NMPlatformLink
The @udi field is not a static string, so any user of a NMPlatformLink
instance must make sure not to use the field beyond the lifetime of the
NMPlatformLink instance.
As we pass on the platform link instance during platform changed events,
this is hard to ensure for the subscriber of the signal -- because a
call back into platform could invalidate/modify the object.

Just not expose this field as part of the link instance. The few callers
who actually needed it should instead call nm_platform_get_uid(). With
that, the lifetime of the returned 'const char *' pointer is clearly
defined.

(cherry picked from commit 1b2b988ea9)
2015-06-21 15:32:13 +02:00
Thomas Haller
d24732b874 platform: remove redundant NMPlatformLink fields "arp" and "up"
(cherry picked from commit 076fe578e3)
2015-06-21 15:30:49 +02:00
Jiří Klimeš
0380c53c39 core/cli: add missing device state-reason to string conversions
for NM_DEVICE_STATE_REASON_PARENT_CHANGED
and NM_DEVICE_STATE_REASON_PARENT_MANAGED_CHANGED

Fixes: cd3df12c8f
(cherry picked from commit bfd502a9b1)
2015-06-20 11:38:35 +02:00
Thomas Haller
8366b9f60d device: fix wrong assert in NMDeviceFactory
nm_device_factory_manager_find_factory_for_link_type()
easily can see a link-type NM_LINK_TYPE_UNKNOWN because
there are many link types that NetworkManager cannot detect.

Just return NULL early.

Fixes: 71bde20c30
(cherry picked from commit eb2efaa228)
2015-06-20 11:38:17 +02:00
Beniamino Galvani
435dec420f wifi: fix memleak in nm_ap_update_from_properties()
Fixes: 59c8192b22
(cherry picked from commit 3e8d828008)
2015-06-20 11:36:55 +02:00
Dan Williams
5fa0b8a222 wifi: fix recognition of AP RSN capabilities
Stupid C&P error made everything look like WPA1.

Fixes: 59c8192b22
(cherry picked from commit fce2fa57a5)
2015-06-20 11:30:17 +02:00
Dan Winship
8656c18690 core: add nm_utils_setpgid(), and use it
Add nm_utils_setpgid() as a g_spawn*() child setup function for
calling setpgid(), and use it where appropriate rather than
reimplementing it every time.

(cherry picked from commit fb792af7cb)
2015-06-20 11:01:27 +02:00
Dan Winship
4213815d6b core: use GUnixSignalWatchSource to simplify signal handling
Replace the pthread_sigwait()-based signal handling with
g_unix_signal_add()-based handling, and get rid of all the
now-unnecessary calls to nm_unblock_posix_signals() when spawning
subprocesses.

As a bonus, this also fixes the "^C in gdb kills NM too" bug.

(cherry picked from commit c5b3e93792)
2015-06-20 10:48:21 +02:00
Thomas Haller
76e5d55a98 default-route: add @out_is_never_default argument to has_default_route()
Also accept a NULL connection in
nm_default_route_manager_ip4_connection_has_default_route() and
nm_default_route_manager_ip6_connection_has_default_route().

(cherry picked from commit 49227a07f3)
2015-06-19 13:42:21 +02:00
Thomas Haller
adcd51065b platform: move ethtool_get_link_speed() to nm-platform-utils
(cherry picked from commit 95333d84bc)
2015-06-19 12:26:03 +02:00
Thomas Haller
acb39d4b31 platform: merge setup_devices() function into constructed()
We already populate the netlink cache in constructed(). No need
to wait with udev devices until nm_platform_query_devices(). Just
do it right away.

Add a hack to keep 'lo' default-unmanaged. Now that we load
udev devices earlier, we end up clearing the default-unmanged
flag on 'lo', which has bad consequences.

(cherry picked from commit d6ce01f115)
2015-06-19 12:26:02 +02:00
Thomas Haller
90eb13a111 core: add option to suppress error logging if nm_utils_modprobe() fails
We don't want error logging for nm_platform_link_add() which
tries to load the bonding module. Later we will run tests as non-root,
where modprobe will fail. Logging an error would break the tests.

(cherry picked from commit 39f2b51abb)
2015-06-19 12:26:02 +02:00
Thomas Haller
1d3c143948 build: rename file "include/nm-utils-internal.h" to "nm-macros-internal.h"
We already have "nm-utils*.h" and "NetworkManagerUtils.h" headers. Rename
"include/nm-utils-internal.h" to "nm-macros-internal.h". I think that
name is better, because this file is header-only, internal, and
repository-wide.

Also, it will never contain non-header-only declarations because
there is no backing object file under "include/".
It will only contain macros and inline functions.

(cherry picked from commit b8b1a01d96)
2015-06-19 12:21:58 +02:00
Thomas Haller
1468f4edd2 device: remove reading ipv6 privacy setting from sysctl
Since introduction for support of ip6-privacy (use_tempaddr,
RFC4941) with commit d376270bfe,
the sysctl value from /etc was always read first.

This is problematic, because an explicit setting in the
connection should not be ignored over a global configuration.

Drop that old behavior. It was also problematic, because we did
not read any files under /etc/sysctl.d (except for sysctl.conf).
Also, we did not honor per-interface configurations.

Now we also use as last fallback the value from
/proc/sys/net/ipv6/conf/default/use_tempaddr
That has the advantage of falling back to the system default value
so that NM doesn't need to have it's own default policy
(Related: https://bugzilla.redhat.com/show_bug.cgi?id=1187525).

This is a change in behavior.

(cherry picked from commit f3c61f8141)
2015-06-19 12:10:52 +02:00
Thomas Haller
a6630e4fad device: add global configuration default for ip6-privacy (use_tempaddr, RFC4941)
Support default value for setting 'ipv6.ip6-privacy' in
NetworkManager.conf.

If the global value is unset, preserve old behavior of looking into
/etc/sycctl.conf first. That behavior was introduced with commit
d376270bfe, since we support ip6-privacy
setting.

If the global value is set to "unknown", add a new fallback
that instead reads the runtime value from
  "/proc/sys/net/ipv6/conf/default/use_tempaddr"
This seems more sensible behavior because we fallback to sysctl,
but instead of looking at static files in /etc, read /proc.
But to preserve the old behavior, we only do that when a global
value is configured at all.

https://bugzilla.gnome.org/show_bug.cgi?id=721200
(cherry picked from commit e729dd70ae)
2015-06-19 12:10:52 +02:00
Thomas Haller
923aa9d727 device: make route-metric configurable per-device
The route-metric can be configured per connection via the
ipv4.route-metric and ipv6.route-metric fields. When the
value is left at -1 (the default), we would determine the
route-metric based on the device type (nm_device_get_priority()).

Extend that scheme by making the default value overwritable in
NetworkManager.conf.

(cherry picked from commit 59a991725a)
2015-06-19 12:10:52 +02:00
Thomas Haller
1429ef7249 device: add device-spec "type:"
Support a device-spec to match by device-type.
This matches on the value as shown by

  nmcli -f GENERAL.TYPE device show

(cherry picked from commit 3fb60edf9f)
2015-06-19 12:10:51 +02:00