/* * Copyright (c) 2011 Rozhuk Ivan * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * */ #if !defined(AFX_DHCPMESSAGE__H__INCLUDED_) #define AFX_DHCPMESSAGE__H__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #ifndef SIZEOF #define SIZEOF(X) (sizeof(X)/sizeof(X[0])) #endif #define DHCP_PSTR char* #define DHCP_PCSTR const char* #define DHCP_1BYTE unsigned char #define DHCP_2BYTE unsigned short #define DHCP_4BYTE unsigned long #ifdef _WINDOWS #define DHCP_SIZE_T SIZE_T #else #define DHCP_SIZE_T size_t #endif // error constants #ifndef _WINDOWS #define NO_ERROR 0 #define ERROR_INVALID_DATA 1 #define ERROR_NOT_SUPPORTED 2 #define ERROR_INVALID_PARAMETER 3 #define ERROR_INSUFFICIENT_BUFFER 4 #define ERROR_NOT_FOUND 5 #define DHCP_ERROR_RESPONSE_CODES_BASE 0 #define DHCP_ERROR_BAD_PACKET 128 #define DHCP_ERROR_NO_PACKET 129 #endif ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // http://www.iana.org/assignments/bootp-dhcp-parameters/bootp-dhcp-parameters.xml#bootp-dhcp-parameters-1 // // RFC 1542 Clarifications and Extensions for BOOTP // RFC 2131 Dynamic Host Configuration Protocol // RFC 2132 DHCP Options and BOOTP Vendor Extensions // RFC 3203 DHCP reconfigure extension (FORCERENEW) // RFC 3679 Unused DHCP Option Codes // RFC 3942 Reclassifying DHCPv4 Options // // RFC 3046 DHCP Relay Agent Information Option (sub opt 1-2) // RFC 3256 The DOCSIS (Data-Over-Cable Service Interface Specifications) Device Class DHCP (Dynamic Host Configuration Protocol) Relay Agent Information Sub-option (add subopt 4 to RFC 3046) // RFC 3527 Link Selection sub-option (add subopt 5 to RFC 3046) // RFC 3993 Subscriber-ID Suboption (add subopt 6 to RFC 3046) // RFC 4014 RADIUS Attributes Suboption (add subopt 7 to RFC 3046) // RFC 4030 Authentication Suboption (add subopt 8 to RFC 3046) // RFC 4243 Vendor-Specific Relay Suboption (add subopt 9 to RFC 3046) // RFC 5010 Relay Agent Flags Suboption (add subopt 10 to RFC 3046) // RFC 5107 Server ID Override Suboption (add subopt 11 to RFC 3046) // // RFC 2241 DHCP Options for Novell Directory Services // RFC 2242 NetWare/IP Domain Name and Information // RFC 2485 DHCP Option for The Open Group's User Authentication Protocol // RFC 2563 DHCP Option to Disable Stateless Auto-Configuration in IPv4 Clients // RFC 2610 DHCP Options for Service Location Protocol // RFC 2937 The Name Service Search Option for DHCP // RFC 2939 Procedures for New DHCP Options // RFC 3004 The User Class Option for DHCP // RFC 3011 The IPv4 Subnet Selection Option for DHCP // RFC 3118 Authentication for DHCP Messages // RFC 3442 Classless Static Route Option for DHCPv4 // RFC 3495 DHCP Option for CableLabs Clients // RFC 3594 Security Ticket Control (add subopt to RFC 3495) // RFC 3825 DHCP Option for Coordinate LCI // RFC 4174 DHCP Option Number for iSNS // RFC 4280 DHCP Options for BMCS // RFC 4361 Node-specific Identifiers for DHCPv4 // RFC 4578 DHCP PXE Options // RFC 4702 The DHCP Client FQDN Option // RFC 4776 Option for Civic Addresses Configuration Information // RFC 4833 Timezone Options for DHCP // RFC 5071 PXELINUX Options // RFC 5192 PAA DHCP Options // RFC 5223 DHCP-Based LoST Discovery // RFC 5678 Mobility Services for DCHP Options // RFC 5859 TFTP Server Address // http://www.iana.org/numbers.htm // http://msdn.microsoft.com/en-us/library/cc227274(v=PROT.10).aspx ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #pragma pack(1) // // DHCP Names limited to 255 // #define DHCP_SRV_PORT 67 #define DHCP_CLI_PORT 68 #define DHCP_MIN_PACKET_LENGTH 300 // RFC 1542 2.1 union DHCP_HEADER_FLAGS { DHCP_2BYTE wFlags; struct HEADER_FLAGS { DHCP_1BYTE MBZ2 :7; //-- // MUST BE ZERO (reserved for future use) DHCP_1BYTE B :1; //C- // BROADCAST DHCP_1BYTE MBZ1 :8; //-- // MUST BE ZERO (reserved for future use) } hf; }; struct DHCP_HEADER { DHCP_1BYTE op; // Message op code / message type DHCP_1BYTE htype; // Hardware address type, see ARP section in "Assigned Numbers" RFC; e.g., '1' = 10mb ethernet. DHCP_1BYTE hlen; // Hardware address length (e.g. '6' for 10mb ethernet). DHCP_1BYTE hops; // Client sets to zero, optionally used by relay agents when booting via a relay agent. DHCP_4BYTE xid; // Transaction ID, a random number chosen by the client, used by the client and server to associate messages and responses between a client and a server. DHCP_2BYTE secs; // Filled in by client, seconds elapsed since client began address acquisition or renewal process. DHCP_HEADER_FLAGS flags;// Flags DHCP_4BYTE ciaddr; // Client IP address; only filled in if client is in BOUND, RENEW or REBINDING state and can respond to ARP requests DHCP_4BYTE yiaddr; // 'your' (client) IP address DHCP_4BYTE siaddr; // IP address of next server to use in bootstrap; returned in DHCPOFFER, DHCPACK by server DHCP_4BYTE giaddr; // Relay agent IP address, used in booting via a relay agent DHCP_1BYTE chaddr[16];// Client hardware address DHCP_1BYTE sname[64];// Optional server host name, null terminated string DHCP_1BYTE file[128];// Boot file name, null terminated string; "generic" name or null in DHCPDISCOVER, fully qualified directory-path name in DHCPOFFER DHCP_1BYTE options[];// Optional parameters field }; // Message op code / message type #define DHCP_HDR_OP_BOOTREQUEST 1 #define DHCP_HDR_OP_BOOTREPLY 2 #define DHCP_HDR_OP_MIN DHCP_HDR_OP_BOOTREQUEST #define DHCP_HDR_OP_MAX DHCP_HDR_OP_BOOTREPLY #define DHCP_HDR_HTYPE_MAX 37 #define DHCP_HDR_HLEN_MAX 16 #define DHCP_HDR_HOPS_MAX 255 #define DHCP_MAGIC_COOKIE 0x63538263 // (99, 130, 83, 99) - in host byte order static DHCP_PCSTR dhcp_header_op[] = { /* 0 */ NULL, /* 1 */ "BOOTREQUEST", /* 2 */ "BOOTREPLY", }; static DHCP_PCSTR dhcp_header_htype[] = { /* 0 */ "Reserved", /* 1 */ "Ethernet (10Mb)", /* 2 */ "Experimental Ethernet (3Mb)", /* 3 */ "Amateur Radio AX.25", /* 4 */ "Proteon ProNET Token Ring", /* 5 */ "Chaos", /* 6 */ "IEEE 802 Networks", /* 7 */ "ARCNET", /* 8 */ "Hyperchannel", /* 9 */ "Lanstar", /* 10 */ "Autonet Short Address", /* 11 */ "LocalTalk", /* 12 */ "LocalNet (IBM PCNet or SYTEK LocalNET)", /* 13 */ "Ultra link", /* 14 */ "SMDS", /* 15 */ "Frame Relay", /* 16 */ "Asynchronous Transmission Mode (ATM)", /* 17 */ "HDLC", /* 18 */ "Fibre Channel", /* 19 */ "Asynchronous Transmission Mode (ATM)", /* 20 */ "Serial Line", /* 21 */ "Asynchronous Transmission Mode (ATM)", /* 22 */ "MIL-STD-188-220", /* 23 */ "Metricom", /* 24 */ "IEEE 1394.1995", /* 25 */ "MAPOS", /* 26 */ "Twinaxial", /* 27 */ "EUI-64", /* 28 */ "HIPARP", /* 29 */ "IP and ARP over ISO 7816-3", /* 30 */ "ARPSec", /* 31 */ "IPsec tunnel", /* 32 */ "InfiniBand (TM)", /* 33 */ "TIA-102 Project 25 Common Air Interface (CAI)", /* 34 */ "Wiegand Interface", /* 35 */ "Pure IP", /* 36 */ "HW_EXP1", /* 37 */ "HFI", }; // DHCP Standard Options // RFC 2132 // 3. RFC 1497 Vendor Extensions #define DHCP_OPT_PAD 0 #define DHCP_OPT_SUBNET_MASK 1 #define DHCP_OPT_TIME_OFFSET 2 // deprecated by RFC 4833 (100, 101) #define DHCP_OPT_ROUTER_ADDRESS 3 #define DHCP_OPT_TIME_SERVERS 4 #define DHCP_OPT_IEN116_NAME_SERVERS 5 #define DHCP_OPT_DOMAIN_NAME_SERVERS 6 #define DHCP_OPT_LOG_SERVERS 7 #define DHCP_OPT_COOKIE_SERVERS 8 #define DHCP_OPT_LPR_SERVERS 9 #define DHCP_OPT_IMPRESS_SERVERS 10 #define DHCP_OPT_RLP_SERVERS 11 #define DHCP_OPT_HOST_NAME 12 #define DHCP_OPT_BOOT_FILE_SIZE 13 #define DHCP_OPT_MERIT_DUMP_FILE 14 #define DHCP_OPT_DOMAIN_NAME 15 #define DHCP_OPT_SWAP_SERVER 16 #define DHCP_OPT_ROOT_PATH 17 #define DHCP_OPT_EXTENSIONS_PATH 18 // 4. IP Layer Parameters per Host #define DHCP_OPT_IP_FORWARD_ENABLE 19 #define DHCP_OPT_NON_LOCAL_SOURCE_ROUTING 20 #define DHCP_OPT_POLICY_FILTER 21 #define DHCP_OPT_MAX_DATAGRAM_REASSEMBLY_SZ 22 #define DHCP_OPT_IP_DEFAULT_TTL 23 #define DHCP_OPT_PMTU_AGING_TIMEOUT 24 #define DHCP_OPT_PMTU_PLATEAU_TABLE 25 // 5. IP Layer Parameters per Interface #define DHCP_OPT_INTERFACE_MTU 26 #define DHCP_OPT_ALL_SUBNETS_LOCAL 27 #define DHCP_OPT_BROADCAST_ADDRESS 28 #define DHCP_OPT_PERFORM_MASK_DISCOVERY 29 #define DHCP_OPT_PROVIDE_MASK_TO_OTHERS 30 #define DHCP_OPT_PERFORM_ROUTER_DISCOVERY 31 #define DHCP_OPT_ROUTER_SOLICITATION_ADDR 32 #define DHCP_OPT_STATIC_ROUTES 33 // 6. Link Layer Parameters per Interface #define DHCP_OPT_TRAILER_ENCAPSULATION 34 #define DHCP_OPT_ARP_CACHE_TIMEOUT 35 #define DHCP_OPT_ETHERNET_ENCAPSULATION 36 // 7. TCP Parameters #define DHCP_OPT_DEFAULT_TCP_TTL 37 #define DHCP_OPT_KEEP_ALIVE_INTERVAL 38 #define DHCP_OPT_KEEP_ALIVE_GARBAGE 39 // 8. Application and Service Parameters #define DHCP_OPT_NIS_DOMAIN_NAME 40 #define DHCP_OPT_NIS_SERVERS 41 #define DHCP_OPT_NTP_SERVERS 42 // 8.4. Vendor Specific Information #define DHCP_OPT_VENDOR_SPEC_INFO 43 // http://msdn.microsoft.com/en-us/library/cc227275%28v=PROT.10%29.aspx // NetBIOS over TCP/IP Name server option #define DHCP_OPT_NETBIOS_NAME_SERVERS 44 #define DHCP_OPT_NETBIOS_DGM_DIST_SERVER 45 #define DHCP_OPT_NETBIOS_NODE_TYPE 46 #define DHCP_OPT_NETBIOS_SCOPE_OPTION 47 // X Window System Options. #define DHCP_OPT_X_WINDOW_FONT_SERVER 48 #define DHCP_OPT_X_WINDOW_DISPLAY_MANAGER 49 // 9. DHCP Extensions #define DHCP_OPT_REQUESTED_IP_ADDRESS 50 #define DHCP_OPT_IP_ADDRESS_LEASE_TIME 51 #define DHCP_OPT_OVERLOAD 52 // #define DHCP_OPT_MESSAGE_TYPE 53 #define DHCP_OPT_MESSAGE_TYPE_DISCOVER 1 // RFC 2132 DHCP Options and BOOTP Vendor Extensions #define DHCP_OPT_MESSAGE_TYPE_OFFER 2 // RFC 2132 DHCP Options and BOOTP Vendor Extensions #define DHCP_OPT_MESSAGE_TYPE_REQUEST 3 // RFC 2132 DHCP Options and BOOTP Vendor Extensions #define DHCP_OPT_MESSAGE_TYPE_DECLINE 4 // RFC 2132 DHCP Options and BOOTP Vendor Extensions #define DHCP_OPT_MESSAGE_TYPE_ACK 5 // RFC 2132 DHCP Options and BOOTP Vendor Extensions #define DHCP_OPT_MESSAGE_TYPE_NAK 6 // RFC 2132 DHCP Options and BOOTP Vendor Extensions #define DHCP_OPT_MESSAGE_TYPE_RELEASE 7 // RFC 2132 DHCP Options and BOOTP Vendor Extensions #define DHCP_OPT_MESSAGE_TYPE_INFORM 8 // RFC 2132 DHCP Options and BOOTP Vendor Extensions #define DHCP_OPT_MESSAGE_TYPE_FORCE_RENEW 9 // RFC 3203 DHCP reconfigure extension #define DHCP_OPT_MESSAGE_TYPE_DHCPLEASEQUERY 10 // RFC 4388 DHCP Leasequery #define DHCP_OPT_MESSAGE_TYPE_DHCPLEASEUNASSIGNED 11 // RFC 4388 DHCP Leasequery #define DHCP_OPT_MESSAGE_TYPE_DHCPLEASEUNKNOWN 12 // RFC 4388 DHCP Leasequery #define DHCP_OPT_MESSAGE_TYPE_DHCPLEASEACTIVE 13 // RFC 4388 DHCP Leasequery // #define DHCP_OPT_DHCP_SERVER_IDENTIFIER 54 #define DHCP_OPT_PARAMETER_REQUEST_LIST 55 #define DHCP_OPT_MESSAGE 56 #define DHCP_OPT_DHCP_MAXIMUM_MSG_SIZE 57 #define DHCP_OPT_RENEWAL_TIME 58 // T1 #define DHCP_OPT_REBINDING_TIME 59 // T2 #define DHCP_OPT_VENDOR_CLASS_IDENTIFIER 60 #define DHCP_OPT_DHCP_CLIENT_IDENTIFIER 61 // upd: RFC 4361 Node-specific Identifiers for DHCPv4 #define DHCP_OPT_NETWARE_DOMAIN_NAME 62 // RFC 2242 NetWare/IP Domain Name and Information #define DHCP_OPT_NETWARE_SUB_OPTIONS 63 // RFC 2242 NetWare/IP Domain Name and Information #define DHCP_OPT_NIS_CLIENT_DOMAIN_NAME 64 #define DHCP_OPT_NIS_SERVER_ADDRESS 65 #define DHCP_OPT_TFTP_SERVER_NAME 66 #define DHCP_OPT_BOOTFILE_NAME 67 #define DHCP_OPT_HOME_AGENT_ADDRESS 68 #define DHCP_OPT_SMTP_SERVER_ADDRESS 69 #define DHCP_OPT_POP3_SERVER_ADDRESS 70 #define DHCP_OPT_NNTP_SERVER_ADDRESS 71 #define DHCP_OPT_WWW_SERVER_ADDRESS 72 #define DHCP_OPT_FINGER_SERVER_ADDRESS 73 #define DHCP_OPT_IRC_SERVER_ADDRESS 74 #define DHCP_OPT_STREETTALK_SERVER_ADDRESS 75 #define DHCP_OPT_STREETTALK_DIRECTORY_ASSIST_SRV 76 #define DHCP_OPT_USER_CLASS 77 // RFC 3004 The User Class Option for DHCP #define DHCP_OPT_SLP_DIRECTORY_AGENT 78 // RFC 2610 DHCP Options for Service Location Protocol #define DHCP_OPT_SLP_SERVICE_SCOPE 79 // RFC 2610 DHCP Options for Service Location Protocol #define DHCP_OPT_RAPID_COMMIT 80 // RFC 4039 Rapid Commit Option for DHCPv4 #define DHCP_OPT_CLIENT_FQDN 81 // RFC 4702 The DHCP Client FQDN Option // #define DHCP_OPT_RELAY_AGENT_INFO 82 // RFC 3046 DHCP Relay Agent Information Option #define DHCP_OPT_RELAY_AGENT_INFO_CIRCUIT_ID 1 // RFC 3046 DHCP Relay Agent Information Option #define DHCP_OPT_RELAY_AGENT_INFO_REMOTE_ID 2 // RFC 3046 DHCP Relay Agent Information Option #define DHCP_OPT_RELAY_AGENT_INFO_DOCSIS_DEVICE_CLASS 4 // RFC 3046 DHCP Relay Agent Information Option #define DHCP_OPT_RELAY_AGENT_INFO_RELAY_LINK_SELECTION 5 // RFC 3046 DHCP Relay Agent Information Option #define DHCP_OPT_RELAY_AGENT_INFO_SUBSCRIBER_ID 6 // RFC 3046 DHCP Relay Agent Information Option #define DHCP_OPT_RELAY_AGENT_INFO_RADIUS_ATTRIBUTES 7 // RFC 3046 DHCP Relay Agent Information Option #define DHCP_OPT_RELAY_AGENT_INFO_AUTHENTICATION_INFO 8 // #define DHCP_OPT_RELAY_AGENT_INFO_VENDOR_SPECIFIC_INFO 9 // #define DHCP_OPT_RELAY_AGENT_INFO_RELAY_AGENT_FLAGS 10 // #define DHCP_OPT_RELAY_AGENT_INFO_SERVER_ID_OVERRIDE 11 // // #define DHCP_OPT_ISNS 83 // RFC 4174 DHCP Option Number for iSNS // #define DHCP_OPT_NDS_SERVERS 85 // DHCP Options for Novell Directory Services #define DHCP_OPT_NDS_TREE_NAME 86 // DHCP Options for Novell Directory Services #define DHCP_OPT_NDS_CONTEXT 87 // DHCP Options for Novell Directory Services #define DHCP_OPT_BCMCS_CTRL_DOMAIN_NAME_LST 88 // RFC 3679 // RFC 4280 DHCP Options for BMCS #define DHCP_OPT_BCMCS_CTRL_IPV4_ADDRESS 89 // RFC 3679 // RFC 4280 DHCP Options for BMCS #define DHCP_OPT_AUTHENTICATION 90 // RFC 3118 Authentication for DHCP Messages #define DHCP_OPT_CLI_LAST_TRANSACTION_TIME 91 // RFC 3679 // RFC 4388 DHCP Leasequery #define DHCP_OPT_ASSOCIATED_IP 92 // RFC 3679 // RFC 4388 DHCP Leasequery #define DHCP_OPT_CLIENT_SYSTEM_ARCHITECTURE 93 // RFC 4578 DHCP PXE Options #define DHCP_OPT_CLIENT_NET_INTERFACE_ID 94 // RFC 4578 DHCP PXE Options // #define DHCP_OPT_CLIENT_MACHINE_ID 97 // RFC 4578 DHCP PXE Options #define DHCP_OPT_UAP 98 // RFC 2485 DHCP Option for The Open Group's User Authentication Protocol #define DHCP_OPT_GEOCONF_CIVIC 99 // RFC 4776 Option for Civic Addresses Configuration Information #define DHCP_OPT_TZ_POSIX_STRING 100 // RFC 4833 Timezone Options for DHCP #define DHCP_OPT_TZ_DATABASE_STRING 101 // RFC 4833 Timezone Options for DHCP // #define DHCP_OPT_AUTO_CONFIGURE 116 // RFC 2563 DHCP Option to Disable Stateless Auto-Configuration in IPv4 Clients #define DHCP_OPT_NAME_SERVICE_SEARCH 117 // RFC 2937 The Name Service Search Option for DHCP #define DHCP_OPT_SUBNET_SELECTION 118 // RFC 3011 The IPv4 Subnet Selection Option for DHCP // #define DHCP_OPT_CLASSLESS_STATIC_ROUTE 121 // RFC 3442 Classless Static Route Option for DHCPv4 #define DHCP_OPT_CABLELABS_CLIENT_CONFIG 122 // RFC 3495 DHCP Option for CableLabs Clients #define DHCP_OPT_LOCATION_CONFIG_INFO 123 // RFC 3825 DHCP Option for Coordinate LCI // #define DHCP_OPT_PANA_AUTHENTICATION_AGENT 136 // RFC 5192 PAA DHCP Options #define DHCP_OPT_LOST_SERVER 137 // RFC 5223 DHCP-Based LoST Discovery // #define DHCP_OPT_MOS_ADDRESS 139 // RFC 5678 Mobility Services for DCHP Options #define DHCP_OPT_MOS_DOMAIN_NAME_LIST 140 // RFC 5678 Mobility Services for DCHP Options // #define DHCP_OPT_TFTP_SERVER_IP_ADDRESSES 150 // RFC 5859 TFTP Server Address // #define DHCP_OPT_PXELINUX_MAGIC 208 // RFC 5071 PXELINUX Options #define DHCP_OPT_PXELINUX_CONFIG_FILE 209 // RFC 5071 PXELINUX Options #define DHCP_OPT_PXELINUX_PATH_PREFIX 210 // RFC 5071 PXELINUX Options #define DHCP_OPT_PXELINUX_REBOOT_TIME 211 // RFC 5071 PXELINUX Options // #define DHCP_OPT_END 255 struct DHCP_OPT_DATA { DHCP_1BYTE Code; // DHCP_OPT_* (Assigned by IANA.) DHCP_1BYTE Lenght; // Size (in octets) of OPTION-DATA DHCP_1BYTE Data[]; // Varies per OPTION-CODE }; struct DHCP_OPT_PARAMS { DHCP_PCSTR DisplayName; DHCP_1BYTE Lenght; // len DHCP_1BYTE Type; // data type DHCP_2BYTE Flags; // 2 byte - for allign only //DHCP_2BYTE MsgTypes; // apply to message types void *DataValues; DHCP_SIZE_T DataValuesCount; }; #define DHCP_OPTP_T_NONE 0 #define DHCP_OPTP_T_SUBOPTS 1 #define DHCP_OPTP_T_BOOL 2 #define DHCP_OPTP_T_1BYTE 3 #define DHCP_OPTP_T_2BYTE 4 #define DHCP_OPTP_T_2TIME 5 #define DHCP_OPTP_T_4BYTE 6 #define DHCP_OPTP_T_4TIME 7 #define DHCP_OPTP_T_IPADDR 8 #define DHCP_OPTP_T_IPIPADDR 9 #define DHCP_OPTP_T_STR 10 #define DHCP_OPTP_T_STRUTF8 11 #define DHCP_OPTP_T_STRRR 12 // DNS string format #define DHCP_OPTP_T_BYTES 13 #define DHCP_OPTP_T_ADV 14 // option have specific format #define DHCP_OPTP_T_PAD 254 #define DHCP_OPTP_T_END 255 #define DHCP_OPTP_F_NONE 0 #define DHCP_OPTP_F_NOLEN 1 #define DHCP_OPTP_F_FIXEDLEN 2 #define DHCP_OPTP_F_MINLEN 4 #define DHCP_OPTP_F_ARRAY 8 // in case (FIXEDLEN + ARRAY), Len = sizeof 1 element #define DHCP_OPTP_MT_NONE 0 #define DHCP_OPTP_MT_NO_REQ_LIST 1 // do not include to DHCP_OPT_PARAMETER_REQUEST_LIST (55) #define DHCP_OPTP_MT_DISCOVER (1<>8))); } #define NTOHS(in) USHORT_FLIP(in) #define HTONS(in) USHORT_FLIP(in) #endif #ifndef NTOHL __inline DHCP_4BYTE ULONG_FLIP(u_long ulIn) { #if defined (_M_IA64) || defined (_M_AMD64) return((((ulIn<<8) & 0x00ff0000) | (ulIn<<24) | ((ulIn>>8) & 0x0000ff00) | (ulIn>>24))); #else __asm { mov eax,ulIn bswap eax mov ulIn,eax }; return(ulIn); #endif } #define NTOHL(in) ULONG_FLIP(in) #define HTONL(in) ULONG_FLIP(in) #endif __inline void DHCPHeaderFlip(DHCP_HEADER *pDHCPHead) { // op // htype // hlen // hops pDHCPHead->xid = ULONG_FLIP(pDHCPHead->xid); pDHCPHead->secs = USHORT_FLIP(pDHCPHead->secs); // flags //pDHCPHead->ciaddr = ULONG_FLIP(pDHCPHead->ciaddr); //pDHCPHead->yiaddr = ULONG_FLIP(pDHCPHead->yiaddr); //pDHCPHead->siaddr = ULONG_FLIP(pDHCPHead->siaddr); //pDHCPHead->giaddr = ULONG_FLIP(pDHCPHead->giaddr); // chaddr[16] // sname[64] // file[128] // options[] } __inline DHCP_4BYTE DHCPHeaderValidate(DHCP_HEADER *pDHCPPacket, DHCP_SIZE_T dwDHCPPacketSize) { DHCP_4BYTE dwRet = 0; if (dwDHCPPacketSize < (sizeof(DHCP_HEADER)+4)) return(255); // cant check other ///////////////if (dwDHCPPacketSize < DHCP_MIN_PACKET_LENGTH) dwRet++; if (DHCP_HDR_OP_MIN > pDHCPPacket->op || pDHCPPacket->op > DHCP_HDR_OP_MAX) dwRet++; if (pDHCPPacket->htype > DHCP_HDR_HTYPE_MAX) dwRet++; if (pDHCPPacket->hlen > DHCP_HDR_HLEN_MAX) dwRet++; if (pDHCPPacket->hops > DHCP_HDR_HOPS_MAX) dwRet++; ///////////////if (pDHCPPacket->flags.hf.MBZ != 0) dwRet++; if ((*((DHCP_4BYTE*)(((BYTE*)pDHCPPacket)+sizeof(DHCP_HEADER)))) != DHCP_MAGIC_COOKIE) dwRet++; return(dwRet); } #endif // AFX_DHCPMESSAGE__H__INCLUDED_