]> git.ipfire.org Git - people/ms/u-boot.git/blobdiff - net/bootp.c
status_led: Kconfig migration
[people/ms/u-boot.git] / net / bootp.c
index 8da2e9b8b43fd7aa8eb37b666d2aacbbb20720cc..be8f710e0c5ca9bb0a2a884891932966c86d21c6 100644 (file)
 
 #include <common.h>
 #include <command.h>
+#include <efi_loader.h>
 #include <net.h>
 #include <net/tftp.h>
 #include "bootp.h"
 #include "nfs.h"
-#ifdef CONFIG_STATUS_LED
+#ifdef CONFIG_LED_STATUS
 #include <status_led.h>
 #endif
 #ifdef CONFIG_BOOTP_RANDOM_DELAY
@@ -60,6 +61,8 @@ char net_nis_domain[32] = {0,}; /* Our NIS domain */
 char net_hostname[32] = {0,}; /* Our hostname */
 char net_root_path[64] = {0,}; /* Our bootpath */
 
+static ulong time_taken_max;
+
 #if defined(CONFIG_CMD_DHCP)
 static dhcp_state_t dhcp_state = INIT;
 static u32 dhcp_leasetime;
@@ -130,6 +133,8 @@ static int check_reply_packet(uchar *pkt, unsigned dest, unsigned src,
                retval = -5;
        else if (!bootp_match_id(net_read_u32(&bp->bp_id)))
                retval = -6;
+       else if (memcmp(bp->bp_chaddr, net_ethaddr, HWL_ETHER) != 0)
+               retval = -7;
 
        debug("Filtering pkt = %d\n", retval);
 
@@ -354,8 +359,8 @@ static void bootp_handler(uchar *pkt, unsigned dest, struct in_addr sip,
        /*
         *      Got a good BOOTP reply.  Copy the data into our variables.
         */
-#if defined(CONFIG_STATUS_LED) && defined(STATUS_LED_BOOT)
-       status_led_set(STATUS_LED_BOOT, STATUS_LED_OFF);
+#if defined(CONFIG_LED_STATUS) && defined(CONFIG_LED_STATUS_BOOT_ENABLE)
+       status_led_set(CONFIG_LED_STATUS_BOOT, CONFIG_LED_STATUS_OFF);
 #endif
 
        store_net_params(bp);           /* Store net parameters from reply */
@@ -380,7 +385,7 @@ static void bootp_timeout_handler(void)
 {
        ulong time_taken = get_timer(bootp_start);
 
-       if (time_taken >= TIMEOUT_MS) {
+       if (time_taken >= time_taken_max) {
 #ifdef CONFIG_BOOTP_MAY_FAIL
                puts("\nRetry time exceeded\n");
                net_set_state(NETLOOP_FAIL);
@@ -406,6 +411,26 @@ static void bootp_timeout_handler(void)
                e += vci_strlen;                                \
        } while (0)
 
+static u8 *add_vci(u8 *e)
+{
+       char *vci = NULL;
+       char *env_vci = getenv("bootp_vci");
+
+#if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_NET_VCI_STRING)
+       vci = CONFIG_SPL_NET_VCI_STRING;
+#elif defined(CONFIG_BOOTP_VCI_STRING)
+       vci = CONFIG_BOOTP_VCI_STRING;
+#endif
+
+       if (env_vci)
+               vci = env_vci;
+
+       if (vci)
+               put_vci(e, vci);
+
+       return e;
+}
+
 /*
  *     Initialize BOOTP extension fields in the request.
  */
@@ -415,10 +440,10 @@ static int dhcp_extended(u8 *e, int message_type, struct in_addr server_ip,
 {
        u8 *start = e;
        u8 *cnt;
-#if defined(CONFIG_BOOTP_PXE)
+#ifdef CONFIG_LIB_UUID
        char *uuid;
-       u16 clientarch;
 #endif
+       int clientarch = -1;
 
 #if defined(CONFIG_BOOTP_VENDOREX)
        u8 *x;
@@ -474,12 +499,19 @@ static int dhcp_extended(u8 *e, int message_type, struct in_addr server_ip,
        }
 #endif
 
-#if defined(CONFIG_BOOTP_PXE)
+#ifdef CONFIG_BOOTP_PXE_CLIENTARCH
        clientarch = CONFIG_BOOTP_PXE_CLIENTARCH;
-       *e++ = 93;      /* Client System Architecture */
-       *e++ = 2;
-       *e++ = (clientarch >> 8) & 0xff;
-       *e++ = clientarch & 0xff;
+#endif
+
+       if (getenv("bootp_arch"))
+               clientarch = getenv_ulong("bootp_arch", 16, clientarch);
+
+       if (clientarch > 0) {
+               *e++ = 93;      /* Client System Architecture */
+               *e++ = 2;
+               *e++ = (clientarch >> 8) & 0xff;
+               *e++ = clientarch & 0xff;
+       }
 
        *e++ = 94;      /* Client Network Interface Identifier */
        *e++ = 3;
@@ -487,6 +519,7 @@ static int dhcp_extended(u8 *e, int message_type, struct in_addr server_ip,
        *e++ = 0;       /* major revision */
        *e++ = 0;       /* minor revision */
 
+#ifdef CONFIG_LIB_UUID
        uuid = getenv("pxeuuid");
 
        if (uuid) {
@@ -503,11 +536,7 @@ static int dhcp_extended(u8 *e, int message_type, struct in_addr server_ip,
        }
 #endif
 
-#if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_NET_VCI_STRING)
-       put_vci(e, CONFIG_SPL_NET_VCI_STRING);
-#elif defined(CONFIG_BOOTP_VCI_STRING)
-       put_vci(e, CONFIG_BOOTP_VCI_STRING);
-#endif
+       e = add_vci(e);
 
 #if defined(CONFIG_BOOTP_VENDOREX)
        x = dhcp_vendorex_prep(e);
@@ -593,14 +622,7 @@ static int bootp_extended(u8 *e)
        *e++ = (576 - 312 + OPT_FIELD_SIZE) & 0xff;
 #endif
 
-#if defined(CONFIG_BOOTP_VCI_STRING) || \
-       (defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_NET_VCI_STRING))
-#ifdef CONFIG_SPL_BUILD
-       put_vci(e, CONFIG_SPL_NET_VCI_STRING);
-#else
-       put_vci(e, CONFIG_BOOTP_VCI_STRING);
-#endif
-#endif
+       add_vci(e);
 
 #if defined(CONFIG_BOOTP_SUBNETMASK)
        *e++ = 1;               /* Subnet mask request */
@@ -651,6 +673,15 @@ static int bootp_extended(u8 *e)
 
        *e++ = 255;             /* End of the list */
 
+       /*
+        * If nothing in list, remove it altogether. Some DHCP servers get
+        * upset by this minor faux pas and do not respond at all.
+        */
+       if (e == start + 3) {
+               printf("*** Warning: no DHCP options requested\n");
+               e -= 3;
+       }
+
        return e - start;
 }
 #endif
@@ -675,12 +706,19 @@ void bootp_request(void)
        u32 bootp_id;
        struct in_addr zero_ip;
        struct in_addr bcast_ip;
+       char *ep;  /* Environment pointer */
 
        bootstage_mark_name(BOOTSTAGE_ID_BOOTP_START, "bootp_start");
 #if defined(CONFIG_CMD_DHCP)
        dhcp_state = INIT;
 #endif
 
+       ep = getenv("bootpretryperiod");
+       if (ep != NULL)
+               time_taken_max = simple_strtoul(ep, NULL, 10);
+       else
+               time_taken_max = TIMEOUT_MS;
+
 #ifdef CONFIG_BOOTP_RANDOM_DELAY               /* Random BOOTP delay */
        if (bootp_try == 0)
                srand_mac();
@@ -949,6 +987,7 @@ static void dhcp_send_request_packet(struct bootp_hdr *bp_offer)
        net_write_ip(&bp->bp_giaddr, zero_ip);
 
        memcpy(bp->bp_chaddr, net_ethaddr, 6);
+       copy_filename(bp->bp_file, net_boot_file_name, sizeof(bp->bp_file));
 
        /*
         * ID is the id of the OFFER packet
@@ -1013,6 +1052,7 @@ static void dhcp_handler(uchar *pkt, unsigned dest, struct in_addr sip,
                            strlen(CONFIG_SYS_BOOTFILE_PREFIX)) == 0) {
 #endif /* CONFIG_SYS_BOOTFILE_PREFIX */
                        dhcp_packet_process_options(bp);
+                       efi_net_set_dhcp_ack(pkt, len);
 
                        debug("TRANSITIONING TO REQUESTING STATE\n");
                        dhcp_state = REQUESTING;