Commit Graph

27030 Commits

Author SHA1 Message Date
Thomas Haller
5f23d691bf l3cfg: add nm_l3_config_data_new_from_platform() for capturing settings
It basically does what nm_ip4_config_capture() and
nm_ip6_config_capture() does.
2020-07-24 16:12:22 +02:00
Thomas Haller
b44f7dce40 core: add nm_platform_dedup_multi_iter_next_*() helpers to "nmp-object.h"
This code is not specific to "nm-ip4-config.h"/"nm-ip6-config.h".
It applies to everybody who wants to iterate over a dedup-multi-index of
certain NMPObjects. Move it.
2020-07-24 16:10:05 +02:00
Thomas Haller
67bfcb49c9 core: use nm_platform_ip[46]_address_pretty_sort_cmp() in "nm-ip[46]-config.c" 2020-07-24 16:10:04 +02:00
Thomas Haller
83bc1e8d60 platform: use NM_CMP_*() macros in nm_platform_ip[46]_address_pretty_sort_cmp()
They ensure to consistently return -1, 0, 1. Also, I think they are
easier to understand.

What is in general hard to understand, whether a comparison sorts
ascending or descending. The macros maybe make that easier too, but it's
still confusing. That's why we have a test.
2020-07-24 16:10:04 +02:00
Thomas Haller
d7608f32a6 platform: add nm_platform_ip[46]_address_pretty_sort_cmp()
This is the code from _addresses_sort_cmp() in "nm-ip[46]-config.h"
and will replace it soon.
2020-07-24 16:10:04 +02:00
Thomas Haller
be655e6ed1 core: read "disable_ipv6" sysctl before nm_ip6_config_create_setting()
First of all, the entire nm_device_generate_connection() and
nm_ip._config_create_setting() approach is fundamentally flawed. You
cannot generate sensible configuration by reading IP addresses from
an interface. Anyway, that's what we still sometimes do, and we possibly
should do it less and less.

It's ugly that nm_ip6_config_capture() would read the "disable_ipv6"
sysctl value and cache it in NMIP6Config. Only so that it can be use
much later during nm_ip6_config_create_setting().

Instead, read the sysctl value shortly before it's needed.
2020-07-24 16:03:15 +02:00
Thomas Haller
b15c85cf8b core: move nm_utils_ip4_address_is_link_local() to header file
It's so simple, let's move it so it can be inlined.
2020-07-24 16:03:15 +02:00
Thomas Haller
b2df6fde30 shared/tests: add nmtst_stable_rand()
Generate a list of pseudo random numbers, the important part here is that
the result is stable and independent of endianness.
2020-07-24 16:03:15 +02:00
Thomas Haller
a8517423c7 shared: add nm_strv_ptrarray_clone() helper 2020-07-24 16:03:15 +02:00
Thomas Haller
c470cbf705 shared: add nm_copy_func_g_strdup() helper 2020-07-24 16:03:15 +02:00
Thomas Haller
66d4af6daf shared: add compat function nm_g_ptr_array_copy() for older glib
This is not in "nm-glib.h", because it's not a complete replacement.
In glib before 2.62, it's not possible to implement g_ptr_array_copy()
as glib provides it, because the element_free_func is not accessible.

So, instead add our own implemented, which follows glib's version as
much as it can.
2020-07-24 16:03:15 +02:00
Thomas Haller
8346870aa6 shared: add nm_assert_unreachable_val() macro 2020-07-24 16:03:15 +02:00
Beniamino Galvani
9c09dcedaf device: downgrade warning about IPv6 MTU if IPv6 is disabled
If IPv6 is disabled, changing the IPv6 MTU fails and NM complains with
a warning. Since this error is expected and doesn't do any harm,
downgrade the logging level to DEBUG.

Since IPv6 kernel support can be built as a module, we have to check
the existence of /proc/sys/net/ipv6 every time. Instead of checking it
and then setting the MTU (adding one /proc access for everyone), just try
to set the MTU; in case of failure, determine the reason for the error.

