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>
+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)
{
static const struct interface_config *find_config_by_hwaddr(
uint8_t *hwaddr)
{
+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)
{
uint8_t *find_mac_by_name(void *ctx, struct network *network,
const char *name)
{
-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)
{
static void add_interface(struct network *network,
struct interface *interface)
{
{
struct interface *iface;
{
struct interface *iface;
- iface = find_interface_by_name(network, dev->device->id);
+ iface = find_interface_by_uuid(network, dev->uuid);
{
struct interface *iface;
{
struct interface *iface;
- iface = find_interface_by_name(network, dev->device->id);
+ iface = find_interface_by_uuid(network, dev->uuid);