}
/* Record cached DHCPACK */
- if ( ( rc = cachedhcp_record ( &cached_dhcpack,
+ if ( ( rc = cachedhcp_record ( &cached_dhcpack, 0,
phys_to_user ( cached_dhcpack_phys ),
sizeof ( BOOTPLAYER_t ) ) ) != 0 ) {
DBGC ( colour, "CACHEDHCP could not record DHCPACK: %s\n",
#include <ipxe/dhcppkt.h>
#include <ipxe/init.h>
#include <ipxe/netdevice.h>
+#include <ipxe/vlan.h>
#include <ipxe/cachedhcp.h>
/** @file
const char *name;
/** DHCP packet (if any) */
struct dhcp_packet *dhcppkt;
+ /** VLAN tag (if applicable) */
+ unsigned int vlan;
};
/** Cached DHCPACK */
* matches this network device.
*/
if ( memcmp ( ll_addr, chaddr, ll_addr_len ) != 0 ) {
- DBGC ( colour, "CACHEDHCP %s does not match %s\n",
- cache->name, netdev->name );
+ DBGC ( colour, "CACHEDHCP %s %s does not match %s\n",
+ cache->name, ll_protocol->ntoa ( chaddr ),
+ netdev->name );
+ return 0;
+ }
+
+ /* Do nothing unless cached packet's VLAN tag matches
+ * this network device.
+ */
+ if ( vlan_tag ( netdev ) != cache->vlan ) {
+ DBGC ( colour, "CACHEDHCP %s VLAN %d does not match "
+ "%s\n", cache->name, cache->vlan,
+ netdev->name );
return 0;
}
- DBGC ( colour, "CACHEDHCP %s is for %s\n",
- cache->name, netdev->name );
/* Use network device's settings block */
settings = netdev_settings ( netdev );
+ DBGC ( colour, "CACHEDHCP %s is for %s\n",
+ cache->name, netdev->name );
}
/* Register settings */
* Record cached DHCP packet
*
* @v cache Cached DHCP packet
+ * @v vlan VLAN tag, if any
* @v data DHCPACK packet buffer
* @v max_len Maximum possible length
* @ret rc Return status code
*/
-int cachedhcp_record ( struct cached_dhcp_packet *cache, userptr_t data,
- size_t max_len ) {
+int cachedhcp_record ( struct cached_dhcp_packet *cache, unsigned int vlan,
+ userptr_t data, size_t max_len ) {
struct dhcp_packet *dhcppkt;
struct dhcp_packet *tmp;
struct dhcphdr *dhcphdr;
DBGC ( colour, "CACHEDHCP %s at %#08lx+%#zx/%#zx\n", cache->name,
user_to_phys ( data, 0 ), len, max_len );
cache->dhcppkt = dhcppkt;
+ cache->vlan = vlan;
return 0;
}
extern struct cached_dhcp_packet cached_proxydhcp;
extern struct cached_dhcp_packet cached_pxebs;
-extern int cachedhcp_record ( struct cached_dhcp_packet *cache, userptr_t data,
+extern int cachedhcp_record ( struct cached_dhcp_packet *cache,
+ unsigned int vlan, userptr_t data,
size_t max_len );
#endif /* _IPXE_CACHEDHCP_H */
#include <ipxe/efi/efi.h>
-extern int efi_cachedhcp_record ( EFI_HANDLE device );
+extern int efi_cachedhcp_record ( EFI_HANDLE device,
+ EFI_DEVICE_PATH_PROTOCOL *path );
#endif /* _IPXE_EFI_CACHEDHCP_H */
#include <errno.h>
#include <ipxe/cachedhcp.h>
#include <ipxe/efi/efi.h>
+#include <ipxe/efi/efi_path.h>
#include <ipxe/efi/efi_cachedhcp.h>
#include <ipxe/efi/Protocol/PxeBaseCode.h>
* Record cached DHCP packet
*
* @v device Device handle
+ * @v path Device path
* @ret rc Return status code
*/
-int efi_cachedhcp_record ( EFI_HANDLE device ) {
- EFI_BOOT_SERVICES *bs = efi_systab->BootServices;
+int efi_cachedhcp_record ( EFI_HANDLE device,
+ EFI_DEVICE_PATH_PROTOCOL *path ) {
+ EFI_BOOT_SERVICES *bs = efi_systab->BootServices;
+ unsigned int vlan;
union {
EFI_PXE_BASE_CODE_PROTOCOL *pxe;
void *interface;
EFI_STATUS efirc;
int rc;
+ /* Get VLAN tag, if any */
+ vlan = efi_path_vlan ( path );
+
/* Look for a PXE base code instance on the image's device handle */
if ( ( efirc = bs->OpenProtocol ( device,
&efi_pxe_base_code_protocol_guid,
/* Record DHCPACK, if present */
if ( mode->DhcpAckReceived &&
- ( ( rc = cachedhcp_record ( &cached_dhcpack,
+ ( ( rc = cachedhcp_record ( &cached_dhcpack, vlan,
virt_to_user ( &mode->DhcpAck ),
sizeof ( mode->DhcpAck ) ) ) != 0 ) ) {
DBGC ( device, "EFI %s could not record DHCPACK: %s\n",
/* Record ProxyDHCPOFFER, if present */
if ( mode->ProxyOfferReceived &&
- ( ( rc = cachedhcp_record ( &cached_proxydhcp,
+ ( ( rc = cachedhcp_record ( &cached_proxydhcp, vlan,
virt_to_user ( &mode->ProxyOffer ),
sizeof ( mode->ProxyOffer ) ) ) != 0)){
DBGC ( device, "EFI %s could not record ProxyDHCPOFFER: %s\n",
/* Record PxeBSACK, if present */
if ( mode->PxeReplyReceived &&
- ( ( rc = cachedhcp_record ( &cached_pxebs,
+ ( ( rc = cachedhcp_record ( &cached_pxebs, vlan,
virt_to_user ( &mode->PxeReply ),
sizeof ( mode->PxeReply ) ) ) != 0)){
DBGC ( device, "EFI %s could not record PXEBSACK: %s\n",
*/
static void efi_init_application ( void ) {
EFI_HANDLE device = efi_loaded_image->DeviceHandle;
+ EFI_DEVICE_PATH_PROTOCOL *path = efi_loaded_image_path;
/* Identify autoboot device, if any */
efi_set_autoboot_ll_addr ( device );
/* Store cached DHCP packet, if any */
- efi_cachedhcp_record ( device );
+ efi_cachedhcp_record ( device, path );
/* Load autoexec script, if any */
efi_autoexec_load ( device );