|
@@ -773,14 +773,12 @@ void bootp_request(void)
|
|
|
}
|
|
|
|
|
|
#if defined(CONFIG_CMD_DHCP)
|
|
|
-static void dhcp_process_options(uchar *popt, struct bootp_hdr *bp)
|
|
|
+static void dhcp_process_options(uchar *popt, uchar *end)
|
|
|
{
|
|
|
- uchar *end = popt + BOOTP_HDR_SIZE;
|
|
|
int oplen, size;
|
|
|
#if defined(CONFIG_CMD_SNTP) && defined(CONFIG_BOOTP_TIMEOFFSET)
|
|
|
int *to_ptr;
|
|
|
#endif
|
|
|
- dhcp_option_overload = 0;
|
|
|
|
|
|
while (popt < end && *popt != 0xff) {
|
|
|
oplen = *(popt + 1);
|
|
@@ -865,6 +863,35 @@ static void dhcp_process_options(uchar *popt, struct bootp_hdr *bp)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static void dhcp_packet_process_options(struct bootp_hdr *bp)
|
|
|
+{
|
|
|
+ uchar *popt = (uchar *)&bp->bp_vend[4];
|
|
|
+ uchar *end = popt + BOOTP_HDR_SIZE;
|
|
|
+
|
|
|
+ if (net_read_u32((u32 *)&bp->bp_vend[0]) != htonl(BOOTP_VENDOR_MAGIC))
|
|
|
+ return;
|
|
|
+
|
|
|
+ dhcp_option_overload = 0;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * The 'options' field MUST be interpreted first, 'file' next,
|
|
|
+ * 'sname' last.
|
|
|
+ */
|
|
|
+ dhcp_process_options(popt, end);
|
|
|
+
|
|
|
+ if (dhcp_option_overload & OVERLOAD_FILE) {
|
|
|
+ popt = (uchar *)bp->bp_file;
|
|
|
+ end = popt + sizeof(bp->bp_file);
|
|
|
+ dhcp_process_options(popt, end);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (dhcp_option_overload & OVERLOAD_SNAME) {
|
|
|
+ popt = (uchar *)bp->bp_sname;
|
|
|
+ end = popt + sizeof(bp->bp_sname);
|
|
|
+ dhcp_process_options(popt, end);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
static int dhcp_message_type(unsigned char *popt)
|
|
|
{
|
|
|
if (net_read_u32((u32 *)popt) != htonl(BOOTP_VENDOR_MAGIC))
|
|
@@ -982,14 +1009,11 @@ static void dhcp_handler(uchar *pkt, unsigned dest, struct in_addr sip,
|
|
|
CONFIG_SYS_BOOTFILE_PREFIX,
|
|
|
strlen(CONFIG_SYS_BOOTFILE_PREFIX)) == 0) {
|
|
|
#endif /* CONFIG_SYS_BOOTFILE_PREFIX */
|
|
|
+ dhcp_packet_process_options(bp);
|
|
|
|
|
|
debug("TRANSITIONING TO REQUESTING STATE\n");
|
|
|
dhcp_state = REQUESTING;
|
|
|
|
|
|
- if (net_read_u32((u32 *)&bp->bp_vend[0]) ==
|
|
|
- htonl(BOOTP_VENDOR_MAGIC))
|
|
|
- dhcp_process_options((u8 *)&bp->bp_vend[4], bp);
|
|
|
-
|
|
|
net_set_timeout_handler(5000, bootp_timeout_handler);
|
|
|
dhcp_send_request_packet(bp);
|
|
|
#ifdef CONFIG_SYS_BOOTFILE_PREFIX
|
|
@@ -1002,9 +1026,7 @@ static void dhcp_handler(uchar *pkt, unsigned dest, struct in_addr sip,
|
|
|
debug("DHCP State: REQUESTING\n");
|
|
|
|
|
|
if (dhcp_message_type((u8 *)bp->bp_vend) == DHCP_ACK) {
|
|
|
- if (net_read_u32((u32 *)&bp->bp_vend[0]) ==
|
|
|
- htonl(BOOTP_VENDOR_MAGIC))
|
|
|
- dhcp_process_options((u8 *)&bp->bp_vend[4], bp);
|
|
|
+ dhcp_packet_process_options(bp);
|
|
|
/* Store net params from reply */
|
|
|
store_net_params(bp);
|
|
|
dhcp_state = BOUND;
|