Commit graph

23629 commits

Author SHA1 Message Date
Thomas Haller
360d26e27c examples: add examples/python/gi/nm-add-connection2.py example script
This is useful for manually testing AddConnection2() D-Bus API.
2019-07-25 15:26:49 +02:00
Thomas Haller
64c178712a cli: use nm_client_add_connection2() API from nmcli
Make use of the new API. Note that AddConnection2() covers all
functionality of AddConnection() and AddConnectionUnsaved(). Let's
only use one API for all.

There is a minor downside to this patch: now nmcli requires
libnm 1.20 API. Note that libnm's nm_client_add_connection2()
makes an effort to avoid AddConnection2() under the hood to
still work against older server versions. So, you can use nmcli
with libnm 1.20 to talk to older versions of NetworkManager.

But with this change nmcli strictly requires libnm 1.20. I think that is
sensible because commonly nmcli requires a libnm version that is as new
as itself.
Also, the value of allowing nmcli to talk to older NetworkManager
versions is during package upgrade (where the daemon might not be
restarted). This is much less concern w.r.t. to updating the nmcli/libnm
combo, which is commonly packaged together.
2019-07-25 15:26:49 +02:00
Thomas Haller
22c8721f35 core,libnm: add AddConnection2() D-Bus API to block autoconnect from the start
It should be possible to add a profile with autoconnect blocked form the
start. Update2() has a %NM_SETTINGS_UPDATE2_FLAG_BLOCK_AUTOCONNECT flag to
block autoconnect, and so we need something similar when adding a connection.

As the existing AddConnection() and AddConnectionUnsaved() API is not
extensible, add AddConnection2() that has flags and room for additional
arguments.

Then add and implement the new flag %NM_SETTINGS_ADD_CONNECTION2_FLAG_BLOCK_AUTOCONNECT
for AddConnection2().

Note that libnm's nm_client_add_connection2() API can completely replace
the existing nm_client_add_connection_async() call. In particular, it
will automatically prefer to call the D-Bus methods AddConnection() and
AddConnectionUnsaved(), in order to work with server versions older than
1.20. The purpose of this is that when upgrading the package, the
running NetworkManager might still be older than the installed libnm.
Anyway, so since nm_client_add_connection2_finish() also has a result
output, the caller needs to decide whether he cares about that result.
Hence it has an argument ignore_out_result, which allows to fallback to
the old API. One might argue that a caller who doesn't care about the
output results while still wanting to be backward compatible, should
itself choose to call nm_client_add_connection_async() or
nm_client_add_connection2(). But instead, it's more convenient if the
new function can fully replace the old one, so that the caller does not
need to switch which start/finish method to call.

https://bugzilla.redhat.com/show_bug.cgi?id=1677068
2019-07-25 15:26:49 +02:00
Thomas Haller
0aa323fb28 settings: add NM_SETTINGS_UPDATE2_FLAG_NO_REAPPLY to prevent runtime changes when updating connection profile
When modifying a connection profile that happens to be active on a
device, then most of the changes don't take effect immediately.
Only after a full re-activation or reapply (nmcli device reapply)
does the configuration of the active device change (the
"applied-connection").

With two execptions: "connection.zone" and "connection.metered" take
effect immediately. I think this is historic, but also to facilitate
firewall-cmd to modify a profile and change the zone right away.

Anyway, I think it should be possible to modify a profile without
changes to the runtime. Add a flag to prevent reapplying these
properties right away.

