diff options
author | H. Peter Anvin <hpa@zytor.com> | 2014-06-16 17:39:24 -0700 |
---|---|---|
committer | H. Peter Anvin <hpa@zytor.com> | 2014-06-16 17:42:36 -0700 |
commit | 191e622cdd85271783682ff38f4c307b89cfe040 (patch) | |
tree | c3b54bb059d1fd585cf89e7de9441d13688954db | |
parent | 616d86cb26b13f6dcab511a515eab437ea2cb652 (diff) | |
download | syslinux-191e622cdd85271783682ff38f4c307b89cfe040.tar.gz |
pxe: Re-add support for embedded DHCP optionssyslinux-6.03-pre15
Fix the support for embedded DHCP options. Although we were
diligently saving them away, we never actually parsed them.
This fixes embedded options for BIOS only -- for EFI we need to modify
the encoding scheme so that it can fit inside an EFI PECOFF image.
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
-rw-r--r-- | core/fs/pxe/bios.c | 17 | ||||
-rw-r--r-- | core/fs/pxe/dhcp_option.c | 7 | ||||
-rw-r--r-- | core/fs/pxe/pxe.h | 1 | ||||
-rw-r--r-- | core/pxelinux.asm | 1 |
4 files changed, 23 insertions, 3 deletions
diff --git a/core/fs/pxe/bios.c b/core/fs/pxe/bios.c index 6d514df2..6eb37626 100644 --- a/core/fs/pxe/bios.c +++ b/core/fs/pxe/bios.c @@ -5,6 +5,7 @@ #include <net.h> #include <minmax.h> #include <bios.h> +#include <dprintf.h> static uint16_t real_base_mem; /* Amount of DOS memory after freeing */ @@ -385,6 +386,9 @@ cant_free: return; } +extern const char bdhcp_data[], adhcp_data[]; +extern const uint32_t bdhcp_len, adhcp_len; + void net_parse_dhcp(void) { int pkt_len; @@ -400,11 +404,18 @@ void net_parse_dhcp(void) *LocalDomain = 0; /* No LocalDomain received */ /* + * Parse any "before" hardcoded options + */ + dprintf("DHCP: bdhcp_len = %d\n", bdhcp_len); + parse_dhcp_options(bdhcp_data, bdhcp_len, 0); + + /* * Get the DHCP client identifiers (query info 1) */ ddprintf("Getting cached packet "); pkt_len = pxe_get_cached_info(1, bp, dhcp_max_packet); parse_dhcp(bp, pkt_len); + /* * We don't use flags from the request packet, so * this is a good time to initialize DHCPMagic... @@ -439,5 +450,11 @@ void net_parse_dhcp(void) parse_dhcp(bp, pkt_len); ddprintf("\n"); + /* + * Parse any "after" hardcoded options + */ + dprintf("DHCP: adhcp_len = %d\n", adhcp_len); + parse_dhcp_options(adhcp_data, adhcp_len, 0); + lfree(bp); } diff --git a/core/fs/pxe/dhcp_option.c b/core/fs/pxe/dhcp_option.c index 3517161a..1fdcc705 100644 --- a/core/fs/pxe/dhcp_option.c +++ b/core/fs/pxe/dhcp_option.c @@ -3,6 +3,7 @@ #include <core.h> #include <sys/cpu.h> #include <lwip/opt.h> /* DNS_MAX_SERVERS */ +#include <dprintf.h> #include "pxe.h" char LocalDomain[256]; @@ -11,8 +12,6 @@ int over_load; uint8_t uuid_type; uint8_t uuid[16]; -static void parse_dhcp_options(const void *, int, uint8_t); - static void subnet_mask(const void *data, int opt_len) { if (opt_len != 4) @@ -164,7 +163,7 @@ static const struct dhcp_options dhcp_opts[] = { * filter contains the minimum value for the option to recognize * -- this is used to restrict parsing to PXELINUX-specific options only. */ -static void parse_dhcp_options(const void *option, int size, uint8_t opt_filter) +void parse_dhcp_options(const void *option, int size, uint8_t opt_filter) { int opt_num; int opt_len; @@ -189,6 +188,8 @@ static void parse_dhcp_options(const void *option, int size, uint8_t opt_filter) if (size < 0) break; + dprintf("DHCP: option %d, len %d\n", opt_num, opt_len); + if (opt_num >= opt_filter) { opt = dhcp_opts; for (i = 0; i < opt_entries; i++) { diff --git a/core/fs/pxe/pxe.h b/core/fs/pxe/pxe.h index 279957ac..15252fff 100644 --- a/core/fs/pxe/pxe.h +++ b/core/fs/pxe/pxe.h @@ -231,6 +231,7 @@ int undiif_start(uint32_t ip, uint32_t netmask, uint32_t gw); void undiif_input(t_PXENV_UNDI_ISR *isr); /* dhcp_options.c */ +void parse_dhcp_options(const void *, int, uint8_t); void parse_dhcp(const void *, size_t); /* idle.c */ diff --git a/core/pxelinux.asm b/core/pxelinux.asm index 953a906f..d4b1a07a 100644 --- a/core/pxelinux.asm +++ b/core/pxelinux.asm @@ -93,6 +93,7 @@ _start: hcdhcp_magic dd 0x2983c8ac ; Magic number hcdhcp_len dd 7*4 ; Size of this structure hcdhcp_flags dd 0 ; Reserved for the future + global bdhcp_len, adhcp_len ; Parameters to be parsed before the ones from PXE bdhcp_offset dd 0 ; Offset (entered by patcher) bdhcp_len dd 0 ; Length (entered by patcher) |