Commit graph

28586 commits

Author SHA1 Message Date
Thomas Haller
3dfd563601
libnm: add type enum for handling gprop differences in to_dbus_fcn
For GBytes, GEnum, GFlags and others, we need special converters from the
default GObject properties to GVariant.

Previously, those were implemented by providing a special
gprop_to_dbus_fcn hook. But gprop_to_dbus_fcn should move
from NMSettInfoPropertType to NMSettInfoProperty, because it's
usually a per-property meta data, and not a per-property-type meta data.
The difference is whether the meta data can be shared between different
properties (of the same "type).

In these cases, this extra information is indeed part of the type.
We want to have a generic NM_SETT_INFO_PROPERT_TYPE_GPROP() property
(using _nm_setting_property_to_dbus_fcn_gprop()), but then we would like
to distinguish between special cases. So this was fine.

However, I find the approach of providing a gprop_to_dbus_fcn in this
case cumbersome. It makes it harder to understand what happens. Instead,
introduce a new "gprop_type" for the different types that
_nm_setting_property_to_dbus_fcn_gprop() can handle.

This new "gprop_type" is extra data of the property type, so
introduce a new field "typdata_to_dbus".

(cherry picked from commit ac090edd87)
2021-06-23 13:02:19 +02:00
Thomas Haller
d2e0a8cc0e
libnm: add and use NM_SETT_INFO_PROPERT_TYPE_*_INIT() macros
The advantage is that we use similar macros for initializing the
static structs like

   const NMSettInfoPropertType nm_sett_info_propert_type_cloned_mac_address;

and the ad-hoc locations that use NM_SETT_INFO_PROPERT_TYPE().

The former exist for property types that are used more than once.
The latter exist for convenience, where a property type is implemented
at only one place.

Also, there are few direct references to _nm_setting_property_to_dbus_fcn_gprop().
all users use NM_SETT_INFO_PROPERT_TYPE_GPROP() or
NM_SETT_INFO_PROPERT_TYPE_GPROP_INIT().

(cherry picked from commit 6fc2e03677)
2021-06-23 13:02:18 +02:00
Thomas Haller
0d95b3c300
libnm: add and use NM_SETT_INFO_PROPERT_TYPE_DBUS() macro
(cherry picked from commit 69597a67c1)
2021-06-23 13:02:17 +02:00
Thomas Haller
db9ae06cfd
libnm: let all property types implement to_dbus_fcn() handler
If a property can be converted to D-Bus, then always set the
to_dbus_fcn() handler. The only caller of to_dbus_fcn() is
property_to_dbus(), so this means that property_to_dbus()
has no more default implementation and always delegates to
to_dbus_fcn().

The code is easier to understand if all properties implement
to_dbus_fcn() the same way.

Also, there is supposed to be a split between NMSettInfoProperty (info about
the property) and NMSettInfoPropertType (the type). The idea is that
each property (obviously) requires its distinct NMSettInfoProperty, but
they can share a common type implementation.
With NMSettInfoPropertType.gprop_to_dbus_fcn that is often violated because
many properties that implement NMSettInfoPropertType.gprop_to_dbus_fcn
require a special type implementation. As such, gprop_to_dbus_fcn should
be part of the property info and not the property type. The first step towards
that is unifying all properties to use to_dbus_fcn().

(cherry picked from commit c161439b73)
2021-06-23 13:02:17 +02:00
Thomas Haller
e4898f98e0
libnm: add NM_SETTING_PARAM_NONE define
This completes other NM_SETTING_PARAM_* flags.

(cherry picked from commit c54be51f99)
2021-06-23 13:02:16 +02:00
Thomas Haller
1ebef50603
libnm: drop unused parameter "ignored_default" from property_to_dbus()
(cherry picked from commit 4065158491)
2021-06-23 13:02:16 +02:00
Thomas Haller
3e58861336
libnm: simplify assertions for valid NMSettInfoProperty
(cherry picked from commit 21638c54b0)
2021-06-23 13:02:16 +02:00
Thomas Haller
d19c0937d4
libnm: expose internal helper nm_utils_hwaddr_to_dbus()
(cherry picked from commit 8081e39ab6)
2021-06-23 13:02:15 +02:00
Thomas Haller
445d01e2c6
glib-aux: add NM_G_PARAM_SPEC_GET_DEFAULT_STRING() helper
(cherry picked from commit 87229b22ae)
2021-06-23 13:02:15 +02:00
Thomas Haller
d99e20e436
glib-aux: add nm_g_variant_singleton_s_empty() helper
(cherry picked from commit e2defd0115)
2021-06-23 13:02:15 +02:00
Thomas Haller
b33ba1ef5c
glib-aux: add nm_g_variant_singleton_b() helper
(cherry picked from commit edb31252cc)
2021-06-23 13:02:15 +02:00
Thomas Haller
aa1be0559d
config: merge branch 'th/config-match-lookup'
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/894

(cherry picked from commit 3e7a589972)
2021-06-21 17:31:07 +02:00
Thomas Haller
e1d28afe4b
config: avoid cloning string during nm_config_data_get_connection_default() et al.
NMConfigData is immutable and with the previous commit are the strings
already cached internally. There is no need to clone it.

Of course, the callers must not assume that the string stays alive after
a config reload (SIGHUP), where the NMConfigData might change. So they
are not always alive, but long enough for all callers to avoid cloning
the string.

(cherry picked from commit 9452d69465)
2021-06-21 17:31:06 +02:00
Thomas Haller
ba2a6ee384
config: add lookup index for _match_section_infos_lookup()
Previously, we would call g_key_file_get_string(), which requires
two hash lookups (one for the group and one for the key).

We can do better. Especially since NMConfigData is immutable, it's
simple to build a lookup index of the values we have and then do binary
search.

Note that we call nm_config_data_get_connection_default() and similar
API *a lot*, so this is measurable.

(cherry picked from commit 2f9ab1d528)
2021-06-21 17:31:06 +02:00
Thomas Haller
34e4364558
core: use nm_config_data_get_device_config_int64() for getting integer setting
(cherry picked from commit b929caa95c)
2021-06-21 17:31:05 +02:00
Thomas Haller
6bbf1b14c9
config: add nm_config_data_get_device_config_int64() helper
(cherry picked from commit a6c9f2518e)
2021-06-21 17:31:05 +02:00
Thomas Haller
cc5a0f517e
glib-aux: cleanup nm_utils_named_value_clear_with_g_free() implementation
(cherry picked from commit 42ba464380)
2021-06-21 17:31:05 +02:00
Thomas Haller
2fe9d99fc0
all: merge branch 'th/connection-track-setting-rework'
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/890

(cherry picked from commit 8f3892ba3e)
2021-06-21 17:25:46 +02:00
Thomas Haller
c11559ffa8
core: avoid checking sort order for cached settings list
We now have a cached list of NMSettingsConnection instances,
sorted by their autoconnect priority.

However, the sort order nm_settings_connection_cmp_autoconnect_priority()
depends on various properties of the connection:

 - "connection.autoconnect" and "connection.autoconnect-priority"
 - the timestamp
 - "connection.uuid"

These properties almost never change, so it's a waste that every call
to nm_settings_get_connections_sorted_by_autoconnect_priority() needs
to check whether the sort order is still satisfied.

We can do better by tracking when the sort order might have been
destroyed and only check in those (much fewer) cases.

Note that we end up calling nm_settings_get_connections_sorted_by_autoconnect_priority()
a lot, so this makes a difference.

(cherry picked from commit 877d2b236f)
2021-06-21 17:25:44 +02:00
Thomas Haller
124627151f
core: cache GVariant for result of GetSettings()
The GetSettings() call is not the only place where we convert a
NMConnection to D-Bus. However it is one of the most prominent ones
with a measurable performance overhead.

The connection seldom changes, so it makes sense to cache it.

Note that GetSettings() is the only caller that specifies an option,
thus it's the only caller that converts a NMConnection to variant
in this particular way. That means, other callers don't benefit from
this caching and we could not cache the variant in the NMConnection
instance itself, because those callers use different parameters.

(cherry picked from commit 252e4a676b)
2021-06-21 17:25:43 +02:00
Thomas Haller
b9d4f7dd00
libnm: add nm_connection_serialization_options_equal() helper
(cherry picked from commit cea52c7cbd)
2021-06-21 17:25:42 +02:00
Thomas Haller
91e6f4ff52
glib-aux: add NM_STRV_EMPTY_CC() helper macro
(cherry picked from commit 92daaff7d1)
2021-06-21 17:25:41 +02:00
Thomas Haller
feb262f24d
libnm: add helper functions for emitting signals in NMConnection
Not very useful, but it seems nicer to read. They anyway can be
inlined. After all, naming and structure is important and the places
where we emit signals are important. By having well-named helper
functions, these places are easier to find and reason about.

(cherry picked from commit 60957a4c8a)
2021-06-21 17:25:40 +02:00
Thomas Haller
bce9de78d9
core: add nm_settings_get_connection_sorted_by_autoconnect_priority()
Turns out, we call nm_settings_get_connection_clone() *a lot* with sort order
nm_settings_connection_cmp_autoconnect_priority_p_with_data().

As we cache the (differently sorted) list of connections, also cache
the presorted list. The only complication is that every time we still
need to check whether the list is still sorted, because it would be
more complicated to invalidate the list when an entry changes which
affects the sort order. Still, such a check is usually successful
and requires "only" N-1 comparisons.

(cherry picked from commit e7b5650eff)
2021-06-21 17:25:40 +02:00
Thomas Haller
ecdd64cb1d
core: add nm_settings_connection_cmp_autoconnect_priority_with_data() helper
(cherry picked from commit 1f09e13f43)
2021-06-21 17:25:39 +02:00
Thomas Haller
830c970196
glib-aux: add nm_utils_ptrarray_is_sorted() helper
(cherry picked from commit f51d3862f9)
2021-06-21 17:25:38 +02:00
Thomas Haller
c5914709f2
core: avoid undefined behavior comparing plain pointer values in _cmp_last_resort()
(cherry picked from commit 85df025e93)
2021-06-21 17:25:38 +02:00
Thomas Haller
5ccbe04788
libnm: optimize NM_CONNECTION_GET_PRIVATE() for NMSimpleConnection
NMConnection is a glib interface, implemented only by NMSimpleConnection
and NMRemoteConnection.

Inside the daemon, every NMConnection instance is always a NMSimpleConnection.

Using glib interfaces has an overhead, for example NM_IS_CONNECTION() needs
to search the implemented types for the pointer. And NM_CONNECTION_GET_PRIVATE()
is implemented by attaching user data to the GObject instance. Both have measurable
overhead.

Special case them for NMSimpleConnection.

This optimizes primarily the call to nm_connection_get_setting_connection(),
which easily gets called millions of times. This is easily measurable.

(cherry picked from commit 7a71aedf46)
2021-06-21 17:25:37 +02:00
Thomas Haller
1c6b50f6ea
libnm: add code comment about preserving ABI for libnm GObject structs
(cherry picked from commit f3abf2491a)
2021-06-21 17:25:36 +02:00
Thomas Haller
c4257c1c7f
libnm: avoid cloning buffer for nm_connection_get_settings() in nm_keyfile_write()
(cherry picked from commit b0f4bb84bf)
2021-06-21 17:25:36 +02:00
Thomas Haller
919618372c
libnm: add _nm_connection_get_settings_arr() helper
(cherry picked from commit 5aef93355f)
2021-06-21 17:25:36 +02:00
Thomas Haller
4949434dac
libnm: take reference to settings in nm_connection_for_each_setting_value()
As we iterate over the settings, let's ensure that they stay
alive while we call back to the user data.

(cherry picked from commit 207b101238)
2021-06-21 17:25:35 +02:00
Thomas Haller
eb10539b80
libnm: avoid cloning list of settings in nm_connection_to_dbus_full()
(cherry picked from commit d829849a7b)
2021-06-21 17:25:35 +02:00
Thomas Haller
07ba3cb0d7
libnm: implement nm_connection_get_setting*() via NMMetaSettingType
The NM_TYPE_SETTING_* macros are really function calls (to a GType/gsize which is
guarded by an atomic operation for thread safe initialization). Also, finding
the setting_info based on the GType requires additional lookups.

It's no longer necessary. We can directly find the setting using the
well known index.

(cherry picked from commit 97eef2bf6d)
2021-06-21 17:25:35 +02:00
Thomas Haller
61013c6995
libnm: avoid cloning list of settings in _nm_connection_verify()
(cherry picked from commit c8c606b323)
2021-06-21 17:25:35 +02:00
Thomas Haller
0a22f4e490
libnm: refactor tracking of NMSetting in NMConnection
A NMConnection tracks a list of NMSetting instances. For
each setting type, it only can track one instance, as is
clear by the API nm_connection_get_setting().

The number of different setting types is known at compile time,
currently it is 52. Also, we have an NMMetaSettingType enum,
which assigns each type a number.

Previously, we were tracking the settings in a GHashTable.
Rework that, to instead use a fixed size array.

Now every NMConnection instance consumes 52 * sizeof(pointer)
for the settings array. Previously, the GHashTable required to malloc
the "struct _GHashTable" (on 64bit that is about the size of 12
pointers) and for N settings it allocated two buffers (for
the key and the values) plus one buffer for the hash values. So,
it may or may not consume a bit more memory now, but also can lookup
settings directly without hashing.

When looking at all settings, we iterate the entire array. Most
entries will be NULL, so it's a question whether this could be done
better. But as the array is of a fixed, small size, naive iteration
is probably still faster and simpler than anything else.

---

Test: compiled with -O2, x86_64:

  $ T=src/core/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh; \
    make -j 8 "$T" && \
    "$T" 1>/dev/null && \
    perf stat -r 200 -B "$T" 1>/dev/null

Before:

 Performance counter stats for 'src/core/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh' (200 runs):

            338.39 msec task-clock:u              #    0.962 CPUs utilized            ( +-  0.68% )
                 0      context-switches:u        #    0.000 K/sec
                 0      cpu-migrations:u          #    0.000 K/sec
             1,121      page-faults:u             #    0.003 M/sec                    ( +-  0.03% )
     1,060,001,815      cycles:u                  #    3.132 GHz                      ( +-  0.50% )
     1,877,905,122      instructions:u            #    1.77  insn per cycle           ( +-  0.01% )
       374,065,113      branches:u                # 1105.429 M/sec                    ( +-  0.01% )
         6,862,991      branch-misses:u           #    1.83% of all branches          ( +-  0.36% )

           0.35185 +- 0.00247 seconds time elapsed  ( +-  0.70% )

After:

 Performance counter stats for 'src/core/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh' (200 runs):

            328.07 msec task-clock:u              #    0.959 CPUs utilized            ( +-  0.39% )
                 0      context-switches:u        #    0.000 K/sec
                 0      cpu-migrations:u          #    0.000 K/sec
             1,130      page-faults:u             #    0.003 M/sec                    ( +-  0.03% )
     1,034,858,368      cycles:u                  #    3.154 GHz                      ( +-  0.33% )
     1,846,714,951      instructions:u            #    1.78  insn per cycle           ( +-  0.00% )
       369,754,267      branches:u                # 1127.052 M/sec                    ( +-  0.01% )
         6,594,396      branch-misses:u           #    1.78% of all branches          ( +-  0.23% )

           0.34193 +- 0.00145 seconds time elapsed  ( +-  0.42% )

(cherry picked from commit 91aacbef41)
2021-06-21 17:25:34 +02:00
Thomas Haller
5e3401fa31
libnm/tests: test consistency for nm_meta_setting_types_by_priority
(cherry picked from commit 042cd99049)
2021-06-21 17:25:34 +02:00
Thomas Haller
481e229450
libnm: add nm_meta_setting_types_by_priority array for sorting settings
nm_meta_setting_infos is a list of all NMMetaSettingInfo, sorted by name.
Add nm_meta_setting_types_by_priority which provides a mapping with a
different sort order (first by priority). We need that sometimes.

(cherry picked from commit b7a7cc1b13)
2021-06-21 17:25:34 +02:00
Thomas Haller
4b3ba8f82b
libnm: pack NMMetaSettingType enum
We keep the enum around in memory, so let's make it smaller/packed.

(cherry picked from commit 1a5a4838f1)
2021-06-21 17:25:34 +02:00
Thomas Haller
be9b6e8c01
libnm: add nm_meta_setting_info helpers
(cherry picked from commit 16b01233fa)
2021-06-21 17:25:34 +02:00
Thomas Haller
418ce1b27c
dhcp/systemd: ignore FORCERENEW requests for DHCPV4 to workaround CVE-2020-13529
The FORCERENEW reqest was not authenticated (because neither rfc3118 nor
rfc6704) is implemented. That is a potential security issue.

As workaround, patch the source to ignore those requests. Note that also
nettools implementation ignores FORCERENEW requests, so if there would
be a need to handle them, then it would be important to improve the
nettools code (which is the main implementation).

The systemd DHCP plugin is no longer used by default. The user explicitly has to
enable it via the undocumented "[main].dhcp=systemd" option in NetworkManager.conf.
Hence, this change is probably not very important either way.

See-also: https://bugzilla.redhat.com/show_bug.cgi?id=1959398
See-also: https://github.com/systemd/systemd/issues/16774
https://bugzilla.redhat.com/show_bug.cgi?id=1966123
CVE-2020-13529

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/898
(cherry picked from commit 1441b04bba)
2021-06-21 16:26:04 +02:00
Beniamino Galvani
2632bb9273 merge: branch 'bg/rh1820770'
https://bugzilla.redhat.com/show_bug.cgi?id=1820770
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/889

(cherry picked from commit 5995653312)
2021-06-21 10:14:19 +02:00
Beniamino Galvani
c8c7e8320b device: prefer IPv6 not-deprecated addresses for hostname lookup
In presence of a IPv6 deprecated address and a non-deprecated one, the
latter will be used by kernel for new connections according to RFC
6724 section 5 (Source Address Selection). Prefer it also to lookup a
hostname via reverse DNS.

While at it, also prefer non-link-local addresses over link-local
ones.

(cherry picked from commit 3c55db886a)
2021-06-21 10:14:19 +02:00
Beniamino Galvani
2ca56c9bbd libnm-platform: add NM_PLATFORM_MATCH_WITH_ADDRSTATE_DEPRECATED
Add a new flag to match deprecated addresses. An address is deprecated
when its preferred lifetime has expired but its valid lifetime has
not.

Address deprecation is one of the criteria for source address
selection in IPv6. For IPv4 the deprecation doesn't have any
real effect.

Note that this commit changes the behavior of
nm_ip_config_get_first_address(WITH_ADDRSTATE_NORMAL), since now
deprecated addresses are not returned. However this should not impact
existing callers since they either:

 - request a IPv6 (WITH_ADDRTYPE_LINKLOCAL | WITH_ADDRSTATE_NORMAL)
   address; IPv6 link-local addresses are supposed to have infinite
   lifetimes;

 or

 - request a IPv6 (WITH_ADDRTYPE_NORMAL | WITH_ADDRSTATE__ANY)
   address.

(cherry picked from commit ff84a4736d)
2021-06-21 10:14:19 +02:00
Beniamino Galvani
a3a282677b core: add nm_ip_config_find_first_address()
Replace nm_ip6_config_find_first_address() with a version generic for
IPv4 and IPv6.

(cherry picked from commit ca31cbbc74)
2021-06-21 10:14:19 +02:00
Beniamino Galvani
786ab294db libnm-platform: add nm_platform_ip_address_match()
Replace nm_platform_ip6_address_match() with a version generic for
IPv4 and IPv6.

(cherry picked from commit 376c7f8315)
2021-06-21 10:14:19 +02:00
Thomas Haller
a1f4255f71
NEWS: belatedly add news entry for 1.32.0
(cherry picked from commit 89af6be1d6)
2021-06-21 10:00:44 +02:00
Beniamino Galvani
21051dc6d8 policy: prefer IPv4 to determine the hostname
When determining the hostname, it is preferable to evaluate devices in
a predictable order to avoid that the hostname changes between
different boots.

The current order is based first on hostname priority, then on the
presence of a best default route, and then on activation order.

The activation order is not a very strong condition, as it is
basically useless for devices that are autoactivated at boot.

As we already prefer IPv4 over IPv6 within the same connection, also
prefer it when 2 connections have the same priority and the same
default route status, to achieve better predictability.

https://bugzilla.redhat.com/show_bug.cgi?id=1970335
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/895
(cherry picked from commit 637a45e25b)
2021-06-21 08:57:30 +02:00
Thomas Haller
229b9a979c
release: bump version to 1.32.1 (development) 2021-06-16 19:48:59 +02:00
Thomas Haller
d9c0d43879
release: bump version to 1.32.0 2021-06-16 19:48:59 +02:00