Commit Graph

29638 Commits

Author SHA1 Message Date
Lubomir Rintel
c03d166322 dhcp: include "dhcp6_ntp_server" in Dhcp6Config
Works for the internal DHCP client only as sd-dhcp does the option
parsing for us.

The option 56 is not understood by dhclient so we would need to parse it
ourselves. Let's not do it for now, as the RFC seems to written in a
somewhat poor taste.

https://bugzilla.redhat.com/show_bug.cgi?id=2047415#c2
2022-02-01 15:56:18 +01:00
Thomas Haller
f42de1dfba core/trivial: whitespace 2022-02-01 15:51:07 +01:00
Thomas Haller
dd85cb1958 dhcp: improve error message in assertion of NMDhcpOption data
We have global data NMDhcpOption that describes the DHCP meta data.
There is a consistency check with NM_MORE_ASSERTS.

Improve the error message when the meta data is inconsistent to
help finding the bug.
2022-02-01 15:42:57 +01:00
Fernando Fernandez Mancera
3034b99c00 ovsdb: unrealize removed ovs-interfaces on UNAVAILABLE state
When NetworkManager shuts down, it is not done properly. We cannot
ensure that all pending async operations are cancelled and therefore
there are possible device leaks. This means that not all the devices
will be disposed and finalized because a different component is handling
a reference to it.

Since the l3cfg refactor, this is affecting to ovs ports. When shutting
down sometimes there are ovs-interface or ovs-port devices that are not
being cleared correctly. When starting NetworkManager back, these
devices are not going to be created again because they already exist and
the existing compatible connections will be instruct to use the device.
But currently, ovsdb is only unrealizing a device after removal if the
state is UNMANAGED. This is wrong, because it will left an inconsistent
state in NetworkManager and the ovs-port/ovs-interface connection won't
be activated.

The interfaces removed by ovsdb must be unrealized if they are on
UNAVAILABLE state.

https://bugzilla.redhat.com/show_bug.cgi?id=2029937
2022-01-31 11:46:17 +01:00
Thomas Haller
0f5536d60c device/wwan: add compat define for MM_MODEM_CAPABILITY_5GNR
MM_MODEM_CAPABILITY_5GNR was added in ModemManager 1.14. Add a define
for compatibility with older versions.
2022-01-29 23:43:27 +01:00
Thomas Haller
34dd9d1f1c wwan: merge branch 'th/wwan-5gnr-capability'
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1076
2022-01-29 16:29:19 +01:00
Thomas Haller
068f8dc496 device/wwan: drop deprecated MM_MODEM_CAPABILITY_LTE_ADVANCED
This is long deprecated, and was apparently never even used/exposed
by ModemManager. Drop it.
2022-01-29 16:28:37 +01:00
Thomas Haller
748feaee89 device/wwan: use cleanup macro in get_capabilities() 2022-01-29 16:26:02 +01:00
Thomas Haller
c0f9925de8 device/wwan: static assert that ModemManager and NM capabilities correspond 2022-01-29 16:26:02 +01:00
Thomas Haller
64630f57a2 device/wwan: ensure capabilities are suitable 32 bit flags
The properties NM_DEVICE_MODEM_CAPABILITIES and
NM_DEVICE_MODEM_CURRENT_CAPABILITIES are uint, with a range from zero to
G_MAXUINT32.

nm_modem_get_capabilities() passes the "untrusted" flags from
ModemManager. Ensure that they fit into 32 bit, and don't cause an
assertion failure due to the range check.

Yes, in practice, on all platforms where we build (known to me), guint
is always the same as guint32. So this has little effect.

