diff --git a/grub-core/net/bootp.c b/grub-core/net/bootp.c index 1a7cd672b..5bb5b3d27 100644 --- a/grub-core/net/bootp.c +++ b/grub-core/net/bootp.c @@ -395,12 +395,19 @@ out: return err; } +/* + * This is called directly from net/ip.c:handle_dgram(), because those + * BOOTP/DHCP packets are a bit special due to their improper + * sender/receiver IP fields. + */ void grub_net_process_dhcp (struct grub_net_buff *nb, - struct grub_net_card *card) + struct grub_net_network_level_interface *iface) { char *name; - struct grub_net_network_level_interface *inf; + struct grub_net_card *card = iface->card; + const struct grub_net_bootp_packet *bp = (const struct grub_net_bootp_packet *) nb->data; + grub_size_t size = nb->tail - nb->data; name = grub_xasprintf ("%s:dhcp", card->name); if (!name) @@ -408,23 +415,15 @@ grub_net_process_dhcp (struct grub_net_buff *nb, grub_print_error (); return; } - grub_net_configure_by_dhcp_ack (name, card, - 0, (const struct grub_net_bootp_packet *) nb->data, - (nb->tail - nb->data), 0, 0, 0); + grub_net_configure_by_dhcp_ack (name, card, 0, bp, size, 0, 0, 0); grub_free (name); if (grub_errno) grub_print_error (); else - { - FOR_NET_NETWORK_LEVEL_INTERFACES(inf) - if (grub_memcmp (inf->name, card->name, grub_strlen (card->name)) == 0 - && grub_memcmp (inf->name + grub_strlen (card->name), - ":dhcp_tmp", sizeof (":dhcp_tmp") - 1) == 0) - { - grub_net_network_level_interface_unregister (inf); - break; - } - } + if (grub_memcmp (iface->name, card->name, grub_strlen (card->name)) == 0 && + grub_memcmp (iface->name + grub_strlen (card->name), + ":dhcp_tmp", sizeof (":dhcp_tmp") - 1) == 0) + grub_net_network_level_interface_unregister (iface); } static char diff --git a/grub-core/net/ip.c b/grub-core/net/ip.c index 7c95cc746..ea5edf8f1 100644 --- a/grub-core/net/ip.c +++ b/grub-core/net/ip.c @@ -279,7 +279,7 @@ handle_dgram (struct grub_net_buff *nb, && grub_memcmp (inf->hwaddress.mac, &bootp->mac_addr, sizeof (inf->hwaddress.mac)) == 0) { - grub_net_process_dhcp (nb, inf->card); + grub_net_process_dhcp (nb, inf); grub_netbuff_free (nb); return GRUB_ERR_NONE; } diff --git a/include/grub/net.h b/include/grub/net.h index 0c7286bd2..3f649d753 100644 --- a/include/grub/net.h +++ b/include/grub/net.h @@ -475,7 +475,7 @@ grub_net_add_ipv4_local (struct grub_net_network_level_interface *inf, void grub_net_process_dhcp (struct grub_net_buff *nb, - struct grub_net_card *card); + struct grub_net_network_level_interface *iface); int grub_net_hwaddr_cmp (const grub_net_link_level_address_t *a,