platform: add NMPlatformLink.parent, sort link_get_all() output
Add a "parent" field to NMPlatformLink, giving the parent device ifindex for devices that have a parent. Make nm_platform_link_get_all() sort the links before returning them, so that masters appear after all of their slaves, and parent devices appear before their children. Remove the second call to nm_platform_query_devices() from NMManager since it is now guaranteed that an NMDeviceVLAN's parent NMDevice will have been created before the NMDeviceVLAN.
This commit is contained in:
@@ -3728,14 +3728,6 @@ nm_manager_start (NMManager *self)
|
|||||||
nm_atm_manager_query_devices (priv->atm_mgr);
|
nm_atm_manager_query_devices (priv->atm_mgr);
|
||||||
nm_bluez_manager_query_devices (priv->bluez_mgr);
|
nm_bluez_manager_query_devices (priv->bluez_mgr);
|
||||||
|
|
||||||
/* Query devices again to ensure that we catch all virtual interfaces (like
|
|
||||||
* VLANs) that require a parent. If during the first pass the VLAN
|
|
||||||
* interface was detected first, the parent wouldn't exist yet and creating
|
|
||||||
* the VLAN would fail. The second query ensures that we'll have a valid
|
|
||||||
* parent for the VLAN during the second pass.
|
|
||||||
*/
|
|
||||||
nm_platform_query_devices ();
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Connections added before the manager is started do not emit
|
* Connections added before the manager is started do not emit
|
||||||
* connection-added signals thus devices have to be created manually.
|
* connection-added signals thus devices have to be created manually.
|
||||||
|
@@ -42,7 +42,6 @@ typedef struct {
|
|||||||
|
|
||||||
char *udi;
|
char *udi;
|
||||||
GBytes *address;
|
GBytes *address;
|
||||||
int vlan_parent;
|
|
||||||
int vlan_id;
|
int vlan_id;
|
||||||
} NMFakePlatformLink;
|
} NMFakePlatformLink;
|
||||||
|
|
||||||
@@ -529,7 +528,7 @@ vlan_add (NMPlatform *platform, const char *name, int parent, int vlan_id, guint
|
|||||||
g_return_val_if_fail (device, FALSE);
|
g_return_val_if_fail (device, FALSE);
|
||||||
|
|
||||||
device->vlan_id = vlan_id;
|
device->vlan_id = vlan_id;
|
||||||
device->vlan_parent = parent;
|
device->link.parent = parent;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@@ -542,7 +541,7 @@ vlan_get_info (NMPlatform *platform, int ifindex, int *parent, int *vlan_id)
|
|||||||
g_return_val_if_fail (device, FALSE);
|
g_return_val_if_fail (device, FALSE);
|
||||||
|
|
||||||
if (parent)
|
if (parent)
|
||||||
*parent = device->vlan_parent;
|
*parent = device->link.parent;
|
||||||
if (vlan_id)
|
if (vlan_id)
|
||||||
*vlan_id = device->vlan_id;
|
*vlan_id = device->vlan_id;
|
||||||
|
|
||||||
|
@@ -543,6 +543,7 @@ link_init (NMPlatform *platform, NMPlatformLink *info, struct rtnl_link *rtnllin
|
|||||||
info->connected = !!(rtnl_link_get_flags (rtnllink) & IFF_LOWER_UP);
|
info->connected = !!(rtnl_link_get_flags (rtnllink) & IFF_LOWER_UP);
|
||||||
info->arp = !(rtnl_link_get_flags (rtnllink) & IFF_NOARP);
|
info->arp = !(rtnl_link_get_flags (rtnllink) & IFF_NOARP);
|
||||||
info->master = rtnl_link_get_master (rtnllink);
|
info->master = rtnl_link_get_master (rtnllink);
|
||||||
|
info->parent = rtnl_link_get_link (rtnllink);
|
||||||
info->mtu = rtnl_link_get_mtu (rtnllink);
|
info->mtu = rtnl_link_get_mtu (rtnllink);
|
||||||
|
|
||||||
udev_device = g_hash_table_lookup (priv->udev_devices, GINT_TO_POINTER (info->ifindex));
|
udev_device = g_hash_table_lookup (priv->udev_devices, GINT_TO_POINTER (info->ifindex));
|
||||||
|
@@ -261,6 +261,37 @@ nm_platform_query_devices (void)
|
|||||||
g_array_unref (links_array);
|
g_array_unref (links_array);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
compare_links (gconstpointer a, gconstpointer b)
|
||||||
|
{
|
||||||
|
NMPlatformLink *link_a = (NMPlatformLink *) a;
|
||||||
|
NMPlatformLink *link_b = (NMPlatformLink *) b;
|
||||||
|
int sortindex_a, sortindex_b;
|
||||||
|
|
||||||
|
/* We mostly want to sort by ifindex. However, slaves should sort
|
||||||
|
* before their masters, and children (eg, VLANs) should sort after
|
||||||
|
* their parents.
|
||||||
|
*/
|
||||||
|
if (link_a->master)
|
||||||
|
sortindex_a = link_a->master * 3 - 1;
|
||||||
|
else if (link_a->parent)
|
||||||
|
sortindex_a = link_a->parent * 3 + 1;
|
||||||
|
else
|
||||||
|
sortindex_a = link_a->ifindex * 3;
|
||||||
|
|
||||||
|
if (link_b->master)
|
||||||
|
sortindex_b = link_b->master * 3 - 1;
|
||||||
|
else if (link_b->parent)
|
||||||
|
sortindex_b = link_b->parent * 3 + 1;
|
||||||
|
else
|
||||||
|
sortindex_b = link_b->ifindex * 3;
|
||||||
|
|
||||||
|
if (sortindex_a == sortindex_b)
|
||||||
|
return link_a->ifindex - link_b->ifindex;
|
||||||
|
else
|
||||||
|
return sortindex_a - sortindex_b;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* nm_platform_link_get_all:
|
* nm_platform_link_get_all:
|
||||||
*
|
*
|
||||||
@@ -270,11 +301,15 @@ nm_platform_query_devices (void)
|
|||||||
GArray *
|
GArray *
|
||||||
nm_platform_link_get_all (void)
|
nm_platform_link_get_all (void)
|
||||||
{
|
{
|
||||||
|
GArray *links;
|
||||||
|
|
||||||
reset_error ();
|
reset_error ();
|
||||||
|
|
||||||
g_return_val_if_fail (klass->link_get_all, NULL);
|
g_return_val_if_fail (klass->link_get_all, NULL);
|
||||||
|
|
||||||
return klass->link_get_all (platform);
|
links = klass->link_get_all (platform);
|
||||||
|
g_array_sort (links, compare_links);
|
||||||
|
return links;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -85,6 +85,7 @@ typedef struct {
|
|||||||
const char *udi;
|
const char *udi;
|
||||||
const char *driver;
|
const char *driver;
|
||||||
int master;
|
int master;
|
||||||
|
int parent;
|
||||||
gboolean up;
|
gboolean up;
|
||||||
gboolean connected;
|
gboolean connected;
|
||||||
gboolean arp;
|
gboolean arp;
|
||||||
|
@@ -36,6 +36,8 @@ dump_interface (NMPlatformLink *link)
|
|||||||
printf (" noarp");
|
printf (" noarp");
|
||||||
if (link->master)
|
if (link->master)
|
||||||
printf (" master %d", link->master);
|
printf (" master %d", link->master);
|
||||||
|
if (link->parent)
|
||||||
|
printf (" parent %d", link->parent);
|
||||||
printf (" mtu %d", link->mtu);
|
printf (" mtu %d", link->mtu);
|
||||||
printf ("\n");
|
printf ("\n");
|
||||||
if (link->driver)
|
if (link->driver)
|
||||||
|
Reference in New Issue
Block a user