Also, cast to guint. Previously, this was just a C enum
NMDeviceModemCapabilities, which theoretically has implementation
defined sizes. Yes, in practice, they too are of size guint, and this
was not an actual bug. But be specific about converting between
different integer types.
2022-01-29 16:22:31 +01:00
Thomas Haller
d501e96857 libnm: use MODEM_CAPS_3GPP()/MODEM_CAPS_3GPP2() macros in get_setting_type() 2022-01-29 16:22:30 +01:00
Thomas Haller
8f6423ac06 libnm,core: use NM_FLAGS_ANY() for MODEM_CAPS_3GPP()/MODEM_CAPS_3GPP2()
Macros should (where possible and sensible) behave function-like.
That means for example, that they evaluate arguments only once, and
use parentheses around code that expands, so that unexpected uses
work correctly. The parentheses was missing.

Instead, just use the NM_FLAGS_ANY() macro which gets this right.
2022-01-29 16:22:30 +01:00
Thomas Haller
e9de583bb9 libnm: add "Since" gtkdoc comment to @NM_DEVICE_MODEM_CAPABILITY_5GNR 2022-01-29 16:16:32 +01:00
Daniele Palmas
ca8168775c libnm,core: add 5GNR device modem capability
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1076
2022-01-29 16:15:29 +01:00
Thomas Haller
ead18781ad release: bump version to 1.35.7 (development) 2022-01-28 15:06:13 +01:00
Thomas Haller
81cf70b0c1 libnm: merge branch 'th/libnm-dangling-property-2'
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1075
2022-01-28 11:02:22 +01:00
Thomas Haller
039f0b2803 libnm: add code comments to NMClient 2022-01-28 11:01:53 +01:00
Thomas Haller
125b1f9a9a libnm/tests: enable check for dangling pointer in test_activate_virtual() 2022-01-28 11:01:53 +01:00
Thomas Haller
8eef822093 libnm: fix dangling pointer in "o" properties when unregistering NMObject
When NMClient gets destroyed, it unrefs all NMObject. We need to unbreak
cycles then, and the property getters must return NULL. In particular,
for "o" type properties (NMLDBusPropertyO), this was not done correctly.
For example, calling nm_device_get_active_connection() while/after
destroying the NMClient can give a dangling pointer and assertion
failure. This will also be covered by test_activate_virtual(). Probably
a similar issue can happen, when a D-Bus object gets removed (without
destroying NMClient altogether).

The fix is that nml_dbus_property_o_clear() needs to clear "nmobj". That
is correct, because the pointer is no longer valid and should not be there.
And the unit test shows that in fact a pointer is left there, and
clearing it fixes it.

That was different from an earlier attempt to fix this (in commit 62b2aa85e8
('Revert "libnm: fix dangling pointer in public API while destructing NMClient"')),
where clearing the pointer at a different place broke things. That
attempt was wrong, because nml_dbus_property_o_notify_changed() needs to be the
one that sets/clears nmobj field during a regular update. But the case
here is not a regular update, nml_dbus_property_o_clear() happens during
unregister/cleanup, and then we need to clear the pointer.

Fixes: ce0e898fb4 ('libnm: refactor caching of D-Bus objects in NMClient')

https://bugzilla.redhat.com/show_bug.cgi?id=2039331
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/issues/896
See-also: https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1064

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1075
2022-01-28 11:01:45 +01:00
Beniamino Galvani
9d60cd2813 dhcp: fix crash accepting leases without addresses
For IPv6 the lease doesn't necessarily have an address. If the address
is missing or the DHCP client doesn't implement accept(), we don't
need to wait for the address in platform.

