summaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
...
* tests/ifupdown: add missing source-stanza files reference from makefileFrancesco Giudici2016-09-131-1/+2
| | | | Fixes: ada6b96de94b97df57f321372736f66725676065
* device: cleanup _hw_addr_set()Thomas Haller2016-09-131-24/+15
| | | | | | No change in behavior, just reorganize. Fixes: 32f7c1d4b9aba597a99128631f07c2985149f303
* device: wait for MAC address change to complete before setting interface upThomas Haller2016-09-131-11/+16
| | | | | | | | | | | | | | | | | | Some drivers (brcmfmac) don't change the MAC address right away. NetworkManager works around that by waiting synchronously until the address changes (commit 1a85103765d4eaa0acab6b03658a4f9cfe684a64). 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
* device: merge branch 'th/device-bring-up-bgo771284'Thomas Haller2016-09-127-106/+49
|\ | | | | | | https://bugzilla.gnome.org/show_bug.cgi?id=771284
| * device: drop virtual methods for bring_up(), take_down() and is_up()Thomas Haller2016-09-122-59/+22
| | | | | | | | They have no more implementations in derived classes.
| * device: drop NMDeviceMacvlan:bring_up() implementationThomas Haller2016-09-121-15/+0
| | | | | | | | | | | | This was added by commit 4de8851eca06d797f1a3c89f5710d51018ca2bff, 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.
| * device: drop NMDeviceVlan:bring_up() implementationThomas Haller2016-09-121-15/+0
| | | | | | | | | | | | | | | | | | | | | | | | This retry loop was added by commit dc6341acec2d12856265d6976420d56f0560410b. 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 5074898591ae99f79b0cc4872c3c7cf018abee82 and it is not clear why we would wait for carrier at all -- we don't do that for other device types either.
| * device: drop NMDeviceWifi:bring_up() implementationThomas Haller2016-09-122-10/+5
| | | | | | | | | | | | | | | | 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().
| * device: implement get_enabled() for NMDeviceWifiThomas Haller2016-09-121-0/+7
| | | | | | | | | | | | | | | | | | 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.
| * core: use defines for signal namesThomas Haller2016-09-125-9/+17
|/
* ifcfg-rh: fill 'auth-alg' with the original value for WPA-PSKBeniamino Galvani2016-09-121-0/+6
| | | | | | | Restore the original value of auth-alg, which can be NULL or 'open' for WPA-PSK. https://bugzilla.gnome.org/show_bug.cgi?id=770907
* ifcfg-rh: add wifi protocols only if present in connection fileBeniamino Galvani2016-09-121-8/+0
| | | | | | | | | | | | | An empty 802-11-wireless-security.proto is equivalent to 'wpa,rsn'. Previously we added the two protocols when reading the connection and the variables were missing, with the result that an empty value would be read as 'wpa,rsn' at the next restart. This is harmless but makes the two connections appear as different, with bad effects when 'monitor-connection-files' is enabled. Ensure that the original value persists after a write/read cycle. https://bugzilla.gnome.org/show_bug.cgi?id=770907
* device: change default value for cloned-mac-address to "preserve" (bgo#770611)Thomas Haller2016-09-125-10/+17
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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
* build: disable type checks in G_TYPE_CHECK_INSTANCE_CAST() macros (bgo#771120)Thomas Haller2016-09-121-4/+57
| | | | | | | Avoid the pointless overhead. Even glib disables them unless you build with --enable-debug. https://bugzilla.gnome.org/show_bug.cgi?id=771120
* libnm: merge branch 'bg/libnm-activation-stuck-rh1367752'Beniamino Galvani2016-09-092-5/+22
|\ | | | | | | https://bugzilla.redhat.com/show_bug.cgi?id=1367752
| * cli: connections: fail the activation if the ac deactivatesBeniamino Galvani2016-09-091-0/+4
| | | | | | | | | | | | | | | | | | | | | | Since commit ac888de15103 ("cli/connections: fail the activation when the active connection disappears") we rely only on the disappearing of the active-connection to determine the failure of an activation. libnm can collapse a 'added' and a 'removed' signal if they are received closer enough and thus we may miss the removal of the active connection. Restore the detection of failure based on active-connection state.
| * libnm: make waiting objects fail when an object initialization failsBeniamino Galvani2016-09-091-5/+18
|/ | | | | | Previously, when the load of an object failed and there were other objects waiting for it, those objects would remain waiting forever. Make them fail as well.
* device: merge branch 'th/device-ip-state-for-disabled-rh1371126'Thomas Haller2016-09-094-83/+124
|\ | | | | | | https://bugzilla.redhat.com/show_bug.cgi?id=1371126
| * device: don't set ip4_state=IP_FAIL for ipv4.method=disabledThomas Haller2016-09-092-5/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ... 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 0652d9c5961e4636eab87647af890aaf8c3e3269, 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
| * device: add new result NM_ACT_STAGE_RETURN_IP_DONE for ip config activationThomas Haller2016-09-092-27/+30
| | | | | | | | | | This is like NM_ACT_STAGE_RETURN_SUCCESS, except it should only set the IP state without commiting an NMIP[46]Config instance.
| * device: only set use_tempaddr sysctl for non-assumed devicesThomas Haller2016-09-091-13/+16
| | | | | | | | and only if the activation stage is not about to fail hard.
| * device/trivial: rename NM_ACT_STAGE_RETURN_STOP to NM_ACT_STAGE_RETURN_IP_FAILThomas Haller2016-09-094-20/+20
| | | | | | | | | | 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.
| * device: remove unneeded activation-stage result NM_ACT_STAGE_RETURN_FINISHThomas Haller2016-09-092-21/+24
| | | | | | | | | | We can express FINISH by returning SUCCESS and not set out_config in act_stage3_ip4_config_start().
| * device: log changes to ip4_state and ip6_stateThomas Haller2016-09-091-30/+63
|/
* libnm-core: fix crash in nm_vpn_plugin_info_list_get_service_types()Thomas Haller2016-09-091-1/+1
| | | | | | | Coverity says, "Dereference after null check". Indeed, @aliases is usually NULL. Fixes: 46665898bbe2c0998529cb75056d674654ba41a9
* ifcfg-rh: remove dead code from write_ip4_setting()Thomas Haller2016-09-091-19/+5
| | | | | | | | s_ip4 cannot be NULL and fake_ip4 is never TRUE. Found by Coverity. Fixes: cf7b8866ced5ec67e76b8dde530e0350104194d4
* device: workaround driver issue with delayed change of MAC addressThomas Haller2016-09-082-26/+61
| | | | | | | | | | | | | | | | | 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
* dns/resolved: branch 'th/systemd-resolved-bgo762540'Thomas Haller2016-09-085-4/+507
|\ | | | | | | https://bugzilla.gnome.org/show_bug.cgi?id=762540
| * man: document dns=systemd-resolvedBeniamino Galvani2016-09-081-3/+7
| |
| * dns/resolved: various fixesThomas Haller2016-09-082-18/+22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | - mode in init_resolv_conf_mode() must be initialized in case it is NULL. - drop the NULL sentinal from resolved_paths and make it static. - resolved_proxy_created() must handle the fact that @self might be already destroyed. - call_done() must not access @self before ensuring that the call was not cancelled. What's more, send_update() can be called by resolved_proxy_created(), thus it must ensure that it has an @update_cancellable. Let send_update() create and cancel the @update_cancellable(). Also, send_update() -- which now manages @update_cancellable instead of update() -- must actually cancel the previous cancellable, otherwise the callback again might access a disposed @self. Co-authored-by: Beniamino Galvani <bgalvani@redhat.com>
| * dns/resolved: adjust coding styleThomas Haller2016-09-082-50/+55
| |
| * dns/resolved: add systemd-resolved backendSjoerd Simons2016-09-084-1/+491
|/ | | | | | | | | | | | | Add initial DNS backend that pushes DNS information into systemd-resolved. Backend is choosen by default if the systems resolv.conv is setup to pointing to one of the standard resolved locations. This doesn't handle global dns configuration. Signed-off-by: Sjoerd Simons <sjoerd@luon.net> https://bugzilla.gnome.org/show_bug.cgi?id=762540
* dhcp: merge branch 'th/dhcp-helper-sync-notify-rh1372854'Thomas Haller2016-09-0824-270/+393
|\ | | | | | | https://bugzilla.redhat.com/show_bug.cgi?id=1372854
| * dhcp: call synchronous Notify D-Bus method from nm-dhcp-helperThomas Haller2016-09-084-33/+153
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | A D-Bus signal is asynchronous and it can happen that nm-dhcp-helper emits the "Event" signal before the server is able to register a handler: NM_DHCP_HELPER=/usr/libexec/nm-dhcp-helper nmcli general logging level TRACE for i in `seq 1 500`; do $NM_DHCP_HELPER & done journalctl -u NetworkManager --since '1 min ago' | grep "didn't have associated interface" | wc -l 499 Avoid that, by calling the synchronous D-Bus method "Notify". Interestingly, this race seem to exist since 2007. Actually, we called g_dbus_connection_signal_subscribe() from inside GDBusServer:new-connection signal. So it is not clear how such a race could exist. I was not able to reproduce it by putting a sleep before g_dbus_connection_signal_subscribe(). On the other hand, there is bug rh#1372854 and above reproducer which strongly indicates that events can be lost under certain circumstances. Now we instead g_dbus_connection_register_object() from the new-connection signal. According to my tests there was no more race as also backed by glib's documentation. Still, keep a simple retry-loop in nm-dhcp-helper just to be sure. https://bugzilla.redhat.com/show_bug.cgi?id=1372854 https://bugzilla.redhat.com/show_bug.cgi?id=1373276
| * dhcp: add new header "nm-dhcp-helper-api.h"Thomas Haller2016-09-085-3/+38
| |
| * dhcp-helper: refactor logging to use logging macrosThomas Haller2016-09-081-5/+40
| |
| * dhcp-helper: refactor error handlingThomas Haller2016-09-081-15/+15
| | | | | | | | | | Don't exit(1) from fatal_error() because that skips destroying local variables in main(). Just return regularly.
| * dhcp-listener/trivial: rename field to track connections in NMDhcpListenerThomas Haller2016-09-081-6/+6
| | | | | | | | | | | | It's not "signal-handles", as it currently tracks the registration ID of type int. Rename it, it is effectively the list of connections that we track.
| * dhcp-listener: add logging macros to nm-dhcp-listener.cThomas Haller2016-09-081-11/+28
| |
| * dhcp-listener: refactor type definition and embed private data in @selfThomas Haller2016-09-082-23/+31
| |
| * core: use _NM_GET_PRIVATE() macrosThomas Haller2016-09-0815-180/+26
| |
| * shared: add _NM_GET_PRIVATE() macroThomas Haller2016-09-081-0/+18
| |
| * shared: add NM_MIN()/NM_MAX() macros to replace glib's MIN()/MAX()Thomas Haller2016-09-081-0/+44
| |
| * logging: don't round subsecond part in logging timestampThomas Haller2016-09-081-1/+1
|/ | | | | | | tv.tv_usec is guaranteed to have less then 6 digits, however rounding it up we might reach 1000000 and thus the value becomes mis-aligned. To round correctly, we would have to carry over a potential overflow to the seconds. But that seems too much effort for little gain. Just truncate the value.
* systemd: merge branch systemd into masterThomas Haller2016-09-073-5/+5
|\
| * systemd: update code from upstreamThomas Haller2016-09-073-5/+5
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This is a direct dump from systemd git on 2016-09-07, git commit c5d5fc91eba8541a3a86ff6b839a2b6e824f4149. ====== SYSTEMD_DIR=../systemd COMMIT=c5d5fc91eba8541a3a86ff6b839a2b6e824f4149 ( cd "$SYSTEMD_DIR" git checkout "$COMMIT" git reset --hard git clean -fdx ) git ls-files :/src/systemd/src/ | xargs -d '\n' rm -f nm_copy_sd() { mkdir -p "./src/systemd/$(dirname "$1")" cp "$SYSTEMD_DIR/$1" "./src/systemd/$1" } nm_copy_sd "src/basic/alloc-util.c" nm_copy_sd "src/basic/alloc-util.h" nm_copy_sd "src/basic/async.h" nm_copy_sd "src/basic/escape.c" nm_copy_sd "src/basic/escape.h" nm_copy_sd "src/basic/ether-addr-util.c" nm_copy_sd "src/basic/ether-addr-util.h" nm_copy_sd "src/basic/extract-word.c" nm_copy_sd "src/basic/extract-word.h" nm_copy_sd "src/basic/fileio.c" nm_copy_sd "src/basic/fileio.h" nm_copy_sd "src/basic/fd-util.c" nm_copy_sd "src/basic/fd-util.h" nm_copy_sd "src/basic/fs-util.c" nm_copy_sd "src/basic/fs-util.h" nm_copy_sd "src/basic/hash-funcs.c" nm_copy_sd "src/basic/hash-funcs.h" nm_copy_sd "src/basic/hashmap.c" nm_copy_sd "src/basic/hashmap.h" nm_copy_sd "src/basic/hexdecoct.c" nm_copy_sd "src/basic/hexdecoct.h" nm_copy_sd "src/basic/hostname-util.c" nm_copy_sd "src/basic/hostname-util.h" nm_copy_sd "src/basic/in-addr-util.c" nm_copy_sd "src/basic/in-addr-util.h" nm_copy_sd "src/basic/io-util.c" nm_copy_sd "src/basic/io-util.h" nm_copy_sd "src/basic/list.h" nm_copy_sd "src/basic/log.h" nm_copy_sd "src/basic/macro.h" nm_copy_sd "src/basic/mempool.h" nm_copy_sd "src/basic/mempool.c" nm_copy_sd "src/basic/parse-util.c" nm_copy_sd "src/basic/parse-util.h" nm_copy_sd "src/basic/path-util.c" nm_copy_sd "src/basic/path-util.h" nm_copy_sd "src/basic/prioq.h" nm_copy_sd "src/basic/prioq.c" nm_copy_sd "src/basic/random-util.c" nm_copy_sd "src/basic/random-util.h" nm_copy_sd "src/basic/refcnt.h" nm_copy_sd "src/basic/set.h" nm_copy_sd "src/basic/signal-util.h" nm_copy_sd "src/basic/siphash24.c" nm_copy_sd "src/basic/siphash24.h" nm_copy_sd "src/basic/socket-util.c" nm_copy_sd "src/basic/socket-util.h" nm_copy_sd "src/basic/sparse-endian.h" nm_copy_sd "src/basic/stdio-util.h" nm_copy_sd "src/basic/string-table.c" nm_copy_sd "src/basic/string-table.h" nm_copy_sd "src/basic/string-util.c" nm_copy_sd "src/basic/string-util.h" nm_copy_sd "src/basic/strv.c" nm_copy_sd "src/basic/strv.h" nm_copy_sd "src/basic/time-util.c" nm_copy_sd "src/basic/time-util.h" nm_copy_sd "src/basic/umask-util.h" nm_copy_sd "src/basic/unaligned.h" nm_copy_sd "src/basic/utf8.c" nm_copy_sd "src/basic/utf8.h" nm_copy_sd "src/basic/util.c" nm_copy_sd "src/basic/util.h" nm_copy_sd "src/libsystemd-network/arp-util.c" nm_copy_sd "src/libsystemd-network/arp-util.h" nm_copy_sd "src/libsystemd-network/dhcp6-internal.h" nm_copy_sd "src/libsystemd-network/dhcp6-lease-internal.h" nm_copy_sd "src/libsystemd-network/dhcp6-network.c" nm_copy_sd "src/libsystemd-network/dhcp6-option.c" nm_copy_sd "src/libsystemd-network/dhcp6-protocol.h" nm_copy_sd "src/libsystemd-network/dhcp-identifier.c" nm_copy_sd "src/libsystemd-network/dhcp-identifier.h" nm_copy_sd "src/libsystemd-network/dhcp-internal.h" nm_copy_sd "src/libsystemd-network/dhcp-lease-internal.h" nm_copy_sd "src/libsystemd-network/dhcp-network.c" nm_copy_sd "src/libsystemd-network/dhcp-option.c" nm_copy_sd "src/libsystemd-network/dhcp-packet.c" nm_copy_sd "src/libsystemd-network/dhcp-protocol.h" nm_copy_sd "src/libsystemd-network/lldp-internal.h" nm_copy_sd "src/libsystemd-network/lldp-neighbor.c" nm_copy_sd "src/libsystemd-network/lldp-neighbor.h" nm_copy_sd "src/libsystemd-network/lldp-network.c" nm_copy_sd "src/libsystemd-network/lldp-network.h" nm_copy_sd "src/libsystemd-network/network-internal.c" nm_copy_sd "src/libsystemd-network/network-internal.h" nm_copy_sd "src/libsystemd-network/sd-dhcp6-client.c" nm_copy_sd "src/libsystemd-network/sd-dhcp6-lease.c" nm_copy_sd "src/libsystemd-network/sd-dhcp-client.c" nm_copy_sd "src/libsystemd-network/sd-dhcp-lease.c" nm_copy_sd "src/libsystemd-network/sd-ipv4ll.c" nm_copy_sd "src/libsystemd-network/sd-ipv4acd.c" nm_copy_sd "src/libsystemd-network/sd-lldp.c" nm_copy_sd "src/libsystemd/sd-event/sd-event.c" nm_copy_sd "src/libsystemd/sd-id128/id128-util.c" nm_copy_sd "src/libsystemd/sd-id128/id128-util.h" nm_copy_sd "src/libsystemd/sd-id128/sd-id128.c" nm_copy_sd "src/shared/dns-domain.c" nm_copy_sd "src/shared/dns-domain.h" nm_copy_sd "src/systemd/_sd-common.h" nm_copy_sd "src/systemd/sd-dhcp6-client.h" nm_copy_sd "src/systemd/sd-dhcp6-lease.h" nm_copy_sd "src/systemd/sd-dhcp-client.h" nm_copy_sd "src/systemd/sd-dhcp-lease.h" nm_copy_sd "src/systemd/sd-event.h" nm_copy_sd "src/systemd/sd-ndisc.h" nm_copy_sd "src/systemd/sd-id128.h" nm_copy_sd "src/systemd/sd-ipv4acd.h" nm_copy_sd "src/systemd/sd-ipv4ll.h" nm_copy_sd "src/systemd/sd-lldp.h"
* | ifupdown: add curly braces to for loopThomas Haller2016-09-071-1/+2
| |
* | plugins: ifupdown: support source-directory stanzaScott Sweeny2016-09-074-12/+61
| | | | | | | | | | | | | | | | | | Enable the ifupdown settings plugin to read interface definitions from the source directory: /etc/network/interfaces.d/ https://mail.gnome.org/archives/networkmanager-list/2016-September/msg00014.html
* | libnm: merge branch 'th/empty-cloned-mac-address-rh1372799'Thomas Haller2016-09-064-16/+39
|\ \ | | | | | | | | | https://bugzilla.redhat.com/show_bug.cgi?id=1372799
| * | libnm: fix regression serializing empty "cloned-mac-address"Thomas Haller2016-09-062-3/+19
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | For "cloned-mac-address", the empty string "" is an invalid value that is rejected by verify(). Commit 8eed671 changed how the property is serialized to D-Bus. Before, it was serialized using _nm_utils_hwaddr_to_dbus(). For invalid or empty addresses, this would not serialize the value on D-Bus (or before commit 76aa6f8e0, it would create a bogus value with no array elements). With commit 8eed671, the cloned-mac-address gets also serialized as "assigned-mac-address" via _nm_utils_hwaddr_cloned_data_synth(), which would pass on invalid strings that the server would then reject. That breaks for example nmtui. Try editing a connection with "cloned-mac-address" set to NULL. Note, as long as you don't edit the cloned MAC address in nmtui, you can save the modification. Once you start modifying the entry, you can no longer set an empty MAC address as the server now receives the invalid empty string. Thus, the "OK" button fails with Unable to save connection: 802-3-ethernet.cloned-mac-address: is not a valid MAC address It also means, nmtui cannot modify the "cloned-mac-address" field to become empty. Fix that problem at various places by coercing "" to NULL. Fixes: 8eed67122c58540360b617eb42d5df8328e21b5d https://bugzilla.redhat.com/show_bug.cgi?id=1372799