From b25ddc2055d8c8e21f3a8078653bc35d401c2cb0 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 25 May 2023 21:56:50 +0200 Subject: [PATCH] libnm: use nm_net_devname_infiniband() for virtual interface-name of infiniband In nm_setting_infiniband_get_virtual_interface_name(), no longer try to detect whether the cached value is still up to date. Instead, as we now have a fix sized buffer for the name, just always generate the name on every call. It's simpler. --- .../plugins/ifcfg-rh/nms-ifcfg-rh-writer.c | 6 ++- src/libnm-core-impl/nm-setting-infiniband.c | 44 ++----------------- src/libnm-core-impl/tests/test-general.c | 18 ++++---- src/libnm-core-intern/nm-core-internal.h | 2 - 4 files changed, 17 insertions(+), 53 deletions(-) diff --git a/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c b/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c index 18ae69eaa..8a382ed19 100644 --- a/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c +++ b/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c @@ -1066,6 +1066,8 @@ write_infiniband_setting(NMConnection *connection, svSetValueStr(ifcfg, "PHYSDEV", parent); if (parent && nm_connection_get_interface_name(connection)) { + char name[NM_IFNAMSIZ]; + /* The connection.interface-name depends on the p-key. Also, * nm_connection_normalize() will automatically adjust the * interface-name to match the p-key. @@ -1073,8 +1075,8 @@ write_infiniband_setting(NMConnection *connection, * As we patched the p-key above, also anticipate that change, and * don't write a DEVICE= to the file, which would we normalize * differently, when reading it back. */ - *out_interface_name = - nm_setting_infiniband_create_virtual_interface_name(parent, p_key); + nm_net_devname_infiniband(name, parent, p_key); + *out_interface_name = g_strdup(name); } } diff --git a/src/libnm-core-impl/nm-setting-infiniband.c b/src/libnm-core-impl/nm-setting-infiniband.c index 1761d5413..621265b6d 100644 --- a/src/libnm-core-impl/nm-setting-infiniband.c +++ b/src/libnm-core-impl/nm-setting-infiniband.c @@ -36,9 +36,7 @@ typedef struct { char *mac_address; char *transport_mode; char *parent; - char *virtual_iface_name; - gsize virtual_iface_name_parent_length; - gint32 virtual_iface_name_p_key; + char virtual_iface_name[NM_IFNAMSIZ]; gint32 p_key; guint32 mtu; } NMSettingInfinibandPrivate; @@ -145,17 +143,6 @@ nm_setting_infiniband_get_parent(NMSettingInfiniband *setting) return NM_SETTING_INFINIBAND_GET_PRIVATE(setting)->parent; } -char * -nm_setting_infiniband_create_virtual_interface_name(const char *parent, int p_key) -{ - char *s; - - s = g_strdup_printf("%s.%04x", parent, (guint) p_key); - if (strlen(s) >= NM_IFNAMSIZ) - s[NM_IFNAMSIZ - 1] = '\0'; - return s; -} - /** * nm_setting_infiniband_get_virtual_interface_name: * @setting: the #NMSettingInfiniband @@ -170,25 +157,11 @@ const char * nm_setting_infiniband_get_virtual_interface_name(NMSettingInfiniband *setting) { NMSettingInfinibandPrivate *priv = NM_SETTING_INFINIBAND_GET_PRIVATE(setting); - gsize len; - if (priv->p_key == -1 || !priv->parent) { - nm_clear_g_free(&priv->virtual_iface_name); + if (priv->p_key == -1 || !priv->parent) return NULL; - } - len = strlen(priv->parent); - if (!priv->virtual_iface_name || priv->virtual_iface_name_p_key != priv->p_key - || priv->virtual_iface_name_parent_length != len - || memcmp(priv->parent, priv->virtual_iface_name, len) != 0) { - priv->virtual_iface_name_p_key = priv->p_key; - priv->virtual_iface_name_parent_length = len; - g_free(priv->virtual_iface_name); - priv->virtual_iface_name = - nm_setting_infiniband_create_virtual_interface_name(priv->parent, priv->p_key); - } - - return priv->virtual_iface_name; + return nm_net_devname_infiniband(priv->virtual_iface_name, priv->parent, priv->p_key); } static gboolean @@ -352,16 +325,6 @@ nm_setting_infiniband_new(void) return g_object_new(NM_TYPE_SETTING_INFINIBAND, NULL); } -static void -finalize(GObject *object) -{ - NMSettingInfinibandPrivate *priv = NM_SETTING_INFINIBAND_GET_PRIVATE(object); - - g_free(priv->virtual_iface_name); - - G_OBJECT_CLASS(nm_setting_infiniband_parent_class)->finalize(object); -} - static void nm_setting_infiniband_class_init(NMSettingInfinibandClass *klass) { @@ -373,7 +336,6 @@ nm_setting_infiniband_class_init(NMSettingInfinibandClass *klass) object_class->get_property = _nm_setting_property_get_property_direct; object_class->set_property = _nm_setting_property_set_property_direct; - object_class->finalize = finalize; setting_class->verify = verify; diff --git a/src/libnm-core-impl/tests/test-general.c b/src/libnm-core-impl/tests/test-general.c index 360e05e2a..4bbb3df45 100644 --- a/src/libnm-core-impl/tests/test-general.c +++ b/src/libnm-core-impl/tests/test-general.c @@ -6255,14 +6255,16 @@ test_connection_normalize_infiniband(void) nmtst_connection_normalize(con); g_assert_cmpstr(nm_connection_get_interface_name(con), ==, "x234567890123.0"); -#define iface_name(parent, p_key, expected) \ - G_STMT_START \ - { \ - gs_free char *_s = nm_setting_infiniband_create_virtual_interface_name((parent), (p_key)); \ - \ - g_assert(nm_utils_ifname_valid_kernel(_s, NULL)); \ - g_assert_cmpstr(_s, ==, (expected)); \ - } \ +#define iface_name(parent, p_key, expected) \ + G_STMT_START \ + { \ + char _name[NM_IFNAMSIZ]; \ + \ + nm_net_devname_infiniband(_name, (parent), (p_key)); \ + \ + g_assert(nm_utils_ifname_valid_kernel(_name, NULL)); \ + g_assert_cmpstr(_name, ==, (expected)); \ + } \ G_STMT_END iface_name("foo", 15, "foo.000f"); diff --git a/src/libnm-core-intern/nm-core-internal.h b/src/libnm-core-intern/nm-core-internal.h index d2143fe87..dbb5a7fa5 100644 --- a/src/libnm-core-intern/nm-core-internal.h +++ b/src/libnm-core-intern/nm-core-internal.h @@ -323,8 +323,6 @@ typedef gpointer (*NMUtilsCopyFunc)(gpointer); const char ** _nm_ip_address_get_attribute_names(const NMIPAddress *addr, gboolean sorted, guint *out_length); -char *nm_setting_infiniband_create_virtual_interface_name(const char *parent, int p_key); - #define NM_SETTING_WIRED_S390_OPTION_MAX_LEN 200u void _nm_setting_wired_clear_s390_options(NMSettingWired *setting);