https://bugzilla.redhat.com/show_bug.cgi?id=1677070
2019-07-25 15:26:49 +02:00
Thomas Haller
dcdbe98406 shared: add nm_g_slice_free() helper
How odd that such a macro does not exist yet. It seems like
the majorities of calls to g_slice_free() could be replaced
by this.
2019-07-25 15:26:49 +02:00
Thomas Haller
9dfc3ff5af core: improve code comment and add assertion to nm_utils_monotonic_timestamp_as_boottime() 2019-07-25 15:10:43 +02:00
Lubomir Rintel
12d9ef4c36 merge: branch 'lr/ovs-bridge-datapath-type'
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/merge_requests/212
2019-07-25 12:32:31 +02:00
Lubomir Rintel
60fa10178b cleints: add support for ovs-bridge.datapath-type property 2019-07-25 12:32:20 +02:00
Lubomir Rintel
b70d0b3b38 ovs/ovsdb: add support for setting the bridge data path type 2019-07-25 12:32:20 +02:00
Lubomir Rintel
6cf390eb55 core: add ovs-bridge.datapath-type property 2019-07-25 12:32:20 +02:00
Lubomir Rintel
3cfe3c0e35 merge: branch 'lr/wpa-ft'
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/merge_requests/6
2019-07-25 12:31:36 +02:00
Lubomir Rintel
d17a0a0905 supplicant: allow fast transition for WPA-PSK and WPA-EAP
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/issues/4
2019-07-25 12:31:19 +02:00
Lubomir Rintel
5480ec8537 supplicant: reorganize the routine that sets key_mgmt a bit
This is functionally equivalent, it only makes it easier to plug in the FT
enablement logic at a later point.
2019-07-25 12:31:19 +02:00
Lubomir Rintel
f5cd641c05 supplicant: detect SHA384 support 2019-07-25 12:31:19 +02:00
Lubomir Rintel
3d0d1a21c8 supplicant: detect 802.11r fast BSS transition (FT) 2019-07-25 12:31:19 +02:00
Lubomir Rintel
bbdb978dc6 wifi/ap: recognize FT variants of wpa-psk and wpa-eap 2019-07-25 12:31:19 +02:00
Francesco Giudici
ff94b445a5 dhcp: merge branch 'fg/nettools_dhcp_options'
Use shared code for dhcp options processing in the nettools backend.

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/merge_requests/207
2019-07-25 11:43:12 +02:00
Francesco Giudici
84dbc217a3 dhcp: nettools: check if addr is in the lease when bound
otherwise quit early and share log info about it, like we do in the
systemd internal client.
2019-07-25 11:42:12 +02:00
Francesco Giudici
2509b840a3 dhcp: nettools: use shared dhcp option resources 2019-07-25 11:42:12 +02:00
Francesco Giudici
2672bacaaa dhcp: add "fqdn" and "client id" to the shared dhcp options 2019-07-25 11:42:12 +02:00
Francesco Giudici
e673ad8b45 dhcp/trivial: fix comment 2019-07-25 11:42:12 +02:00
Thomas Haller
3c003e0ea4 core: merge branch 'th/no-auto-default-by-ifname'
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/merge_requests/206
2019-07-25 11:38:22 +02:00
Thomas Haller
b424f75479 config: simplify no-auto-default list handling and sort entries
- don't let no_auto_default_from_file() do any preprocessing of
  the lines that it reads. It merely splits the lines at '\n'
  and utf8safe-unescapes them.
  This was previously duplicated also by NMConfigData's property
  setter. We don't need to do it twice.

- sort the lines. This makes the entire handling O(n*ln(n)) instead
  of O(n^2). Also, sorting effectively normalizes the content, and
  it's desirable to have one true representation of what we write.
2019-07-25 10:52:47 +02:00
Thomas Haller
fb8d1cda94 device,config: for virtual devices store the interface name to "no-auto-default.state"
For devices that have no real MAC address (virtual devices) it makes no
sense to store the MAC address to "no-auto-default.state" file. Also,
because we later would not match the MAC address during
nm_match_spec_device().

Instead, extend the format and add a "interface-name:=$IFACE" match-spec.

Maybe we generally should prefer the interface-name over the MAC
address. Anyway, for now, just extend the previously non-working case.
2019-07-25 10:52:19 +02:00
Thomas Haller
c43a32ea5f config: backslash escape values (utf8safe) in "no-auto-default.state" file
Currently "no-auto-default.state" contains only MAC addresses in ASCII
representation.

Next, we will also want to write there interface names. Interface names
in Linux don't enforce any encoding, so they can contain almost all
characters (except NUL and '/'). In particular '\n', which
we use as line separator.

If we want to store there interface names, we need to properly escape
and unescape them. Use our nm_utils_str_utf8safe_*() API for that.
2019-07-25 10:51:08 +02:00
Thomas Haller
38148bb33a config: cleanup handling no_auto_default lists 2019-07-25 10:50:40 +02:00
Thomas Haller
8437cd0895 device,config: don't write fake MAC address to "no-auto-default.state" file
For one, nm_config_get_no_auto_default_for_device() uses
nm_device_spec_match_list(). This ignores fake MAC addresses.
Maybe it should not do that, but it's also not clear what it
would mean for the function to consider them.

As such, it makes not sense trying to persist such MAC addresses
to "/var/lib/NetworkManager/no-auto-default.state". For the moment,
just do nothing.

