From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from list by lists.gnu.org with archive (Exim 4.71) id 1aTdAZ-0003ul-Su for mharc-grub-devel@gnu.org; Wed, 10 Feb 2016 17:23:31 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33981) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aTdAU-0003oF-G6 for grub-devel@gnu.org; Wed, 10 Feb 2016 17:23:30 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aTdAT-0004pH-BJ for grub-devel@gnu.org; Wed, 10 Feb 2016 17:23:26 -0500 Received: from 66-220-144-178.intmgw.facebook.com ([66.220.144.178]:47682 helo=mx-out.facebook.com) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aTdAT-0004p9-58 for grub-devel@gnu.org; Wed, 10 Feb 2016 17:23:25 -0500 Received: from facebook.com (2401:db00:2040:5012:face:0:9:0) by mx-out.facebook.com (10.102.107.99) with ESMTP id 0d9fcf80d03c11e597940002c99293a0-ef6fc270 for ; Wed, 10 Feb 2016 13:20:05 -0800 Received: by devbig041.ash4.facebook.com (Postfix, from userid 8730) id 17F6945406DC; Wed, 10 Feb 2016 13:21:11 -0800 (PST) From: Josef Bacik To: grub-devel@gnu.org, kernel-team@fb.com Subject: [PATCH 14/14] net: add interfaces when we open a card Date: Wed, 10 Feb 2016 13:21:08 -0800 Message-Id: <1455139268-3241273-15-git-send-email-jbacik@fb.com> X-Mailer: git-send-email 1.8.1 In-Reply-To: <1455139268-3241273-1-git-send-email-jbacik@fb.com> References: <1455139268-3241273-1-git-send-email-jbacik@fb.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [generic] [fuzzy] X-Received-From: 66.220.144.178 Cc: Josef Bacik X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.14 Precedence: list Reply-To: The development of GNU GRUB List-Id: The development of GNU GRUB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 10 Feb 2016 22:23:30 -0000 Since we've started adding addresses to the multicast filter in efi we need to make sure that any addresses that are added before we call ->open are added as well. This can happen when we configure interfaces from the dhcp packet left in the pxe config. Do this in a helper function and have the two people that call ->open use the helper function instead. Thanks, Signed-off-by: Josef Bacik --- grub-core/net/ethernet.c | 12 +++--------- grub-core/net/net.c | 43 +++++++++++++++++++++++++++++++------------ include/grub/net.h | 3 +++ 3 files changed, 37 insertions(+), 21 deletions(-) diff --git a/grub-core/net/ethernet.c b/grub-core/net/ethernet.c index c397b1b..443ac7b 100644 --- a/grub-core/net/ethernet.c +++ b/grub-core/net/ethernet.c @@ -67,15 +67,9 @@ send_ethernet_packet (struct grub_net_network_level_interface *inf, grub_memcpy (eth->src, inf->hwaddress.mac, 6); eth->type = grub_cpu_to_be16 (ethertype); - if (!inf->card->opened) - { - err = GRUB_ERR_NONE; - if (inf->card->driver->open) - err = inf->card->driver->open (inf->card); - if (err) - return err; - inf->card->opened = 1; - } + err = net_open_card (inf->card); + if (err) + return err; return inf->card->driver->send (inf->card, nb); } diff --git a/grub-core/net/net.c b/grub-core/net/net.c index e04a35b..599a311 100644 --- a/grub-core/net/net.c +++ b/grub-core/net/net.c @@ -1460,24 +1460,43 @@ grub_net_fs_close (grub_file_t file) return GRUB_ERR_NONE; } +grub_err_t +net_open_card (struct grub_net_card *card) +{ + struct grub_net_network_level_interface *inf; + grub_err_t err = GRUB_ERR_NONE; + + if (card->opened) + return err; + + if (card->driver->open) + err = card->driver->open (card); + if (err) + return err; + card->opened = 1; + + if (!card->driver->add_addr) + return err; + + FOR_NET_NETWORK_LEVEL_INTERFACES (inf) + { + if (inf->card == card) + card->driver->add_addr(card, &inf->address); + } + return err; +} + static void receive_packets (struct grub_net_card *card, int *stop_condition) { int received = 0; + grub_err_t err; + if (card->num_ifaces == 0) return; - if (!card->opened) - { - grub_err_t err = GRUB_ERR_NONE; - if (card->driver->open) - err = card->driver->open (card); - if (err) - { - grub_errno = GRUB_ERR_NONE; - return; - } - card->opened = 1; - } + err = net_open_card (card); + if (err) + return; while (received < 100) { /* Maybe should be better have a fixed number of packets for each card diff --git a/include/grub/net.h b/include/grub/net.h index 393ad3c..7e54f55 100644 --- a/include/grub/net.h +++ b/include/grub/net.h @@ -341,6 +341,9 @@ grub_net_add_addr (const char *name, const grub_net_link_level_address_t *hwaddress, grub_net_interface_flags_t flags); +grub_err_t +net_open_card (struct grub_net_card *card); + extern struct grub_net_network_level_interface *grub_net_network_level_interfaces; #define FOR_NET_NETWORK_LEVEL_INTERFACES(var) for (var = grub_net_network_level_interfaces; var; var = var->next) #define FOR_NET_NETWORK_LEVEL_INTERFACES_SAFE(var,next) for (var = grub_net_network_level_interfaces, next = (var ? var->next : 0); var; var = next, next = (var ? var->next : 0)) -- 1.8.1