Home | History | Annotate | Download | only in Ip6Dxe
      1 /** @file
      2   Definitions for EFI IPv6 Configuartion Protocol implementation.
      3 
      4   Copyright (c) 2009 - 2013, 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 __IP6_CONFIG_IMPL_H__
     17 #define __IP6_CONFIG_IMPL_H__
     18 
     19 #define IP6_CONFIG_INSTANCE_SIGNATURE    SIGNATURE_32 ('I', 'P', '6', 'C')
     20 #define IP6_FORM_CALLBACK_INFO_SIGNATURE SIGNATURE_32 ('I', 'F', 'C', 'I')
     21 #define IP6_CONFIG_VARIABLE_ATTRIBUTE    (EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS)
     22 
     23 #define IP6_CONFIG_DEFAULT_DAD_XMITS        1
     24 #define IP6_CONFIG_DHCP6_OPTION_ORO         6
     25 #define IP6_CONFIG_DHCP6_OPTION_DNS_SERVERS 23
     26 
     27 #define DATA_ATTRIB_SIZE_FIXED              0x1
     28 #define DATA_ATTRIB_VOLATILE                0x2
     29 
     30 #define DATA_ATTRIB_SET(Attrib, Bits)       (BOOLEAN)((Attrib) & (Bits))
     31 #define SET_DATA_ATTRIB(Attrib, Bits)       ((Attrib) |= (Bits))
     32 
     33 typedef struct _IP6_CONFIG_INSTANCE IP6_CONFIG_INSTANCE;
     34 
     35 #define IP6_CONFIG_INSTANCE_FROM_PROTOCOL(Proto) \
     36   CR ((Proto), \
     37       IP6_CONFIG_INSTANCE, \
     38       Ip6Config, \
     39       IP6_CONFIG_INSTANCE_SIGNATURE \
     40       )
     41 
     42 
     43 #define IP6_CONFIG_INSTANCE_FROM_FORM_CALLBACK(Callback) \
     44   CR ((Callback), \
     45       IP6_CONFIG_INSTANCE, \
     46       CallbackInfo, \
     47       IP6_CONFIG_INSTANCE_SIGNATURE \
     48       )
     49 
     50 #define IP6_SERVICE_FROM_IP6_CONFIG_INSTANCE(Instance) \
     51   CR ((Instance), \
     52       IP6_SERVICE, \
     53       Ip6ConfigInstance, \
     54       IP6_SERVICE_SIGNATURE \
     55       )
     56 
     57 #define IP6_FORM_CALLBACK_INFO_FROM_CONFIG_ACCESS(ConfigAccess) \
     58   CR ((ConfigAccess), \
     59       IP6_FORM_CALLBACK_INFO, \
     60       HiiConfigAccess, \
     61       IP6_FORM_CALLBACK_INFO_SIGNATURE \
     62       )
     63 
     64 /**
     65   The prototype of work function for EfiIp6ConfigSetData().
     66 
     67   @param[in]     Instance The pointer to the IP6 config instance data.
     68   @param[in]     DataSize In bytes, the size of the buffer pointed to by Data.
     69   @param[in]     Data     The data buffer to set.
     70 
     71   @retval EFI_BAD_BUFFER_SIZE  The DataSize does not match the size of the type,
     72                                8 bytes.
     73   @retval EFI_SUCCESS          The specified configuration data for the EFI IPv6
     74                                network stack was set successfully.
     75 
     76 **/
     77 typedef
     78 EFI_STATUS
     79 (*IP6_CONFIG_SET_DATA) (
     80   IN IP6_CONFIG_INSTANCE  *Instance,
     81   IN UINTN                DataSize,
     82   IN VOID                 *Data
     83   );
     84 
     85 /**
     86   The prototype of work function for EfiIp6ConfigGetData().
     87 
     88   @param[in]      Instance The pointer to the IP6 config instance data.
     89   @param[in, out] DataSize On input, in bytes, the size of Data. On output, in
     90                            bytes, the size of buffer required to store the specified
     91                            configuration data.
     92   @param[in]      Data     The data buffer in which the configuration data is returned.
     93                            Ignored if DataSize is ZERO.
     94 
     95   @retval EFI_BUFFER_TOO_SMALL The size of Data is too small for the specified
     96                                configuration data, and the required size is
     97                                returned in DataSize.
     98   @retval EFI_SUCCESS          The specified configuration data was obtained successfully.
     99 
    100 **/
    101 typedef
    102 EFI_STATUS
    103 (*IP6_CONFIG_GET_DATA) (
    104   IN IP6_CONFIG_INSTANCE  *Instance,
    105   IN OUT UINTN            *DataSize,
    106   IN VOID                 *Data      OPTIONAL
    107   );
    108 
    109 typedef union {
    110   VOID                                      *Ptr;
    111   EFI_IP6_CONFIG_INTERFACE_INFO             *IfInfo;
    112   EFI_IP6_CONFIG_INTERFACE_ID               *AltIfId;
    113   EFI_IP6_CONFIG_POLICY                     *Policy;
    114   EFI_IP6_CONFIG_DUP_ADDR_DETECT_TRANSMITS  *DadXmits;
    115   EFI_IP6_CONFIG_MANUAL_ADDRESS             *ManualAddress;
    116   EFI_IPv6_ADDRESS                          *Gateway;
    117   EFI_IPv6_ADDRESS                          *DnsServers;
    118 } IP6_CONFIG_DATA;
    119 
    120 typedef struct {
    121   IP6_CONFIG_SET_DATA  SetData;
    122   IP6_CONFIG_GET_DATA  GetData;
    123   EFI_STATUS           Status;
    124   UINT8                Attribute;
    125   NET_MAP              EventMap;
    126   IP6_CONFIG_DATA      Data;
    127   UINTN                DataSize;
    128 } IP6_CONFIG_DATA_ITEM;
    129 
    130 typedef struct {
    131   UINT16                    Offset;
    132   UINT32                    DataSize;
    133   EFI_IP6_CONFIG_DATA_TYPE  DataType;
    134 } IP6_CONFIG_DATA_RECORD;
    135 
    136 #pragma pack(1)
    137 
    138 //
    139 // heap data that contains the data for each data record.
    140 //
    141 //  BOOLEAN                                   IsAltIfIdSet;
    142 //  EFI_IP6_CONFIG_POLICY                     Policy;
    143 //  EFI_IP6_CONFIG_DUP_ADDR_DETECT_TRANSMITS  DadXmits;
    144 //  UINT32                                    ManualaddressCount;
    145 //  UINT32                                    GatewayCount;
    146 //  UINT32                                    DnsServersCount;
    147 //  EFI_IP6_CONFIG_INTERFACE_ID               AltIfId;
    148 //  EFI_IP6_CONFIG_MANUAL_ADDRESS             ManualAddress[];
    149 //  EFI_IPv6_ADDRESS                          Gateway[];
    150 //  EFI_IPv6_ADDRESS                          DnsServers[];
    151 //
    152 typedef struct {
    153   UINT32                  IaId;
    154   UINT16                  Checksum;
    155   UINT16                  DataRecordCount;
    156   IP6_CONFIG_DATA_RECORD  DataRecord[1];
    157 } IP6_CONFIG_VARIABLE;
    158 
    159 #pragma pack()
    160 
    161 typedef struct {
    162   LIST_ENTRY                  Link;
    163   EFI_IP6_ADDRESS_INFO        AddrInfo;
    164 } IP6_ADDRESS_INFO_ENTRY;
    165 
    166 typedef struct {
    167   EFI_IP6_CONFIG_POLICY                    Policy;              ///< manual or automatic
    168   EFI_IP6_CONFIG_DUP_ADDR_DETECT_TRANSMITS DadTransmitCount;    ///< dad transmits count
    169   EFI_IP6_CONFIG_INTERFACE_ID              InterfaceId;         ///< alternative interface id
    170   LIST_ENTRY                               ManualAddress;       ///< IP addresses
    171   UINT32                                   ManualAddressCount;  ///< IP addresses count
    172   LIST_ENTRY                               GatewayAddress;      ///< Gateway address
    173   UINT32                                   GatewayAddressCount; ///< Gateway address count
    174   LIST_ENTRY                               DnsAddress;          ///< DNS server address
    175   UINT32                                   DnsAddressCount;     ///< DNS server address count
    176 } IP6_CONFIG_NVDATA;
    177 
    178 typedef struct _IP6_FORM_CALLBACK_INFO {
    179   UINT32                           Signature;
    180   EFI_HANDLE                       ChildHandle;
    181   EFI_HII_CONFIG_ACCESS_PROTOCOL   HiiConfigAccess;
    182   EFI_DEVICE_PATH_PROTOCOL         *HiiVendorDevicePath;
    183   EFI_HII_HANDLE                   RegisteredHandle;
    184 } IP6_FORM_CALLBACK_INFO;
    185 
    186 struct _IP6_CONFIG_INSTANCE {
    187   UINT32                                    Signature;
    188   BOOLEAN                                   Configured;
    189   LIST_ENTRY                                Link;
    190   UINT16                                    IfIndex;
    191 
    192   EFI_IP6_CONFIG_INTERFACE_INFO             InterfaceInfo;
    193   EFI_IP6_CONFIG_INTERFACE_ID               AltIfId;
    194   EFI_IP6_CONFIG_POLICY                     Policy;
    195   EFI_IP6_CONFIG_DUP_ADDR_DETECT_TRANSMITS  DadXmits;
    196 
    197   IP6_CONFIG_DATA_ITEM                      DataItem[Ip6ConfigDataTypeMaximum];
    198   NET_MAP                                   DadFailedMap;
    199   NET_MAP                                   DadPassedMap;
    200 
    201   EFI_IP6_CONFIG_PROTOCOL                   Ip6Config;
    202 
    203   EFI_EVENT                                 Dhcp6SbNotifyEvent;
    204   VOID                                      *Registration;
    205   EFI_HANDLE                                Dhcp6Handle;
    206   EFI_DHCP6_PROTOCOL                        *Dhcp6;
    207   BOOLEAN                                   OtherInfoOnly;
    208   UINT32                                    IaId;
    209   EFI_EVENT                                 Dhcp6Event;
    210   UINT32                                    FailedIaAddressCount;
    211   EFI_IPv6_ADDRESS                          *DeclineAddress;
    212   UINT32                                    DeclineAddressCount;
    213 
    214   IP6_FORM_CALLBACK_INFO                    CallbackInfo;
    215   IP6_CONFIG_NVDATA                         Ip6NvData;
    216 };
    217 
    218 /**
    219   The event process routine when the DHCPv6 server is answered with a reply packet
    220   for an information request.
    221 
    222   @param[in]     This          Points to the EFI_DHCP6_PROTOCOL.
    223   @param[in]     Context       The pointer to the IP6 configuration instance data.
    224   @param[in]     Packet        The DHCPv6 reply packet.
    225 
    226   @retval EFI_SUCCESS      The DNS server address was retrieved from the reply packet.
    227   @retval EFI_NOT_READY    The reply packet does not contain the DNS server option, or
    228                            the DNS server address is not valid.
    229 
    230 **/
    231 EFI_STATUS
    232 EFIAPI
    233 Ip6ConfigOnDhcp6Reply (
    234   IN EFI_DHCP6_PROTOCOL  *This,
    235   IN VOID                *Context,
    236   IN EFI_DHCP6_PACKET    *Packet
    237   );
    238 
    239 /**
    240   The work function to trigger the DHCPv6 process to perform a stateful autoconfiguration.
    241 
    242   @param[in]     Instance      Pointer to the IP6 config instance data.
    243   @param[in]     OtherInfoOnly If FALSE, get stateful address and other information
    244                                via DHCPv6. Otherwise, only get the other information.
    245 
    246   @retval    EFI_SUCCESS       The operation finished successfully.
    247   @retval    EFI_UNSUPPORTED   The DHCP6 driver is not available.
    248 
    249 **/
    250 EFI_STATUS
    251 Ip6ConfigStartStatefulAutoConfig (
    252   IN IP6_CONFIG_INSTANCE  *Instance,
    253   IN BOOLEAN              OtherInfoOnly
    254   );
    255 
    256 /**
    257   Initialize an IP6_CONFIG_INSTANCE.
    258 
    259   @param[out]    Instance       The buffer of IP6_CONFIG_INSTANCE to be initialized.
    260 
    261   @retval EFI_OUT_OF_RESOURCES  Failed to allocate resources to complete the operation.
    262   @retval EFI_SUCCESS           The IP6_CONFIG_INSTANCE initialized successfully.
    263 
    264 **/
    265 EFI_STATUS
    266 Ip6ConfigInitInstance (
    267   OUT IP6_CONFIG_INSTANCE  *Instance
    268   );
    269 
    270 /**
    271   Release an IP6_CONFIG_INSTANCE.
    272 
    273   @param[in, out] Instance    The buffer of IP6_CONFIG_INSTANCE to be freed.
    274 
    275 **/
    276 VOID
    277 Ip6ConfigCleanInstance (
    278   IN OUT IP6_CONFIG_INSTANCE  *Instance
    279   );
    280 
    281 /**
    282   Destroy the Dhcp6 child in IP6_CONFIG_INSTANCE and release the resources.
    283 
    284   @param[in, out] Instance    The buffer of IP6_CONFIG_INSTANCE to be freed.
    285 
    286   @retval EFI_SUCCESS         The child was successfully destroyed.
    287   @retval Others              Failed to destroy the child.
    288 
    289 **/
    290 EFI_STATUS
    291 Ip6ConfigDestroyDhcp6 (
    292   IN OUT IP6_CONFIG_INSTANCE  *Instance
    293   );
    294 
    295 #endif
    296