diff --git a/src/NetworkManagerUtils.c b/src/NetworkManagerUtils.c index 76116aca8..14ed35e13 100644 --- a/src/NetworkManagerUtils.c +++ b/src/NetworkManagerUtils.c @@ -2141,8 +2141,32 @@ nm_utils_complete_generic (NMConnection *connection, char * nm_utils_new_vlan_name (const char *parent_iface, guint32 vlan_id) { - /* Basically VLAN_NAME_TYPE_RAW_PLUS_VID_NO_PAD */ - return g_strdup_printf ("%s.%d", parent_iface, vlan_id); + guint id_len; + gsize parent_len; + char *ifname; + + g_return_val_if_fail (parent_iface && *parent_iface, NULL); + + if (vlan_id < 10) { + g_return_val_if_fail (vlan_id > 0, NULL); + id_len = 2; + } else if (vlan_id < 100) + id_len = 3; + else if (vlan_id < 1000) + id_len = 4; + else { + g_return_val_if_fail (vlan_id < 4096, NULL); + id_len = 5; + } + + ifname = g_new (char, IFNAMSIZ); + + parent_len = strlen (parent_iface); + parent_len = MIN (parent_len, IFNAMSIZ - 1 - id_len); + memcpy (ifname, parent_iface, parent_len); + g_snprintf (&ifname[parent_len], IFNAMSIZ - parent_len, ".%u", vlan_id); + + return ifname; } /** diff --git a/src/tests/test-general-with-expect.c b/src/tests/test-general-with-expect.c index c6abdccf8..3ec9df41a 100644 --- a/src/tests/test-general-with-expect.c +++ b/src/tests/test-general-with-expect.c @@ -855,6 +855,48 @@ test_nm_multi_index (void) /*******************************************/ +static void +test_nm_utils_new_vlan_name (void) +{ + guint i, j; + const char *parent_names[] = { + "a", + "a2", + "a23", + "a23456789", + "a2345678901", + "a23456789012", + "a234567890123", + "a2345678901234", + "a23456789012345", + "a234567890123456", + "a2345678901234567", + }; + + for (i = 0; i < G_N_ELEMENTS (parent_names); i++) { + for (j = 0; j < 10; j++) { + gs_free char *ifname = NULL; + gs_free char *vlan_id_s = NULL; + guint vlan_id; + + vlan_id = nmtst_get_rand_int () % 4096; + + vlan_id_s = g_strdup_printf (".%d", vlan_id); + + ifname = nm_utils_new_vlan_name (parent_names[i], vlan_id); + g_assert (ifname && ifname[0]); + g_assert_cmpint (strlen (ifname), ==, MIN (15, strlen (parent_names[i]) + strlen (vlan_id_s))); + g_assert (g_str_has_suffix (ifname, vlan_id_s)); + g_assert (ifname[strlen (ifname) - strlen (vlan_id_s)] == '.'); + g_assert (strncmp (ifname, parent_names[i], strlen (ifname) - strlen (vlan_id_s)) == 0); + if (!g_str_has_prefix (ifname, parent_names[i])) + g_assert_cmpint (strlen (ifname), ==, 15); + } + } +} + +/*******************************************/ + NMTST_DEFINE (); int @@ -867,6 +909,7 @@ main (int argc, char **argv) g_test_add_func ("/general/nm_utils_array_remove_at_indexes", test_nm_utils_array_remove_at_indexes); g_test_add_func ("/general/nm_ethernet_address_is_valid", test_nm_ethernet_address_is_valid); g_test_add_func ("/general/nm_multi_index", test_nm_multi_index); + g_test_add_func ("/general/nm_utils_new_vlan_name", test_nm_utils_new_vlan_name); return g_test_run (); }