Commit graph

533 commits

Author SHA1 Message Date
Beniamino Galvani
7f2745f3b1 libnm-glib-aux: add nm_ip6_addr_rfc6724_label() 2026-03-17 14:45:04 +01:00
Beniamino Galvani
1589346de4 libnm-glib-aux: add nm_ip6_addr_common_prefix_len() 2026-03-17 14:45:03 +01:00
Rahul Rajesh
29c8bbe21a platform: add support for GENEVE tunnels
GENEVE (Generic Network Virtualization Encapsulation) is a network
tunneling protocol that provides a flexible encapsulation format for
overlay networks. It uses UDP as the transport protocol and supports
variable-length metadata in the tunnel header.

This patch adds GENEVE tunnel to NM's platform layer:

- Add platform API functions (nm_platform_link_geneve_add,
  nm_platform_link_get_lnk_geneve)

- Netlink message parsing for the following attributes:
  * IFLA_GENEVE_ID - VNI (Virtual Network Identifier)
  IPv4 and IPv6 remote
  * IFLA_GENEVE_REMOTE
  * IFLA_GENEVE_REMOTE6
  TTL, TOS, and DF flags
  * IFLA_GENEVE_TTL
  * IFLA_GENEVE_TOS
  * IFLA_GENEVE_DF
  UDP destination port
  * IFLA_GENEVE_PORT

- Add test cases for GENEVE tunnel creation and detection with two test
  modes covering IPv4 and IPv6.

The implementation tries to follow the same patterns as other tunnel
types (GRE, VXLAN, etc.) and integrates with the existing platform
abstraction layer.
2026-02-17 15:21:03 -05:00
Beniamino Galvani
c312390932 libnm-glib-aux: add temp name argument to nm_utils_file_set_contents()
In some cases it's useful to specify the name of the temporary file to
be used.
2025-10-22 09:56:39 +02:00
Íñigo Huguet
bcbe386823 all: code format 2025-05-13 11:43:33 +02:00
Beniamino Galvani
dbc4ff0a1d libnm-glib-aux: add nm_ip6_addr_get_subnet_id()
Add function nm_ip6_addr_get_subnet_id() to get the subnet ID of a
IPv6 address.
2025-04-02 11:18:02 +02:00
Beniamino Galvani
4ed1d04aff libnm-glib-aux: add nm_puint64_hash()/nm_puint64_equal()
The two new functions can be used as GHashFunc and GEqualFunc when
creating hash tables whose keys are pointers to a guint64.
2025-04-02 11:18:02 +02:00
Michael Biebl
898db303c3 typo fix: allow to -> allow one to
Detected by lintian:

Example:
I: network-manager: typo-in-manual-page "allow to" "allow one to" [usr/share/man/man5/NetworkManager.conf.5.gz:1392]
2025-03-26 19:22:56 +01:00
Michael Biebl
10e58f7c3c typo fix: allows to -> allows one to
Detected by lintian:

Example:
I: network-manager: typo-in-manual-page "allows to" "allows one to" [usr/share/man/man5/NetworkManager.conf.5.gz:1266]
2025-03-26 19:22:01 +01:00
Beniamino Galvani
5ed963e054 build: remove -flto-partition=none when building with GCC
Older versions of GCC (< 12) have issues building NM with LTO because
they drop libnm symbols added via '_asm__(".symver " ...)', which we
use to support symbols backported to older versions of the DSO.

Nowadays, GCC supports a new "__symver__" attribute that is
LTO-friendly; use that when possible and remove the
-flto-partition=none hack, as it increases memory usage when
compiling.

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/issues/1714
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/2142
2025-03-26 09:25:53 +01:00
Jan Vaclav
21c46d6e5f libnm-glib-aux: add nm_utils_is_not_empty_hostname
Checks whether the hostname is not empty or "(none)".
2025-03-11 09:26:20 +00:00
Jason A. Donenfeld
c627bbea4c nm-random-utils: always generate good random bytes and prioritize getrandom support
The current mess of code seems like a hodgepodge of complex ideas,
partially copied from systemd, but then subtly different, and it's a
mess. Let's simplify this drastically.

First, assume that getrandom() is always available. If the kernel is too
old, we have an unoptimized slowpath for still supporting ancient
kernels, a path that should be removed at some point. If getrandom()
isn't available and the fallback path doesn't work, the system has much
larger problems, so just crash. This should basically never happen.
getrandom() and having randomness available in general is a critical
system API that should be expected to be available on any functioning
system.

Second, assume that the rng is initialized, so that asking for random
numbers should never block. This is virtually always true on modern
kernels. On ancient kernels, it usually becomes true. But, more
importantly, this is not the responsibility of various daemons, even
ones that run at boot. Instead, this is something for the kernel and/or
init to ensure.

Putting these together, we adopt new behavior:

- First, try getrandom(..., ..., 0). The 0 flags field means that this
  call will only return good random bytes, not insecure ones.

- If this fails for some reason that isn't ENOSYS, crash.

- If this fails due to ENOSYS, poll on /dev/random until 1 byte is
  available, suggesting that subsequent reads from the rng will almost
  have good random bytes. If this fails, crash. Then, read from
  /dev/urandom. If this fails, crash.

We don't bother caching when getrandom() returns ENOSYS. We don't apply
any other fancy optimizations to the slow fallback path. We keep that as
barebones and minimal as we can. It works. It's for ancient kernels. It
should be removed soon. It's not worth spending cycles over. Instead,
the goal is to eventually reduce all of this down to a simple boring
call to getrandom(..., ..., 0).

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/2127
2025-02-11 10:04:26 +01:00
Beniamino Galvani
43fe39fa71 libnm-glib-aux: move nm_keyfile_add_group()
Move nm_keyfile_add_group() to libnm-glib-aux so that it can be used
by other components such as nm-initrd-generator. Rename it to
nm_key_file_add_group() to be consistent with the GLib API names
(g_key_file_*()).
2025-02-04 10:44:48 +01:00
Beniamino Galvani
17f274d5b4 libnm-glib-aux: fix build error with GCC 15
Fix the following error with GCC 15:

  ../src/libnm-glib-aux/nm-shared-utils.c:35:42: error: initializer-string for array of 'char' is too long [-Werror=unterminated-string-initialization]
     35 | const char _nm_hexchar_table_lower[16] = "0123456789abcdef";
        |                                          ^~~~~~~~~~~~~~~~~~
  ../src/libnm-glib-aux/nm-shared-utils.c:36:42: error: initializer-string for array of 'char' is too long [-Werror=unterminated-string-initialization]
     36 | const char _nm_hexchar_table_upper[16] = "0123456789ABCDEF";
        |                                          ^~~~~~~~~~~~~~~~~~

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/2116
2025-01-28 17:07:26 +01:00
Fernando Fernandez Mancera
a63eec924c glib-aux: add nm_ether_addr_hash() helper
Add a hash generation helper for NMEtherAddr struct. This can be used
for HashTables containing pointers to NMEtherAddr structs.
2024-12-18 14:45:54 +01:00
Beniamino Galvani
bb6881f88c format: run nm-code-format
Reformat with:

  clang-format version 19.1.0 (Fedora 19.1.0-1.fc41)

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/2046
2024-10-04 11:07:35 +02:00
Fernando Fernandez Mancera
d238ff487b ipvlan: add support to IPVLAN interface
This patch add support to IPVLAN interface. IPVLAN is a driver for a
virtual network device that can be used in container environment to
access the host network. IPVLAN exposes a single MAC address to the
external network regardless the number of IPVLAN device created inside
the host network. This means that a user can have multiple IPVLAN
devices in multiple containers and the corresponding switch reads a
single MAC address. IPVLAN driver is useful when the local switch
imposes constraints on the total number of MAC addresses that it can
manage.
2024-09-18 13:19:42 +02:00
Jan Vaclav
142e72b5b5 glib-aux: add nm_utils_buf_utf8safe_escape_strv()
This function allows us to escape whole strv arrays, only
copying them when necessary, indicated by the "to_free"
output parameter.
2024-09-02 12:24:28 +00:00
Dominique Martinet
beaf4f8db3 l3cfg/ipv4ll: add new nm_platform_ip4_address_is_link_local() helper
Move the static _ip4_address_is_link_local() check to a new global
nm_platform_ip4_address_is_link_local() helper so we can check if
an IPv4 is link local in other files
2024-09-02 08:16:18 +00:00
Fernando Fernandez Mancera
79221f79a2 src: drop most slave references from the code
While we cannot remove all the references to "slave" we can remove most
of them.
2024-08-09 15:47:32 +02:00
Fernando Fernandez Mancera
090d617017 src: drop most master references from the code
While we cannot remove all the references to "master" we can remove most
of them.
2024-08-09 15:47:32 +02:00
Fernando Fernandez Mancera
a4bbdeaf54 src: fix code formatting to last clang version 2024-05-30 15:23:37 +02:00
Íñigo Huguet
56179465df Updated code format
The CI will use Fedora 40 for code formatting check. Update the code
formatting so it passes.
2024-04-08 06:35:20 +00:00
Beniamino Galvani
fcea2f174e libnm-glib-aux: fix comments about UUID generation
Whether the length is supplied explicitly or implicitly (via -1), the
result is the same. Update the comment.
2024-04-05 11:40:44 +02:00
Beniamino Galvani
2386c0f52d libnm-glib-aux: fix "maybe-uninitialized" error when generating UUID
GCC 14 complans with:

  src/libnm-glib-aux/nm-uuid.c: In function 'nm_uuid_generate_from_strings_strv':
  src/libnm-glib-aux/nm-uuid.c:492:12: error: '_1' may be used uninitialized [-Werror=maybe-uninitialized]
    492 |     return nm_uuid_generate_from_string_str(s, slen, uuid_type, type_args);
        |            ^
  src/libnm-glib-aux/nm-uuid.c:392:1: note: by argument 1 of type 'const char *' to 'nm_uuid_generate_from_string_str' declared here
    392 | nm_uuid_generate_from_string_str(const char   *s,
        | ^

"-Wmaybe-uninitialized" diagnoses passing pointers or references to
uninitialized memory to functions taking const-qualified arguments.

In this case, nm_uuid_generate_from_string_str()'s first argument is a
"const char *" and so the compiler expects that the string is always
initialized. However, it is not initialized when len is zero.

A non-null zero-length array can be specified in two ways: by setting
len to zero, or by setting len to -1 and having NULL as first
element. Handle both cases in the same way.
2024-04-05 11:40:44 +02:00
Beniamino Galvani
c0705faaf2 Revert "fix gcc warnings"
The patch doesn't fix compilation.

This reverts commit 98cabe557f.
2024-04-05 11:40:44 +02:00
Gris Ge
98cabe557f fix gcc warnings
In Fedora 40+, we have complaining failure:

```
src/libnm-glib-aux/nm-uuid.c: In function 'nm_uuid_generate_from_strings_strv':
src/libnm-glib-aux/nm-uuid.c:490:12: error: '_1' may be used
uninitialized [-Werror=maybe-uninitialized]
  490 |     return nm_uuid_generate_from_string_str(s, slen, uuid_type,
  type_args);
      |            ^
src/libnm-glib-aux/nm-uuid.c:392:1: note: by argument 1 of type 'const
char *' to 'nm_uuid_generate_from_string_str' declared here
  392 | nm_uuid_generate_from_string_str(const char   *s,
      | ^
lto1: all warnings being treated as errors
lto-wrapper: fatal error: gcc returned 1 exit status
```

Fixed by set the `s` initial variable to NULL;

Signed-off-by: Gris Ge <fge@redhat.com>
2024-04-02 21:03:51 +08:00
Beniamino Galvani
0ca9caa32d core: move functions for env variable name encoding to libnm-glib-aux
They will be used by the dispatcher service.

(cherry picked from commit 38acb7a57d)
2024-02-21 11:49:10 +01:00
Thomas Haller
0904bab5e2 glib-aux: fix atomic pattern in nm_ref_string_unref()
It's simply not valid to read the ref-count without an atomic.
The compiler might optimize out the assignment to "r" and read the
_ref_count field multiple times. Thereby, we might at first appear
to be larger than > 1, and later pass 1 to compare-and-exchange.

We need an atomic get here.

Fixes: 19d4027824 ('refstr: inline nm_ref_string_{ref,unref}()')

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1847
(cherry picked from commit 5f7a027f59)
2024-02-09 12:54:37 +01:00
Thomas Haller
a5f75625e2 std-aux: move NM_PRAGMA_WARNING_DISABLE() macro from libnm-glib-aux to libnm-std-aux
Will be used by nm_assert().

(cherry picked from commit c0338526f3)
2024-02-07 09:43:43 +01:00
Thomas Haller
81bfce7c47
glib-aux: convert nmtst_assert_setting_verifies() to a macro
The macro has the advantage, that it preserves the file and line number
from the caller.
2024-01-23 09:43:25 +01:00
Thomas Haller
9db8cdb64d
glib-aux: add nm_g_variant_cmp()
There is g_variant_equal(), which can handle all variant types (however
that is not a compare function).

There is g_variant_compare(), which is a compare function but only works for
basic types.

Add nm_g_variant_cmp() which works with all variant types.

This is based on nm_property_compare(), with some differences:

- nm_property_compare() tries (wrongly) to accept string dictionaries in
  any order. That functionality seems wrong, and nm_g_variant_cmp()
  doesn't do that.

- nm_property_compare() does possibly not support all variant types.
  This can be a problem, if we call the function on untrusted data
  (and it can be hard to validate first, whether the function can
  be called with a particular variant). Instead, nm_g_variant_cmp()
  should work with all variants.

The unit tests are copied from "src/libnm-core-impl/tests/test-compare.c"
with some adjustments (because nm_property_compare() is not the same as
nm_g_variant_cmp()).

Note that the code is actually unused. It was written as replacement for
nm_property_compare(), but turns out not to be used there. For now,
leave it, because it might still be useful to have in the toolbox and it
exists (including tests).
2024-01-04 09:59:59 +01:00
Thomas Haller
2dd24b0045
glib-aux: rename and change order of arguments for _nm_gobject_notify_together_impl##suffix()
Rename _nm_gobject_notify_together_impl##suffix() to
_nm_gobject_notify_together_full_v##suffix(). This name makes a bit more
sense. The "_v" suffix indicates that this takes an array of properties.

Also, commonly, when we have an array and a length parameter, the array comes
first. Reorder the arguments.
2023-12-18 18:54:09 +01:00
Thomas Haller
0a64237932
all: adjust nm_utils_is_empty_ssid() to return TRUE for zero length SSID
A SSID of zero length, really looks "empty". Let
nm_utils_is_empty_ssid() indicate so too.

This affects some places, that try to guess what a hidden SSID looks
like. In general, it seems that treating a length of zero as empty, is
suitable also then.
2023-12-13 09:07:51 +01:00
Thomas Haller
64ffa1bf40
glib-aux: add nm_gobject_notify_together_by_pspec() helper
We have nm_gobject_notify_together(), which accepts a list of
_PropertyEnums arguments. Add nm_gobject_notify_together_by_pspec(),
which can use a param spec.
2023-12-11 12:57:15 +01:00
Thomas Haller
2485a49a0d
glib: drop compat code for glib < 2.42 from "nm-glib.h"
"nm-glib" h contains compat wrappers for older glib versions. This file
used to be copied over to VPN plugins, to use the same compat code.  It
was thus interesting to also have compat code for glib versions, that
were no longer supported by NetworkManager itself.

This was fine. But glib 2.42 is more than 8 years old. At this point,
there really is no need to support that, even if you copy the file out
of NetworkManager source tree.

Drop those compat wrappers.
2023-12-11 12:45:20 +01:00
Fernando Fernandez Mancera
e68bedd28d all: reformat code to clang shipped with Fedora 39 2023-12-06 10:37:24 +01:00
Fernando Fernandez Mancera
5426bdf4a1 HSR: add support to HSR/PRP interface
This patch add support to HSR/PRP interface. Please notice that PRP
driver is represented as HSR too. They are different drivers but on
kernel they are integrated together.

HSR/PRP is a network protocol standard for Ethernet that provides
seamless failover against failure of any network component. It intends
to be transparent to the application. These protocols are useful for
applications that request high availability and short switchover time
e.g electrical substation or high power inverters.

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1791
2023-12-05 08:05:56 +01:00
Thomas Haller
7c16eb36ab
glib-aux: add nm_strv_ptrarray_to_strv() helper
This will replace _nm_utils_ptrarray_to_strv().

One difference is, that this will fail an assertion if there are any
NULL string in the GPtrArray.
2023-11-30 15:53:21 +01:00
Thomas Haller
541979d098
glib-aux: add nm_strv_dup_full() helper to preserve empty strv 2023-11-30 15:53:21 +01:00
Thomas Haller
503a76f604
all: use nm_strv_empty_new() helper 2023-11-30 15:53:21 +01:00
Thomas Haller
cb5ef4b3a0
glib-aux: add NM_PTRARRAY_EMPTY_NEW()/nm_strv_empty_new() helpers 2023-11-30 15:53:20 +01:00
Thomas Haller
563fad718c
glib-aux: refactor nm_strvarray_get_strv*() and nm_strvarray_set_strv*() helpers
Unfortunately, there are several possibilities how to handle NULL and
empty arrays. Therefore we have different variants.

Clean this up, and add a way to preserve whether the array is empty
(previous variants could not distinguish that).

Functions are also renamed, so that if you backport a user of the new
API, you'll get a compiler error if this patch is missing.

Also, nm_strvarray_get_strv_notnull() no longer takes a pointer to a
"GArray*". Previously, it used that to fake an empty strv array. Now
this returns NM_STRV_EMPTY_CC().
2023-11-23 17:17:52 +01:00
Thomas Haller
e48fc3ee3e
glib-aux: add "const" to arguments of nm_strvarray_*() helpers 2023-11-23 17:17:51 +01:00
Thomas Haller
7b5e8381f0
glib-aux: assert against NULL arguments for nm_strvarray_add() 2023-11-15 17:59:26 +01:00
Thomas Haller
2d8c4cfe05
glib-aux: add nm_strvarray_add_take() helper 2023-11-15 17:59:26 +01:00
Thomas Haller
60375218d1
glib-aux: add nm_strvarray_remove_index() helper 2023-11-15 17:59:25 +01:00
Thomas Haller
6c83f7bd67
glib-aux: add nm_strvarray_ensure_and_add() helper 2023-11-15 17:59:25 +01:00
Thomas Haller
73947cdfd0
glib-aux: add nm_strvarray_clear() helper 2023-11-15 17:59:25 +01:00
Thomas Haller
7ab9a2b69f
glib-aux: add nm_strvarray_contains() helper 2023-11-15 17:58:04 +01:00