-/** @file
-
-Copyright (c) 2006, Intel Corporation
-All rights reserved. This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-
-Module Name:
-
- Dhcp4Option.h
-
-Abstract:
-
- To validate, parse and process the DHCP options
-
-
-**/
-
-#ifndef __EFI_DHCP4_OPTION_H__
-#define __EFI_DHCP4_OPTION_H__
-
-//
-// DHCP option tags (types)
-//
-enum {
- //
- // RFC1497 vendor extensions
- //
- DHCP_TAG_PAD = 0, // Pad Option
- DHCP_TAG_EOP = 255, // End Option
- DHCP_TAG_NETMASK = 1, // Subnet Mask
- DHCP_TAG_TIME_OFFSET = 2, // Time Offset from UTC
- DHCP_TAG_ROUTER = 3, // Router option,
- DHCP_TAG_TIME_SERVER = 4, // Time Server
- DHCP_TAG_NAME_SERVER = 5, // Name Server
- DHCP_TAG_DNS_SERVER = 6, // Domain Name Server
- DHCP_TAG_LOG_SERVER = 7, // Log Server
- DHCP_TAG_COOKIE_SERVER = 8, // Cookie Server
- DHCP_TAG_LPR_SERVER = 9, // LPR Print Server
- DHCP_TAG_IMPRESS_SERVER = 10, // Impress Server
- DHCP_TAG_RL_SERVER = 11, // Resource Location Server
- DHCP_TAG_HOSTNAME = 12, // Host Name
- DHCP_TAG_BOOTFILE_LEN = 13, // Boot File Size
- DHCP_TAG_DUMP = 14, // Merit Dump File
- DHCP_TAG_DOMAINNAME = 15, // Domain Name
- DHCP_TAG_SWAP_SERVER = 16, // Swap Server
- DHCP_TAG_ROOTPATH = 17, // Root path
- DHCP_TAG_EXTEND_PATH = 18, // Extensions Path
-
- //
- // IP Layer Parameters per Host
- //
- DHCP_TAG_IPFORWARD = 19, // IP Forwarding Enable/Disable
- DHCP_TAG_NONLOCAL_SRR = 20, // on-Local Source Routing Enable/Disable
- DHCP_TAG_POLICY_SRR = 21, // Policy Filter
- DHCP_TAG_EMTU = 22, // Maximum Datagram Reassembly Size
- DHCP_TAG_TTL = 23, // Default IP Time-to-live
- DHCP_TAG_PATHMTU_AGE = 24, // Path MTU Aging Timeout
- DHCP_TAG_PATHMTU_PLATEAU = 25, // Path MTU Plateau Table
-
- //
- // IP Layer Parameters per Interface
- //
- DHCP_TAG_IFMTU = 26, // Interface MTU
- DHCP_TAG_SUBNET_LOCAL = 27, // All Subnets are Local
- DHCP_TAG_BROADCAST = 28, // Broadcast Address
- DHCP_TAG_DISCOVER_MASK = 29, // Perform Mask Discovery
- DHCP_TAG_SUPPLY_MASK = 30, // Mask Supplier
- DHCP_TAG_DISCOVER_ROUTE = 31, // Perform Router Discovery
- DHCP_TAG_ROUTER_SOLICIT = 32, // Router Solicitation Address
- DHCP_TAG_STATIC_ROUTE = 33, // Static Route
-
- //
- // Link Layer Parameters per Interface
- //
- DHCP_TAG_TRAILER = 34, // Trailer Encapsulation
- DHCP_TAG_ARPAGE = 35, // ARP Cache Timeout
- DHCP_TAG_ETHER_ENCAP = 36, // Ethernet Encapsulation
-
- //
- // TCP Parameters
- //
- DHCP_TAG_TCP_TTL = 37, // TCP Default TTL
- DHCP_TAG_KEEP_INTERVAL = 38, // TCP Keepalive Interval
- DHCP_TAG_KEEP_GARBAGE = 39, // TCP Keepalive Garbage
-
- //
- // Application and Service Parameters
- //
- DHCP_TAG_NIS_DOMAIN = 40, // Network Information Service Domain
- DHCP_TAG_NIS_SERVER = 41, // Network Information Servers
- DHCP_TAG_NTP_SERVER = 42, // Network Time Protocol Servers
- DHCP_TAG_VENDOR = 43, // Vendor Specific Information
- DHCP_TAG_NBNS = 44, // NetBIOS over TCP/IP Name Server
- DHCP_TAG_NBDD = 45, // NetBIOS Datagram Distribution Server
- DHCP_TAG_NBTYPE = 46, // NetBIOS over TCP/IP Node Type
- DHCP_TAG_NBSCOPE = 47, // NetBIOS over TCP/IP Scope
- DHCP_TAG_XFONT = 48, // X Window System Font Server
- DHCP_TAG_XDM = 49, // X Window System Display Manager
- DHCP_TAG_NISPLUS = 64, // Network Information Service+ Domain
- DHCP_TAG_NISPLUS_SERVER = 65, // Network Information Service+ Servers
- DHCP_TAG_MOBILEIP = 68, // Mobile IP Home Agent
- DHCP_TAG_SMTP = 69, // Simple Mail Transport Protocol Server
- DHCP_TAG_POP3 = 70, // Post Office Protocol (POP3) Server
- DHCP_TAG_NNTP = 71, // Network News Transport Protocol Server
- DHCP_TAG_WWW = 72, // Default World Wide Web (WWW) Server
- DHCP_TAG_FINGER = 73, // Default Finger Server
- DHCP_TAG_IRC = 74, // Default Internet Relay Chat (IRC) Server
- DHCP_TAG_STTALK = 75, // StreetTalk Server
- DHCP_TAG_STDA = 76, // StreetTalk Directory Assistance Server
- DHCP_TAG_CLASSLESS_ROUTE = 121, // Classless Route
-
- //
- // DHCP Extensions
- //
- DHCP_TAG_REQUEST_IP = 50, // Requested IP Address
- DHCP_TAG_LEASE = 51, // IP Address Lease Time
- DHCP_TAG_OVERLOAD = 52, // Option Overload
- DHCP_TAG_TFTP = 66, // TFTP server name
- DHCP_TAG_BOOTFILE = 67, // Bootfile name
- DHCP_TAG_TYPE = 53, // DHCP Message Type
- DHCP_TAG_SERVER_ID = 54, // Server Identifier
- DHCP_TAG_PARA_LIST = 55, // Parameter Request List
- DHCP_TAG_MESSAGE = 56, // Message
- DHCP_TAG_MAXMSG = 57, // Maximum DHCP Message Size
- DHCP_TAG_T1 = 58, // Renewal (T1) Time Value
- DHCP_TAG_T2 = 59, // Rebinding (T2) Time Value
- DHCP_TAG_VENDOR_CLASS = 60, // Vendor class identifier
- DHCP_TAG_CLIENT_ID = 61 // Client-identifier
-};
-
-enum {
- DHCP_OPTION_MAGIC = 0x63538263, // Network byte order
- DHCP_MAX_OPTIONS = 256,
-
- //
- // DHCP option types, this is used to validate the DHCP options.
- //
- DHCP_OPTION_SWITCH = 1,
- DHCP_OPTION_INT8,
- DHCP_OPTION_INT16,
- DHCP_OPTION_INT32,
- DHCP_OPTION_IP,
- DHCP_OPTION_IPPAIR,
-
- //
- // Value of DHCP overload option
- //
- DHCP_OVERLOAD_FILENAME = 1,
- DHCP_OVERLOAD_SVRNAME = 2,
- DHCP_OVERLOAD_BOTH = 3
-};
-
-//
-// The DHCP option structure. This structure extends the EFI_DHCP_OPTION
-// structure to support options longer than 255 bytes, such as classless route.
-//
-typedef struct {
- UINT8 Tag;
- UINT16 Len;
- UINT8 *Data;
-} DHCP_OPTION;
-
-//
-// Structures used to parse the DHCP options with RFC3396 support.
-//
-typedef struct {
- UINT8 Index;
- UINT16 Offset;
-} DHCP_OPTION_COUNT;
-
-typedef struct {
- DHCP_OPTION_COUNT *OpCount;
- DHCP_OPTION *Options;
- UINT8 *Buf;
-} DHCP_OPTION_CONTEXT;
-
-//
-// The options that matters to DHCP driver itself. The user of
-// DHCP clients may be interested in other options, such as
-// classless route, who can parse the DHCP offer to get them.
-//
-typedef struct {
- IP4_ADDR NetMask; // DHCP_TAG_NETMASK
- IP4_ADDR Router; // DHCP_TAG_ROUTER, only the first router is used
-
- //
- // DHCP specific options
- //
- UINT8 DhcpType; // DHCP_TAG_TYPE
- UINT8 Overload; // DHCP_TAG_OVERLOAD
- IP4_ADDR ServerId; // DHCP_TAG_SERVER_ID
- UINT32 Lease; // DHCP_TAG_LEASE
- UINT32 T1; // DHCP_TAG_T1
- UINT32 T2; // DHCP_TAG_T2
-} DHCP_PARAMETER;
-
-//
-// Structure used to describe and validate the format of DHCP options.
-// Type is the options' data type, such as DHCP_OPTION_INT8. MinOccur
-// is the minium occurance of this data type. MaxOccur is defined
-// similarly. If MaxOccur is -1, it means that there is no limit on the
-// maximum occurance. Alert tells whether DHCP client should further
-// inspect the option to parse DHCP_PARAMETER.
-//
-typedef struct {
- UINT8 Tag;
- INTN Type;
- INTN MinOccur;
- INTN MaxOccur;
- BOOLEAN Alert;
-} DHCP_OPTION_FORMAT;
-
-typedef
-EFI_STATUS
-(*DHCP_CHECK_OPTION) (
- IN UINT8 Tag,
- IN UINT8 Len,
- IN UINT8 *Data,
- IN VOID *Context
- );
-
-EFI_STATUS
-DhcpIterateOptions (
- IN EFI_DHCP4_PACKET *Packet,
- IN DHCP_CHECK_OPTION Check, OPTIONAL
- IN VOID *Context
- );
-
-EFI_STATUS
-DhcpValidateOptions (
- IN EFI_DHCP4_PACKET *Packet,
- OUT DHCP_PARAMETER **Para OPTIONAL
- );
-
-EFI_STATUS
-DhcpParseOption (
- IN EFI_DHCP4_PACKET *Packet,
- OUT INTN *Count,
- OUT DHCP_OPTION **OptionPoint
- );
-
-UINT8 *
-DhcpAppendOption (
- IN UINT8 *Buf,
- IN UINT8 Tag,
- IN UINT16 DataLen,
- IN UINT8 *Data
- );
-
-EFI_STATUS
-DhcpBuild (
- IN EFI_DHCP4_PACKET *SeedPacket,
- IN UINT32 DeleteCount,
- IN UINT8 *DeleteList OPTIONAL,
- IN UINT32 AppendCount,
- IN EFI_DHCP4_PACKET_OPTION *AppendList[] OPTIONAL,
- OUT EFI_DHCP4_PACKET **NewPacket
- );
-
-#endif
+/** @file\r
+ To validate, parse and process the DHCP options.\r
+\r
+Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution. The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef __EFI_DHCP4_OPTION_H__\r
+#define __EFI_DHCP4_OPTION_H__\r
+\r
+///\r
+/// DHCP option tags (types)\r
+///\r
+\r
+#define DHCP_OPTION_MAGIC 0x63538263 // Network byte order\r
+#define DHCP_MAX_OPTIONS 256\r
+\r
+\r
+//\r
+// DHCP option types, this is used to validate the DHCP options.\r
+//\r
+#define DHCP_OPTION_SWITCH 1\r
+#define DHCP_OPTION_INT8 2\r
+#define DHCP_OPTION_INT16 3\r
+#define DHCP_OPTION_INT32 4\r
+#define DHCP_OPTION_IP 5\r
+#define DHCP_OPTION_IPPAIR 6\r
+\r
+//\r
+// Value of DHCP overload option\r
+//\r
+#define DHCP_OVERLOAD_FILENAME 1\r
+#define DHCP_OVERLOAD_SVRNAME 2\r
+#define DHCP_OVERLOAD_BOTH 3\r
+\r
+///\r
+/// The DHCP option structure. This structure extends the EFI_DHCP_OPTION\r
+/// structure to support options longer than 255 bytes, such as classless route.\r
+///\r
+typedef struct {\r
+ UINT8 Tag;\r
+ UINT16 Len;\r
+ UINT8 *Data;\r
+} DHCP_OPTION;\r
+\r
+///\r
+/// Structures used to parse the DHCP options with RFC3396 support.\r
+///\r
+typedef struct {\r
+ UINT8 Index;\r
+ UINT16 Offset;\r
+} DHCP_OPTION_COUNT;\r
+\r
+typedef struct {\r
+ DHCP_OPTION_COUNT *OpCount;\r
+ DHCP_OPTION *Options;\r
+ UINT8 *Buf;\r
+} DHCP_OPTION_CONTEXT;\r
+\r
+///\r
+/// The options that matters to DHCP driver itself. The user of\r
+/// DHCP clients may be interested in other options, such as\r
+/// classless route, who can parse the DHCP offer to get them.\r
+///\r
+typedef struct {\r
+ IP4_ADDR NetMask; // DHCP4_TAG_NETMASK\r
+ IP4_ADDR Router; // DHCP4_TAG_ROUTER, only the first router is used\r
+\r
+ //\r
+ // DHCP specific options\r
+ //\r
+ UINT8 DhcpType; // DHCP4_TAG_MSG_TYPE\r
+ UINT8 Overload; // DHCP4_TAG_OVERLOAD\r
+ IP4_ADDR ServerId; // DHCP4_TAG_SERVER_ID\r
+ UINT32 Lease; // DHCP4_TAG_LEASE\r
+ UINT32 T1; // DHCP4_TAG_T1\r
+ UINT32 T2; // DHCP4_TAG_T2\r
+} DHCP_PARAMETER;\r
+\r
+///\r
+/// Structure used to describe and validate the format of DHCP options.\r
+/// Type is the options' data type, such as DHCP_OPTION_INT8. MinOccur\r
+/// is the minium occurance of this data type. MaxOccur is defined\r
+/// similarly. If MaxOccur is -1, it means that there is no limit on the\r
+/// maximum occurance. Alert tells whether DHCP client should further\r
+/// inspect the option to parse DHCP_PARAMETER.\r
+///\r
+typedef struct {\r
+ UINT8 Tag;\r
+ INTN Type;\r
+ INTN MinOccur;\r
+ INTN MaxOccur;\r
+ BOOLEAN Alert;\r
+} DHCP_OPTION_FORMAT;\r
+\r
+typedef\r
+EFI_STATUS\r
+(*DHCP_CHECK_OPTION) (\r
+ IN UINT8 Tag,\r
+ IN UINT8 Len,\r
+ IN UINT8 *Data,\r
+ IN VOID *Context\r
+ );\r
+\r
+/**\r
+ Iterate through a DHCP message to visit each option. First inspect\r
+ all the options in the OPTION field. Then if overloaded, inspect\r
+ the options in FILENAME and SERVERNAME fields. One option may be\r
+ encoded in several places. See RFC 3396 Encoding Long Options in DHCP\r
+\r
+ @param[in] Packet The DHCP packet to check the options for\r
+ @param[in] Check The callback function to be called for each option\r
+ found\r
+ @param[in] Context The opaque parameter for Check\r
+\r
+ @retval EFI_SUCCESS The DHCP packet's options are well formated\r
+ @retval EFI_INVALID_PARAMETER The DHCP packet's options are not well formated\r
+\r
+**/\r
+EFI_STATUS\r
+DhcpIterateOptions (\r
+ IN EFI_DHCP4_PACKET *Packet,\r
+ IN DHCP_CHECK_OPTION Check OPTIONAL,\r
+ IN VOID *Context\r
+ );\r
+\r
+/**\r
+ Validate the packet's options. If necessary, allocate\r
+ and fill in the interested parameters.\r
+\r
+ @param[in] Packet The packet to validate the options\r
+ @param[out] Para The variable to save the DHCP parameters.\r
+\r
+ @retval EFI_OUT_OF_RESOURCES Failed to allocate memory to validate the packet.\r
+ @retval EFI_INVALID_PARAMETER The options are mal-formated\r
+ @retval EFI_SUCCESS The options are parsed into OptionPoint\r
+\r
+**/\r
+EFI_STATUS\r
+DhcpValidateOptions (\r
+ IN EFI_DHCP4_PACKET *Packet,\r
+ OUT DHCP_PARAMETER **Para OPTIONAL\r
+ );\r
+\r
+/**\r
+ Parse the options of a DHCP packet. It supports RFC 3396: Encoding\r
+ Long Options in DHCP. That is, it will combine all the option value\r
+ of all the occurances of each option.\r
+ A little bit of implemenation:\r
+ It adopts the "Key indexed counting" algorithm. First, it allocates\r
+ an array of 256 DHCP_OPTION_COUNTs because DHCP option tag is encoded\r
+ as a UINT8. It then iterates the DHCP packet to get data length of\r
+ each option by calling DhcpIterOptions with DhcpGetOptionLen. Now, it\r
+ knows the number of present options and their length. It allocates a\r
+ array of DHCP_OPTION and a continuous buffer after the array to put\r
+ all the options' data. Each option's data is pointed to by the Data\r
+ field in DHCP_OPTION structure. At last, it call DhcpIterateOptions\r
+ with DhcpFillOption to fill each option's data to its position in the\r
+ buffer.\r
+\r
+ @param[in] Packet The DHCP packet to parse the options\r
+ @param[out] Count The number of valid dhcp options present in the\r
+ packet\r
+ @param[out] OptionPoint The array that contains the DHCP options. Caller\r
+ should free it.\r
+\r
+ @retval EFI_NOT_FOUND Cannot find any option.\r
+ @retval EFI_OUT_OF_RESOURCES Failed to allocate memory to parse the packet.\r
+ @retval EFI_INVALID_PARAMETER The options are mal-formated\r
+ @retval EFI_SUCCESS The options are parsed into OptionPoint\r
+\r
+**/\r
+EFI_STATUS\r
+DhcpParseOption (\r
+ IN EFI_DHCP4_PACKET *Packet,\r
+ OUT INTN *Count,\r
+ OUT DHCP_OPTION **OptionPoint\r
+ );\r
+\r
+/**\r
+ Append an option to the memory, if the option is longer than\r
+ 255 bytes, splits it into several options.\r
+\r
+ @param[out] Buf The buffer to append the option to\r
+ @param[in] Tag The option's tag\r
+ @param[in] DataLen The length of the option's data\r
+ @param[in] Data The option's data\r
+\r
+ @return The position to append the next option\r
+\r
+**/\r
+UINT8 *\r
+DhcpAppendOption (\r
+ OUT UINT8 *Buf,\r
+ IN UINT8 Tag,\r
+ IN UINT16 DataLen,\r
+ IN UINT8 *Data\r
+ );\r
+\r
+/**\r
+ Build a new DHCP packet from a seed packet. Options may be deleted or\r
+ appended. The caller should free the NewPacket when finished using it.\r
+\r
+ @param[in] SeedPacket The seed packet to start with\r
+ @param[in] DeleteCount The number of options to delete\r
+ @param[in] DeleteList The options to delete from the packet\r
+ @param[in] AppendCount The number of options to append\r
+ @param[in] AppendList The options to append to the packet\r
+ @param[out] NewPacket The new packet, allocated and built by this\r
+ function.\r
+\r
+ @retval EFI_OUT_OF_RESOURCES Failed to allocate memory\r
+ @retval EFI_INVALID_PARAMETER The options in SeekPacket are mal-formated\r
+ @retval EFI_SUCCESS The packet is build.\r
+\r
+**/\r
+EFI_STATUS\r
+DhcpBuild (\r
+ IN EFI_DHCP4_PACKET *SeedPacket,\r
+ IN UINT32 DeleteCount,\r
+ IN UINT8 *DeleteList OPTIONAL,\r
+ IN UINT32 AppendCount,\r
+ IN EFI_DHCP4_PACKET_OPTION *AppendList[] OPTIONAL,\r
+ OUT EFI_DHCP4_PACKET **NewPacket\r
+ );\r
+\r
+#endif\r