Commit graph

1506 commits

Author SHA1 Message Date
Beniamino Galvani
8f92ead6e2 device: fix crash reapplying connection to slave devices
Slave devices don't have IPv4 and IPv6 configuration and so special
care must be taken when comparing their methods.

https://bugzilla.redhat.com/show_bug.cgi?id=1376446
2016-09-16 14:20:38 +02:00
Thomas Haller
e7a1008b4b device: cleanup _hw_addr_set()
No change in behavior, just reorganize.

Fixes: 32f7c1d4b9
2016-09-13 11:16:31 +02:00
Thomas Haller
32f7c1d4b9 device: wait for MAC address change to complete before setting interface up
Some drivers (brcmfmac) don't change the MAC address right away.
NetworkManager works around that by waiting synchronously until
the address changes (commit 1a85103765).

wpa_supplicant on the other hand, only re-reads the MAC address
when changing state from DISABLED to ENABLED, which happens when
the interface comes up.

That is a bug in wpa_supplicant and the driver, but we can work-around by
waiting until the MAC address actually changed before setting the interface
IFF_UP. Also note, that there is still a race in wpa_supplicant which might
miss a change to DISABLED state altogether.

https://bugzilla.gnome.org/show_bug.cgi?id=770504
https://bugzilla.redhat.com/show_bug.cgi?id=1374023
2016-09-13 10:33:58 +02:00
Thomas Haller
d461eb6894 device: drop virtual methods for bring_up(), take_down() and is_up()
They have no more implementations in derived classes.
2016-09-12 18:09:17 +02:00
Thomas Haller
14ae46021b device: drop NMDeviceMacvlan:bring_up() implementation
This was added by commit 4de8851eca, probably
by copying from NMDeviceVlan. It's not clear why a netlink request to
set the device IFF_UP would fail, or why that warrants a retry.
2016-09-12 18:08:16 +02:00
Thomas Haller
2c8cb145c2 device: drop NMDeviceVlan:bring_up() implementation
This retry loop was added by commit dc6341acec.
But I suspect, that the main-point there was not to retry the netlink
request to set the interface up. Why would that fail, and why would
a failure to set the interface up require a retry?

I think it was added to wait for carrier. But waiting for carrier was
later dropped with commit 5074898591
and it is not clear why we would wait for carrier at all -- we don't
do that for other device types either.
2016-09-12 18:08:16 +02:00
Thomas Haller
9deb6ede73 device: drop NMDeviceWifi:bring_up() implementation
Instead of letting the sub-class check the "enabled" state, let
it be handled by nm_device_bring_up().

Note that nm_device_get_enabled() only has two implementations:
NMDeviceModem:bring_up() and NMDeviceWifi:bring_up().
2016-09-12 18:03:47 +02:00
Thomas Haller
b122337353 device: implement get_enabled() for NMDeviceWifi
The virtual function NMDevice:set_enabled() has two implementations:
NMDeviceModem and NMDeviceWifi. Likewise, the get_enabled() function
should also be implemented by those types.