From https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1066#note_1233210 :

  0  0x00007ffff760f88c in __pthread_kill_implementation () at /lib64/libc.so.6
  1  0x00007ffff75c26a6 in raise () at /lib64/libc.so.6
  2  0x00007ffff75ac7d3 in abort () at /lib64/libc.so.6
  3  0x00007ffff77c5d4c in g_assertion_message (domain=<optimized out>, file=<optimized out>, line=<optimized out>, func=<optimized out>, message=<optimized out>)
      at ../glib/gtestutils.c:3223
  4  0x00007ffff782645f in g_assertion_message_expr
      (domain=domain@entry=0x5555559e7c96 "nm", file=file@entry=0x5555559deac0 "src/core/dhcp/nm-dhcp-client.c", line=line@entry=609, func=func@entry=0x5555559e0090 <__func__.31> "l3_cfg_notify_cb", expr=expr@entry=0x5555559df5cf "lease_address") at ../glib/gtestutils.c:3249
  5  0x00005555558b2866 in l3_cfg_notify_cb (l3cfg=0x555555c29790, notify_data=<optimized out>, self=0x555555e9a1b0) at src/core/dhcp/nm-dhcp-client.c:609
  9  0x00007ffff791abe3 in <emit signal ??? on instance ???> (instance=instance@entry=0x555555c29790, signal_id=<optimized out>, detail=detail@entry=0) at ../gobject/gsignal.c:3553
      6  0x00007ffff78fcc7f in g_closure_invoke (closure=0x555555ca3900, return_value=0x0, n_param_values=2, param_values=0x7fffffffd420, invocation_hint=0x7fffffffd3a0)
      at ../gobject/gclosure.c:830
      7  0x00007ffff7919106 in signal_emit_unlocked_R
      (node=node@entry=0x555555bbadc0, detail=detail@entry=0, instance=instance@entry=0x555555c29790, emission_return=emission_return@entry=0x0, instance_and_params=instance_and_params@entry=0x7fffffffd420) at ../gobject/gsignal.c:3742
      8  0x00007ffff791a9ca in g_signal_emit_valist (instance=<optimized out>, signal_id=<optimized out>, detail=<optimized out>, var_args=var_args@entry=0x7fffffffd5f0)
      at ../gobject/gsignal.c:3497
  10 0x000055555564c8a6 in _nm_l3cfg_emit_signal_notify (self=self@entry=0x555555c29790, notify_data=notify_data@entry=0x7fffffffdf30) at src/core/nm-l3cfg.c:576
  11 0x000055555564ce77 in _nm_l3cfg_emit_signal_notify_simple (self=self@entry=0x555555c29790, notify_type=notify_type@entry=NM_L3_CONFIG_NOTIFY_TYPE_POST_COMMIT)
      at src/core/nm-l3cfg.c:585
  12 0x0000555555656082 in _l3_commit (self=self@entry=0x555555c29790, commit_type=NM_L3_CFG_COMMIT_TYPE_UPDATE, commit_type@entry=NM_L3_CFG_COMMIT_TYPE_AUTO, is_idle=is_idle@entry=1)
      at src/core/nm-l3cfg.c:4201
  13 0x0000555555656189 in _l3_commit_on_idle_cb (user_data=user_data@entry=0x555555c29790) at src/core/nm-l3cfg.c:2961
  14 0x00007ffff77f847b in g_idle_dispatch (source=0x555555d65680, callback=0x55555565612c <_l3_commit_on_idle_cb>, user_data=0x555555c29790) at ../glib/gmain.c:5897
  15 0x00007ffff77fc130 in g_main_dispatch (context=0x555555aa5020) at ../glib/gmain.c:3381
  16 g_main_context_dispatch (context=0x555555aa5020) at ../glib/gmain.c:4099
  17 0x00007ffff7851208 in g_main_context_iterate.constprop.0 (context=0x555555aa5020, block=block@entry=1, dispatch=dispatch@entry=1, self=<optimized out>) at ../glib/gmain.c:4175
  18 0x00007ffff77fb853 in g_main_loop_run (loop=0x555555aa5970) at ../glib/gmain.c:4373
  19 0x0000555555593c56 in main (argc=<optimized out>, argv=<optimized out>) at src/core/main.c:509

