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 <jba...@fb.com> --- 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 _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel