/** @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