This still leaves the problem how we prevent the device from generating
a auto-default connection. But this patch is no change in behavior, because
it didn't work anyway.
2019-07-25 10:49:48 +02:00
Thomas Haller
f13454cb1c device: move check for no-auto-default to "nm-settings.c"
nm_config_set_no_auto_default_for_device() is called by NMSettings,
so it makes sense that also NMSettings checks whether the device is
blocked.

Of course, there is little difference in practice.

The only downside is that most device types don't implement
new_default_connection(). So the previous form performed the
cheaper check first. On the other hand, we do expect to have
profiles for the devices anyway.
2019-07-25 10:48:40 +02:00
Thomas Haller
d6b84294de config: use nm_utils_g_slist_strlist_cmp() in nm_config_data_diff() 2019-07-25 10:48:40 +02:00
Thomas Haller
b0cb2966ed ifcfg-rh: don't allow globbing for unhandled device specs
With plain "interface-name:$IFNAME" globbing is enabled. So this behaves
wrong if there are special characters like '*' or '?'.

Also, it behaves wrong if the first character of the interface name happens
to be '='.

Make an explicit match.
2019-07-25 10:48:40 +02:00
Thomas Haller
3a6f651a98 core: add and use NM_MATCH_SPEC_*_TAG defines instead of plain strings
The define is better, because then we can grep for all the occurances
where they are used. The plain text like "mac:" is not at all unique in
our source-tree.
2019-07-25 10:48:40 +02:00
Thomas Haller
726192c185 libnm: accept %NULL for @name argument of nm_utils_is_valid_iface_name()
Rejecting %NULL for a "is-a" function can be annoying. Of course, %NULL is
not a valid name. But it's sufficient that the function just returns
%FALSE in that case, and not assert against the input not being %NULL.

Asserting might be useful to catch bugs, but rejecting %NULL as input
is more cumbersome to the caller than helping with catching bugs.

Something similar was also recently done for nm_utils_is_uuid().
2019-07-25 10:46:18 +02:00
Thomas Haller
1440a3c149 shared: accept %NULL strings in nm_utils_strv_sort()
In particular when calling nm_utils_strv_sort() with a positive length
argument, then this is not a %NULL terminated strv arrary. That may mean
that it makes sense for the input array to contain %NULL strings.

Use a strcmp() function that accepts %NULL too.

While this is not used at the moment, I think nm_utils_strv_sort()
should accept %NULL strings beause otherwise it's a possibly unexpected
restriction of its API. The function should handle sensible input gracefully.
2019-07-25 10:44:22 +02:00
Thomas Haller
29a7bffecf shared: add nm_strcmp0_p_with_data() helper 2019-07-25 10:43:44 +02:00
Thomas Haller
a78ba1c33a shared: add nm_strcmp_with_data()
It is like strcmp(), but has a signature suitable for GCompareDataFunc.

This is necessary with nm_utils_ptrarray_find_binary_search()
to search a sorted strv array.

The fault is here really C, which doesn't allow inline static functions.
So, you need all kinds of slightly different flavors for the same
callbacks (with or without user-data).

Note that glib2 internally just casts strcmp() to GCompareDataFunc ([1]),
relying on the fact how arguments are passed to the function and
ignoring the additional user-data argument. But I find that really
ugly and probably not permissible in general C. Dunno whether POSIX
would guarantee for this to work. I'd rather not do such function
pointer casts.

[1] 0c0cf59858/glib/garray.c (L1792)
2019-07-25 10:42:06 +02:00
Francesco Giudici
31d74e8b45 dhcp: internal: fix the logging message for the lease time
the lease time was incorrectly presented as the expiration time
2019-07-24 16:28:56 +02:00
Francesco Giudici
257d92717b dhcp: internal: Prefer nm_assert() to g_assert()
make checkpatch.pl happy:
src/dhcp/nm-dhcp-systemd.c:949: Prefer nm_assert() or g_return*() to g_assert*():
>       g_assert (priv->client6 == client);
2019-07-24 16:28:56 +02:00
Lubomir Rintel
0c62445853 dispatcher: tolerate lack of connection path
If the dispatcher is being invoked because the connection was removed
(e.g. device going down), it doesn't have a path or a filename anymore.
Don't abort in such cases.

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/merge_requests/205
2019-07-24 13:30:41 +02:00
Lubomir Rintel
3c6644db32 all: codespell fixes
Codespel run with the same arguments as described in
commit 58510ed566 ('docs: misc. typos pt2').
2019-07-24 11:30:19 +02:00
Thomas Haller
7811d1c187 platform/netlink: mark nested netlink attribute with NLA_F_NESTED
Kernel 5.2 is adding stricter checking for netlink messages.
In particular, for certain API it checks now that NLA_F_NESTED flag is
set for nested attributes ([1]).

