Skip to content

Commit

Permalink
[pxe] Implicitly open network device in PXENV_UDP_OPEN
Browse files Browse the repository at this point in the history
Some end-user configurations have been observed in which the first NBP
(such as GRUB2) uses the UNDI API and then transfers control to a
second NBP (such as pxelinux) which uses the UDP API.  The first NBP
closes the network device using PXENV_UNDI_CLOSE, which renders the
UDP API unable to transmit or receive packets.

The correct behaviour under these circumstances is (as often) simply
not documented by the PXE specification.  Testing with the Intel PXE
stack suggests that PXENV_UDP_OPEN will implicitly reopen the network
device if necessary, so match this behaviour.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
  • Loading branch information
mcb30 committed Mar 22, 2016
1 parent ee3122b commit 3df5988
Showing 1 changed file with 10 additions and 0 deletions.
10 changes: 10 additions & 0 deletions src/arch/x86/interface/pxe/pxe_udp.c
Expand Up @@ -11,6 +11,7 @@
#include <ipxe/udp.h>
#include <ipxe/uaccess.h>
#include <ipxe/process.h>
#include <ipxe/netdevice.h>
#include <realmode.h>
#include <pxe.h>

Expand Down Expand Up @@ -180,6 +181,15 @@ static PXENV_EXIT_t pxenv_udp_open ( struct s_PXENV_UDP_OPEN *pxenv_udp_open ) {
pxe_udp.local.sin_addr.s_addr = pxenv_udp_open->src_ip;
DBG ( " %s\n", inet_ntoa ( pxe_udp.local.sin_addr ) );

/* Open network device, if necessary */
if ( pxe_netdev && ( ! netdev_is_open ( pxe_netdev ) ) &&
( ( rc = netdev_open ( pxe_netdev ) ) != 0 ) ) {
DBG ( "PXENV_UDP_OPEN could not (implicitly) open %s: %s\n",
pxe_netdev->name, strerror ( rc ) );
pxenv_udp_open->Status = PXENV_STATUS ( rc );
return PXENV_EXIT_FAILURE;
}

/* Open promiscuous UDP connection */
intf_restart ( &pxe_udp.xfer, 0 );
if ( ( rc = udp_open_promisc ( &pxe_udp.xfer ) ) != 0 ) {
Expand Down

0 comments on commit 3df5988

Please sign in to comment.