https://bugzilla.redhat.com/show_bug.cgi?id=1840989
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/585
2020-07-24 13:41:31 +02:00
tk906328
cb73d0b1e2 libnm-core: avoid compiler warning in nm_connection_to_dbus_full()
Deal with compiling warning about variable not initialized before use.

[thaller@redhat.com: reworded original commit message]

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/587
2020-07-24 09:12:30 +02:00
Thomas Haller
4cc93e1f80 core: merge branch 'th/l3cfg-1'
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/583
2020-07-23 23:27:44 +02:00
Thomas Haller
a1dbaf5799 l3cfg: add NML3ConfigData
Currently NMIP4Config and NMIP6Config both track the data to be
configured, they expose properties on D-Bus, and they have logic for
capturing and applying settings to platform.

We will split that.

- NMIP4Config and NMIP6Config will expose data on D-Bus.

- NML3Cfg will have the logic for handling IP configuration.

- NML3ConfigData will track data to be configured.

NML3ConfigData mirrors NMIP4Config/NMIP6Config in many aspects. For now,
this duplicates a lot of code. More will be done later. Eventually,
NMIP4Config/NMIP6Config will drop the duplicated functionality.
2020-07-23 15:29:25 +02:00
Thomas Haller
6e8a987763 l3cfg: add nm_l3cfg_property_emit_register() API
The NML3Cfg instance tracks and prepares the IP configuration.
However, that is also partly exposed on other objects, like
NMIP4Config's "route-data" property.

Add an API, so that NMIP4Config can register itself to be notified
when something relevant changes.

This is an alternative to standard GObject properties and signals. They
often seem more effort than worth. That is, because in this case,
NMIP4Config.route-data has no other task then to re-emit the signal.
So, to implement that with GObject properties/signals, we would have to
add a property/signal to NML3Cfg, subscribe to it from NMIP4Config,
and remit the signal. An alternative is to bind properties, but that
would still be quite some extra code, and unclear that it would be
simpler. Not to mention the overhead, as bindings are themself full
GObject instances, that register to and emit signals by name.
2020-07-23 15:29:25 +02:00
Thomas Haller
2eb5639a30 l3cfg: add NML3CfgPrivate data
We have several fields in the header file, so that the frequently used accessors
can be inlined. However, we also want some private data. Add a structure for that.
2020-07-23 15:29:25 +02:00
Thomas Haller
62ea998d32 l3cfg: track ifname in NML3Cfg 2020-07-23 15:29:25 +02:00
Thomas Haller
b5c563329a l3cfg: notify NML3Cfg about NMPlatform changes in an idle handler
We need to react to platform changes. Also, we usually want to delay the
reaction to an idle handler.

Instead of subscribing each NML3Cfg instance itself to platform changes,
let only NMNetns do that. The goal is of course that each platform event
only needs to notify the NML3Cfg instance, which collects the events and
schedules them on the idle handler.
2020-07-23 15:29:25 +02:00
Thomas Haller
ea1f0fc0a6 device: let NMDevice track a NML3Cfg instance for each ifindex 2020-07-23 15:29:25 +02:00
Thomas Haller
88d057978d core: add "nm-l3cfg.[hc]" 2020-07-23 15:29:24 +02:00
Thomas Haller
d32074e2b6 device: simplify device_ip_link_changed() for setting ip_iface
_ip_iface_update() only had one caller. The code is simpler to
understand by inlining it.

