summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSamuel Mendoza-Jonas <sam@mendozajonas.com>2016-09-05 14:22:07 +1000
committerSamuel Mendoza-Jonas <sam@mendozajonas.com>2016-09-08 15:05:23 +1000
commita8b4e044d505e9bdcc28ab0dfa5e3315542f0e67 (patch)
tree7f7658fbea331e0be9adc3025533af0e68c7877d
parent3037e6c59656daf510e9ced820d149d74f8a499c (diff)
downloadtalos-petitboot-a8b4e044d505e9bdcc28ab0dfa5e3315542f0e67.tar.gz
talos-petitboot-a8b4e044d505e9bdcc28ab0dfa5e3315542f0e67.zip
discover/network: Add find_interface_by_uuidv1.2.5
Currently in network_register_device() and network_unregister_device() the appropriate interface is searched for by name. However it is possible in some scenarios for multiple interfaces to have the same name, so instead search by UUID to be sure that the correct interface is being selected. Signed-off-by: Samuel Mendoza-Jonas <sam@mendozajonas.com> (cherry picked from commit 82b4c9d7ecbfada62295620a6082caf1b9860ff6)
-rw-r--r--discover/network.c61
1 files changed, 40 insertions, 21 deletions
diff --git a/discover/network.c b/discover/network.c
index 0161c69..1851fed 100644
--- a/discover/network.c
+++ b/discover/network.c
@@ -65,6 +65,25 @@ struct network {
bool dry_run;
};
+static char *mac_bytes_to_string(void *ctx, uint8_t *addr, int len)
+{
+ const int l = strlen("xx:");
+ char *buf;
+ int i;
+
+ if (len <= 0)
+ return talloc_strdup(ctx, "");
+
+ buf = talloc_array(ctx, char, (len * l) + 1);
+
+ for (i = 0; i < len; i++)
+ sprintf(buf + (l * i), "%02x:", addr[i]);
+
+ *(buf + (l * len) - 1) = '\0';
+
+ return buf;
+}
+
static const struct interface_config *find_config_by_hwaddr(
uint8_t *hwaddr)
{
@@ -109,6 +128,25 @@ static struct interface *find_interface_by_name(struct network *network,
return NULL;
}
+static struct interface *find_interface_by_uuid(struct network *network,
+ const char *uuid)
+{
+ struct interface *interface;
+ char *mac;
+
+ list_for_each_entry(&network->interfaces, interface, list) {
+ mac = mac_bytes_to_string(interface, interface->hwaddr,
+ sizeof(interface->hwaddr));
+ if (!strcmp(mac, uuid)) {
+ talloc_free(mac);
+ return interface;
+ }
+ talloc_free(mac);
+ }
+
+ return NULL;
+}
+
uint8_t *find_mac_by_name(void *ctx, struct network *network,
const char *name)
{
@@ -175,25 +213,6 @@ static int network_send_link_query(struct network *network)
return 0;
}
-static char *mac_bytes_to_string(void *ctx, uint8_t *addr, int len)
-{
- const int l = strlen("xx:");
- char *buf;
- int i;
-
- if (len <= 0)
- return talloc_strdup(ctx, "");
-
- buf = talloc_array(ctx, char, (len * l) + 1);
-
- for (i = 0; i < len; i++)
- sprintf(buf + (l * i), "%02x:", addr[i]);
-
- *(buf + (l * len) - 1) = '\0';
-
- return buf;
-}
-
static void add_interface(struct network *network,
struct interface *interface)
{
@@ -222,7 +241,7 @@ void network_register_device(struct network *network,
{
struct interface *iface;
- iface = find_interface_by_name(network, dev->device->id);
+ iface = find_interface_by_uuid(network, dev->uuid);
if (!iface)
return;
@@ -236,7 +255,7 @@ void network_unregister_device(struct network *network,
{
struct interface *iface;
- iface = find_interface_by_name(network, dev->device->id);
+ iface = find_interface_by_uuid(network, dev->uuid);
if (!iface)
return;
OpenPOWER on IntegriCloud