The only caller of nm_device_get_enabled() is NMPolicy:schedule_activate_check().
It is correct to skip Wi-Fi devices based on their enabled state.
2016-09-12 18:03:47 +02:00
Thomas Haller
042f2b2e7e core: use defines for signal names 2016-09-12 18:03:47 +02:00
Thomas Haller
fae5ecec5a device: change default value for cloned-mac-address to "preserve" (bgo#770611)
Long ago before commit 1b49f94, NetworkManager did not touch the
MAC address at all. Since 0.8.2 NetworkManager would modify the
MAC address, and eventually it would reset the permanent MAC address
of the device.

This prevents a user from externally setting the MAC address via tools
like macchanger and rely on NetworkManager not to reset it to the
permanent MAC address. This is considered a security regression in
bgo#708820.

This only changed with commit 9a354cd and 1.4.0. Since then it is possible
to configure "cloned-mac-address=preserve", which instead uses the "initial"
MAC address when the device activates.
That also changed that the "initial" MAC address is the address which was
externally configured on the device as last. In other words, the
"initial" MAC address is picked up from external changes, unless it
was NetworkManager itself who configured the address when activating a
connection.

However, in absence of an explicit configuration the default for
"cloned-mac-address" is still "permanent". Meaning, the user has to
explicitly configure that NetworkManager should not touch the MAC address.
It makes sense to change the upstream default to "preserve". Although this
is a change in behavior since 0.8.2, it seems a better default.

This change has the drastic effect that all the existing connections
out there with "cloned-mac-address=$(nil)" change behavior after upgrade.
I think most users won't notice, because their devices have the permanent
address set by default anyway. I would think that there are few users
who intentionally configured "cloned-mac-address=" to have NetworkManager
restore the permanent address.

https://bugzilla.gnome.org/show_bug.cgi?id=770611
2016-09-12 14:01:57 +02:00
Thomas Haller
553717bb1c device: don't set ip4_state=IP_FAIL for ipv4.method=disabled
... and don't set ip6_state=IP_FAIL for ipv6.method=ignore.

The disabled state is like having an empty NMIP4Config object.
It should not result in %IP_FAIL state. Instead, we just want
to proceed and commit an empty NMIP4Config instance.

This was introduced by commit 0652d9c596,
which I think was wrong.

Likewise, for ipv6.method=ignore we also don't want to mark the
IP state as failed. Instead, we want to proceed and set IP_DONE
right away -- without commiting anything, which is a difference
to the IPv4 case.

This is especially important, because an ip4_state/ip6_state of IP_FAIL
causes nm_device_can_assume_active_connection() to return FALSE, which
means we unmanage devices at shutdown. Ony might say that it doesn't
matter so much for a device without IP configuration, but imagine a
bond with VLANs on top that only has Layer 2 configuration. This will
bring down the entire stack.

With this change, devices with IP methods disabled/ignore stay up on
exit of NetworkManager (rh#1371126). Of course, that means on restart
software devices stay unamanged due to external-down (because since
commit e1edcda, devices without IP address are also external-down).
So, this really just fixes one scenario, breaking another one.
This should be fixed with bgo#746440 by not assuming connections.

https://bugzilla.redhat.com/show_bug.cgi?id=1371126
2016-09-09 14:10:27 +02:00
Thomas Haller
067aa50363 device: add new result NM_ACT_STAGE_RETURN_IP_DONE for ip config activation
This is like NM_ACT_STAGE_RETURN_SUCCESS, except it should only set
the IP state without commiting an NMIP[46]Config instance.
2016-09-09 14:10:27 +02:00
Thomas Haller
dd48472909 device: only set use_tempaddr sysctl for non-assumed devices
and only if the activation stage is not about to fail hard.
2016-09-09 14:10:27 +02:00
Thomas Haller
2162a84c5f device/trivial: rename NM_ACT_STAGE_RETURN_STOP to NM_ACT_STAGE_RETURN_IP_FAIL
and rename NM_ACT_STAGE_RETURN_STOP to NM_ACT_STAGE_RETURN_IP_FAIL.
They are only used during IP config stage. Give them a better name.
2016-09-09 14:10:27 +02:00
Thomas Haller
398e1e8b3c device: remove unneeded activation-stage result NM_ACT_STAGE_RETURN_FINISH
We can express FINISH by returning SUCCESS and not set out_config in
act_stage3_ip4_config_start().
2016-09-09 14:10:27 +02:00
Thomas Haller
94f42e9bec device: log changes to ip4_state and ip6_state 2016-09-09 14:10:27 +02:00
Thomas Haller
1a85103765 device: workaround driver issue with delayed change of MAC address
brcmfmac and possibly other drivers don't change the MAC address
right away, but instead the result is delayed. That is problematic
because we cannot continue activation before the MAC address is
settled.

Add a hack to workaround the issue by waiting until the MAC address
changed.

The previous attempt to workaround this was less intrusive: we would
just refresh the link once and check the result. But that turns out
not to be sufficent for all cases. Now, wait and poll.

https://bugzilla.gnome.org/show_bug.cgi?id=770456
https://bugzilla.redhat.com/show_bug.cgi?id=1374023
2016-09-08 20:59:33 +02:00
Thomas Haller
cdf6ad4057 core: use _NM_GET_PRIVATE() macros 2016-09-08 00:21:21 +02:00
Beniamino Galvani
a043b0b4c7 wwan: fix memory leaks 2016-09-02 09:47:41 +02:00
Beniamino Galvani
7203769fd0 device: don't try to start LLDP listener if no link is available
L3-only devices don't have an ifindex during stage2, don't try to
start LLDP on them.

Fixes: 07a9364d9c
2016-09-02 09:47:41 +02:00
Beniamino Galvani
c39e03edbf device: manage firewall zone for assumed persistent connections
After the fix in [1], if the connection is assumed we don't update its
firewall zone. The goal of that change was to prevent NM from
interfering with the configuration done externally on devices not
created by NM.

However if there is an assumed persistent connection active on the
device NM touches the configuration in other ways, for example it
configures DHCP and manages the default route. So it seems correct to
also update the firewall zone.

OTOH, if the connection is assumed-generated there is no persistent
connection specifying a firewall zone and updating it makes no sense.

Bug [1] was about not interfering with devices unknown to NM (for
which there is no persistent connection) and so this change should not
conflict with the previous fix.

[1] https://bugzilla.redhat.com/show_bug.cgi?id=1098281

https://bugzilla.redhat.com/show_bug.cgi?id=1366288
2016-08-31 14:44:02 +02:00
Lubomir Rintel
3127fb0d17 device: don't let external changes cause a release of the slave
At this point we don't know if the slave has been using an assumed
connection that just vanished -- the best bet is to let the device be.

If it's meant to be unenslaved, it won't be due to an external event.

https://bugzilla.redhat.com/show_bug.cgi?id=1357738
2016-08-31 12:06:22 +02:00
Thomas Haller
34880d62d0 device: forget unmanaged-flag "user-explicit" for unrealized devices
When a software device unrealizes, we want to forget about the "user-explict"
unmanaged state. It means, that after a software device is deleted, the
"user-explict" managed flag will be cleared for that device.

It might be nice to preserve the managed-state after deletion of the device.
However, the unrealized-device only exists as long as we have a connection
for the device. That means, before this patch whether the unmanaged flag
was forgotten depends on whether the user had some connections that keep
the device alive as unrealized. That behavior was complicated, just don't
do that.
2016-08-30 18:06:07 +02:00
Thomas Haller
67b6852358 device: add hack to wait after changing MAC address
It seems some drivers return success for nm_platform_link_set_address(),
but at that point the address did not yet actually change *sigh*.
It changes a bit later, possibly after setting the device up.

Add a workaround to retry reading the MAC address when platform indicates
success but the address still differs at first.

https://bugzilla.gnome.org/show_bug.cgi?id=770456
2016-08-29 18:39:30 +02:00
Thomas Haller
d51f2c2a4e device: fix spelling in logging 2016-08-29 17:14:11 +02:00
Thomas Haller
9382fb0213 device/team: fix assuming non-NULL team-config in NMDeviceTeam::act_stage1_prepare()
(cherry picked from commit 4f6fd1bf0e)
2016-08-24 10:59:39 +02:00
Lubomir Rintel
aa0ebcc324 tests: try to resolve the .so file symbols
At some point, linker on ppc64le would throw away useful symbols along with the
garbage: https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=1c9177d9a5c3e06d3344347c8068acfb7d8ecc8b

Add a post-build check so that the distributors running broken binutils
would catch this early and fix their toolchain (or disable the garbage
collecting at the expense of larger and slower binaries).

(cherry picked from commit 680b3d1037)
2016-08-23 14:32:43 +02:00
Thomas Haller
417039fbd6 device: silence logging about "link disconnected"
<info> logging is just too verbose for something that happens
frequently.

(cherry picked from commit ed7f832c40)
2016-08-23 10:50:49 +02:00
Thomas Haller
f392da2c78 device: fix queued activation failure due to link disconnected
When activating a connection, it may fail with nmcli reporting:
  $ nmcli connection up id "Wired Connection 1"
  Error: Connection activation failed: Active connection removed before it was initialized

This should be easily reproducible by having a connection "Wired Connection 1" with
cloned-mac-address set to random. When the connection is already active on a device,
re-activating with
  $ nmcli connection up id "Wired Connection 1"
fails.

We first create a queued-activation and tear down the existing
connection:
   device (enp0s25): state change: deactivating -> disconnected (reason 'new-activation')
Shortly after we see:
   device[0x557d02cdb0c0] (enp0s25): set-hw-addr: setting MAC address to 'AA:BB:CC:DD:EE:FF' (reset, deactivate)...
   device[0x557d02cdb0c0] (enp0s25): taking down device
later, we get:
   device (enp0s25): link disconnected
   device[0x557d02cdb0c0] (enp0s25): queued state change to unavailable due to carrier-changed (id 17290)
in the meantime, the queued activation request starts:
   device (enp0s25): Activation: starting connection 'my-wired' (ca058ec5-8a47-4e1e-b38e-962b71c4699e)
but the device already transitions to unavailable
   device[0x557d02cdb0c0] (enp0s25): running queued state change to unavailable (id 17290)
   device (enp0s25): state change: disconnected -> unavailable (reason 'carrier-changed') [30 20 40]
which kills the new activation request:
   active-connection[0x557d02c10e40]: set state deactivated (was unknown)

Just delay a carrier-lost handling if we have any queued activation
requests.

(cherry picked from commit d4e9b30320)
2016-08-23 10:50:48 +02:00
Thomas Haller
0e1c7ede12 device: emit NM_DEVICE_STATE_CHANGED signal by id
This saves a lookup of the ID by name. We already have the signal-id,
use it.

(cherry picked from commit 534b0360c1)
2016-08-22 16:25:32 +02:00
Beniamino Galvani
9364585eeb device: don't flush addresses when unmanaging assumed devices
When a assumed software device is brought down externally, it becomes
UNMANAGED_EXTERNAL_DOWN and its state goes from ACTIVATED directly to
UNMANAGED. In such case, we shouldn't flush the IP configuration
(addresses and routes) present on the device.

To fix this, clean up the device with CLEANUP_TYPE_KEEP and modify
nm_device_cleanup() not to flush addresses and devices with such flag.

https://bugzilla.redhat.com/show_bug.cgi?id=1363995
(cherry picked from commit 45cd3302dc)
2016-08-19 18:19:13 +02:00
Thomas Haller
0bdcab100c all: cleanup includes in header files
- don't include "nm-default.h" in header files. Every source file must
  include as first header "nm-default.h", thus our headers get the
  default include already implicitly.

- we don't support compiling NetworkManager itself with a C++ compiler. Remove
  G_BEGIN_DECLS/G_END_DECLS from internal headers. We do however support
  users of libnm to use C++, thus they stay in public headers.

(cherry picked from commit f19aff8909)
2016-08-17 19:51:17 +02:00
Thomas Haller
fbbebc2123 device: always expose device statistics information
Instead of updating the device-statistic counters only periodically as
we refresh the link, update them on every link-changed event from
platform.

That means, also for devices that have RefreshRateMs at zero, the values
will be updated at random times when the link information changes.
The difference is, that previously the counters would be zero unless
RefreshRateMs was set. Now, they have some (probably stale) values
which however are not guaranteed to be kept up-to-date.

Also, now we refresh more often then promised by RefreshRateMs. But the API
technically doesn't specify that, so if we find there is a problem with
this, we may revert it later.
2016-08-17 16:08:21 +02:00
Thomas Haller
c16e14c71c device: drop nm-device-statistics.c and refactor tracking device statistics
Originally, "nm-device-statistics.c" contained code to fetch the device
counters via netlink. As now the netlink part is handled by NMPlatform,
the code can be simplified by merging it back to NMDevice.
2016-08-17 16:08:21 +02:00
Thomas Haller
02a448e49b device: namespace fields related to statistics in NMDevicePrivate
... by grouping them together in a struct.
2016-08-17 16:08:21 +02:00
Thomas Haller
d9509a2db1 device: don't initalize fields in nm_device_init() to NULL
They are already guaranteed to be 0/NULL.
2016-08-17 16:08:21 +02:00
Thomas Haller
36f8ffad9f device: refresh the link before reading the stats 2016-08-17 16:08:21 +02:00
Thomas Haller
fc2f1d9cb8 device: reset device-stats in update_stats() on missing link
First of all, we don't expect missing NMPlatformLink instances.
If that actually happens, just reset the counters to zero.
2016-08-17 16:08:21 +02:00
Thomas Haller
9c5405eba4 platform: drop nm_platform_link_get_stats()
No need to add accessors for fields of NMPlatformLink. Just access
them directly.
2016-08-17 16:08:21 +02:00
Alfonso Sanchez-Beato
24b193ab64 device: add statistics interface
Add statistics interface to all device instances. When active, the
properties of this interface are refreshed whenever there is network
activity for the device.

Activation is performed by changing RefreshRateMs property. If set to
zero, the interface is deactivated. If set to other value, the rest of
the interface properties are refreshed whenever the related network
metric changes, being RefreshRateMs the minimum time between property
changes, in milliseconds.
2016-08-17 15:50:20 +02:00
Thomas Haller
f04baa63c0 device: copy the plink instance before realize_start_setup()
To make sure, we don't end up with a dangling pointer due
to an intermediate platform access which may invalidate the
pointer.
2016-08-17 15:50:20 +02:00
Beniamino Galvani
300b8ce842 team: update configuration when adding or removing slaves
Unfortunately teamd doesn't have an asynchronous way to notify a
change in the actual configuration, so when a port is enslaved or
released we wait some time for the changes to take effect and read the
configuration again.

https://bugzilla.redhat.com/show_bug.cgi?id=1310435
2016-07-23 08:58:58 +02:00
Beniamino Galvani
791bca1dcc team: request actual configuration to teamd
Request the actual configuration when reading it from teamd. The
actual configuration, differently from the normal one, doesn't contain
non-active team ports.
2016-07-23 08:58:58 +02:00
Francesco Giudici
ddc35f27eb device: enable checks against the MAC address of virtual devices
enables (back) matching against 802-3-ethernet.mac-address and
802-3-ethenet.mac-address-blacklist connection parameters
for MAC addresses belonging to virtual devices too.
2016-07-22 19:36:23 +02:00
Francesco Giudici
55b9fd46ee device: allow creation of default wired connection for virtual interfaces 2016-07-22 19:36:23 +02:00
Thomas Haller
36856ba610 all: reuse _nm_utils_hwaddr_ntoa() for converting binary to string 2016-07-10 13:44:58 +02:00
Thomas Haller
bfe4a69c25 wwan: downgrade warning logging about 'No SIM object available'
On every start of NetworkManager I'd see a warning message:

  modem-broadband[cdc-wdm0]: failed to retrieve SIM object: No SIM object available

Apparently, to warn about this is too alarming.
2016-07-10 11:53:11 +02:00
Beniamino Galvani
75406d1760 device: allow ipv6ll address to be set for disconnected devices
Commit f85941ee91 ("device: don't try to generate ipv6ll address for
disconnected devices") disabled the generation of IPv6 link-local
addresses for disconnected devices to fix a crash. However that broke
the following:

 $ ip a f dev eth0
 $ systemctl start NetworkManager
 $ nmcli d
 DEVICE  TYPE      STATE         CONNECTION
 eth0    ethernet  disconnected  eth0
 $ ip a a dev eth0 2001::42/64
 $ ip a show eth0
 4: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
     link/ether 52:52:00:61:32:81 brd ff:ff:ff:ff:ff:ff
     inet6 2001::42/64 scope global
        valid_lft forever preferred_lft forever
     (no link-local address)

Instead, enable the generation of a link-local address even if the
device is disconnected and fix nm_device_get_ip_iface_identifier() to
not require a connection if @ignore_token is set.

Fixes: f85941ee91
2016-07-09 11:38:58 +02:00
Thomas Haller
e988ed96f9 device: downgrade debug logging about not setting hardware address
No change is not particularly interesting, and for Wi-Fi devices
it happens everytime we scan. Downgrade the debug message to trace
level.
2016-07-09 10:23:39 +02:00
Thomas Haller
0e07bbf968 rdisc: tighten up type and range of NMRDiscRoute.plen 2016-07-08 12:35:14 +02:00