core: truncate parent ifname when constructing virtual ifname for VLAN
https://bugzilla.redhat.com/show_bug.cgi?id=1300755
This commit is contained in:
@@ -2141,8 +2141,32 @@ nm_utils_complete_generic (NMConnection *connection,
|
|||||||
char *
|
char *
|
||||||
nm_utils_new_vlan_name (const char *parent_iface, guint32 vlan_id)
|
nm_utils_new_vlan_name (const char *parent_iface, guint32 vlan_id)
|
||||||
{
|
{
|
||||||
/* Basically VLAN_NAME_TYPE_RAW_PLUS_VID_NO_PAD */
|
guint id_len;
|
||||||
return g_strdup_printf ("%s.%d", parent_iface, vlan_id);
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -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 ();
|
NMTST_DEFINE ();
|
||||||
|
|
||||||
int
|
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_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_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_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 ();
|
return g_test_run ();
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user