Note that libnl3 does not ever set this flag, and since our netlink
implementation is copied from there, certain netlink messages are now
rejected as invalid.

On the other hand, libmnl always adds this flag ([2]). So we should do that
as well.

In particular, this affects the WireGuard netlink API causing request
from NetworkManager to be rejected ([3]).

[1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=b424e432e770d6dd572765459d5b6a96a19c5286
[2] https://git.netfilter.org/libmnl/tree/src/attr.c?id=5937dfcb0185f5cb9cf275992ea701ec4e619d9c#n535
[3] https://gitlab.freedesktop.org/NetworkManager/NetworkManager/issues/212

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/merge_requests/210
2019-07-23 14:43:50 +02:00
Thomas Haller
be1727be1f libnm,core: use nm_utils_clock_gettime_*() instead of clock_gettime()
We usually want to combine the fields from "struct timespec" to
have one timestamp in either nanoseconds or milliseconds.

Use nm_utils_clock_gettime_*() util for that.
2019-07-23 12:19:33 +02:00
Thomas Haller
3c0161a385 shared: add nm_utils_clock_gettime_*() util
Using clock_gettime() directly is a bit inconvenient. We usually
want to combine the fields of struct timespec into one timestamp
(for example, in unit nanoseconds).

Add a helper function to do that.
2019-07-23 12:19:22 +02:00
Iain Lane
8f8a1990ce libnm,core: Add ConnectivityCheckUri property and accessors
So that applications like GNOME Shell can hit the same URI to show the
captive portal login page.

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/merge_requests/209
2019-07-22 21:03:09 +02:00
Marco Trevisan (Treviño)
b621aba5c2 device: free temporary typename with iface variable
To create a disambiguated name for some Bluetooth devices we use its type name
with iface, however this value is allocated but never free'd when passed to
g_strdup_printf.

So use instead a temporary variable and free it once done.

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/merge_requests/208

Fixes: 8bbda5cdff
2019-07-22 08:22:14 +02:00
Thomas Haller
b8e9a62f2a libnm,core: support more "arp_validate" bond options
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/networking/bonding.txt?id=22051d9c4a57d3b4a8b5a7407efc80c71c7bfb16#n306

https://bugzilla.redhat.com/show_bug.cgi?id=1730793
2019-07-18 12:17:35 +02:00
Thomas Haller
2870037b1f settings: add more trace logging for auto-default (default wired) connections
Automatically creating profiles is suprising. Add more logging to understand
what's happening.
2019-07-17 14:36:30 +02:00
Thomas Haller
7644b18443 device: move check for config "no-auto-default" to NMDevice's new_default_connection()
Only NMDeviceEthernet implements new_default_connection(). Anyway, it
makes only sense to do this precheck by the caller first, and not by
each implementation.
2019-07-17 13:55:13 +02:00
Thomas Haller
da72f276cd settings: write tombstones when deleting connection with duplicate files on disk
Create such duplicate files:

  UUID=0df1bac3-1131-42d4-8893-4492d5424d11
  rm -f /etc/NetworkManager/system-connections/x[12]
  rm -f /{etc,run}/NetworkManager/system-connections/"$UUID".nmmeta
  printf -v C "[connection]\nuuid=$UUID\ntype=ethernet\nautoconnect=false"
  echo "$C" > /etc/NetworkManager/system-connections/x1
  echo "$C" > /etc/NetworkManager/system-connections/x2
  chmod 600 /etc/NetworkManager/system-connections/x[12]
  touch /etc/NetworkManager/system-connections/x2
  ls -l --full-time /etc/NetworkManager/system-connections/x[12] /{etc,run}/NetworkManager/system-connections/"$UUID".nmmeta 2>/dev/null
  nmcli connection reload
  nmcli -f all connection show | grep $UUID

Now, we have x2 file loaded, and x1 is shadowed. When we delete x2,
we probably don't want to delete the hidden x1 file.

What previously happend was that when calling

  nmcli connection delete $UUID

the command would hang because the profile wasn't really deleted:

  <trace> [1563355597.3671] keyfile: commit: deleted "/etc/NetworkManager/system-connections/x2", profile 0df1bac3-1131-42d4-8893-4492d5424d11 (deleted from disk)
  <trace> [1563355597.3672] settings: storage[0df1bac3-1131-42d4-8893-4492d5424d11,91e13003dd84928f/keyfile]: change event for dropping profile (file "/etc/NetworkManager/system-connections/x2")
  <trace> [1563355597.3672] settings: update[0df1bac3-1131-42d4-8893-4492d5424d11]: updating connection "x1" (2b798d30d43b0daf/keyfile)
  <debug> [1563355597.3674] ++ connection 'update connection' (0x55a167693ee0/NMSimpleConnection/"802-3-ethernet" < 0x55a16762e580/NMSimpleConnection/"802-3-ethernet") [/org/freedesktop/NetworkManager/Settings/41]:
  <debug> [1563355597.3675] ++ connection                [ 0x55a16782a400 < 0x55a16762c350 ]
  <debug> [1563355597.3675] ++ connection.id             = 'x1' < 'x2'
  <info>  [1563355597.3680] audit: op="connection-delete" uuid="0df1bac3-1131-42d4-8893-4492d5424d11" name="x1" pid=32077 uid=0 result="success"

instead, we need to write a tombstone:

  <trace> [1563359300.2910] keyfile: commit: deleted "/etc/NetworkManager/system-connections/x2", profile 0df1bac3-1131-42d4-8893-4492d5424d11 (deleted from disk)
  <trace> [1563359300.2911] settings: storage[0df1bac3-1131-42d4-8893-4492d5424d11,0c12620295ac7f83/keyfile]: change event for dropping profile (file "/etc/NetworkManager/system-connections/>
  <trace> [1563359300.2912] keyfile: commit: writing nmmeta symlink "/etc/NetworkManager/system-connections/0df1bac3-1131-42d4-8893-4492d5424d11.nmmeta" (pointing to "/dev/null") succeeded
  <trace> [1563359300.2912] settings: storage[0df1bac3-1131-42d4-8893-4492d5424d11,02a430e6ee52358d/keyfile]: change event for hiding profile (file "/etc/NetworkManager/system-connections/0d>
  <trace> [1563359300.2912] settings: update[0df1bac3-1131-42d4-8893-4492d5424d11]: delete connection "x2" (02a430e6ee52358d/keyfile)
  <debug> [1563359300.2914] Deleting secrets for connection /org/freedesktop/NetworkManager/Settings (x2)
  <trace> [1563359300.2915] dbus-object[13d79ec95177f9eb]: unexport: "/org/freedesktop/NetworkManager/Settings/54"
  <trace> [1563359300.2916] settings-connection[13d79ec95177f9eb,0df1bac3-1131-42d4-8893-4492d5424d11]: update settings-connection flags to none (was visible)
  <info>  [1563359300.2917] audit: op="connection-delete" uuid="0df1bac3-1131-42d4-8893-4492d5424d11" name="x2" pid=22572 uid=0 result="success"
  <debug> [1563359300.2918] settings-connection[13d79ec95177f9eb,0df1bac3-1131-42d4-8893-4492d5424d11]: disposing

and of course after a `nmcli connection reload` the profile stays hidden:

  <trace> [1563359412.0355] settings: storage[0df1bac3-1131-42d4-8893-4492d5424d11,e45535721abb092a/keyfile]: change event with connection "x1" (file "/etc/NetworkManager/system-connections/x1")
  <trace> [1563359412.0355] settings: storage[0df1bac3-1131-42d4-8893-4492d5424d11,02a430e6ee52358d/keyfile]: change event for hiding profile (file "/etc/NetworkManager/system-connections/0df1bac3-1131-42d4-8893-4492d5424d11.nmmeta")
2019-07-17 12:53:01 +02:00
Thomas Haller
1735a0a8ab settings: add nm_settings_plugin_cmp_by_priority() function
Initially I thought I would use this somewhere else. Didn't do so far,
but this seems a useful function to have on its own because also
NMSettings is concerned about the relative priority of plugins.
2019-07-17 12:51:26 +02:00
Thomas Haller
e1867d917b settings: fix prefering newer keyfile/ifcfg-rh files with duplicate UUIDs 2019-07-17 12:22:25 +02:00