git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10418 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			341 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			341 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   To validate, parse and process the DHCP options.
 | |
|   
 | |
| Copyright (c) 2006 - 2009, Intel Corporation. All rights reserved.<BR>
 | |
| 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.
 | |
| 
 | |
| **/
 | |
| 
 | |
| #ifndef __EFI_DHCP4_OPTION_H__
 | |
| #define __EFI_DHCP4_OPTION_H__
 | |
| 
 | |
| ///
 | |
| /// DHCP option tags (types)
 | |
| ///
 | |
| 
 | |
| //
 | |
| // RFC1497 vendor extensions
 | |
| //
 | |
| #define DHCP_TAG_PAD              0    // Pad Option
 | |
| #define DHCP_TAG_EOP              255  // End Option
 | |
| #define DHCP_TAG_NETMASK          1    // Subnet Mask
 | |
| #define DHCP_TAG_TIME_OFFSET      2    // Time Offset from UTC
 | |
| #define DHCP_TAG_ROUTER           3    // Router option,
 | |
| #define DHCP_TAG_TIME_SERVER      4    // Time Server
 | |
| #define DHCP_TAG_NAME_SERVER      5    // Name Server
 | |
| #define DHCP_TAG_DNS_SERVER       6    // Domain Name Server
 | |
| #define DHCP_TAG_LOG_SERVER       7    // Log Server
 | |
| #define DHCP_TAG_COOKIE_SERVER    8    // Cookie Server
 | |
| #define DHCP_TAG_LPR_SERVER       9    // LPR Print Server
 | |
| #define DHCP_TAG_IMPRESS_SERVER   10   // Impress Server
 | |
| #define DHCP_TAG_RL_SERVER        11   // Resource Location Server
 | |
| #define DHCP_TAG_HOSTNAME         12   // Host Name
 | |
| #define DHCP_TAG_BOOTFILE_LEN     13   // Boot File Size
 | |
| #define DHCP_TAG_DUMP             14   // Merit Dump File
 | |
| #define DHCP_TAG_DOMAINNAME       15   // Domain Name
 | |
| #define DHCP_TAG_SWAP_SERVER      16   // Swap Server
 | |
| #define DHCP_TAG_ROOTPATH         17   // Root path
 | |
| #define DHCP_TAG_EXTEND_PATH      18   // Extensions Path
 | |
| 
 | |
| //
 | |
| // IP Layer Parameters per Host
 | |
| //
 | |
| #define DHCP_TAG_IPFORWARD        19 // IP Forwarding Enable/Disable
 | |
| #define DHCP_TAG_NONLOCAL_SRR     20 // on-Local Source Routing Enable/Disable
 | |
| #define DHCP_TAG_POLICY_SRR       21 // Policy Filter
 | |
| #define DHCP_TAG_EMTU             22 // Maximum Datagram Reassembly Size
 | |
| #define DHCP_TAG_TTL              23 // Default IP Time-to-live
 | |
| #define DHCP_TAG_PATHMTU_AGE      24 // Path MTU Aging Timeout
 | |
| #define DHCP_TAG_PATHMTU_PLATEAU  25 // Path MTU Plateau Table
 | |
| 
 | |
| //
 | |
| // IP Layer Parameters per Interface
 | |
| //
 | |
| #define DHCP_TAG_IFMTU            26 // Interface MTU
 | |
| #define DHCP_TAG_SUBNET_LOCAL     27 // All Subnets are Local
 | |
| #define DHCP_TAG_BROADCAST        28 // Broadcast Address
 | |
| #define DHCP_TAG_DISCOVER_MASK    29 // Perform Mask Discovery
 | |
| #define DHCP_TAG_SUPPLY_MASK      30 // Mask Supplier
 | |
| #define DHCP_TAG_DISCOVER_ROUTE   31 // Perform Router Discovery
 | |
| #define DHCP_TAG_ROUTER_SOLICIT   32 // Router Solicitation Address
 | |
| #define DHCP_TAG_STATIC_ROUTE     33 // Static Route
 | |
| 
 | |
| //
 | |
| // Link Layer Parameters per Interface
 | |
| //
 | |
| #define DHCP_TAG_TRAILER          34 // Trailer Encapsulation
 | |
| #define DHCP_TAG_ARPAGE           35 // ARP Cache Timeout
 | |
| #define DHCP_TAG_ETHER_ENCAP      36 // Ethernet Encapsulation
 | |
| 
 | |
| //
 | |
| // TCP Parameters
 | |
| //
 | |
| #define DHCP_TAG_TCP_TTL          37 // TCP Default TTL
 | |
| #define DHCP_TAG_KEEP_INTERVAL    38 // TCP Keepalive Interval
 | |
| #define DHCP_TAG_KEEP_GARBAGE     39 // TCP Keepalive Garbage
 | |
| 
 | |
| //
 | |
