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) 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; }
/* * Warning: no field size check - change CONFIG_BOOTP_* at your own risk! */ static int BootpExtended(u8 *e) { u8 *start = e; *e++ = 99; /* RFC1048 Magic Cookie */ *e++ = 130; *e++ = 83; *e++ = 99; #if defined(CONFIG_CMD_DHCP) *e++ = 53; /* DHCP Message Type */ *e++ = 1; *e++ = DHCP_DISCOVER; *e++ = 57; /* Maximum DHCP Message Size */ *e++ = 2; *e++ = (576 - 312 + OPT_FIELD_SIZE) >> 16; *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 #if defined(CONFIG_BOOTP_SUBNETMASK) *e++ = 1; /* Subnet mask request */ *e++ = 4; e += 4; #endif #if defined(CONFIG_BOOTP_GATEWAY) *e++ = 3; /* Default gateway request */ *e++ = 4; e += 4; #endif #if defined(CONFIG_BOOTP_DNS) *e++ = 6; /* Domain Name Server */ *e++ = 4; e += 4; #endif #if defined(CONFIG_BOOTP_HOSTNAME) *e++ = 12; /* Host name request */ *e++ = 32; e += 32; #endif #if defined(CONFIG_BOOTP_BOOTFILESIZE) *e++ = 13; /* Boot file size */ *e++ = 2; e += 2; #endif #if defined(CONFIG_BOOTP_BOOTPATH) *e++ = 17; /* Boot path */ *e++ = 32; e += 32; #endif #if defined(CONFIG_BOOTP_NISDOMAIN) *e++ = 40; /* NIS Domain name request */ *e++ = 32; e += 32; #endif #if defined(CONFIG_BOOTP_NTPSERVER) *e++ = 42; *e++ = 4; e += 4; #endif *e++ = 255; /* End of the list */ return e - start; }
static int DhcpExtended(u8 *e, int message_type, IPaddr_t ServerID, IPaddr_t RequestedIP) { u8 *start = e; u8 *cnt; #if defined(CONFIG_BOOTP_PXE) char *uuid; u16 clientarch; #endif #if defined(CONFIG_BOOTP_VENDOREX) u8 *x; #endif #if defined(CONFIG_BOOTP_SEND_HOSTNAME) char *hostname; #endif *e++ = 99; /* RFC1048 Magic Cookie */ *e++ = 130; *e++ = 83; *e++ = 99; *e++ = 53; /* DHCP Message Type */ *e++ = 1; *e++ = message_type; *e++ = 57; /* Maximum DHCP Message Size */ *e++ = 2; *e++ = (576 - 312 + OPT_FIELD_SIZE) >> 8; *e++ = (576 - 312 + OPT_FIELD_SIZE) & 0xff; if (ServerID) { int tmp = ntohl(ServerID); *e++ = 54; /* ServerID */ *e++ = 4; *e++ = tmp >> 24; *e++ = tmp >> 16; *e++ = tmp >> 8; *e++ = tmp & 0xff; } if (RequestedIP) { int tmp = ntohl(RequestedIP); *e++ = 50; /* Requested IP */ *e++ = 4; *e++ = tmp >> 24; *e++ = tmp >> 16; *e++ = tmp >> 8; *e++ = tmp & 0xff; } #if defined(CONFIG_BOOTP_SEND_HOSTNAME) hostname = getenv("hostname"); if (hostname) { int hostnamelen = strlen(hostname); *e++ = 12; /* Hostname */ *e++ = hostnamelen; memcpy(e, hostname, hostnamelen); e += hostnamelen; } #endif #if defined(CONFIG_BOOTP_PXE) clientarch = CONFIG_BOOTP_PXE_CLIENTARCH; *e++ = 93; /* Client System Architecture */ *e++ = 2; *e++ = (clientarch >> 8) & 0xff; *e++ = clientarch & 0xff; *e++ = 94; /* Client Network Interface Identifier */ *e++ = 3; *e++ = 1; /* type field for UNDI */ *e++ = 0; /* major revision */ *e++ = 0; /* minor revision */ uuid = getenv("pxeuuid"); if (uuid) { if (uuid_str_valid(uuid)) { *e++ = 97; /* Client Machine Identifier */ *e++ = 17; *e++ = 0; /* type 0 - UUID */ uuid_str_to_bin(uuid, e, UUID_STR_FORMAT_STD); e += 16; } else { printf("Invalid pxeuuid: %s\n", uuid); } } #endif #ifdef CONFIG_BOOTP_VCI_STRING put_vci(e, CONFIG_BOOTP_VCI_STRING); #endif #if defined(CONFIG_BOOTP_VENDOREX) x = dhcp_vendorex_prep(e); if (x) return x - start; #endif *e++ = 55; /* Parameter Request List */ cnt = e++; /* Pointer to count of requested items */ *cnt = 0; #if defined(CONFIG_BOOTP_SUBNETMASK) *e++ = 1; /* Subnet Mask */ *cnt += 1; #endif #if defined(CONFIG_BOOTP_TIMEOFFSET) *e++ = 2; *cnt += 1; #endif #if defined(CONFIG_BOOTP_GATEWAY) *e++ = 3; /* Router Option */ *cnt += 1; #endif #if defined(CONFIG_BOOTP_DNS) *e++ = 6; /* DNS Server(s) */ *cnt += 1; #endif #if defined(CONFIG_BOOTP_HOSTNAME) *e++ = 12; /* Hostname */ *cnt += 1; #endif #if defined(CONFIG_BOOTP_BOOTFILESIZE) *e++ = 13; /* Boot File Size */ *cnt += 1; #endif #if defined(CONFIG_BOOTP_BOOTPATH) *e++ = 17; /* Boot path */ *cnt += 1; #endif #if defined(CONFIG_BOOTP_NISDOMAIN) *e++ = 40; /* NIS Domain name request */ *cnt += 1; #endif #if defined(CONFIG_BOOTP_NTPSERVER) *e++ = 42; *cnt += 1; #endif /* no options, so back up to avoid sending an empty request list */ if (*cnt == 0) e -= 2; *e++ = 255; /* End of the list */ /* Pad to minimal length */ #ifdef CONFIG_DHCP_MIN_EXT_LEN while ((e - start) < CONFIG_DHCP_MIN_EXT_LEN) *e++ = 0; #endif return e - start; }