X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;ds=sidebyside;f=net%2Fbootp.c;h=efa959971c279fe4e74d04ec0007d0cb1ef52e34;hb=ca2b07a8d4e0b90e3bbc369760ceb12968666c81;hp=d718e35b63ec392e1f9d2df0cf1489df0e000d01;hpb=4570a993d5f330ab05081f7b1070da9bcde9289e;p=u-boot diff --git a/net/bootp.c b/net/bootp.c index d718e35b63..efa959971c 100644 --- a/net/bootp.c +++ b/net/bootp.c @@ -14,8 +14,7 @@ #include #include #include "bootp.h" -#include "nfs.h" -#ifdef CONFIG_STATUS_LED +#ifdef CONFIG_LED_STATUS #include #endif #ifdef CONFIG_BOOTP_RANDOM_DELAY @@ -170,7 +169,7 @@ static void store_net_params(struct bootp_hdr *bp) * not contain a new value */ if (*net_boot_file_name) - setenv("bootfile", net_boot_file_name); + env_set("bootfile", net_boot_file_name); #endif net_copy_ip(&net_ip, &bp->bp_yiaddr); } @@ -359,8 +358,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 */ @@ -387,12 +386,19 @@ static void bootp_timeout_handler(void) if (time_taken >= time_taken_max) { #ifdef CONFIG_BOOTP_MAY_FAIL - puts("\nRetry time exceeded\n"); - net_set_state(NETLOOP_FAIL); -#else - puts("\nRetry time exceeded; starting again\n"); - net_start_again(); + char *ethrotate; + + ethrotate = env_get("ethrotate"); + if ((ethrotate && strcmp(ethrotate, "no") == 0) || + net_restart_wrap) { + puts("\nRetry time exceeded\n"); + net_set_state(NETLOOP_FAIL); + } else #endif + { + puts("\nRetry time exceeded; starting again\n"); + net_start_again(); + } } else { bootp_timeout *= 2; if (bootp_timeout > 2000) @@ -413,12 +419,21 @@ static void bootp_timeout_handler(void) static u8 *add_vci(u8 *e) { + char *vci = NULL; + char *env_vci = env_get("bootp_vci"); + #if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_NET_VCI_STRING) - put_vci(e, CONFIG_SPL_NET_VCI_STRING); + vci = CONFIG_SPL_NET_VCI_STRING; #elif defined(CONFIG_BOOTP_VCI_STRING) - put_vci(e, CONFIG_BOOTP_VCI_STRING); + vci = CONFIG_BOOTP_VCI_STRING; #endif + if (env_vci) + vci = env_vci; + + if (vci) + put_vci(e, vci); + return e; } @@ -431,10 +446,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; @@ -479,7 +494,7 @@ static int dhcp_extended(u8 *e, int message_type, struct in_addr server_ip, *e++ = tmp & 0xff; } #if defined(CONFIG_BOOTP_SEND_HOSTNAME) - hostname = getenv("hostname"); + hostname = env_get("hostname"); if (hostname) { int hostnamelen = strlen(hostname); @@ -490,12 +505,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 (env_get("bootp_arch")) + clientarch = env_get_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; @@ -503,7 +525,8 @@ static int dhcp_extended(u8 *e, int message_type, struct in_addr server_ip, *e++ = 0; /* major revision */ *e++ = 0; /* minor revision */ - uuid = getenv("pxeuuid"); +#ifdef CONFIG_LIB_UUID + uuid = env_get("pxeuuid"); if (uuid) { if (uuid_str_valid(uuid)) { @@ -656,6 +679,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 @@ -687,7 +719,7 @@ void bootp_request(void) dhcp_state = INIT; #endif - ep = getenv("bootpretryperiod"); + ep = env_get("bootpretryperiod"); if (ep != NULL) time_taken_max = simple_strtoul(ep, NULL, 10); else