Also, it is relevant where and how we set ip_iface_ and ip_ifindex_
fields. Keep the places few and easily understandable.
2020-07-23 15:29:24 +02:00
Thomas Haller
5c273efb36 core: use nm_utils_parse_inaddr_prefix_bin() in nm_utils_ip_route_attribute_to_platform()
We already have an implementation for parsing an address/plen string.
Use it.
2020-07-23 15:29:24 +02:00
Thomas Haller
4127c88ad2 core: move _nm_ip_config_merge_route_attributes() to "NetworkManagerUtils.c"
and rename to nm_utils_ip_route_attribute_to_platform(). The function is independent
from NMIP4Config. We also will use it outside of NMIP4Config. Also, "NetworkManagerUtils.c"
already has similar functions that parse libnm structures to internal structures.
2020-07-23 15:29:24 +02:00
Thomas Haller
348d721b3f core: use nmp_object_ip_route_is_best_defaut_route() in NMIP4Config 2020-07-23 15:29:24 +02:00
Thomas Haller
3f771c55ac core: use nmp_object_ref_set() instead of _nm_ip_config_best_default_route_set()
_nm_ip_config_best_default_route_set() doesn't really do anything
special. Use the generic helper function for the same job.

Also because NMIP4Config in the current form will be replaced by
something else, and this code needs to change.
2020-07-23 15:29:24 +02:00
Thomas Haller
84d93315d8 platform: add nmp_object_ip_route_is_best_defaut_route() helper 2020-07-23 15:29:24 +02:00
Thomas Haller
d4b7a3c27e platform: add nmp_object_ref_set() helper 2020-07-23 15:29:24 +02:00
Thomas Haller
04be1dbd80 platform: add NMP_OBJECT_GET_ADDR_FAMILY() helper 2020-07-23 15:29:23 +02:00
Thomas Haller
bc3439d14f platform: add nmp_object_link_get_ifname() helper 2020-07-23 15:29:23 +02:00
Thomas Haller
fb6e9795b7 shared: add nm_g_array_append_new() helper 2020-07-23 15:29:23 +02:00
Thomas Haller
99296d4c6c shared: add nm_strv_ptrarray_ensure() and nm_strv_ptrarray_find_first() helpers 2020-07-23 15:29:23 +02:00
Thomas Haller
7ae8100d7a shared: add NM_IS_IPv4() macro
This is of course trivial. However, we use this macro at several places
as and index into an array of length 2, to lookup either the IPv4 or
IPv6 element. As such, this MUST return 0 or 1. This promise is what the
macro should convey.
2020-07-23 15:29:23 +02:00
Thomas Haller
56a0aa06ac shared: move addr-family helpers to "nm-std-aux.h"
Handling address families is something we do all over the place.
Move some simple helper code to "nm-std-aux.h".
2020-07-23 15:29:23 +02:00
Thomas Haller
97770bc7a8 shared: add nm_g_object_ref_set_take() helper macro 2020-07-23 15:29:23 +02:00
Thomas Haller
ace515e697 shared: add nm_hash_obfuscated_ptr_str() helper 2020-07-23 15:29:23 +02:00
Thomas Haller
1e870c675d shared: avoid heap allocation for temporary string in nm_utils_parse_inaddr_prefix_bin() 2020-07-23 15:29:22 +02:00
Thomas Haller
e9b84221de device: emit rx-bytes/tx-bytes change notification together
This also groups the PropertiesChanged signal on D-Bus.
2020-07-23 15:29:22 +02:00
Thomas Haller
abce548222 shared: don't freeze in nm_gobject_notify_together() unless necessary
nm_gobject_notify_together() is supposed to emit one or more property changed
notifications, but with freezing (and thawing) the notifications.

Also, we want to allow the user to pass PROP_0, for skipping emitions.
The point is code like

  nm_gobject_notify_together (obj,
                              PROP_FOO,
                              bar_changed ? PROP_BAR : PROP_0);

Optimize the code to only freeze/thaw the notifications, if we are
actually notifying more than one properties.
2020-07-23 15:29:19 +02:00
Beniamino Galvani
e6acf64859 libnm-core: support 'clsact' qdisc
The 'clsact' qdisc is similar to 'ingress' but supports both ingress
and egress [1]. It uses the same handle as 'ingress' and has two child
classes :fff2 (ingress) and :fff3 (egress) on which filters can be
attached.

