[DHCPINFORM] = BOOTP_REQUEST, }; /** Raw option data for options common to all DHCP requests */ static uint8_t dhcp_request_options_data[] = { DHCP_MESSAGE_TYPE, DHCP_BYTE ( 0 ), DHCP_MAX_MESSAGE_SIZE, DHCP_WORD ( ETH_MAX_MTU - 20 /* IP header */ - 8 /* UDP header */ ), DHCP_CLIENT_ARCHITECTURE, DHCP_ARCH_CLIENT_ARCHITECTURE, DHCP_CLIENT_NDI, DHCP_ARCH_CLIENT_NDI, DHCP_VENDOR_CLASS_ID, DHCP_ARCH_VENDOR_CLASS_ID, DHCP_USER_CLASS_ID, DHCP_STRING ( 'i', 'P', 'X', 'E' ), DHCP_PARAMETER_REQUEST_LIST, DHCP_OPTION ( DHCP_SUBNET_MASK, DHCP_ROUTERS, DHCP_DNS_SERVERS, DHCP_LOG_SERVERS, DHCP_HOST_NAME, DHCP_DOMAIN_NAME, DHCP_ROOT_PATH, DHCP_VENDOR_ENCAP, DHCP_VENDOR_CLASS_ID, DHCP_TFTP_SERVER_NAME, DHCP_BOOTFILE_NAME, 128, 129, 130, 131, 132, 133, 134, 135, /* for PXE */ DHCP_EB_ENCAP, DHCP_ISCSI_INITIATOR_IQN ), DHCP_END }; /** DHCP server address setting */ struct setting dhcp_server_setting __setting ( SETTING_MISC ) = { .name = "dhcp-server", .description = "DHCP server", .tag = DHCP_SERVER_IDENTIFIER, .type = &setting_type_ipv4, }; /** DHCP user class setting */ struct setting user_class_setting __setting ( SETTING_HOST_EXTRA ) = {
static void DHCPSRV_write_header ( DHCPSRV_STATE_STRUCT_PTR state, DHCPSRV_ADDR_STRUCT_PTR lease_ptr, uint_32 lease_time, uchar msgtype ) { /* Body */ DHCP_HEADER_PTR outp; DHCP_HEADER_PTR inp; uchar_ptr optptr; volatile uint_32 optlen; uint_32 temp_long; uint_16 temp_short; uchar temp_char; outp = (DHCP_HEADER_PTR)state->SND_BUFFER; inp = (DHCP_HEADER_PTR)state->RCV_BUFFER; /* Build a DHCPOFFER, DHCPACK, or DHCPNAK packet */ htonc(outp->OP, DHCPOP_BOOTREPLY); htonc(outp->HTYPE, ARPLINK_ETHERNET); temp_char = ntohc(inp->HLEN); htonc(outp->HLEN, temp_char); htonc(outp->HOPS, 0); /* Use client's existing transaction ID */ temp_long = ntohl(inp->XID); htonl(outp->XID, temp_long); htons(outp->SECS, 0); if (ntohl(inp->GIADDR) == 0) { htons(outp->FLAGS, 0); } else { temp_short = ntohs(inp->FLAGS); htons(outp->FLAGS, temp_short); } /* Endif */ if (msgtype == DHCPTYPE_DHCPOFFER) { htonl(outp->CIADDR, 0); } else { temp_long = ntohl(inp->CIADDR); htonl(outp->CIADDR, temp_long); } /* Endif */ if (msgtype == DHCPTYPE_DHCPNAK) { htonl(outp->YIADDR, 0); htonl(outp->SIADDR, 0); } else { htonl(outp->YIADDR, lease_ptr->IP_ADDR); htonl(outp->SIADDR, lease_ptr->OPTIONS->SADDR); } /* Endif */ htonl(outp->GIADDR, 0); _mem_copy(inp->CHADDR, outp->CHADDR, sizeof(outp->CHADDR)); if (msgtype == DHCPTYPE_DHCPNAK) { _mem_zero(outp->SNAME, sizeof(outp->SNAME)); _mem_zero(outp->FILE, sizeof(outp->FILE)); } else { _mem_copy(lease_ptr->OPTIONS->SNAME, outp->SNAME, sizeof(outp->SNAME)); _mem_copy(lease_ptr->OPTIONS->FILE, outp->FILE, sizeof(outp->FILE)); } /* Endif */ /* ** Fill in the required response options. These are message type, ** subnet mask, and server id. */ optlen = sizeof(DHCP_HEADER); optptr = state->SND_BUFFER + optlen; /* The Magic Cookie must always be the first thing in the OPTIONS */ htonl(optptr, DHCP_MAGIC); optptr += DHCPSIZE_MAGIC; optlen += DHCPSIZE_MAGIC; #define DHCP_OPTION(type,len,val) \ htonc(optptr, DHCPOPT_ ## type); optptr++; optlen++; \ htonc(optptr, DHCPSIZE_ ## type); optptr++; optlen++; \ hton ## len(optptr, val); \ optptr += DHCPSIZE_ ## type; \ optlen += DHCPSIZE_ ## type DHCP_OPTION(MSGTYPE, c, msgtype); if (msgtype != DHCPTYPE_DHCPNAK) { DHCP_OPTION(SERVERID, l, lease_ptr->OPTIONS->SERVERID); DHCP_OPTION(MASK, l, lease_ptr->OPTIONS->MASK); DHCP_OPTION(LEASE, l, lease_time); } /* Endif */ state->SND_BUFFER_LEN = optlen; } /* Endbody */
[DHCPINFORM] = BOOTP_REQUEST, }; /** Raw option data for options common to all DHCP requests */ static uint8_t dhcp_request_options_data[] = { DHCP_MESSAGE_TYPE, DHCP_BYTE ( 0 ), DHCP_MAX_MESSAGE_SIZE, DHCP_WORD ( ETH_MAX_MTU - 20 /* IP header */ - 8 /* UDP header */ ), DHCP_CLIENT_ARCHITECTURE, DHCP_ARCH_CLIENT_ARCHITECTURE, DHCP_CLIENT_NDI, DHCP_ARCH_CLIENT_NDI, DHCP_VENDOR_CLASS_ID, DHCP_ARCH_VENDOR_CLASS_ID, DHCP_USER_CLASS_ID, DHCP_STRING ( 'i', 'P', 'X', 'E' ), DHCP_PARAMETER_REQUEST_LIST, DHCP_OPTION ( DHCP_SUBNET_MASK, DHCP_ROUTERS, DHCP_DNS_SERVERS, DHCP_LOG_SERVERS, DHCP_HOST_NAME, DHCP_DOMAIN_NAME, DHCP_ROOT_PATH, DHCP_VENDOR_ENCAP, DHCP_VENDOR_CLASS_ID, DHCP_TFTP_SERVER_NAME, DHCP_BOOTFILE_NAME, DHCP_EB_ENCAP, DHCP_ISCSI_INITIATOR_IQN ), DHCP_END }; /** Version number feature */ FEATURE_VERSION ( VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH ); /** DHCP server address setting */ struct setting dhcp_server_setting __setting = { .name = "dhcp-server", .description = "DHCP server address", .tag = DHCP_SERVER_IDENTIFIER, .type = &setting_type_ipv4, };