| // Application and Service Parameters
 | |
| //
 | |
| #define DHCP_TAG_NIS_DOMAIN       40   // Network Information Service Domain
 | |
| #define DHCP_TAG_NIS_SERVER       41   // Network Information Servers
 | |
| #define DHCP_TAG_NTP_SERVER       42   // Network Time Protocol Servers
 | |
| #define DHCP_TAG_VENDOR           43   // Vendor Specific Information
 | |
| #define DHCP_TAG_NBNS             44   // NetBIOS over TCP/IP Name Server
 | |
| #define DHCP_TAG_NBDD             45   // NetBIOS Datagram Distribution Server
 | |
| #define DHCP_TAG_NBTYPE           46   // NetBIOS over TCP/IP Node Type
 | |
| #define DHCP_TAG_NBSCOPE          47   // NetBIOS over TCP/IP Scope
 | |
| #define DHCP_TAG_XFONT            48   // X Window System Font Server
 | |
| #define DHCP_TAG_XDM              49   // X Window System Display Manager
 | |
| #define DHCP_TAG_NISPLUS          64   // Network Information Service+ Domain
 | |
| #define DHCP_TAG_NISPLUS_SERVER   65   // Network Information Service+ Servers
 | |
| #define DHCP_TAG_MOBILEIP         68   // Mobile IP Home Agent
 | |
| #define DHCP_TAG_SMTP             69   // Simple Mail Transport Protocol Server
 | |
| #define DHCP_TAG_POP3             70   // Post Office Protocol (POP3) Server
 | |
| #define DHCP_TAG_NNTP             71   // Network News Transport Protocol Server
 | |
| #define DHCP_TAG_WWW              72   // Default World Wide Web (WWW) Server
 | |
| #define DHCP_TAG_FINGER           73   // Default Finger Server
 | |
| #define DHCP_TAG_IRC              74   // Default Internet Relay Chat (IRC) Server
 | |
| #define DHCP_TAG_STTALK           75   // StreetTalk Server
 | |
| #define DHCP_TAG_STDA             76   // StreetTalk Directory Assistance Server
 | |
| #define DHCP_TAG_CLASSLESS_ROUTE  121  // Classless Route
 | |
| 
 | |
| //
 | |
| // DHCP Extensions
 | |
| //
 | |
| #define DHCP_TAG_REQUEST_IP       50         // Requested IP Address
 | |
| #define DHCP_TAG_LEASE            51         // IP Address Lease Time
 | |
| #define DHCP_TAG_OVERLOAD         52         // Option Overload
 | |
| #define DHCP_TAG_TFTP             66         // TFTP server name
 | |
| #define DHCP_TAG_BOOTFILE         67         // Bootfile name
 | |
| #define DHCP_TAG_TYPE             53         // DHCP Message Type
 | |
| #define DHCP_TAG_SERVER_ID        54         // Server Identifier
 | |
| #define DHCP_TAG_PARA_LIST        55         // Parameter Request List
 | |
| #define DHCP_TAG_MESSAGE          56         // Message
 | |
| #define DHCP_TAG_MAXMSG           57         // Maximum DHCP Message Size
 | |
| #define DHCP_TAG_T1               58         // Renewal (T1) Time Value
 | |
| #define DHCP_TAG_T2               59         // Rebinding (T2) Time Value
 | |
| #define DHCP_TAG_VENDOR_CLASS     60         // Vendor class identifier
 | |
| #define DHCP_TAG_CLIENT_ID        61         // Client-identifier
 | |
| 
 | |
| 
 | |
| #define DHCP_OPTION_MAGIC         0x63538263 // Network byte order
 | |
| #define DHCP_MAX_OPTIONS          256
 | |
| 
 | |
|  
 | |
| //
 | |
| // DHCP option types, this is used to validate the DHCP options.
 | |
| //
 | |
| #define DHCP_OPTION_SWITCH        1
 | |
| #define DHCP_OPTION_INT8          2
 | |
| #define DHCP_OPTION_INT16         3
 | |
| #define DHCP_OPTION_INT32         4
 | |
| #define DHCP_OPTION_IP            5
 | |
| #define DHCP_OPTION_IPPAIR        6
 | |
| 
 | |
| //
 | |
| // Value of DHCP overload option
 | |
| //
 | |
| #define DHCP_OVERLOAD_FILENAME    1
 | |
| #define DHCP_OVERLOAD_SVRNAME     2
 | |
| #define 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
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Iterate through a DHCP message to visit each option. First inspect
 | |
|   all the options in the OPTION field. Then if overloaded, inspect
 | |
|   the options in FILENAME and SERVERNAME fields. One option may be
 | |
|   encoded in several places. See RFC 3396 Encoding Long Options in DHCP
 | |
| 
 | |
|   @param[in]  Packet                 The DHCP packet to check the options for
 | |
|   @param[in]  Check                  The callback function to be called for each option
 | |