With clsact, for example, it becomes possible to do port mirroring
with a single qdisc:

  nmcli connection modify mirror +tc.qdisc "clsact"
  nmcli connection modify mirror +tc.tfilter
    "parent ffff:fff3 matchall action mirred egress mirror dev dummy1"
  nmcli connection modify mirror +tc.tfilter
    "parent ffff:fff2 matchall action mirred egress mirror dev dummy1"

instead of two (ingress + i.e. prio). We don't support yet the
symbolic names 'ingress' and 'egress' for :fff2 and :fff3 in the
filter.

See-also: https://bugzilla.redhat.com/show_bug.cgi?id=1436535

[1] https://lwn.net/Articles/671458/
2020-07-23 14:12:02 +02:00
Thomas Haller
2a1bac6b8a core: fix selecting of best-default-route to consider only unicast routes
Fixes: 5d0d13f570 ('platform: add support for local routes')
2020-07-21 18:13:45 +02:00
Thomas Haller
5035687a7b core: only expose "type unicast" routes on D-Bus
Currently, we would not mark non-unicast routes with their type, so they
would wrongly appear as unicast routes in the D-Bus API.

That is wrong. For now, just hide them.

Fixes: 5d0d13f570 ('platform: add support for local routes')
2020-07-21 13:52:26 +02:00
Charlie Getzen
e7d2ea95ba man: update nmcli.xml wording
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/582
2020-07-21 09:14:16 +02:00
Beniamino Galvani
116c49fceb merge: branch 'bg/sleep-unmanaged-rh1855563'
https://bugzilla.redhat.com/show_bug.cgi?id=1855563
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/580
2020-07-21 09:01:09 +02:00
Beniamino Galvani
725fed01cf policy: block connection from autoconnect in case of failed dependency
A connection that fails due to dependency-failed is not able to
reconnect until the master connection activates again; when this
happens, the master clears the blocked reason for all its slaves in
activate_slave_connections() and tries to reconnect them. For this to
work, the slave should be marked as blocked when it fails with
dependency-failed.
2020-07-21 09:00:53 +02:00
Beniamino Galvani
fe2d93980b manager: fix race condition when resuming from sleep
If the device state change (to disconnected or unmanaged) triggered by
a sleep event happens after the wake, the devices becomes wrongly
unmanaged and it's necessary to manually manage it again, or restart
NM.

During the wake event we should disconnect the device_sleep_cb()
callback for all devices because we don't want to react to state
changes anymore; in particular we don't need to detect when the device
becomes disconnected to unmanage it.
2020-07-21 09:00:52 +02:00
Thomas Haller
e73bd2cf5f cloud-setup: always replace addresses, routes and rules in _nmc_mangle_connection()
If the list of addresses, routes and rules is empty, we still want to mangle
the applied connection, to also have an empty list.

nm-cloud-setup has certain expectations. For example, that the static addresses,
routes and rules of the active connection is entirely under the control of the
tool. For example, so it usually replaces the lists entirely. It also should do
that, if the new list is empty.

Maybe, one day there could be more complex merging strategies, where the user could
also add static addresses, routes, or rules to the profile, and nm-cloud-setup
would preserve them. However, that is not implemented, nor is it clear how exactly
that would work.
2020-07-20 19:02:57 +02:00
Thomas Haller
6f29ed9f3f device: fix setting %NULL iface in nm_device_update_from_platform_link()
Fixes: f004e7b1a7 ('device: mark ifindex/iface fields of NMDevicePrivate as const')
2020-07-20 16:11:48 +02:00
Thomas Haller
cb4fb0ac06 core: use nm_streq*() instead of strcmp() in "nm-device.c" and "nm-manager.c" 2020-07-20 13:55:22 +02:00