net/dhcp: Make grub_net_process_dhcp() take an interface

Change the interface of the function dealing with incoming BOOTP packets
to take an interface instead of a card, to allow more fine per-interface
state (timeout, handshake state) later on.

Use the opportunity to clean up the code a bit.

Signed-off-by: Andre Przywara <andre.przywara@arm.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
This commit is contained in:
Andrei Borzenkov 2019-03-07 15:14:11 +00:00 committed by Daniel Kiper
parent 7ace83295a
commit 5459243465
3 changed files with 16 additions and 17 deletions

View file

@ -395,12 +395,19 @@ out:
return err; 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 void
grub_net_process_dhcp (struct grub_net_buff *nb, grub_net_process_dhcp (struct grub_net_buff *nb,
struct grub_net_card *card) struct grub_net_network_level_interface *iface)
{ {
char *name; 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); name = grub_xasprintf ("%s:dhcp", card->name);
if (!name) if (!name)
@ -408,23 +415,15 @@ grub_net_process_dhcp (struct grub_net_buff *nb,
grub_print_error (); grub_print_error ();
return; return;
} }
grub_net_configure_by_dhcp_ack (name, card, grub_net_configure_by_dhcp_ack (name, card, 0, bp, size, 0, 0, 0);
0, (const struct grub_net_bootp_packet *) nb->data,
(nb->tail - nb->data), 0, 0, 0);
grub_free (name); grub_free (name);
if (grub_errno) if (grub_errno)
grub_print_error (); grub_print_error ();
else else
{ if (grub_memcmp (iface->name, card->name, grub_strlen (card->name)) == 0 &&
FOR_NET_NETWORK_LEVEL_INTERFACES(inf) grub_memcmp (iface->name + grub_strlen (card->name),
if (grub_memcmp (inf->name, card->name, grub_strlen (card->name)) == 0 ":dhcp_tmp", sizeof (":dhcp_tmp") - 1) == 0)
&& grub_memcmp (inf->name + grub_strlen (card->name), grub_net_network_level_interface_unregister (iface);
":dhcp_tmp", sizeof (":dhcp_tmp") - 1) == 0)
{
grub_net_network_level_interface_unregister (inf);
break;
}
}
} }
static char static char

View file

@ -279,7 +279,7 @@ handle_dgram (struct grub_net_buff *nb,
&& grub_memcmp (inf->hwaddress.mac, &bootp->mac_addr, && grub_memcmp (inf->hwaddress.mac, &bootp->mac_addr,
sizeof (inf->hwaddress.mac)) == 0) sizeof (inf->hwaddress.mac)) == 0)
{ {
grub_net_process_dhcp (nb, inf->card); grub_net_process_dhcp (nb, inf);
grub_netbuff_free (nb); grub_netbuff_free (nb);
return GRUB_ERR_NONE; return GRUB_ERR_NONE;
} }

View file

@ -475,7 +475,7 @@ grub_net_add_ipv4_local (struct grub_net_network_level_interface *inf,
void void
grub_net_process_dhcp (struct grub_net_buff *nb, grub_net_process_dhcp (struct grub_net_buff *nb,
struct grub_net_card *card); struct grub_net_network_level_interface *iface);
int int
grub_net_hwaddr_cmp (const grub_net_link_level_address_t *a, grub_net_hwaddr_cmp (const grub_net_link_level_address_t *a,