Fixes: e1648d0665 ('core: commit l3cd asynchronously on DHCP bound event')

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1074
2022-01-27 22:17:46 +01:00
Thomas Haller
a99de89745 supplicant: use nm_ref_string_reset_str() in _properties_changed_main() 2022-01-27 19:04:44 +01:00
Thomas Haller
bd84ba31a5 glib-aux/tests: add tests for nm_ref_string_equal_str() 2022-01-27 19:04:44 +01:00
Thomas Haller
6ae6edb6a8 glib-aux/trival: add code comment to nm_ref_string_equal_str() 2022-01-27 14:35:38 +01:00
Beniamino Galvani
b755539aa6 glib-aux: fix nm_ref_string_equal_str()
Fix comparison with a NULL string.

The only current caller is nm-supplicant-interface.c, and this bug
causes a missing cleanup of the CurrentBSS property on disconnect.

Fixes: ac8c3a7111 ('glib-aux: improve nm_ref_string_equals_str() to work for non-C-strings')

https://bugzilla.redhat.com/show_bug.cgi?id=1983735
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1073
2022-01-27 13:47:57 +01:00
Thomas Haller
7895a9d7e2 man: mention "rd.znet_ifnames" option in man nm-initrd-generator 2022-01-26 23:00:14 +01:00
Thomas Haller
6f3fd32bbb dhcp: for systemd DHCPv6 client always explicitly set prefix-delegation
Beginning with [1], prefix delegation will be always enabled by default. Thus,
always explicitly set it.

[1] 01b4e90f32
2022-01-26 18:22:58 +01:00
Thomas Haller
2cf198d978 release: bump version to 1.35.6 (development) 2022-01-26 17:19:25 +01:00
Beniamino Galvani
dd4386d5c6 merge: branch 'bg/500vlans'
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1066
https://bugzilla.redhat.com/show_bug.cgi?id=2028849
2022-01-26 14:57:43 +01:00
Beniamino Galvani
ce0a36d20f dns: better track l3cd changes
Update DNS only when something relevant changes:

 - an old l3cd gets removed, without adding a new one

 - a new one is added without removing an old one

 - an old is removed and it differs (in routes and DNS) from the new
   added one
2022-01-26 14:54:52 +01:00
Beniamino Galvani
ddaee5d7e6 core: update hostname once at startup
NMPolicy stores the last hostname set in priv->cur_hostname and checks
if it changed before notifying the DNS manager.

_set_hostname() should be called one time early during startup so that
the priv->cur_hostname gets initialized without triggering a DNS
update.
2022-01-26 14:54:52 +01:00
Beniamino Galvani
cb29244552 core: support compare flags in nm_l3_config_data_cmp_full() 2022-01-26 14:54:51 +01:00
Beniamino Galvani
86cd4580f1 core: defer DNS updates until the device enters the SECONDARIES state
I see a significant performance increase with many parallel
activations if DNS updates are deferred to the SECONDARIES state.

Since there is no guarantee that device_l3cd_changed() is called again
when the device becomes ACTIVATED, we need also to change
device_state_changed().
2022-01-26 14:54:51 +01:00
Beniamino Galvani
e1648d0665 core: commit l3cd asynchronously on DHCP bound event
When a lease is obtained, currently NMDevice performs a synchronous
commit of IP configuration and then accepts the lease.

Instead, let NMDevice only schedule a async commit; when the DHCP
client notices that the new address was committed it will
automatically accept it and emit a new signal so that the device can
succeed the activation.

Sync commits should be avoided because a commit does of things which
are outside the control of the caller (see the comment in
nm_device_l3cfg_commit()). Furthermore, when there are many pending
activations, async commits seem to help in reducing the CPU usage.

While making the commit async, also move the responsibility of the
accept() to NMDhcpClient.
2022-01-26 14:54:51 +01:00
Thomas Haller
62b2aa85e8 Revert "libnm: fix dangling pointer in public API while destructing NMClient"
This breaks test @nmcli_monitor. With this patch, `nmcli monitor` no
longer prints "There's no primary connection". Need to investigate why.
For now, revert the patch.

