initrd: generate infiniband connections

Generate infiniband connections based on the interface name or MAC
address length.

https://bugzilla.redhat.com/show_bug.cgi?id=1883173
This commit is contained in:
Beniamino Galvani 2020-10-15 09:44:52 +02:00
parent ba1e1c364c
commit 317171ed6e
2 changed files with 78 additions and 6 deletions

View file

@ -137,10 +137,21 @@ reader_create_connection(Reader * reader,
multi_connect,
NULL);
if (mac) {
setting = nm_setting_wired_new();
if (nm_streq0(type_name, NM_SETTING_INFINIBAND_SETTING_NAME)) {
setting = nm_setting_infiniband_new();
nm_connection_add_setting(connection, setting);
g_object_set(setting, NM_SETTING_WIRED_MAC_ADDRESS, mac, NULL);
g_object_set(setting, NM_SETTING_INFINIBAND_TRANSPORT_MODE, "datagram", NULL);
}
if (mac) {
if (nm_streq0(type_name, NM_SETTING_INFINIBAND_SETTING_NAME)) {
setting = (NMSetting *) nm_connection_get_setting_infiniband(connection);
g_object_set(setting, NM_SETTING_INFINIBAND_MAC_ADDRESS, mac, NULL);
} else {
setting = nm_setting_wired_new();
nm_connection_add_setting(connection, setting);
g_object_set(setting, NM_SETTING_WIRED_MAC_ADDRESS, mac, NULL);
}
}
return connection;
@ -180,7 +191,7 @@ reader_get_connection(Reader * reader,
if (nm_utils_is_valid_iface_name(iface_spec, NULL))
ifname = iface_spec;
else {
mac = nm_utils_hwaddr_canonical(iface_spec, ETH_ALEN);
mac = nm_utils_hwaddr_canonical(iface_spec, -1);
if (!mac)
_LOGW(LOGD_CORE, "invalid interface '%s'", iface_spec);
}
@ -219,8 +230,13 @@ reader_get_connection(Reader * reader,
if (!create_if_missing)
return NULL;
if (!type_name)
type_name = NM_SETTING_WIRED_SETTING_NAME;
if (!type_name) {
if (NM_STR_HAS_PREFIX(ifname, "ib")
|| (mac && nm_utils_hwaddr_valid(mac, INFINIBAND_ALEN)))
type_name = NM_SETTING_INFINIBAND_SETTING_NAME;
else
type_name = NM_SETTING_WIRED_SETTING_NAME;
}
connection = reader_create_connection(reader,
ifname ?: mac,

View file

@ -1772,6 +1772,60 @@ test_dhcp_vendor_class_id(void)
g_assert(nm_setting_ip4_config_get_dhcp_vendor_class_identifier(s_ip4) == NULL);
}
static void
test_infiniband_iface(void)
{
gs_unref_hashtable GHashTable *connections = NULL;
const char *const * ARGV = NM_MAKE_STRV("ip=ib1:dhcp");
NMConnection * connection;
NMSettingInfiniband * s_ib;
gs_free char * hostname = NULL;
connections = nmi_cmdline_reader_parse(TEST_INITRD_DIR "/sysfs", ARGV, &hostname);
g_assert(connections);
g_assert_cmpint(g_hash_table_size(connections), ==, 1);
g_assert_cmpstr(hostname, ==, NULL);
connection = g_hash_table_lookup(connections, "ib1");
g_assert(connection);
nmtst_assert_connection_verifies_without_normalization(connection);
g_assert_cmpstr(nm_connection_get_connection_type(connection),
==,
NM_SETTING_INFINIBAND_SETTING_NAME);
s_ib = nm_connection_get_setting_infiniband(connection);
g_assert(s_ib);
}
static void
test_infiniband_mac(void)
{
gs_unref_hashtable GHashTable *connections = NULL;
const char *const * ARGV =
NM_MAKE_STRV("ip=00-11-22-33-44-55-66-77-88-99-aa-bb-cc-dd-ee-ff-00-11-22-33:dhcp");
NMConnection * connection;
NMSettingInfiniband *s_ib;
gs_free char * hostname = NULL;
connections = nmi_cmdline_reader_parse(TEST_INITRD_DIR "/sysfs", ARGV, &hostname);
g_assert(connections);
g_assert_cmpint(g_hash_table_size(connections), ==, 1);
g_assert_cmpstr(hostname, ==, NULL);
connection = g_hash_table_lookup(connections,
"00:11:22:33:44:55:66:77:88:99:AA:BB:CC:DD:EE:FF:00:11:22:33");
g_assert(connection);
nmtst_assert_connection_verifies_without_normalization(connection);
g_assert_cmpstr(nm_connection_get_connection_type(connection),
==,
NM_SETTING_INFINIBAND_SETTING_NAME);
g_assert_cmpstr(nm_connection_get_interface_name(connection), ==, NULL);
s_ib = nm_connection_get_setting_infiniband(connection);
g_assert(s_ib);
g_assert_cmpstr(nm_setting_infiniband_get_mac_address(s_ib),
==,
"00:11:22:33:44:55:66:77:88:99:AA:BB:CC:DD:EE:FF:00:11:22:33");
}
NMTST_DEFINE();
int
@ -1813,6 +1867,8 @@ main(int argc, char **argv)
g_test_add_func("/initrd/cmdline/bootif/off", test_bootif_off);
g_test_add_func("/initrd/cmdline/neednet", test_neednet);
g_test_add_func("/initrd/cmdline/dhcp/vendor_class_id", test_dhcp_vendor_class_id);
g_test_add_func("/initrd/cmdline/infiniband/iface", test_infiniband_iface);
g_test_add_func("/initrd/cmdline/infiniband/mac", test_infiniband_mac);
return g_test_run();
}