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 14:26:27 +1000
commit82b4c9d7ecbfada62295620a6082caf1b9860ff6 (patch)
tree9e84ed4802673c3c177160ee989487c4eccf0ddb
parent1def8f21aecc41ac22652e7b8bd1f5bf7a4dae98 (diff)
downloadpetitboot-82b4c9d7ecbfada62295620a6082caf1b9860ff6.zip
petitboot-82b4c9d7ecbfada62295620a6082caf1b9860ff6.tar.gz
discover/network: Add find_interface_by_uuid
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>
-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