This reverts commit 2afecaf908.
2022-01-25 21:40:38 +01:00
Ana Cabral
a2d2ea6ea6 Merge branch 'ac/gsm' into 'main'
core/wwan: Ensure correct conditions before signal emission

See merge request NetworkManager/NetworkManager!1071
2022-01-25 16:18:59 +00:00
Ana Cabral
e2ee0e6a0d core/wwan: ensure correct conditions before signal emission
Currently, ip4 new config signal is being emitted twice, due
to the lack of a barrier to a possible situation. This
commit includes this.

This fixes a crash on NMCI tests due to an assertion failure,
now it will not go ahead in the function anymore if it is under the
undesired conditions.

The backtrace of the crashes can be found at
https://bugzilla.redhat.com/show_bug.cgi?id=2028385
2022-01-25 17:15:17 +01:00
Ana Cabral
b88ce6a317 core/wwan: fix log domain 2022-01-25 17:15:17 +01:00
Thomas Haller
c6223c5a41 contrib/rpm: fix spec file for CentOS7/RHEL7 for "Suggests:"
Seems "Suggests:" is not supported.
2022-01-25 16:12:24 +01:00
Lubomir Rintel
68f500f5ce initrd: add support for rd.znet_ifnames
This uses interface names specified rd.znet_ifnames on kernel command line
instead of automatically generated names if possible.

Accompanied by a test.

https://bugzilla.redhat.com/show_bug.cgi?id=1980387
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1070
2022-01-25 14:57:22 +01:00
Thomas Haller
3f0ec85634 contrib/rpm: split ifup/ifdown compat scripts to new package NetworkManager-initscripts-updown
Previously (on RHEL<=8 and Fedora<=35), NetworkManager package contains
the compat scripts nm-ifup/nm-ifdown.

If initscripts package (not network-scripts!) is installed, then a RPM
trigger links them as alternatives for the ifup/ifdown commands.

One problem is that `dnf provides /usr/sbin/ifup` lists the
NetworkManager package. Which is technically true, but on RHEL9 where
initscripts is not installed by default, `dnf install NetworkManager`
does not actually create those scripts.

Solve that by moving those scripts to a new subpackage
NetworkManager-initscripts-updown. The %post script now always creates the
alternatives links, regardless whether initscripts package is installed.

Note that on RHEL8, NetworkManager package not only Obsoletes: but also
Suggests: the new package.

The name "initscripts-updown" is chosen because in the future we might
have additonal initscripts/ifcfg related subpackages to contain the
ifcfg-rh plugin (NetworkManager-initscripts-ifcfg) or ifcfg-rh migration
tools (NetworkManager-initscripts-tools).

https://bugzilla.redhat.com/show_bug.cgi?id=2022418

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1061
2022-01-24 17:40:17 +01:00
Thomas Haller
26c43e4bcc libnm/tests: fix race in test test_activate_virtual()
ERROR: src/libnm-client-impl/tests/test-nm-client - Bail out! nm:ERROR:src/libnm-client-impl/tests/test-nm-client.c:807:_dev_eth0_1_state_changed_cb: assertion failed (old_state == NM_DEVICE_STATE_PREPARE): (100 == 40)

Fixes: bc9aa72c88 ('libnm/tests: add unit test for checking dangling pointer in libnm')
2022-01-21 13:44:01 +01:00
Thomas Haller
aafd6cb524 libnm: merge branch 'th/libnm-dangling-property'
https://bugzilla.redhat.com/show_bug.cgi?id=2039331
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/issues/896

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1064
2022-01-21 12:10:25 +01:00
Thomas Haller
2afecaf908 libnm: fix dangling pointer in public API while destructing NMClient
While (and after) NMClient gets destroyed, nm_device_get_active_connection()
gives a dangling pointer. That can lead to a crash. This probably
affects all NMLDBusPropertyO type properties.

It's not clear how to fix that best. Usually, NMClient does updates in
two phases, first it processes the D-Bus events and tracks internal
data, then it emits all GObject signals and notifications.

