grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 14/14] net: add interfaces when we open a card


From: Josef Bacik
Subject: [PATCH 14/14] net: add interfaces when we open a card
Date: Wed, 10 Feb 2016 13:21:08 -0800

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 <address@hidden>
---
 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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]