707 lines
26 KiB
Diff
707 lines
26 KiB
Diff
From 61636ae740e7de1ad75202cd1d2adfd506f7d5c0 Mon Sep 17 00:00:00 2001
|
|
From: Thomas Haller <thaller@redhat.com>
|
|
Date: Wed, 22 Jul 2020 12:24:59 +0200
|
|
Subject: [PATCH 1/4] shared: add nm_strv_ptrarray_ensure() and
|
|
nm_strv_ptrarray_find_first() helpers
|
|
|
|
(cherry picked from commit 99296d4c6caee60065286210f1f5fb4d653861bd)
|
|
(cherry picked from commit 0ae9e9ec5eddbfd34f073a60819e02aa648e312c)
|
|
Signed-off-by: Antonio Cardace <acardace@redhat.com>
|
|
---
|
|
shared/nm-glib-aux/nm-shared-utils.h | 27 +++++++++++++++++++++++++++
|
|
1 file changed, 27 insertions(+)
|
|
|
|
diff --git a/shared/nm-glib-aux/nm-shared-utils.h b/shared/nm-glib-aux/nm-shared-utils.h
|
|
index b17c8d1a0..f33949e61 100644
|
|
--- a/shared/nm-glib-aux/nm-shared-utils.h
|
|
+++ b/shared/nm-glib-aux/nm-shared-utils.h
|
|
@@ -1771,6 +1771,17 @@ GSource *nm_utils_g_main_context_create_integrate_source (GMainContext *internal
|
|
|
|
/*****************************************************************************/
|
|
|
|
+static inline GPtrArray *
|
|
+nm_strv_ptrarray_ensure (GPtrArray **p_arr)
|
|
+{
|
|
+ nm_assert (p_arr);
|
|
+
|
|
+ if (G_UNLIKELY (!*p_arr))
|
|
+ *p_arr = g_ptr_array_new_with_free_func (g_free);
|
|
+
|
|
+ return *p_arr;
|
|
+}
|
|
+
|
|
static inline void
|
|
nm_strv_ptrarray_add_string_take (GPtrArray *cmd,
|
|
char *str)
|
|
@@ -1809,6 +1820,22 @@ nm_strv_ptrarray_take_gstring (GPtrArray *cmd,
|
|
FALSE));
|
|
}
|
|
|
|
+static inline gssize
|
|
+nm_strv_ptrarray_find_first (const GPtrArray *strv,
|
|
+ const char *str)
|
|
+{
|
|
+ if (!strv)
|
|
+ return -1;
|
|
+ return nm_utils_strv_find_first ((char **) strv->pdata, strv->len, str);
|
|
+}
|
|
+
|
|
+static inline gboolean
|
|
+nm_strv_ptrarray_contains (const GPtrArray *strv,
|
|
+ const char *str)
|
|
+{
|
|
+ return nm_strv_ptrarray_find_first (strv, str) >= 0;
|
|
+}
|
|
+
|
|
/*****************************************************************************/
|
|
|
|
int nm_utils_getpagesize (void);
|
|
--
|
|
2.28.0
|
|
|
|
|
|
From 2d5322ba201152f41010a4629a659c424520e2be Mon Sep 17 00:00:00 2001
|
|
From: Beniamino Galvani <bgalvani@redhat.com>
|
|
Date: Thu, 19 Nov 2020 11:06:04 +0100
|
|
Subject: [PATCH 2/4] initrd: add test for prefixed address in ip= argument
|
|
|
|
(cherry picked from commit 584e9048b3dd7e8c550e56d2da5398516398be0f)
|
|
(cherry picked from commit 58a6697e96b19707b0bd07e11c2c646982739e95)
|
|
(cherry picked from commit d7361496a207b3476c0da34e7dcc08394914b9a7)
|
|
Signed-off-by: Antonio Cardace <acardace@redhat.com>
|
|
---
|
|
src/initrd/tests/test-cmdline-reader.c | 3 ++-
|
|
1 file changed, 2 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/src/initrd/tests/test-cmdline-reader.c b/src/initrd/tests/test-cmdline-reader.c
|
|
index d6966023a..565bb9e8f 100644
|
|
--- a/src/initrd/tests/test-cmdline-reader.c
|
|
+++ b/src/initrd/tests/test-cmdline-reader.c
|
|
@@ -340,7 +340,7 @@ static void
|
|
test_multiple_merge (void)
|
|
{
|
|
gs_unref_hashtable GHashTable *connections = NULL;
|
|
- const char *const*ARGV = NM_MAKE_STRV ("ip=192.0.2.2:::::eth0",
|
|
+ const char *const*ARGV = NM_MAKE_STRV ("ip=192.0.2.2/16:::::eth0",
|
|
"ip=[2001:db8::2]:::56::eth0");
|
|
NMConnection *connection;
|
|
NMSettingConnection *s_con;
|
|
@@ -375,6 +375,7 @@ test_multiple_merge (void)
|
|
ip_addr = nm_setting_ip_config_get_address (s_ip4, 0);
|
|
g_assert (ip_addr);
|
|
g_assert_cmpstr (nm_ip_address_get_address (ip_addr), ==, "192.0.2.2");
|
|
+ g_assert_cmpint (nm_ip_address_get_prefix (ip_addr), ==, 16);
|
|
|
|
s_ip6 = nm_connection_get_setting_ip6_config (connection);
|
|
g_assert (s_ip6);
|
|
--
|
|
2.28.0
|
|
|
|
|
|
From c6668afd87b53521ad574a7876f25a34f6a9b3f5 Mon Sep 17 00:00:00 2001
|
|
From: Beniamino Galvani <bgalvani@redhat.com>
|
|
Date: Tue, 17 Nov 2020 11:10:54 +0100
|
|
Subject: [PATCH 3/4] initrd: fix parsing of ip= argument with dotted interface
|
|
name
|
|
|
|
The command line parser looks for a dot or a colon to determine
|
|
whether the first token in a ip= argument is a IPv4 address (dot), an
|
|
IPv6 address (colon) or an interface name (none). This strategy
|
|
doesn't work for interface names containing a dot (typically VLANs).
|
|
|
|
Instead, try to parse the IPv4/IPv6 address in the token; if this
|
|
fails then consider the token as an interface name.
|
|
|
|
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/issues/581
|
|
(cherry picked from commit 4aa902ecf537fbf14fd483a336b83b2139025681)
|
|
(cherry picked from commit f766b3cbae0db7e3b7421bfdffc1d6182717e05c)
|
|
(cherry picked from commit a2ce810b87981f586e4acb993f7658c1da06b67e)
|
|
Signed-off-by: Antonio Cardace <acardace@redhat.com>
|
|
---
|
|
src/initrd/nm-initrd-generator.h | 24 ++++++++-----
|
|
src/initrd/nmi-cmdline-reader.c | 39 +++++++++-----------
|
|
src/initrd/nmi-ibft-reader.c | 4 +--
|
|
src/initrd/tests/test-cmdline-reader.c | 49 ++++++++++++++++++++++++++
|
|
4 files changed, 82 insertions(+), 34 deletions(-)
|
|
|
|
diff --git a/src/initrd/nm-initrd-generator.h b/src/initrd/nm-initrd-generator.h
|
|
index 8e17f0455..e7647edd7 100644
|
|
--- a/src/initrd/nm-initrd-generator.h
|
|
+++ b/src/initrd/nm-initrd-generator.h
|
|
@@ -11,17 +11,23 @@
|
|
|
|
#define NMI_WAIT_DEVICE_TIMEOUT_MS 60000
|
|
|
|
-static inline gboolean
|
|
-guess_ip_address_family (const char *str)
|
|
+static inline int
|
|
+get_ip_address_family (const char *str, gboolean with_prefix)
|
|
{
|
|
- if (str == NULL)
|
|
- return AF_UNSPEC;
|
|
- else if (strchr (str, '.'))
|
|
- return AF_INET;
|
|
- else if (strchr (str, ':'))
|
|
- return AF_INET6;
|
|
- else
|
|
+ int addr_family;
|
|
+
|
|
+ if (!str)
|
|
return AF_UNSPEC;
|
|
+
|
|
+ if (with_prefix) {
|
|
+ if (nm_utils_parse_inaddr_prefix_bin (AF_UNSPEC, str, &addr_family, NULL, NULL))
|
|
+ return addr_family;
|
|
+ } else {
|
|
+ if (nm_utils_parse_inaddr_bin (AF_UNSPEC, str, &addr_family, NULL))
|
|
+ return addr_family;
|
|
+ }
|
|
+
|
|
+ return AF_UNSPEC;
|
|
}
|
|
|
|
GHashTable *nmi_ibft_read (const char *sysfs_dir);
|
|
diff --git a/src/initrd/nmi-cmdline-reader.c b/src/initrd/nmi-cmdline-reader.c
|
|
index 257ba3d7a..1b693758f 100644
|
|
--- a/src/initrd/nmi-cmdline-reader.c
|
|
+++ b/src/initrd/nmi-cmdline-reader.c
|
|
@@ -385,7 +385,7 @@ reader_parse_ip (Reader *reader, const char *sysfs_dir, char *argument)
|
|
/* ip={dhcp|on|any|dhcp6|auto6|ibft} */
|
|
kind = tmp;
|
|
} else {
|
|
- client_ip_family = guess_ip_address_family (tmp);
|
|
+ client_ip_family = get_ip_address_family (tmp, TRUE);
|
|
if (client_ip_family != AF_UNSPEC) {
|
|
/* <client-IP>:[<peer>]:<gateway-IP>:<netmask>:<client_hostname>: */
|
|
client_ip = tmp;
|
|
@@ -411,11 +411,11 @@ reader_parse_ip (Reader *reader, const char *sysfs_dir, char *argument)
|
|
kind = get_word (&argument, ':');
|
|
|
|
tmp = get_word (&argument, ':');
|
|
- dns_addr_family[0] = guess_ip_address_family (tmp);
|
|
+ dns_addr_family[0] = get_ip_address_family (tmp, FALSE);
|
|
if (dns_addr_family[0] != AF_UNSPEC) {
|
|
dns[0] = tmp;
|
|
dns[1] = get_word (&argument, ':');
|
|
- dns_addr_family[1] = guess_ip_address_family (dns[1]);
|
|
+ dns_addr_family[1] = get_ip_address_family (dns[1], FALSE);
|
|
if (*argument)
|
|
_LOGW (LOGD_CORE, "Ignoring extra: '%s'.", argument);
|
|
} else {
|
|
@@ -475,9 +475,8 @@ reader_parse_ip (Reader *reader, const char *sysfs_dir, char *argument)
|
|
_LOGW (LOGD_CORE, "Invalid address '%s': %s", client_ip, error->message);
|
|
g_clear_error (&error);
|
|
}
|
|
- } else {
|
|
- _LOGW (LOGD_CORE, "Unrecognized address: %s", client_ip);
|
|
- }
|
|
+ } else
|
|
+ nm_assert_not_reached ();
|
|
|
|
if (address) {
|
|
switch (client_ip_family) {
|
|
@@ -496,7 +495,7 @@ reader_parse_ip (Reader *reader, const char *sysfs_dir, char *argument)
|
|
nm_setting_ip_config_add_address (s_ip6, address);
|
|
break;
|
|
default:
|
|
- _LOGW (LOGD_CORE, "Unknown address family: %s", client_ip);
|
|
+ nm_assert_not_reached ();
|
|
break;
|
|
}
|
|
nm_ip_address_unref (address);
|
|
@@ -579,22 +578,16 @@ reader_parse_ip (Reader *reader, const char *sysfs_dir, char *argument)
|
|
_LOGW (LOGD_CORE, "Ignoring peer: %s (not implemented)\n", peer);
|
|
|
|
if (gateway_ip && *gateway_ip) {
|
|
- int addr_family = guess_ip_address_family (gateway_ip);
|
|
-
|
|
- if (nm_utils_ipaddr_is_valid (addr_family, gateway_ip)) {
|
|
- switch (addr_family) {
|
|
- case AF_INET:
|
|
- g_object_set (s_ip4, NM_SETTING_IP_CONFIG_GATEWAY, gateway_ip, NULL);
|
|
- break;
|
|
- case AF_INET6:
|
|
- g_object_set (s_ip6, NM_SETTING_IP_CONFIG_GATEWAY, gateway_ip, NULL);
|
|
- break;
|
|
- default:
|
|
- _LOGW (LOGD_CORE, "Unknown address family: %s", gateway_ip);
|
|
- break;
|
|
- }
|
|
- } else {
|
|
+ switch (get_ip_address_family (gateway_ip, FALSE)) {
|
|
+ case AF_INET:
|
|
+ g_object_set (s_ip4, NM_SETTING_IP_CONFIG_GATEWAY, gateway_ip, NULL);
|
|
+ break;
|
|
+ case AF_INET6:
|
|
+ g_object_set (s_ip6, NM_SETTING_IP_CONFIG_GATEWAY, gateway_ip, NULL);
|
|
+ break;
|
|
+ default:
|
|
_LOGW (LOGD_CORE, "Invalid gateway: %s", gateway_ip);
|
|
+ break;
|
|
}
|
|
}
|
|
|
|
@@ -893,7 +886,7 @@ reader_add_nameservers (Reader *reader, GPtrArray *nameservers)
|
|
|
|
for (i = 0; i < nameservers->len; i++) {
|
|
ns = nameservers->pdata[i];
|
|
- addr_family = guess_ip_address_family (ns);
|
|
+ addr_family = get_ip_address_family (ns, FALSE);
|
|
if (addr_family == AF_UNSPEC) {
|
|
_LOGW (LOGD_CORE, "Unknown address family: %s", ns);
|
|
continue;
|
|
diff --git a/src/initrd/nmi-ibft-reader.c b/src/initrd/nmi-ibft-reader.c
|
|
index fe6f6432a..bdb99e67e 100644
|
|
--- a/src/initrd/nmi-ibft-reader.c
|
|
+++ b/src/initrd/nmi-ibft-reader.c
|
|
@@ -162,9 +162,9 @@ ip_setting_add_from_block (GHashTable *nic,
|
|
NULL);
|
|
}
|
|
|
|
- family = guess_ip_address_family (s_ipaddr);
|
|
+ family = get_ip_address_family (s_ipaddr, FALSE);
|
|
if (family == AF_UNSPEC)
|
|
- family = guess_ip_address_family (s_gateway);
|
|
+ family = get_ip_address_family (s_gateway, FALSE);
|
|
|
|
switch (family) {
|
|
case AF_INET:
|
|
diff --git a/src/initrd/tests/test-cmdline-reader.c b/src/initrd/tests/test-cmdline-reader.c
|
|
index 565bb9e8f..53ddccc27 100644
|
|
--- a/src/initrd/tests/test-cmdline-reader.c
|
|
+++ b/src/initrd/tests/test-cmdline-reader.c
|
|
@@ -1064,6 +1064,54 @@ test_team (void)
|
|
g_assert_cmpint (nm_setting_connection_get_multi_connect (s_con), ==, NM_CONNECTION_MULTI_CONNECT_SINGLE);
|
|
}
|
|
|
|
+static void
|
|
+test_vlan (void)
|
|
+{
|
|
+ const char *const *ARGV0 = NM_MAKE_STRV ("ip=eth0.100:dhcp", "vlan=eth0.100:eth0");
|
|
+ const char *const *ARGV1 = NM_MAKE_STRV ("vlan=eth0.100:eth0", "ip=eth0.100:dhcp");
|
|
+ const char *const *ARGV[] = {ARGV0, ARGV1};
|
|
+ guint i;
|
|
+
|
|
+ for (i = 0; i < G_N_ELEMENTS (ARGV); i++) {
|
|
+ gs_unref_hashtable GHashTable *connections = NULL;
|
|
+ NMConnection *connection;
|
|
+ NMSettingIPConfig *s_ip4;
|
|
+ NMSettingIPConfig *s_ip6;
|
|
+ NMSettingVlan *s_vlan;
|
|
+ gs_free char *hostname = NULL;
|
|
+
|
|
+ connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV[i], &hostname);
|
|
+ g_assert (connections);
|
|
+ g_assert_cmpint (g_hash_table_size (connections), ==, 1);
|
|
+ g_assert_cmpstr (hostname, ==, NULL);
|
|
+
|
|
+ connection = g_hash_table_lookup (connections, "eth0.100");
|
|
+ g_assert (connection);
|
|
+ nmtst_assert_connection_verifies_without_normalization (connection);
|
|
+ g_assert_cmpstr (nm_connection_get_connection_type (connection),
|
|
+ ==,
|
|
+ NM_SETTING_VLAN_SETTING_NAME);
|
|
+ g_assert_cmpstr (nm_connection_get_id (connection), ==, "eth0.100");
|
|
+
|
|
+ s_vlan = nm_connection_get_setting_vlan (connection);
|
|
+ g_assert (s_vlan);
|
|
+ g_assert_cmpstr (nm_setting_vlan_get_parent (s_vlan), ==, "eth0");
|
|
+ g_assert_cmpint (nm_setting_vlan_get_id (s_vlan), ==, 100);
|
|
+
|
|
+ s_ip4 = nm_connection_get_setting_ip4_config (connection);
|
|
+ g_assert (s_ip4);
|
|
+ g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip4),
|
|
+ ==,
|
|
+ NM_SETTING_IP4_CONFIG_METHOD_AUTO);
|
|
+
|
|
+ s_ip6 = nm_connection_get_setting_ip6_config (connection);
|
|
+ g_assert (s_ip6);
|
|
+ g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip6),
|
|
+ ==,
|
|
+ NM_SETTING_IP6_CONFIG_METHOD_AUTO);
|
|
+ }
|
|
+}
|
|
+
|
|
static void
|
|
test_ibft_ip_dev (void)
|
|
{
|
|
@@ -1675,6 +1723,7 @@ int main (int argc, char **argv)
|
|
g_test_add_func ("/initrd/cmdline/bond/ip", test_bond_ip);
|
|
g_test_add_func ("/initrd/cmdline/bond/default", test_bond_default);
|
|
g_test_add_func ("/initrd/cmdline/team", test_team);
|
|
+ g_test_add_func ("/initrd/cmdline/vlan", test_vlan);
|
|
g_test_add_func ("/initrd/cmdline/bridge", test_bridge);
|
|
g_test_add_func ("/initrd/cmdline/bridge/default", test_bridge_default);
|
|
g_test_add_func ("/initrd/cmdline/bridge/ip", test_bridge_ip);
|
|
--
|
|
2.28.0
|
|
|
|
|
|
From d7d342fb3c112513dcd5645603b524700d8e208e Mon Sep 17 00:00:00 2001
|
|
From: Beniamino Galvani <bgalvani@redhat.com>
|
|
Date: Wed, 18 Nov 2020 14:27:19 +0100
|
|
Subject: [PATCH 4/4] initrd: disable ipv4 and ipv6 by default for vlan parent
|
|
connection
|
|
|
|
Change the generator to disable by default IP configuration for the
|
|
parent connection of a VLAN, because that is what a user would expect
|
|
and what the legacy module does. Of course if the user explicitly
|
|
configures DHCP or an address for the parent interface, that overrides
|
|
the default.
|
|
|
|
Note that now the generator always creates a connection for the parent
|
|
interface. Before this commit, it did only when there was an explicit
|
|
ip= argument for the parent interface.
|
|
|
|
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/issues/509
|
|
(cherry picked from commit f2e51ace6815bd1bd264101694b8dc65226ddd90)
|
|
(cherry picked from commit 4b0007b0370badc2fcefe529a6e680e8ffe2d9e7)
|
|
(cherry picked from commit 6e4345baac776a1b715a4173539171d4ecdd07af)
|
|
Signed-off-by: Antonio Cardace <acardace@redhat.com>
|
|
---
|
|
src/initrd/nmi-cmdline-reader.c | 40 ++++-
|
|
src/initrd/tests/test-cmdline-reader.c | 196 ++++++++++++++++++++++++-
|
|
2 files changed, 231 insertions(+), 5 deletions(-)
|
|
|
|
diff --git a/src/initrd/nmi-cmdline-reader.c b/src/initrd/nmi-cmdline-reader.c
|
|
index 1b693758f..f94cc7db8 100644
|
|
--- a/src/initrd/nmi-cmdline-reader.c
|
|
+++ b/src/initrd/nmi-cmdline-reader.c
|
|
@@ -21,6 +21,8 @@
|
|
typedef struct {
|
|
GHashTable *hash;
|
|
GPtrArray *array;
|
|
+ GPtrArray *vlan_parents;
|
|
+ GHashTable *explicit_ip_connections;
|
|
NMConnection *bootdev_connection; /* connection for bootdev=$ifname */
|
|
NMConnection *default_connection; /* connection not bound to any ifname */
|
|
char *hostname;
|
|
@@ -38,7 +40,9 @@ reader_new (void)
|
|
|
|
reader = g_slice_new (Reader);
|
|
*reader = (Reader) {
|
|
- .hash = g_hash_table_new_full (nm_str_hash, g_str_equal, g_free, g_object_unref),
|
|
+ .hash = g_hash_table_new_full (nm_str_hash, g_str_equal, g_free, g_object_unref),
|
|
+ .explicit_ip_connections = g_hash_table_new_full (nm_direct_hash, NULL, g_object_unref, NULL),
|
|
+ .vlan_parents = g_ptr_array_new_with_free_func (g_free),
|
|
.array = g_ptr_array_new (),
|
|
};
|
|
|
|
@@ -51,6 +55,8 @@ reader_destroy (Reader *reader, gboolean free_hash)
|
|
gs_unref_hashtable GHashTable *hash = NULL;
|
|
|
|
g_ptr_array_unref (reader->array);
|
|
+ g_ptr_array_unref (reader->vlan_parents);
|
|
+ g_hash_table_unref (reader->explicit_ip_connections);
|
|
hash = g_steal_pointer (&reader->hash);
|
|
nm_clear_g_free (&reader->hostname);
|
|
nm_clear_g_free (&reader->dhcp4_vci);
|
|
@@ -436,6 +442,8 @@ reader_parse_ip (Reader *reader, const char *sysfs_dir, char *argument)
|
|
else
|
|
connection = reader_get_default_connection (reader);
|
|
|
|
+ g_hash_table_add (reader->explicit_ip_connections, g_object_ref (connection));
|
|
+
|
|
s_ip4 = nm_connection_get_setting_ip4_config (connection);
|
|
s_ip6 = nm_connection_get_setting_ip6_config (connection);
|
|
|
|
@@ -789,6 +797,9 @@ reader_parse_vlan (Reader *reader, char *argument)
|
|
|
|
if (argument && *argument)
|
|
_LOGW (LOGD_CORE, "Ignoring extra: '%s'.", argument);
|
|
+
|
|
+ if (!nm_strv_ptrarray_contains (reader->vlan_parents, phy))
|
|
+ g_ptr_array_add (reader->vlan_parents, g_strdup (phy));
|
|
}
|
|
|
|
static void
|
|
@@ -1031,6 +1042,33 @@ nmi_cmdline_reader_parse (const char *sysfs_dir, const char *const*argv, char **
|
|
}
|
|
}
|
|
|
|
+ for (i = 0; i < reader->vlan_parents->len; i++) {
|
|
+ NMConnection *connection;
|
|
+ NMSettingIPConfig *s_ip;
|
|
+
|
|
+ /* Disable IP configuration for parent connections of VLANs,
|
|
+ * unless those interfaces were explicitly configured otherwise. */
|
|
+
|
|
+ connection = reader_get_connection (reader, reader->vlan_parents->pdata[i], NULL, TRUE);
|
|
+ if (!g_hash_table_contains (reader->explicit_ip_connections, connection)) {
|
|
+ s_ip = nm_connection_get_setting_ip4_config (connection);
|
|
+ if (s_ip) {
|
|
+ g_object_set (s_ip,
|
|
+ NM_SETTING_IP_CONFIG_METHOD,
|
|
+ NM_SETTING_IP4_CONFIG_METHOD_DISABLED,
|
|
+ NULL);
|
|
+ }
|
|
+
|
|
+ s_ip = nm_connection_get_setting_ip6_config (connection);
|
|
+ if (s_ip) {
|
|
+ g_object_set (s_ip,
|
|
+ NM_SETTING_IP_CONFIG_METHOD,
|
|
+ NM_SETTING_IP6_CONFIG_METHOD_DISABLED,
|
|
+ NULL);
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
if (ignore_bootif)
|
|
nm_clear_g_free (&bootif_val);
|
|
if (bootif_val) {
|
|
diff --git a/src/initrd/tests/test-cmdline-reader.c b/src/initrd/tests/test-cmdline-reader.c
|
|
index 53ddccc27..b9d2acf41 100644
|
|
--- a/src/initrd/tests/test-cmdline-reader.c
|
|
+++ b/src/initrd/tests/test-cmdline-reader.c
|
|
@@ -439,7 +439,7 @@ test_bootdev (void)
|
|
|
|
connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname);
|
|
g_assert (connections);
|
|
- g_assert_cmpint (g_hash_table_size (connections), ==, 2);
|
|
+ g_assert_cmpint (g_hash_table_size (connections), ==, 3);
|
|
g_assert_cmpstr (hostname, ==, NULL);
|
|
|
|
connection = g_hash_table_lookup (connections, "ens3");
|
|
@@ -462,6 +462,18 @@ test_bootdev (void)
|
|
g_assert_cmpstr (nm_setting_connection_get_connection_type (s_con), ==, NM_SETTING_VLAN_SETTING_NAME);
|
|
g_assert_cmpstr (nm_setting_connection_get_id (s_con), ==, "vlan2");
|
|
g_assert_cmpstr (nm_setting_connection_get_interface_name (s_con), ==, "vlan2");
|
|
+
|
|
+ connection = g_hash_table_lookup (connections, "ens5");
|
|
+ g_assert (connection);
|
|
+ nmtst_assert_connection_verifies_without_normalization (connection);
|
|
+
|
|
+ s_con = nm_connection_get_setting_connection (connection);
|
|
+ g_assert (s_con);
|
|
+ g_assert_cmpstr (nm_setting_connection_get_connection_type (s_con),
|
|
+ ==,
|
|
+ NM_SETTING_WIRED_SETTING_NAME);
|
|
+ g_assert_cmpstr (nm_setting_connection_get_id (s_con), ==, "ens5");
|
|
+ g_assert_cmpstr (nm_setting_connection_get_interface_name (s_con), ==, "ens5");
|
|
}
|
|
|
|
static void
|
|
@@ -1082,9 +1094,80 @@ test_vlan (void)
|
|
|
|
connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV[i], &hostname);
|
|
g_assert (connections);
|
|
- g_assert_cmpint (g_hash_table_size (connections), ==, 1);
|
|
+ g_assert_cmpint (g_hash_table_size (connections), ==, 2);
|
|
g_assert_cmpstr (hostname, ==, NULL);
|
|
|
|
+ /* VLAN eth0.100 */
|
|
+ connection = g_hash_table_lookup (connections, "eth0.100");
|
|
+ g_assert (connection);
|
|
+ nmtst_assert_connection_verifies_without_normalization (connection);
|
|
+ g_assert_cmpstr (nm_connection_get_connection_type(connection),
|
|
+ ==,
|
|
+ NM_SETTING_VLAN_SETTING_NAME);
|
|
+ g_assert_cmpstr (nm_connection_get_id (connection), ==, "eth0.100");
|
|
+
|
|
+ s_vlan = nm_connection_get_setting_vlan (connection);
|
|
+ g_assert (s_vlan);
|
|
+ g_assert_cmpstr (nm_setting_vlan_get_parent (s_vlan), ==, "eth0");
|
|
+ g_assert_cmpint (nm_setting_vlan_get_id (s_vlan), ==, 100);
|
|
+
|
|
+ s_ip4 = nm_connection_get_setting_ip4_config (connection);
|
|
+ g_assert (s_ip4);
|
|
+ g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip4),
|
|
+ ==,
|
|
+ NM_SETTING_IP4_CONFIG_METHOD_AUTO);
|
|
+
|
|
+ s_ip6 = nm_connection_get_setting_ip6_config (connection);
|
|
+ g_assert (s_ip6);
|
|
+ g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip6),
|
|
+ ==,
|
|
+ NM_SETTING_IP6_CONFIG_METHOD_AUTO);
|
|
+
|
|
+ /* Ethernet eth0 */
|
|
+ connection = g_hash_table_lookup (connections, "eth0");
|
|
+ g_assert (connection);
|
|
+ nmtst_assert_connection_verifies_without_normalization (connection);
|
|
+ g_assert_cmpstr (nm_connection_get_connection_type (connection),
|
|
+ ==,
|
|
+ NM_SETTING_WIRED_SETTING_NAME);
|
|
+ g_assert_cmpstr (nm_connection_get_id (connection), ==, "eth0");
|
|
+
|
|
+ s_ip4 = nm_connection_get_setting_ip4_config (connection);
|
|
+ g_assert (s_ip4);
|
|
+ g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip4),
|
|
+ ==,
|
|
+ NM_SETTING_IP4_CONFIG_METHOD_DISABLED);
|
|
+
|
|
+ s_ip6 = nm_connection_get_setting_ip6_config (connection);
|
|
+ g_assert (s_ip6);
|
|
+ g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip6),
|
|
+ ==,
|
|
+ NM_SETTING_IP6_CONFIG_METHOD_DISABLED);
|
|
+ }
|
|
+}
|
|
+
|
|
+static void
|
|
+test_vlan_with_dhcp_on_parent (void)
|
|
+{
|
|
+ const char *const *ARGV0 = NM_MAKE_STRV ("vlan=eth0.100:eth0", "ip=eth0:dhcp");
|
|
+ const char *const *ARGV1 = NM_MAKE_STRV ("ip=eth0:dhcp", "vlan=eth0.100:eth0");
|
|
+ const char *const *ARGV[] = {ARGV0, ARGV1};
|
|
+ guint i;
|
|
+
|
|
+ for (i = 0; i < G_N_ELEMENTS (ARGV); i++) {
|
|
+ gs_unref_hashtable GHashTable *connections = NULL;
|
|
+ NMConnection *connection;
|
|
+ NMSettingIPConfig *s_ip4;
|
|
+ NMSettingIPConfig *s_ip6;
|
|
+ NMSettingVlan *s_vlan;
|
|
+ gs_free char *hostname = NULL;
|
|
+
|
|
+ connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV[i], &hostname);
|
|
+ g_assert (connections);
|
|
+ g_assert_cmpint (g_hash_table_size (connections), ==, 2);
|
|
+ g_assert_cmpstr (hostname, ==, NULL);
|
|
+
|
|
+ /* VLAN eth0.100 */
|
|
connection = g_hash_table_lookup (connections, "eth0.100");
|
|
g_assert (connection);
|
|
nmtst_assert_connection_verifies_without_normalization (connection);
|
|
@@ -1093,16 +1176,37 @@ test_vlan (void)
|
|
NM_SETTING_VLAN_SETTING_NAME);
|
|
g_assert_cmpstr (nm_connection_get_id (connection), ==, "eth0.100");
|
|
|
|
+ s_ip4 = nm_connection_get_setting_ip4_config (connection);
|
|
+ g_assert (s_ip4);
|
|
+ g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip4),
|
|
+ ==,
|
|
+ NM_SETTING_IP4_CONFIG_METHOD_AUTO);
|
|
+
|
|
+ s_ip6 = nm_connection_get_setting_ip6_config (connection);
|
|
+ g_assert (s_ip6);
|
|
+ g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip6),
|
|
+ ==,
|
|
+ NM_SETTING_IP6_CONFIG_METHOD_AUTO);
|
|
+
|
|
s_vlan = nm_connection_get_setting_vlan (connection);
|
|
g_assert (s_vlan);
|
|
g_assert_cmpstr (nm_setting_vlan_get_parent (s_vlan), ==, "eth0");
|
|
g_assert_cmpint (nm_setting_vlan_get_id (s_vlan), ==, 100);
|
|
|
|
+ /* Ethernet eth0 */
|
|
+ connection = g_hash_table_lookup (connections, "eth0");
|
|
+ g_assert (connection);
|
|
+ nmtst_assert_connection_verifies_without_normalization (connection);
|
|
+ g_assert_cmpstr (nm_connection_get_connection_type (connection),
|
|
+ ==,
|
|
+ NM_SETTING_WIRED_SETTING_NAME);
|
|
+ g_assert_cmpstr (nm_connection_get_id (connection), ==, "eth0");
|
|
+
|
|
s_ip4 = nm_connection_get_setting_ip4_config (connection);
|
|
g_assert (s_ip4);
|
|
g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip4),
|
|
- ==,
|
|
- NM_SETTING_IP4_CONFIG_METHOD_AUTO);
|
|
+ ==,
|
|
+ NM_SETTING_IP4_CONFIG_METHOD_AUTO);
|
|
|
|
s_ip6 = nm_connection_get_setting_ip6_config (connection);
|
|
g_assert (s_ip6);
|
|
@@ -1112,6 +1216,88 @@ test_vlan (void)
|
|
}
|
|
}
|
|
|
|
+static void
|
|
+test_vlan_over_bond (void)
|
|
+{
|
|
+ const char *const *ARGV0 = NM_MAKE_STRV ("ip=1.2.3.4:::24::vlan1:none",
|
|
+ "bond=bond2:ens3,ens4:mode=active-backup",
|
|
+ "vlan=vlan1:bond2");
|
|
+ const char *const *ARGV1 = NM_MAKE_STRV ("vlan=vlan1:bond2",
|
|
+ "ip=1.2.3.4:::24::vlan1:none",
|
|
+ "bond=bond2:ens3,ens4:mode=active-backup");
|
|
+ const char *const *ARGV2 = NM_MAKE_STRV ("bond=bond2:ens3,ens4:mode=active-backup",
|
|
+ "ip=1.2.3.4:::24::vlan1:none",
|
|
+ "vlan=vlan1:bond2");
|
|
+ const char *const *ARGV[] = {ARGV0, ARGV1, ARGV2};
|
|
+ guint i;
|
|
+
|
|
+ for (i = 0; i < G_N_ELEMENTS (ARGV); i++) {
|
|
+ gs_unref_hashtable GHashTable *connections = NULL;
|
|
+ NMConnection *connection;
|
|
+ NMSettingIPConfig *s_ip4;
|
|
+ NMSettingIPConfig *s_ip6;
|
|
+ NMSettingVlan *s_vlan;
|
|
+ gs_free char *hostname = NULL;
|
|
+
|
|
+ connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV[i], &hostname);
|
|
+ g_assert (connections);
|
|
+ g_assert_cmpint (g_hash_table_size (connections), ==, 4);
|
|
+ g_assert_cmpstr (hostname, ==, NULL);
|
|
+
|
|
+ /* VLAN vlan1 */
|
|
+ connection = g_hash_table_lookup (connections, "vlan1");
|
|
+ g_assert (connection);
|
|
+ nmtst_assert_connection_verifies_without_normalization (connection);
|
|
+ g_assert_cmpstr (nm_connection_get_connection_type (connection),
|
|
+ ==,
|
|
+ NM_SETTING_VLAN_SETTING_NAME);
|
|
+ g_assert_cmpstr (nm_connection_get_id (connection), ==, "vlan1");
|
|
+
|
|
+ s_ip4 = nm_connection_get_setting_ip4_config(connection);
|
|
+ g_assert (s_ip4);
|
|
+ g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip4),
|
|
+ ==,
|
|
+ NM_SETTING_IP4_CONFIG_METHOD_MANUAL);
|
|
+
|
|
+ s_ip6 = nm_connection_get_setting_ip6_config (connection);
|
|
+ g_assert (s_ip6);
|
|
+ g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip6),
|
|
+ ==,
|
|
+ NM_SETTING_IP6_CONFIG_METHOD_DISABLED);
|
|
+ s_vlan = nm_connection_get_setting_vlan (connection);
|
|
+ g_assert (s_vlan);
|
|
+ g_assert_cmpstr(nm_setting_vlan_get_parent (s_vlan), ==, "bond2");
|
|
+ g_assert_cmpint(nm_setting_vlan_get_id (s_vlan), ==, 1);
|
|
+
|
|
+ /* Bond bond2 */
|
|
+ connection = g_hash_table_lookup (connections, "bond2");
|
|
+ g_assert (connection);
|
|
+ nmtst_assert_connection_verifies_without_normalization (connection);
|
|
+ g_assert_cmpstr (nm_connection_get_connection_type (connection),
|
|
+ ==,
|
|
+ NM_SETTING_BOND_SETTING_NAME);
|
|
+ g_assert_cmpstr(nm_connection_get_id (connection), ==, "bond2");
|
|
+
|
|
+ s_ip4 = nm_connection_get_setting_ip4_config (connection);
|
|
+ g_assert (s_ip4);
|
|
+ g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip4),
|
|
+ ==,
|
|
+ NM_SETTING_IP4_CONFIG_METHOD_DISABLED);
|
|
+
|
|
+ s_ip6 = nm_connection_get_setting_ip6_config (connection);
|
|
+ g_assert (s_ip6);
|
|
+ g_assert_cmpstr (nm_setting_ip_config_get_method (s_ip6),
|
|
+ ==,
|
|
+ NM_SETTING_IP6_CONFIG_METHOD_DISABLED);
|
|
+
|
|
+ /* Ethernet ens3 and ens4 */
|
|
+ connection = g_hash_table_lookup (connections, "ens3");
|
|
+ g_assert (connection);
|
|
+ connection = g_hash_table_lookup (connections, "ens4");
|
|
+ g_assert (connection);
|
|
+ }
|
|
+}
|
|
+
|
|
static void
|
|
test_ibft_ip_dev (void)
|
|
{
|
|
@@ -1724,6 +1910,8 @@ int main (int argc, char **argv)
|
|
g_test_add_func ("/initrd/cmdline/bond/default", test_bond_default);
|
|
g_test_add_func ("/initrd/cmdline/team", test_team);
|
|
g_test_add_func ("/initrd/cmdline/vlan", test_vlan);
|
|
+ g_test_add_func ("/initrd/cmdline/vlan/dhcp-on-parent", test_vlan_with_dhcp_on_parent);
|
|
+ g_test_add_func ("/initrd/cmdline/vlan/over-bond", test_vlan_over_bond);
|
|
g_test_add_func ("/initrd/cmdline/bridge", test_bridge);
|
|
g_test_add_func ("/initrd/cmdline/bridge/default", test_bridge_default);
|
|
g_test_add_func ("/initrd/cmdline/bridge/ip", test_bridge_ip);
|
|
--
|
|
2.28.0
|
|
|