From patchwork Tue Sep 6 01:45:54 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sam Mendoza-Jonas X-Patchwork-Id: 666120 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3sSqFb4v5vz9s5g for ; Tue, 6 Sep 2016 11:46:27 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=mendozajonas.com header.i=@mendozajonas.com header.b=atv2rIyn; dkim-atps=neutral Received: from ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 3sSqFb3rCrzDrq8 for ; Tue, 6 Sep 2016 11:46:27 +1000 (AEST) Authentication-Results: lists.ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=mendozajonas.com header.i=@mendozajonas.com header.b=atv2rIyn; dkim-atps=neutral X-Original-To: petitboot@lists.ozlabs.org Delivered-To: petitboot@lists.ozlabs.org Received: from mendozajonas.com (mendozajonas.com [188.166.185.233]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 3sSqFG5Rj8zDrpj for ; Tue, 6 Sep 2016 11:46:10 +1000 (AEST) Authentication-Results: lists.ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=mendozajonas.com header.i=@mendozajonas.com header.b=atv2rIyn; dkim-atps=neutral Received: from skellige.ozlabs.ibm.com (unknown [122.99.82.10]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client did not present a certificate) (Authenticated sender: sam@mendozajonas.com) by mendozajonas.com (Postfix) with ESMTPSA id CCF87143FA6; Tue, 6 Sep 2016 09:46:07 +0800 (SGT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mendozajonas.com; s=mail; t=1473126368; bh=MzUqqk7PalRLi4rpBzCpvtcEq1gYqSIvqeej5F4Wd0s=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=atv2rIynvmgT/VqPwSVMEfCz4mlsfPDhcCsvkst8UygKde5MLzFHTI4jUG8d27JBa LvKH1B6H+qIZ3vgSYddxDgMTS+NyqdcwwT8VzaO5a0GsvbUKnwyH8nkUk37iOjf7BQ BSHLz3VmujISN0npCVI6rgs82zvYstaJhgKBkgFI= From: Samuel Mendoza-Jonas To: petitboot@lists.ozlabs.org Subject: [PATCH 4/4] discover/network: Add find_interface_by_uuid Date: Tue, 6 Sep 2016 11:45:54 +1000 Message-Id: <20160906014554.20634-5-sam@mendozajonas.com> X-Mailer: git-send-email 2.9.3 In-Reply-To: <20160906014554.20634-1-sam@mendozajonas.com> References: <20160906014554.20634-1-sam@mendozajonas.com> X-BeenThere: petitboot@lists.ozlabs.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: Petitboot bootloader development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Samuel Mendoza-Jonas MIME-Version: 1.0 Errors-To: petitboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Petitboot" 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 --- discover/network.c | 61 +++++++++++++++++++++++++++++++++++------------------- 1 file 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;