|                                      found
 | |
|   @param[in]  Context                The opaque parameter for Check
 | |
| 
 | |
|   @retval EFI_SUCCESS            The DHCP packet's options are well formated
 | |
|   @retval EFI_INVALID_PARAMETER  The DHCP packet's options are not well formated
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| DhcpIterateOptions (
 | |
|   IN  EFI_DHCP4_PACKET      *Packet,
 | |
|   IN  DHCP_CHECK_OPTION     Check         OPTIONAL,
 | |
|   IN  VOID                  *Context
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Validate the packet's options. If necessary, allocate
 | |
|   and fill in the interested parameters.
 | |
| 
 | |
|   @param[in]  Packet                 The packet to validate the options
 | |
|   @param[out] Para                   The variable to save the DHCP parameters.
 | |
| 
 | |
|   @retval EFI_OUT_OF_RESOURCES   Failed to allocate memory to validate the packet.
 | |
|   @retval EFI_INVALID_PARAMETER  The options are mal-formated
 | |
|   @retval EFI_SUCCESS            The options are parsed into OptionPoint
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| DhcpValidateOptions (
 | |
|   IN  EFI_DHCP4_PACKET      *Packet,
 | |
|   OUT DHCP_PARAMETER        **Para       OPTIONAL
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Parse the options of a DHCP packet. It supports RFC 3396: Encoding
 | |
|   Long Options in DHCP. That is, it will combine all the option value
 | |
|   of all the occurances of each option.
 | |
|   A little bit of implemenation:
 | |
|   It adopts the "Key indexed counting" algorithm. First, it allocates
 | |
|   an array of 256 DHCP_OPTION_COUNTs because DHCP option tag is encoded
 | |
|   as a UINT8. It then iterates the DHCP packet to get data length of
 | |
|   each option by calling DhcpIterOptions with DhcpGetOptionLen. Now, it
 | |
|   knows the number of present options and their length. It allocates a
 | |
|   array of DHCP_OPTION and a continuous buffer after the array to put
 | |
|   all the options' data. Each option's data is pointed to by the Data
 | |
|   field in DHCP_OPTION structure. At last, it call DhcpIterateOptions
 | |
|   with DhcpFillOption to fill each option's data to its position in the
 | |
|   buffer.
 | |
| 
 | |
|   @param[in]  Packet                 The DHCP packet to parse the options
 | |
|   @param[out] Count                  The number of valid dhcp options present in the
 | |
|                                      packet
 | |
|   @param[out] OptionPoint            The array that contains the DHCP options. Caller
 | |
|                                      should free it.
 | |
| 
 | |
|   @retval EFI_NOT_FOUND          Cannot find any option.
 | |
|   @retval EFI_OUT_OF_RESOURCES   Failed to allocate memory to parse the packet.
 | |
|   @retval EFI_INVALID_PARAMETER  The options are mal-formated
 | |
|   @retval EFI_SUCCESS            The options are parsed into OptionPoint
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| DhcpParseOption (
 | |
|   IN  EFI_DHCP4_PACKET      *Packet,
 | |
|   OUT INTN                  *Count,
 | |
|   OUT DHCP_OPTION           **OptionPoint
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Append an option to the memory, if the option is longer than
 | |
|   255 bytes, splits it into several options.
 | |
| 
 | |
|   @param[out] Buf                    The buffer to append the option to
 | |
|   @param[in]  Tag                    The option's tag
 | |
|   @param[in]  DataLen                The length of the option's data
 | |
|   @param[in]  Data                   The option's data
 | |
| 
 | |
|   @return The position to append the next option
 | |
| 
 | |
| **/
 | |
| UINT8 *
 | |
| DhcpAppendOption (
 | |
|   OUT UINT8                  *Buf,
 | |
|   IN  UINT8                  Tag,
 | |
|   IN  UINT16                 DataLen,
 | |
|   IN  UINT8                  *Data
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Build a new DHCP packet from a seed packet. Options may be deleted or
 | |
|   appended. The caller should free the NewPacket when finished using it.
 | |
| 
 | |
|   @param[in]  SeedPacket             The seed packet to start with
 | |
|   @param[in]  DeleteCount            The number of options to delete
 | |
|   @param[in]  DeleteList             The options to delete from the packet
 | |
|   @param[in]  AppendCount            The number of options to append
 | |
|   @param[in]  AppendList             The options to append to the packet
 | |
|   @param[out] NewPacket              The new packet, allocated and built by this
 | |
|                                      function.
 | |
| 
 | |
|   @retval EFI_OUT_OF_RESOURCES   Failed to allocate memory
 | |
|   @retval EFI_INVALID_PARAMETER  The options in SeekPacket are mal-formated
 | |
|   @retval EFI_SUCCESS            The packet is build.
 | |
| 
 | |
| **/
 | |
| 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
 |