From c0942408b7ab30745952e801381e931b1b947e1f Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Wed, 20 Jun 2012 11:56:43 +0100 Subject: [dhcp] Request broadcast responses when we already have an IPv4 address FCoE requires the use of multiple local unicast link-layer addresses. To avoid the complexity of managing multiple addresses, iPXE operates in promiscuous mode. As a consequence, any unicast packets with non-matching IPv4 addresses are rejected at the IPv4 layer (rather than at the link layer). This can cause problems when issuing a second DHCP request: if the address chosen by the DHCP server does not match the existing address, then the DHCP response will itself be rejected. Fix by requesting a broadcast response from the DHCP server if the network interface already has any IPv4 addresses. Signed-off-by: Michael Brown --- src/net/udp/dhcp.c | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'src/net/udp') diff --git a/src/net/udp/dhcp.c b/src/net/udp/dhcp.c index 10482e94d..9a231840d 100644 --- a/src/net/udp/dhcp.c +++ b/src/net/udp/dhcp.c @@ -941,6 +941,13 @@ int dhcp_create_packet ( struct dhcp_packet *dhcppkt, &dhcphdr->flags ); memcpy ( dhcphdr->options, options, options_len ); + /* If the network device already has an IPv4 address then + * unicast responses from the DHCP server may be rejected, so + * request broadcast responses. + */ + if ( ipv4_has_any_addr ( netdev ) ) + dhcphdr->flags |= htons ( BOOTP_FL_BROADCAST ); + /* Initialise DHCP packet structure */ memset ( dhcppkt, 0, sizeof ( *dhcppkt ) ); dhcppkt_init ( dhcppkt, data, max_len ); -- cgit v1.2.3-55-g7522