When an object gets removed from the NMClient cache, then the second
phase is not fully processed, because the object is already removed
from the cache. Thus, the property was not properly cleared leaving
a dangling pointer.

A simple fix is to always clear the pointer during the first phase. Note that
effectively we do the same also for NMLDBusPropertyAO (by clearing the
"pr_ao->arr"), so at least this is consistent.

Somehow it seems that we should make sure that the "second" phase gets
full processed in this case too. But it's complicated, and it's not
clear how to do that. So this solution seems fine.

https://bugzilla.redhat.com/show_bug.cgi?id=2039331
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/issues/896
2022-01-21 12:09:45 +01:00
Thomas Haller
bc9aa72c88 libnm/tests: add unit test for checking dangling pointer in libnm
When destroying NMClient, nm_device_get_active_connection() still
return dangling pointers. Add a unit test for that bug.

Obviously, the bug currently exists, so the relevant code is commented
out.
2022-01-21 12:08:01 +01:00
Thomas Haller
1f9de38a7b tools/tests: set available-connections for vlan device in NM test stub 2022-01-21 12:08:00 +01:00
Thomas Haller
ee3e2e0bb6 glib-aux/tests: add nmtst_test_skip_slow() helper 2022-01-21 12:08:00 +01:00
Thomas Haller
eda2c5ac48 tools: support --no-make-first option in "run-nm-test.sh"
Why? Because I often use a command line like

  $ ./tools/run-nm-test.sh -m src/libnm-client-impl/tests/test-nm-client -p /libnm/device-connection-compatibility

or even alias it to a one character command `x`.
Usually I want to do the rebuild, and as `make` is so slow, it
adds noticeable time running the command. Thus, sometimes I want
to modify the command, for which I have to edit the command from the
history, or toggle two separate commands.

Add a `-M` flag that can reverse the effect of an earlier `-m`.

An "enable" flag in general should just also have a "disable" flag.
2022-01-21 12:08:00 +01:00
Thomas Haller
cb9ca67901 glib-aux: workaround maybe-uninitialized warning with LTO in nm_uuid_generate_from_string_str()
In function 'nm_uuid_unparse',
      inlined from 'nm_uuid_generate_from_string_str' at src/libnm-glib-aux/nm-uuid.c:393:12,
      inlined from 'nm_uuid_generate_from_strings.constprop' at src/libnm-glib-aux/nm-uuid.c:430:16:
  src/libnm-glib-aux/nm-uuid.h:37:12: error: 'uuid' may be used uninitialized [-Werror=maybe-uninitialized]
     37 |     return nm_uuid_unparse_case(uuid, out_str, FALSE);
        |            ^
  src/libnm-glib-aux/nm-uuid.c: In function 'nm_uuid_generate_from_strings.constprop':
  src/libnm-glib-aux/nm-uuid.c:20:1: note: by argument 1 of type 'const struct NMUuid *' to 'nm_uuid_unparse_case.constprop' declared here
     20 | nm_uuid_unparse_case(const NMUuid *uuid, char out_str[static 37], gboolean upper_case)
        | ^
  src/libnm-glib-aux/nm-uuid.c:390:12: note: 'uuid' declared here
    390 |     NMUuid uuid;
        |            ^
  lto1: all warnings being treated as errors

The problem are code paths with failed g_return*() assertions. Being in
a bad state already, they don't bother to ensure proper return values,
and with LTO the compiler might think there are valid code paths wrongly
handled. Work around.
2022-01-21 11:38:08 +01:00
Thomas Haller
3dd854eb1b device: initialize nm_auto variable in _ethtool_features_reset()
The compiler is often adament to warn about maybe-uninitialized.
2022-01-21 11:38:08 +01:00
Thomas Haller
2395bedd63 wifi/iwd: merge branch 'balrog-kun:iwd-p2p'
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1017
2022-01-21 11:16:40 +01:00