Home | History | Annotate | Download | only in UefiPxeBcDxe
      1 /** @file
      2   Functions declaration related with DHCPv6 for UefiPxeBc Driver.
      3 
      4   Copyright (c) 2009 - 2016, Intel Corporation. All rights reserved.<BR>
      5 
      6   This program and the accompanying materials
      7   are licensed and made available under the terms and conditions of the BSD License
      8   which accompanies this distribution.  The full text of the license may be found at
      9   http://opensource.org/licenses/bsd-license.php.
     10 
     11   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     12   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     13 
     14 **/
     15 
     16 #ifndef __EFI_PXEBC_DHCP6_H__
     17 #define __EFI_PXEBC_DHCP6_H__
     18 
     19 #define PXEBC_DHCP6_OPTION_MAX_NUM        16
     20 #define PXEBC_DHCP6_OPTION_MAX_SIZE       312
     21 #define PXEBC_DHCP6_PACKET_MAX_SIZE       (sizeof (EFI_PXE_BASE_CODE_PACKET))
     22 #define PXEBC_IP6_POLICY_MAX              0xff
     23 #define PXEBC_IP6_ROUTE_TABLE_TIMEOUT     10
     24 
     25 #define PXEBC_DHCP6_S_PORT                547
     26 #define PXEBC_DHCP6_C_PORT                546
     27 
     28 #define PXEBC_DHCP6_ENTERPRISE_NUM        343   // TODO: IANA TBD: temporarily using Intel's
     29 #define PXEBC_DHCP6_MAX_BOOT_FILE_SIZE    65535 //   It's a limitation of bit length, 65535*512 bytes.
     30 
     31 
     32 #define PXEBC_DHCP6_IDX_IA_NA             0
     33 #define PXEBC_DHCP6_IDX_BOOT_FILE_URL     1
     34 #define PXEBC_DHCP6_IDX_BOOT_FILE_PARAM   2
     35 #define PXEBC_DHCP6_IDX_VENDOR_CLASS      3
     36 #define PXEBC_DHCP6_IDX_DNS_SERVER        4
     37 #define PXEBC_DHCP6_IDX_MAX               5
     38 
     39 #define PXEBC_DHCP6_BOOT_FILE_URL_PREFIX  "tftp://"
     40 #define PXEBC_TFTP_URL_SEPARATOR          '/'
     41 #define PXEBC_ADDR_START_DELIMITER        '['
     42 #define PXEBC_ADDR_END_DELIMITER          ']'
     43 
     44 #define GET_NEXT_DHCP6_OPTION(Opt) \
     45   (EFI_DHCP6_PACKET_OPTION *) ((UINT8 *) (Opt) + \
     46   sizeof (EFI_DHCP6_PACKET_OPTION) + (NTOHS ((Opt)->OpLen)) - 1)
     47 
     48 #define GET_DHCP6_OPTION_SIZE(Pkt)  \
     49   ((Pkt)->Length - sizeof (EFI_DHCP6_HEADER))
     50 
     51 #define IS_PROXY_OFFER(Type) \
     52   ((Type) == PxeOfferTypeProxyBinl || \
     53    (Type) == PxeOfferTypeProxyPxe10 || \
     54    (Type) == PxeOfferTypeProxyWfm11a)
     55 
     56 
     57 #pragma pack(1)
     58 typedef struct {
     59   UINT16 OpCode[256];
     60 } PXEBC_DHCP6_OPTION_ORO;
     61 
     62 typedef struct {
     63   UINT8 Type;
     64   UINT8 MajorVer;
     65   UINT8 MinorVer;
     66 } PXEBC_DHCP6_OPTION_UNDI;
     67 
     68 typedef struct {
     69   UINT16 Type;
     70 } PXEBC_DHCP6_OPTION_ARCH;
     71 
     72 typedef struct {
     73   UINT8 ClassIdentifier[10];
     74   UINT8 ArchitecturePrefix[5];
     75   UINT8 ArchitectureType[5];
     76   UINT8 Lit3[1];
     77   UINT8 InterfaceName[4];
     78   UINT8 Lit4[1];
     79   UINT8 UndiMajor[3];
     80   UINT8 UndiMinor[3];
     81 } PXEBC_CLASS_ID;
     82 
     83 typedef struct {
     84   UINT32         Vendor;
     85   UINT16         ClassLen;
     86   PXEBC_CLASS_ID ClassId;
     87 } PXEBC_DHCP6_OPTION_VENDOR_CLASS;
     88 
     89 #pragma pack()
     90 
     91 typedef union {
     92   PXEBC_DHCP6_OPTION_ORO            *Oro;
     93   PXEBC_DHCP6_OPTION_UNDI           *Undi;
     94   PXEBC_DHCP6_OPTION_ARCH           *Arch;
     95   PXEBC_DHCP6_OPTION_VENDOR_CLASS   *VendorClass;
     96 } PXEBC_DHCP6_OPTION_ENTRY;
     97 
     98 typedef struct {
     99   LIST_ENTRY              Link;
    100   EFI_DHCP6_PACKET_OPTION *Option;
    101   UINT8                   Precedence;
    102 } PXEBC_DHCP6_OPTION_NODE;
    103 
    104 #define PXEBC_CACHED_DHCP6_PACKET_MAX_SIZE  (OFFSET_OF (EFI_DHCP6_PACKET, Dhcp6) + PXEBC_DHCP6_PACKET_MAX_SIZE)
    105 
    106 typedef union {
    107   EFI_DHCP6_PACKET        Offer;
    108   EFI_DHCP6_PACKET        Ack;
    109   UINT8                   Buffer[PXEBC_CACHED_DHCP6_PACKET_MAX_SIZE];
    110 } PXEBC_DHCP6_PACKET;
    111 
    112 typedef struct {
    113   PXEBC_DHCP6_PACKET      Packet;
    114   PXEBC_OFFER_TYPE        OfferType;
    115   EFI_DHCP6_PACKET_OPTION *OptList[PXEBC_DHCP6_IDX_MAX];
    116 } PXEBC_DHCP6_PACKET_CACHE;
    117 
    118 
    119 /**
    120   Free all the nodes in the boot file list.
    121 
    122   @param[in]  Head            The pointer to the head of the list.
    123 
    124 **/
    125 VOID
    126 PxeBcFreeBootFileOption (
    127   IN LIST_ENTRY               *Head
    128   );
    129 
    130 
    131 /**
    132   Parse the Boot File URL option.
    133 
    134   @param[in]      Private             Pointer to PxeBc private data.
    135   @param[out]     FileName     The pointer to the boot file name.
    136   @param[in, out] SrvAddr      The pointer to the boot server address.
    137   @param[in]      BootFile     The pointer to the boot file URL option data.
    138   @param[in]      Length       Length of the boot file URL option data.
    139 
    140   @retval EFI_ABORTED     User canceled the operation.
    141   @retval EFI_SUCCESS     Selected the boot menu successfully.
    142   @retval EFI_NOT_READY   Read the input key from the keybroad has not finish.
    143 
    144 **/
    145 EFI_STATUS
    146 PxeBcExtractBootFileUrl (
    147   IN PXEBC_PRIVATE_DATA      *Private,
    148      OUT UINT8               **FileName,
    149   IN OUT EFI_IPv6_ADDRESS    *SrvAddr,
    150   IN     CHAR8               *BootFile,
    151   IN     UINT16              Length
    152   );
    153 
    154 
    155 /**
    156   Parse the Boot File Parameter option.
    157 
    158   @param[in]  BootFilePara      The pointer to the boot file parameter option data.
    159   @param[out] BootFileSize      The pointer to the parsed boot file size.
    160 
    161   @retval EFI_SUCCESS     Successfully obtained the boot file size from parameter option.
    162   @retval EFI_NOT_FOUND   Failed to extract the boot file size from parameter option.
    163 
    164 **/
    165 EFI_STATUS
    166 PxeBcExtractBootFileParam (
    167   IN  CHAR8                  *BootFilePara,
    168   OUT UINT16                 *BootFileSize
    169   );
    170 
    171 
    172 /**
    173   Parse the cached DHCPv6 packet, including all the options.
    174 
    175   @param[in]  Cache6           The pointer to a cached DHCPv6 packet.
    176 
    177   @retval     EFI_SUCCESS      Parsed the DHCPv6 packet successfully.
    178   @retval     EFI_DEVICE_ERROR Failed to parse and invalid packet.
    179 
    180 **/
    181 EFI_STATUS
    182 PxeBcParseDhcp6Packet (
    183   IN PXEBC_DHCP6_PACKET_CACHE  *Cache6
    184   );
    185 
    186 
    187 /**
    188   Register the ready address by Ip6Config protocol.
    189 
    190   @param[in]  Private             The pointer to the PxeBc private data.
    191   @param[in]  Address             The pointer to the ready address.
    192 
    193   @retval     EFI_SUCCESS         Registered the address succesfully.
    194   @retval     Others              Failed to register the address.
    195 
    196 **/
    197 EFI_STATUS
    198 PxeBcRegisterIp6Address (
    199   IN PXEBC_PRIVATE_DATA            *Private,
    200   IN EFI_IPv6_ADDRESS              *Address
    201   );
    202 
    203 
    204 /**
    205   Unregister the address by Ip6Config protocol.
    206 
    207   @param[in]  Private             The pointer to the PxeBc private data.
    208 
    209 **/
    210 VOID
    211 PxeBcUnregisterIp6Address (
    212   IN PXEBC_PRIVATE_DATA            *Private
    213   );
    214 
    215 
    216 /**
    217   Build and send out the request packet for the bootfile, and parse the reply.
    218 
    219   @param[in]  Private               The pointer to the PxeBc private data.
    220   @param[in]  Type                  PxeBc option boot item type.
    221   @param[in]  Layer                 The pointer to the option boot item layer.
    222   @param[in]  UseBis                Use BIS or not.
    223   @param[in]  DestIp                The pointer to the server address.
    224 
    225   @retval     EFI_SUCCESS           Successfully discovered theboot file.
    226   @retval     EFI_OUT_OF_RESOURCES  Failed to allocate resource.
    227   @retval     EFI_NOT_FOUND         Can't get the PXE reply packet.
    228   @retval     Others                Failed to discover boot file.
    229 
    230 **/
    231 EFI_STATUS
    232 PxeBcDhcp6Discover (
    233   IN  PXEBC_PRIVATE_DATA            *Private,
    234   IN  UINT16                        Type,
    235   IN  UINT16                        *Layer,
    236   IN  BOOLEAN                       UseBis,
    237   IN  EFI_IP_ADDRESS                *DestIp
    238   );
    239 
    240 /**
    241   Set the IP6 policy to Automatic.
    242 
    243   @param[in]  Private             The pointer to PXEBC_PRIVATE_DATA.
    244 
    245   @retval     EFI_SUCCESS         Switch the IP policy succesfully.
    246   @retval     Others              Unexpect error happened.
    247 
    248 **/
    249 EFI_STATUS
    250 PxeBcSetIp6Policy (
    251   IN PXEBC_PRIVATE_DATA            *Private
    252   );
    253 
    254 /**
    255   This function will register the station IP address and flush IP instance to start using the new IP address.
    256 
    257   @param[in]  Private             The pointer to PXEBC_PRIVATE_DATA.
    258 
    259   @retval     EFI_SUCCESS         The new IP address has been configured successfully.
    260   @retval     Others              Failed to configure the address.
    261 
    262 **/
    263 EFI_STATUS
    264 PxeBcSetIp6Address (
    265   IN  PXEBC_PRIVATE_DATA              *Private
    266   );
    267 
    268 /**
    269   Start the DHCPv6 S.A.R.R. process to acquire the IPv6 address and other PXE boot information.
    270 
    271   @param[in]  Private           The pointer to the PxeBc private data.
    272   @param[in]  Dhcp6             The pointer to EFI_DHCP6_PROTOCOL.
    273 
    274   @retval EFI_SUCCESS           The S.A.R.R. process successfully finished.
    275   @retval Others                Failed to finish the S.A.R.R. process.
    276 
    277 **/
    278 EFI_STATUS
    279 PxeBcDhcp6Sarr (
    280   IN PXEBC_PRIVATE_DATA            *Private,
    281   IN EFI_DHCP6_PROTOCOL            *Dhcp6
    282   );
    283 
    284 #endif
    285 
    286