summaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
* nmcli: show sriov capability in "nmcli" outputlr/nmcli-sriovLubomir Rintel2022-10-141-1/+5
| | | | This is sometimes interesting to know.
* man/nmcli: document variables affecting fancy outputLubomir Rintel2022-10-111-1/+40
| | | | | | Notably, PAGER, TERM and NO_COLORS. https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1419
* platform: use NM_STR_HAS_PREFIX() where appropriateThomas Haller2022-10-111-22/+22
| | | | | | | | Prefer it over strncmp(), because it seems easier to understand (to me). Prefer it over g_str_has_prefix(), because it can directly expand to a plain strncmp() -- instead of first humping to glib, then calling strlen() before calling strncmp().
* platform: in _linktype_get_type() check for devtype before the interface nameThomas Haller2022-10-111-9/+11
| | | | | I think the devtype should be checked first, before the interface name. Checking by name seems really very hacky, move that last.
* platform: also recognize rmnet/ccmni with ARPHRD_RAWIP typeRatchanan Srirattanamet2022-10-111-5/+16
| | | | | | | | | | | | | Turns out, modern rmnet_* devices doesn't use ARPHRD_ETHER arptype, but ARPHRD_RAWIP. Also complicating the fact is that ARPHRD_RAWIP is actually added in v4.14, but devices using kernel before that version define this value as "530" in an out-of-tree patch [1]. Recognize this case and check explicitly for 3 values of arptype. [1] https://github.com/LineageOS/android_kernel_google_msm-4.9/commit/54948008c293fdf48552a5c39c91c09c3eb76ed2 https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1392
* release: bump version to 1.41.3 (development)1.41.3-devBeniamino Galvani2022-10-112-2/+2
|
* gitlab-ci: update ci-templates versionThomas Haller2022-10-112-7/+7
|
* gitlab-ci: enable F38 container and regenerate containersThomas Haller2022-10-112-6/+38
|
* cli: fix translation string for error message in set_property()Thomas Haller2022-10-111-2/+3
| | | | https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/issues/1112
* glib-aux: merge branch 'th/uuid-generate-strv-null'Thomas Haller2022-10-117-57/+139
|\ | | | | | | https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1417
| * glib-aux: extend nm_uuid_generate_from_strings() to honor NULL valuesThomas Haller2022-10-113-36/+120
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | When you call nm_uuid_generate_from_strings_strv(uuid_type, type_arg, v1, v2); you'd probably expect that both values are honored in some way. However, if v1 happened to be NULL, then previously v2 would be ignored. Extend nm_uuid_generate_from_strings() to accept also NULL values and pass on the length. Currently, there are no users of nm_uuid_generate_from_strings(), so nobody is affected by this change. Also extend nm_uuid_generate_from_strings_strv() to take a length argument. It still accepts "-1" to take the input strv as a NULL terminated array. If a positive length is provided to nm_uuid_generate_from_strings_strv(), it hashes the same UUID as the respective NULL terminated array. But of course only, if there is no NULL inside the array. If there are any NULLs, a distinct UUID gets generated.
| * glib-aux: add and use nm_uuid_generate_from_strings_old()Thomas Haller2022-10-116-21/+19
|/ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | For a long time we have a function like nm_uuid_generate_from_strings(). This was recently reworked and renamed, but it preserved behavior. Preserving behavior is important for this function, because for the existing users, we need to keep generating the same UUIDs. Originally, this function was a variadic function with NULL sentinel. That means, when you write nm_uuid_generate_from_strings(uuid_type, type_arg, v1, v2, v3, NULL); and v2 happens to be NULL, then v3 is ignored. That is most likely not what the user intended. Maybe they had a bug and v2 should not be NULL. But nm_uuid_generate_from_strings() should not require that all arguments are non-NULL and it should not ignore arguments after the first NULL. For example, one user works around this via uuid = nm_uuid_generate_from_strings_old("ibft", s_hwaddr, s_vlanid ? "V" : "v", s_vlanid ? s_vlanid : "", s_ipaddr ? "A" : "DHCP", s_ipaddr ? s_ipaddr : ""); which is cumbersome and ugly. That will be fixed next, by adding a function that doesn't suffer from this problem. But "this problem" is part of the API of the function, we cannot just change it. Instead, rename it and all users, so they can keep doing the same. New users of course should no longer use the "old" function.
* glib-aux,libnmc: merge branch 'th/setting-info-binsearch'Thomas Haller2022-10-115-83/+265
|\ | | | | | | https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1369
| * libnm: use binary search for nm_meta_setting_infos_by_gtype() for libnmcThomas Haller2022-10-112-8/+154
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The file "nm-meta-setting-base-impl.c" is shared by "libnm-core-impl" and "libnmc-setting". For "libnm-core-impl" it uses a efficient lookup from the gtype. For "libnmc-setting", that class information is not available, so it did a linear search. Instead, do a binary search. Tested: diff --git a/src/libnm-core-impl/nm-meta-setting-base-impl.c b/src/libnm-core-impl/nm-meta-setting-base-impl.c index 3434c858391f..62c366d2ca42 100644 --- a/src/libnm-core-impl/nm-meta-setting-base-impl.c +++ b/src/libnm-core-impl/nm-meta-setting-base-impl.c @@ -821,6 +821,11 @@ nm_meta_setting_infos_by_gtype(GType gtype) { const NMMetaSettingInfo *setting_info; +#if _NM_META_SETTING_BASE_IMPL_LIBNM + return _infos_by_gtype_binary_search(gtype); +#endif + nm_assert_not_reached(); + #if _NM_META_SETTING_BASE_IMPL_LIBNM setting_info = _infos_by_gtype_from_class(gtype); #else diff --git a/src/libnm-core-impl/tests/test-setting.c b/src/libnm-core-impl/tests/test-setting.c index 85d549eb766c..65fcafd076c9 100644 --- a/src/libnm-core-impl/tests/test-setting.c +++ b/src/libnm-core-impl/tests/test-setting.c @@ -5134,6 +5134,29 @@ main(int argc, char **argv) { nmtst_init(&argc, &argv, TRUE); + { + gs_unref_object NMConnection *con = NULL; + guint8 ctr = 0; + guint i; + + con = nmtst_create_minimal_connection("test", NULL, NM_SETTING_WIRED_SETTING_NAME, NULL); + + nm_connection_add_setting(con, nm_setting_wired_new()); + + nmtst_connection_normalize(con); + nmtst_assert_connection_verifies_without_normalization(con); + + for (i = 0; i < 10000000; i++) { + ctr += GPOINTER_TO_UINT(nm_connection_get_setting(con, NM_TYPE_SETTING_WIRED)); + ctr += GPOINTER_TO_UINT(nm_connection_get_setting(con, NM_TYPE_SETTING_CONNECTION)); + ctr += GPOINTER_TO_UINT(nm_connection_get_setting(con, NM_TYPE_SETTING_PROXY)); + ctr += GPOINTER_TO_UINT(nm_connection_get_setting(con, NM_TYPE_SETTING_WIREGUARD)); + ctr += GPOINTER_TO_UINT(nm_connection_get_setting(con, NM_TYPE_SETTING_IP4_CONFIG)); + } + + return !!ctr; + } + g_test_add_func("/libnm/test_connection_uuid", test_connection_uuid); g_test_add_func("/libnm/settings/test_nm_meta_setting_types_by_priority", Results of `make src/libnm-core-impl/tests/test-setting && libtool --mode=execute perf stat -r 5 -B src/libnm-core-impl/tests/test-setting`: 1) previous linear search: 3,182.81 msec 2) bsearch not inlined: 1,611.19 msec 3) bsearch open-coded: 1,214.45 msec 4) bsearch inlined: 1,167.70 msec 5) lookup from class: 1,147.64 msec 1) previous implementation 2) using nm_array_find_bsearch() 3) manually implementing binary search 4) using nm_array_find_bsearch_inline() 5) only available to libnm-core as it uses internal meta data Note that for "libnm-core-impl" the implementation was already fast (5), and it didn't change. It only changed to binary search for "libnmc-setting", which arguably is a less strong use-case.
| * libnm: cleanup implementations for nm_meta_setting_infos_by_gtype()Thomas Haller2022-10-112-52/+62
| | | | | | | | | | | | | | | | | | | | | | | | The file "nm-meta-setting-base-impl.c" is present twice in our source tree and compiled twice. Once with internal headers of libnm-core and once with only public headers. Consequently, there are two implementations for nm_meta_setting_infos_by_gtype(), one that can benefit from internal access to the data structure, and the one for libnmc, which cannot. Refactor the implementations, in the hope to have it clearer.
| * glib-aux: add an inlinable version of nm_array_find_bsearch()Thomas Haller2022-10-112-31/+56
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | To implement binary search is not very hard. It's almost easy enough to just open-code it, without using the existing nm_array_find_bsearch() function. In particular, because nm_array_find_bsearch() won't be inlined, and thus it is slower than implementing it by hand. Add nm_array_find_bsearch_inline() as a variant that will be inlined. This actually is as fast as reimplementing it by hand (I measured), which takes away any reason to avoid the function. However, our headers get huge. That may be a problem for complication time. To counter that a bit, only define the function when the caller requests it with a NM_WANT_NM_ARRAY_FIND_BSEARCH_INLINE define.
| * std-aux: add _nm_always_inline for "__attribute__((__always_inline__))"Thomas Haller2022-10-111-0/+1
|/
* tools: avoid Python 3 f-string in "generate-docs-nm-property-infos.py"Thomas Haller2022-10-071-1/+1
| | | | | | We also need to build with python2. No f-strings. Fixes: 8fc7b6df12ed ('tools: rework generating documentation from libnm meta data')
* std-aux: workaround unused variable warning with clang 14 and nm_auto ↵Thomas Haller2022-10-071-2/+2
| | | | cleanup attribute
* ovs: wait that links disappear during initial cleanupBeniamino Galvani2022-10-071-23/+132
| | | | | | | | | | | | | | | | | | | | | | | | | | | At startup, we remove from ovsdb any existing interface created by NM and later an interface with the same name might be readded. This can cause race conditions. Consider this series of events: 1. at startup NM removes the entry from ovsdb; 2. ovsdb reports success; 3. NM inserts an interface with the same name again; 4. ovs-vswitch monitors ovsdb changes, and gets events for removal and insertion. Depending on how those events are split in different batches, it might decide: 4a. to delete the link and add it back, or 4b. to keep the existing link because the delete and insertion cancel out each other. When NM sees the link staying in platform, it doesn't know if it's because of 4b or because 4a will happen eventually. To avoid this ambiguity, after ovsdb reports the successful deletion NM should also wait that the link disappears from platform. Unfortunately, this means that ovsdb gets a dependency to the platform code. https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1386
* glib-aux: use nm_assert() in nm_{ptr,}array_find_bsearch()Thomas Haller2022-10-071-10/+19
| | | | | | | | | | | | | | | These checks don't seem very useful, to have them enabled in production code. What is actually the real danger of messing up with binary search, is that the input array is not properly sorted. Asserting for that would be way more useful, but also likely too expensive to be worth it. Checking that the input arguments are not NULL/zero, is not that useful, because we "usually" won't make such mistakes. While at it, declare each local variable on a separate line.
* policy: track the autoconnect retries in devices for multi-connectFernando Fernandez Mancera2022-10-073-10/+157
| | | | | | | | | | | | | | | | | | For connections with multi-connect property set to "multiple", the autoconnect-retries should be tracked per device and not per connection. That means, if autoconnect-retries is set to 2, each device using that connection should retry to autoconnect 2 times. The device autoconnect retries is -2 by default. This is a special value, in NMPolicy context, if the connection used is multi-connect the device value will be set to match the connection retries. Each time the device picks a different connection, it will reset the device autoconnect retries to -2 and if needed, sync. with the connection retries. https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1387 https://bugzilla.redhat.com/show_bug.cgi?id=2039734
* device: fix hanging port devices when controller goes down while port is not ↵Thomas Haller2022-10-071-4/+8
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | fully attached This partly reverts 1fe8166fc9fb ('device: only deactivate when the master we've enslaved to goes away'). If the controller fails while the port is not yet fully attached, before this patch the following happened: <info> [1664299566.1065] device (bond0): state change: ip-config -> failed (reason 'config-failed', sys-iface-state: 'managed') ... <warn> [1664299566.1073] device (bond0): Activation: failed for connection 'bond0' <trace> [1664299566.1073] device[6b76ac7314eb0b53] (bond0): master: release one slave a9f10ea824bb1725/eth1 (not enslaved) (configure) <debug> [1664299566.1073] device[a9f10ea824bb1725] (eth1): unmanaged: flags set to [!sleeping,!by-type,!platform-init,!user-explicit,!user-settings,!user-conf=0x0/0x179/managed], forget [is-slave=0x800], reason removed) ... <info> [1664299566.1080] device (eth1): state change: config -> ip-config (reason 'none', sys-iface-state: 'managed') Note that now eth1 has no controller, but it lingers in "ip-config" state indefinitely. If we look at a case where the port is already attached we see: <info> [1664299540.9661] device (bond0): state change: secondaries -> failed (reason 'config-failed', sys-iface-state: 'managed') ... <warn> [1664299540.9667] device (bond0): Activation: failed for connection 'bond0' <trace> [1664299540.9667] device[6b76ac7314eb0b53] (bond0): master: release one slave a9f10ea824bb1725/eth1 (enslaved) (configure) <debug> [1664299540.9667] platform: (eth1) link: releasing 10 from master 'bond0' (80) ... <info> [1664299540.9740] device (bond0): detached bond port eth1 ... <debug> [1664299540.9749] device[a9f10ea824bb1725] (eth1): Activation: connection 'eth1' master failed ... <warn> [1664299540.9749] device (eth1): queue-state[secondaries, reason:none, id:520]: replace previously queued state change ... <debug> [1664299540.9750] device[a9f10ea824bb1725] (eth1): queue-state[deactivating, reason:dependency-failed, id:533]: queue state change <debug> [1664299540.9751] device[a9f10ea824bb1725] (eth1): unmanaged: flags set to [!sleeping,!by-type,!platform-init,!user-explicit,!user-settings,!user-conf=0x0/0x179/managed], forget [is-slave=0x800], reason removed) ... <debug> [1664299541.0201] device[a9f10ea824bb1725] (eth1): enslaved to unknown device 0 (??) ... <debug> [1664299541.0227] device[a9f10ea824bb1725] (eth1): queue-state[deactivating, reason:dependency-failed, id:533]: change state <info> [1664299541.0228] device (eth1): state change: ip-check -> deactivating (reason 'dependency-failed', sys-iface-state: 'managed') Fix that by not ignoring the nm_device_slave_notify_release() call. Now we get: <info> [1664391684.9757] device (bond0): state change: ip-config -> failed (reason 'config-failed', sys-iface-state: 'managed') ... <debug> [1664391684.9759] active-connection[69c2b12d61f5b171]: set state deactivated (was activating) <debug> [1664391684.9760] active-connection[142bb8240f6a696d]: check-master-ready: already signalled (state activating, master 0x56116f1480a0 is in state deactivated) ... <debug> [1664391684.9762] manager: ActivatingConnection now (none) ... <warn> [1664391684.9763] device (bond0): Activation: failed for connection 'bond0' <trace> [1664391684.9763] device[142828814dec6e26] (bond0): master: release one slave 720791275fe8a68c/eth1 (not enslaved) (configure) <debug> [1664391684.9763] device[720791275fe8a68c] (eth1): Activation: connection 'eth1' master failed ... <debug> [1664391684.9764] device[720791275fe8a68c] (eth1): queue-state[deactivating, reason:dependency-failed, id:3047]: queue state change <debug> [1664391684.9765] device[720791275fe8a68c] (eth1): unmanaged: flags set to [!sleeping,!by-type,!platform-init,!user-explicit,!user-settings,!user-conf=0x0/0x179/managed], forget [is-slave=0x800], reason removed) ... <debug> [1664391684.9797] device[720791275fe8a68c] (eth1): queue-state[deactivating, reason:dependency-failed, id:3047]: change state <info> [1664391684.9797] device (eth1): state change: config -> deactivating (reason 'dependency-failed', sys-iface-state: 'managed') Commit 1fe8166fc9fb ('device: only deactivate when the master we've enslaved to goes away') added the "return", but it seems to also add it in cases where we need to handle this. Restrict the return to cases if we do "no-config". https://bugzilla.redhat.com/show_bug.cgi?id=2130287 Fixes: 1fe8166fc9fb ('device: only deactivate when the master we've enslaved to goes away') https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1406
* glib-aux/trivial: style fixThomas Haller2022-10-061-0/+1
|
* core: wait for carrier before resolving hostname via DNSBeniamino Galvani2022-10-062-3/+33
| | | | | | | | | If there is no carrier on a device, don't try to resolve the hostname on it. Instead, subscribe to carrier change notifications and retry again once carrier goes up. https://bugzilla.redhat.com/show_bug.cgi?id=2118817 https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1402
* libnm: embed address family in NMSettingIPConfigClass for ↵Thomas Haller2022-10-064-18/+36
| | | | | | | | | | | | NM_SETTING_IP_CONFIG_GET_ADDR_FAMILY() The G_TYPE_INSTANCE_GET_CLASS() macro is just one pointer dereference (self)->g_class, plus additional assertions with debug builds. As such, it is as fast as it gets. Embed the address family there, and implement NM_SETTING_IP_CONFIG_GET_ADDR_FAMILY() that way. https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1395
* libnm: merge branch 'th/connection-path-as-ref-str'Thomas Haller2022-10-067-13/+83
|\ | | | | | | https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1394
| * libnm: use NMRefString for nm_connection_get_path()Thomas Haller2022-10-066-12/+65
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | NMConnection is an interface, implemented by NMSimpleConnection and NMRemoteConnection. For the most part, an NMConnection is only the content of the profile (the settings). The "path" of the connection refers to the D-Bus path, and wouldn't really make sense of the NMConnection interface or the NMSimpleConnection type. As such, the daemon (which only uses NMConnection and NMSimpleConnection) never sets the path. Only libnm does. NMClient uses NMRefString extensively for the D-Bus interface and the path is already internalized. Take advantage of that. It is very likely, that we are able to share the path instance in libnm at which point it makes sense to use NMRefString. Also, during nm_simple_connection_new_clone(), we can just take another reference instead of cloning the string.
| * glib-aux: reorder comparison in nm_ref_string_equal_str()Thomas Haller2022-10-061-1/+1
| | | | | | | | | | We usually compare first for pointer equality. It seems to make more sense this way. Swap.
| * glib-aux: add nm_ref_string_reset() helperThomas Haller2022-10-061-0/+17
|/
* docs: merge branch 'th/generate-docs'Thomas Haller2022-10-065-123/+418
|\ | | | | | | https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1410
| * tools: sort the settings in "generate-docs-nm-property-infos.py" by nameThomas Haller2022-10-061-11/+44
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | "nm-setting-ip-config.c" is a base class for IPv4 and IPv6 settings. So far, any tags there were ignored, which was not obvious. It can be useful to document common properties there. Well, maybe every property better has a IPv4/IPv6 specific text, but that should not be a technical limitation of the tool. So also honor the base file for "ipv4" and "ipv6" settings. When doing that, the settings are no longer processed in the order as they are provided on the command line. Because, one file would be parsed twice, it wouldn't make much sense. Instead, sort the my setting name. The advantage is that the generated XML is independent from the order that make/meson passes to the tool.
| * tools: don't set empty attributes in "generate-docs-nm-property-infos.py"Thomas Haller2022-10-061-6/+1
| | | | | | | | | | | | | | | | | | | | If the information is missing, the entire attribute should not be there. Don't set it to the empty word. Also, don't alias the "variable" attribute to the "name". It's not clear what the "variable" fields is supposed to mean, but if it's not explicitly set, don't make up the information. If a user of that information cares, the can always fallback to the "name".
| * tools: don't write empty XML nodes in "generate-docs-nm-property-infos.py"Thomas Haller2022-10-061-2/+0
| | | | | | | | | | This generates '<setting name="XXX">\n</setting>' nodes in case there is no additional data. Don't do that. Just '<setting name="XXX"/>'
| * tools: preserve newlines and indentation in "generate-docs-nm-property-infos.py"Thomas Haller2022-10-063-4/+4
| | | | | | | | | | | | | | | | | | | | | | | | Our docs can be long. It's important to be able to express paragraphs. Honor a blank line to include a newline. For XML often whitespace is ignored, but our tools can choose to honor the newline. Also, don't strip the whitespace from the beginning and the end. We keep whitespace for a certain indentation level, but additional whitespace gets preserved. This is less important, because regular spaces is indeed irrelevant. But when we write the annotations, we should be in full control over spaces.
| * tools: rework generating documentation from libnm meta dataThomas Haller2022-10-061-113/+382
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | With the given input, this produces *exactly* the same XML as before. - the parsing is now stricter (and thus the code more verbose). No funny stuff, get the annotations correct. - on parsing errors, we log now the affecting lines - "nm-setting-ip-config.c" is a base class. Previously it was ignored and for the moment we still do that. Next, we will allow to also describe properties there. - prepare the code to better preserve whitespace, indentation and line wrappings. In particular, to honor a blank line to indicate a line break and support paragraphs. This is not yet done to compare the output to before, but will be turned on with a small patch next. - the code will make it simple to promote the XML attributes to nodes. Attributes aren't great, let's write XML nodes later. We will only need to adjust the "keywords" dictionary for that, but this change will require changes to the entire chain of tools.
| * libnm/docs: fix alignment in BOOTPROTO descriptionThomas Haller2022-10-062-8/+8
|/ | | | | The parser will become more strict about whitespace. Don't have these whitespaces, they will be kept.
* merge: branch 'lr/master-uuid'Lubomir Rintel2022-10-055-26/+34
|\ | | | | | | | | | | https://bugzilla.redhat.com/show_bug.cgi?id=2125615 https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1408 https://gitlab.freedesktop.org/NetworkManager/NetworkManager-ci/-/merge_requests/1204
| * bond,bridge,team: use uuid for con.master when generating connectionlr/master-uuidLubomir Rintel2022-09-303-12/+15
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | If we're generating a connection for an externally configured slave, refer the master by the UUID instead of the device name. This doesn't matter most of the time. However, on a checkpoint restore we need to make sure that a connection that is unambiguously the original master is up. Otherwise it could happen that a different connection was activated on the same master device and the slaves being restored don't agree on which master connection to bring up. I can't think of any thing that would rely on this but I've been wrong about more serious things before. Fixes-test: @libnm_snapshot_reattach_unmanaged_ports_to_bridge https://bugzilla.redhat.com/show_bug.cgi?id=2125615
| * device: assert we're not waiting on a nil masterLubomir Rintel2022-09-301-0/+2
| | | | | | | | | | | | | | | | If we're notified of a master appearing, make sure there's actually an ifindex we're waiting for. Triger an assertion failure if that is not the case, cause that's pretty messed up.
| * device: fix recheck slave logicLubomir Rintel2022-09-301-13/+16
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Since commit a1de6810df46 ('device: don't ignore external slave removals') we don't leave device_recheck_slave_status() on un-eslaving (that is plink->master = 0) early enough. This results in hooking of NM_MANAGER_DEVICE_IFINDEX_CHANGED even when we're not actually waiting for any master device to come up, accompanied by a messed up log entry: device[3fa7cfc200be4e84] (portXc): enslaved to unknown device 0 (??) We also log nonsense when we see any device's link being removed: device[a9a4b65bde851bcf] (br0): ifindex: set ifindex 0 (old-l3cfg: 05c6a4409f84d9d2) device[45d34e95fb71cce0] (portXa): master br0 with ifindex 0 appeared We don't do further damage afterwards, so this is purely a cosmetic annoyance.
| * checkpoint: move a log message a little lowerLubomir Rintel2022-09-301-1/+1
| | | | | | | | It's happier there.
* | po: update Ukrainian (uk) translationYuri Chornoivan2022-10-051-593/+571
| | | | | | | | https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1412
* | systemd: merge branch systemd into mainThomas Haller2022-10-0544-286/+640
|\ \ | | | | | | | | | https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1411
| * | systemd: update code from upstream (2022-10-04)Thomas Haller2022-10-0443-285/+637
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This is a direct dump from systemd git. $ git clean -fdx && \ git cat-file -p HEAD | sed '1,/^======$/ d' | bash - && \ git add . ====== SYSTEMD_DIR=../systemd COMMIT=f77c0840d505825f14ff30921752cb26778bf53e ( cd "$SYSTEMD_DIR" git checkout "$COMMIT" git reset --hard git clean -fdx ) git ls-files -z :/src/libnm-systemd-core/src/ \ :/src/libnm-systemd-shared/src/ \ :/src/libnm-std-aux/unaligned.h | \ xargs -0 rm -f nm_copy_sd_shared() { mkdir -p "./src/libnm-systemd-shared/$(dirname "$1")" cp "$SYSTEMD_DIR/$1" "./src/libnm-systemd-shared/$1" } nm_copy_sd_core() { mkdir -p "./src/libnm-systemd-core/$(dirname "$1")" cp "$SYSTEMD_DIR/$1" "./src/libnm-systemd-core/$1" } nm_copy_sd_stdaux() { mkdir -p "./src/libnm-std-aux/" cp "$SYSTEMD_DIR/$1" "./src/libnm-std-aux/${1##*/}" } nm_copy_sd_core "src/libsystemd-network/arp-util.c" nm_copy_sd_core "src/libsystemd-network/arp-util.h" nm_copy_sd_core "src/libsystemd-network/dhcp-identifier.c" nm_copy_sd_core "src/libsystemd-network/dhcp-identifier.h" nm_copy_sd_core "src/libsystemd-network/dhcp-lease-internal.h" nm_copy_sd_core "src/libsystemd-network/dhcp6-internal.h" nm_copy_sd_core "src/libsystemd-network/dhcp6-lease-internal.h" nm_copy_sd_core "src/libsystemd-network/dhcp6-network.c" nm_copy_sd_core "src/libsystemd-network/dhcp6-option.c" nm_copy_sd_core "src/libsystemd-network/dhcp6-option.h" nm_copy_sd_core "src/libsystemd-network/dhcp6-protocol.c" nm_copy_sd_core "src/libsystemd-network/dhcp6-protocol.h" nm_copy_sd_core "src/libsystemd-network/lldp-neighbor.c" nm_copy_sd_core "src/libsystemd-network/lldp-neighbor.h" nm_copy_sd_core "src/libsystemd-network/lldp-network.c" nm_copy_sd_core "src/libsystemd-network/lldp-network.h" nm_copy_sd_core "src/libsystemd-network/lldp-rx-internal.h" nm_copy_sd_core "src/libsystemd-network/network-common.c" nm_copy_sd_core "src/libsystemd-network/network-common.h" nm_copy_sd_core "src/libsystemd-network/network-internal.h" nm_copy_sd_core "src/libsystemd-network/sd-dhcp6-client.c" nm_copy_sd_core "src/libsystemd-network/sd-dhcp6-lease.c" nm_copy_sd_core "src/libsystemd-network/sd-lldp-rx.c" nm_copy_sd_core "src/libsystemd/sd-event/event-source.h" nm_copy_sd_core "src/libsystemd/sd-event/event-util.c" nm_copy_sd_core "src/libsystemd/sd-event/event-util.h" nm_copy_sd_core "src/libsystemd/sd-event/sd-event.c" nm_copy_sd_core "src/libsystemd/sd-id128/id128-util.c" nm_copy_sd_core "src/libsystemd/sd-id128/id128-util.h" nm_copy_sd_core "src/libsystemd/sd-id128/sd-id128.c" nm_copy_sd_core "src/systemd/_sd-common.h" nm_copy_sd_core "src/systemd/sd-dhcp6-client.h" nm_copy_sd_core "src/systemd/sd-dhcp6-lease.h" nm_copy_sd_core "src/systemd/sd-dhcp6-option.h" nm_copy_sd_core "src/systemd/sd-event.h" nm_copy_sd_core "src/systemd/sd-id128.h" nm_copy_sd_core "src/systemd/sd-lldp-rx.h" nm_copy_sd_core "src/systemd/sd-lldp.h" nm_copy_sd_core "src/systemd/sd-ndisc.h" nm_copy_sd_shared "src/basic/alloc-util.c" nm_copy_sd_shared "src/basic/alloc-util.h" nm_copy_sd_shared "src/basic/async.h" nm_copy_sd_shared "src/basic/cgroup-util.h" nm_copy_sd_shared "src/basic/dns-def.h" nm_copy_sd_shared "src/basic/env-file.c" nm_copy_sd_shared "src/basic/env-file.h" nm_copy_sd_shared "src/basic/env-util.c" nm_copy_sd_shared "src/basic/env-util.h" nm_copy_sd_shared "src/basic/errno-util.h" nm_copy_sd_shared "src/basic/escape.c" nm_copy_sd_shared "src/basic/escape.h" nm_copy_sd_shared "src/basic/ether-addr-util.c" nm_copy_sd_shared "src/basic/ether-addr-util.h" nm_copy_sd_shared "src/basic/extract-word.c" nm_copy_sd_shared "src/basic/extract-word.h" nm_copy_sd_shared "src/basic/fd-util.c" nm_copy_sd_shared "src/basic/fd-util.h" nm_copy_sd_shared "src/basic/fileio.c" nm_copy_sd_shared "src/basic/fileio.h" nm_copy_sd_shared "src/basic/format-util.c" nm_copy_sd_shared "src/basic/format-util.h" nm_copy_sd_shared "src/basic/fs-util.c" nm_copy_sd_shared "src/basic/fs-util.h" nm_copy_sd_shared "src/basic/glyph-util.c" nm_copy_sd_shared "src/basic/glyph-util.h" nm_copy_sd_shared "src/basic/hash-funcs.c" nm_copy_sd_shared "src/basic/hash-funcs.h" nm_copy_sd_shared "src/basic/hashmap.c" nm_copy_sd_shared "src/basic/hashmap.h" nm_copy_sd_shared "src/basic/hexdecoct.c" nm_copy_sd_shared "src/basic/hexdecoct.h" nm_copy_sd_shared "src/basic/hostname-util.c" nm_copy_sd_shared "src/basic/hostname-util.h" nm_copy_sd_shared "src/basic/in-addr-util.c" nm_copy_sd_shared "src/basic/in-addr-util.h" nm_copy_sd_shared "src/basic/inotify-util.c" nm_copy_sd_shared "src/basic/inotify-util.h" nm_copy_sd_shared "src/basic/io-util.c" nm_copy_sd_shared "src/basic/io-util.h" nm_copy_sd_shared "src/basic/list.h" nm_copy_sd_shared "src/basic/locale-util.c" nm_copy_sd_shared "src/basic/locale-util.h" nm_copy_sd_shared "src/basic/log.h" nm_copy_sd_shared "src/basic/macro.h" nm_copy_sd_shared "src/basic/memory-util.c" nm_copy_sd_shared "src/basic/memory-util.h" nm_copy_sd_shared "src/basic/mempool.c" nm_copy_sd_shared "src/basic/mempool.h" nm_copy_sd_shared "src/basic/missing_fcntl.h" nm_copy_sd_shared "src/basic/missing_random.h" nm_copy_sd_shared "src/basic/missing_socket.h" nm_copy_sd_shared "src/basic/missing_stat.h" nm_copy_sd_shared "src/basic/missing_syscall.h" nm_copy_sd_shared "src/basic/missing_type.h" nm_copy_sd_shared "src/basic/ordered-set.c" nm_copy_sd_shared "src/basic/ordered-set.h" nm_copy_sd_shared "src/basic/parse-util.c" nm_copy_sd_shared "src/basic/parse-util.h" nm_copy_sd_shared "src/basic/path-util.c" nm_copy_sd_shared "src/basic/path-util.h" nm_copy_sd_shared "src/basic/prioq.c" nm_copy_sd_shared "src/basic/prioq.h" nm_copy_sd_shared "src/basic/process-util.c" nm_copy_sd_shared "src/basic/process-util.h" nm_copy_sd_shared "src/basic/random-util.c" nm_copy_sd_shared "src/basic/random-util.h" nm_copy_sd_shared "src/basic/ratelimit.c" nm_copy_sd_shared "src/basic/ratelimit.h" nm_copy_sd_shared "src/basic/set.h" nm_copy_sd_shared "src/basic/signal-util.c" nm_copy_sd_shared "src/basic/signal-util.h" nm_copy_sd_shared "src/basic/siphash24.h" nm_copy_sd_shared "src/basic/socket-util.c" nm_copy_sd_shared "src/basic/socket-util.h" nm_copy_sd_shared "src/basic/sort-util.h" nm_copy_sd_shared "src/basic/sparse-endian.h" nm_copy_sd_shared "src/basic/stat-util.c" nm_copy_sd_shared "src/basic/stat-util.h" nm_copy_sd_shared "src/basic/stdio-util.h" nm_copy_sd_shared "src/basic/string-table.c" nm_copy_sd_shared "src/basic/string-table.h" nm_copy_sd_shared "src/basic/string-util.c" nm_copy_sd_shared "src/basic/string-util.h" nm_copy_sd_shared "src/basic/strv.c" nm_copy_sd_shared "src/basic/strv.h" nm_copy_sd_shared "src/basic/strxcpyx.c" nm_copy_sd_shared "src/basic/strxcpyx.h" nm_copy_sd_shared "src/basic/time-util.c" nm_copy_sd_shared "src/basic/time-util.h" nm_copy_sd_shared "src/basic/tmpfile-util.c" nm_copy_sd_shared "src/basic/tmpfile-util.h" nm_copy_sd_shared "src/basic/umask-util.h" nm_copy_sd_shared "src/basic/user-util.h" nm_copy_sd_shared "src/basic/utf8.c" nm_copy_sd_shared "src/basic/utf8.h" nm_copy_sd_shared "src/basic/util.c" nm_copy_sd_shared "src/basic/util.h" nm_copy_sd_shared "src/fundamental/macro-fundamental.h" nm_copy_sd_shared "src/fundamental/sha256.c" nm_copy_sd_shared "src/fundamental/sha256.h" nm_copy_sd_shared "src/fundamental/string-util-fundamental.c" nm_copy_sd_shared "src/fundamental/string-util-fundamental.h" nm_copy_sd_shared "src/shared/dns-domain.c" nm_copy_sd_shared "src/shared/dns-domain.h" nm_copy_sd_shared "src/shared/log-link.h" nm_copy_sd_shared "src/shared/web-util.c" nm_copy_sd_shared "src/shared/web-util.h" nm_copy_sd_stdaux "src/basic/unaligned.h"
* | | systemd: drop invalid "user-util.h" compat headerThomas Haller2022-10-042-4/+1
| | | | | | | | | | | | | | | We included the original "user-util.h" header. There must be no compat header.
* | | bond: merge branch 'th/mlag-bonding-slb'Thomas Haller2022-10-0410-6/+1418
|\ \ \ | | | | | | | | | | | | | | | | | | | | https://bugzilla.redhat.com/show_bug.cgi?id=2128216 https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1385
| * | | libnm,core: support "bond.balance-slb" optionThomas Haller2022-10-044-6/+162
| | | |
| * | | core: add NMBondManager to handle NTF rules for balance-slb (MLAG)Thomas Haller2022-10-044-0/+1002
| | | |
| * | | firewall: add mlag firewall utils for multi chassis link aggregation (MLAG) ↵Thomas Haller2022-10-042-0/+254
|/ / / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | for bonding-slb Add a way to configure MLAG NFT rules for SLB bonding. OVS supports "bonding-slb" (source load balancing, [1]). This is basically setting "mode=balance-xor" and "xmit_hash_policy=vlan+srcmac", which requires no special switch configuration (like LACP). For that to work, we need to filter out packets that the switch sends back on the other port, for which we configure some NFT rules. The rules are taken from mlag.sh at [2] or [3]. See-also: https://bugzilla.redhat.com/show_bug.cgi?id=1724795 [1] https://docs.openvswitch.org/en/latest/topics/bonding/#slb-bondin [2] https://gitlab.com/egarver/virtual-networking [3] https://gitlab.com/jtoppins_redhat/bond-slb-nft