Home | History | Annotate | Download | only in Ip4Dxe
      1 /** @file
      2   Definitions for EFI IPv4 Configuration II Protocol implementation.
      3 
      4   Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
      5   (C) Copyright 2015 Hewlett Packard Enterprise Development LP<BR>
      6 
      7   This program and the accompanying materials
      8   are licensed and made available under the terms and conditions of the BSD License
      9   which accompanies this distribution.  The full text of the license may be found at
     10   http://opensource.org/licenses/bsd-license.php.
     11 
     12   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     13   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     14 
     15 **/
     16 
     17 #ifndef __IP4_CONFIG2_IMPL_H__
     18 #define __IP4_CONFIG2_IMPL_H__
     19 
     20 #define IP4_CONFIG2_INSTANCE_SIGNATURE    SIGNATURE_32 ('I', 'P', 'C', '2')
     21 #define IP4_FORM_CALLBACK_INFO_SIGNATURE  SIGNATURE_32 ('I', 'F', 'C', 'I')
     22 
     23 #define IP4_CONFIG2_VARIABLE_ATTRIBUTE    (EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS)
     24 
     25 #define DATA_ATTRIB_SIZE_FIXED              0x1
     26 #define DATA_ATTRIB_VOLATILE                0x2
     27 
     28 #define DHCP_TAG_PARA_LIST             55
     29 #define DHCP_TAG_NETMASK               1
     30 #define DHCP_TAG_ROUTER                3
     31 #define DHCP_TAG_DNS_SERVER            6
     32 
     33 #define DATA_ATTRIB_SET(Attrib, Bits)       (BOOLEAN)((Attrib) & (Bits))
     34 #define SET_DATA_ATTRIB(Attrib, Bits)       ((Attrib) |= (Bits))
     35 
     36 typedef struct _IP4_CONFIG2_INSTANCE IP4_CONFIG2_INSTANCE;
     37 
     38 #define IP4_CONFIG2_INSTANCE_FROM_PROTOCOL(Proto) \
     39   CR ((Proto), \
     40       IP4_CONFIG2_INSTANCE, \
     41       Ip4Config2, \
     42       IP4_CONFIG2_INSTANCE_SIGNATURE \
     43       )
     44 
     45 #define IP4_SERVICE_FROM_IP4_CONFIG2_INSTANCE(Instance) \
     46   CR ((Instance), \
     47       IP4_SERVICE, \
     48       Ip4Config2Instance, \
     49       IP4_SERVICE_SIGNATURE \
     50       )
     51 
     52 #define IP4_CONFIG2_INSTANCE_FROM_FORM_CALLBACK(Callback) \
     53   CR ((Callback), \
     54       IP4_CONFIG2_INSTANCE, \
     55       CallbackInfo, \
     56       IP4_CONFIG2_INSTANCE_SIGNATURE \
     57       )
     58 
     59 #define IP4_FORM_CALLBACK_INFO_FROM_CONFIG_ACCESS(ConfigAccess) \
     60   CR ((ConfigAccess), \
     61       IP4_FORM_CALLBACK_INFO, \
     62       HiiConfigAccessProtocol, \
     63       IP4_FORM_CALLBACK_INFO_SIGNATURE \
     64       )
     65 
     66 /**
     67   The prototype of work function for EfiIp4Config2SetData().
     68 
     69   @param[in]     Instance The pointer to the IP4 config2 instance data.
     70   @param[in]     DataSize In bytes, the size of the buffer pointed to by Data.
     71   @param[in]     Data     The data buffer to set.
     72 
     73   @retval EFI_BAD_BUFFER_SIZE  The DataSize does not match the size of the type,
     74                                8 bytes.
     75   @retval EFI_SUCCESS          The specified configuration data for the EFI IPv4
     76                                network stack was set successfully.
     77 
     78 **/
     79 typedef
     80 EFI_STATUS
     81 (*IP4_CONFIG2_SET_DATA) (
     82   IN IP4_CONFIG2_INSTANCE *Instance,
     83   IN UINTN                DataSize,
     84   IN VOID                 *Data
     85   );
     86 
     87 /**
     88   The prototype of work function for EfiIp4Config2GetData().
     89 
     90   @param[in]      Instance The pointer to the IP4 config2 instance data.
     91   @param[in, out] DataSize On input, in bytes, the size of Data. On output, in
     92                            bytes, the size of buffer required to store the specified
     93                            configuration data.
     94   @param[in]      Data     The data buffer in which the configuration data is returned.
     95                            Ignored if DataSize is ZERO.
     96 
     97   @retval EFI_BUFFER_TOO_SMALL The size of Data is too small for the specified
     98                                configuration data, and the required size is
     99                                returned in DataSize.
    100   @retval EFI_SUCCESS          The specified configuration data was obtained successfully.
    101 
    102 **/
    103 typedef
    104 EFI_STATUS
    105 (*IP4_CONFIG2_GET_DATA) (
    106   IN IP4_CONFIG2_INSTANCE *Instance,
    107   IN OUT UINTN            *DataSize,
    108   IN VOID                 *Data      OPTIONAL
    109   );
    110 
    111 typedef union {
    112   VOID                                      *Ptr;
    113   EFI_IP4_CONFIG2_INTERFACE_INFO            *IfInfo;
    114   EFI_IP4_CONFIG2_POLICY                    *Policy;
    115   EFI_IP4_CONFIG2_MANUAL_ADDRESS            *ManualAddress;
    116   EFI_IPv4_ADDRESS                          *Gateway;
    117   EFI_IPv4_ADDRESS                          *DnsServers;
    118 } IP4_CONFIG2_DATA;
    119 
    120 typedef struct {
    121   IP4_CONFIG2_SET_DATA SetData;
    122   IP4_CONFIG2_GET_DATA GetData;
    123   EFI_STATUS           Status;
    124   UINT8                Attribute;
    125   NET_MAP              EventMap;
    126   IP4_CONFIG2_DATA     Data;
    127   UINTN                DataSize;
    128 } IP4_CONFIG2_DATA_ITEM;
    129 
    130 typedef struct {
    131   UINT16                    Offset;
    132   UINT32                    DataSize;
    133   EFI_IP4_CONFIG2_DATA_TYPE DataType;
    134 } IP4_CONFIG2_DATA_RECORD;
    135 
    136 #pragma pack(1)
    137 
    138 //
    139 // heap data that contains the data for each data record.
    140 //
    141 //  EFI_IP4_CONFIG2_POLICY                    Policy;
    142 //  UINT32                                    ManualaddressCount;
    143 //  UINT32                                    GatewayCount;
    144 //  UINT32                                    DnsServersCount;
    145 //  EFI_IP4_CONFIG2_MANUAL_ADDRESS            ManualAddress[];
    146 //  EFI_IPv4_ADDRESS                          Gateway[];
    147 //  EFI_IPv4_ADDRESS                          DnsServers[];
    148 //
    149 typedef struct {
    150   UINT16                  Checksum;
    151   UINT16                  DataRecordCount;
    152   IP4_CONFIG2_DATA_RECORD DataRecord[1];
    153 } IP4_CONFIG2_VARIABLE;
    154 
    155 #pragma pack()
    156 
    157 typedef struct {
    158   EFI_IP4_CONFIG2_POLICY                   Policy;               ///< manual or automatic
    159   EFI_IP4_CONFIG2_MANUAL_ADDRESS           *ManualAddress;       ///< IP addresses
    160   UINT32                                   ManualAddressCount;   ///< IP addresses count
    161   EFI_IPv4_ADDRESS                         *GatewayAddress;      ///< Gateway address
    162   UINT32                                   GatewayAddressCount;  ///< Gateway address count
    163   EFI_IPv4_ADDRESS                         *DnsAddress;          ///< DNS server address
    164   UINT32                                   DnsAddressCount;      ///< DNS server address count
    165 } IP4_CONFIG2_NVDATA;
    166 
    167 typedef struct _IP4_FORM_CALLBACK_INFO {
    168   UINT32                           Signature;
    169   EFI_HANDLE                       ChildHandle;
    170   EFI_HII_CONFIG_ACCESS_PROTOCOL   HiiConfigAccessProtocol;
    171   EFI_DEVICE_PATH_PROTOCOL         *HiiVendorDevicePath;
    172   EFI_HII_HANDLE                   RegisteredHandle;
    173 } IP4_FORM_CALLBACK_INFO;
    174 
    175 struct _IP4_CONFIG2_INSTANCE {
    176   UINT32                                    Signature;
    177   BOOLEAN                                   Configured;
    178   LIST_ENTRY                                Link;
    179   UINT16                                    IfIndex;
    180 
    181   EFI_IP4_CONFIG2_PROTOCOL                  Ip4Config2;
    182 
    183   EFI_IP4_CONFIG2_INTERFACE_INFO            InterfaceInfo;
    184   EFI_IP4_CONFIG2_POLICY                    Policy;
    185   IP4_CONFIG2_DATA_ITEM                     DataItem[Ip4Config2DataTypeMaximum];
    186 
    187   EFI_EVENT                                 Dhcp4SbNotifyEvent;
    188   VOID                                      *Registration;
    189   EFI_HANDLE                                Dhcp4Handle;
    190   EFI_DHCP4_PROTOCOL                        *Dhcp4;
    191   BOOLEAN                                   DhcpSuccess;
    192   BOOLEAN                                   OtherInfoOnly;
    193   EFI_EVENT                                 Dhcp4Event;
    194   UINT32                                    FailedIaAddressCount;
    195   EFI_IPv4_ADDRESS                          *DeclineAddress;
    196   UINT32                                    DeclineAddressCount;
    197 
    198   IP4_FORM_CALLBACK_INFO                    CallbackInfo;
    199 
    200   IP4_CONFIG2_NVDATA                        Ip4NvData;
    201 };
    202 
    203 //
    204 // Configure the DHCP to request the routers and netmask
    205 // from server. The DHCP_TAG_NETMASK is included in Head.
    206 //
    207 #pragma pack(1)
    208 typedef struct {
    209   EFI_DHCP4_PACKET_OPTION Head;
    210   UINT8                   Route;
    211   UINT8                   Dns;
    212 } IP4_CONFIG2_DHCP4_OPTION;
    213 #pragma pack()
    214 
    215 /**
    216   Start the DHCP configuration for this IP service instance.
    217   It will locates the EFI_IP4_CONFIG2_PROTOCOL, then start the
    218   DHCP configuration.
    219 
    220   @param[in]  Instance           The IP4 config2 instance to configure.
    221 
    222   @retval EFI_SUCCESS            The auto configuration is successfull started.
    223   @retval Others                 Failed to start auto configuration.
    224 
    225 **/
    226 EFI_STATUS
    227 Ip4StartAutoConfig (
    228   IN IP4_CONFIG2_INSTANCE   *Instance
    229   );
    230 
    231 /**
    232   Initialize an IP4_CONFIG2_INSTANCE.
    233 
    234   @param[out]    Instance       The buffer of IP4_CONFIG2_INSTANCE to be initialized.
    235 
    236   @retval EFI_OUT_OF_RESOURCES  Failed to allocate resources to complete the operation.
    237   @retval EFI_SUCCESS           The IP4_CONFIG2_INSTANCE initialized successfully.
    238 
    239 **/
    240 EFI_STATUS
    241 Ip4Config2InitInstance (
    242   OUT IP4_CONFIG2_INSTANCE  *Instance
    243   );
    244 
    245 /**
    246   Release an IP4_CONFIG2_INSTANCE.
    247 
    248   @param[in, out] Instance    The buffer of IP4_CONFIG2_INSTANCE to be freed.
    249 
    250 **/
    251 VOID
    252 Ip4Config2CleanInstance (
    253   IN OUT IP4_CONFIG2_INSTANCE  *Instance
    254   );
    255 
    256 /**
    257   Destroy the Dhcp4 child in IP4_CONFIG2_INSTANCE and release the resources.
    258 
    259   @param[in, out] Instance    The buffer of IP4 config2 instance to be freed.
    260 
    261   @retval EFI_SUCCESS         The child was successfully destroyed.
    262   @retval Others              Failed to destroy the child.
    263 
    264 **/
    265 EFI_STATUS
    266 Ip4Config2DestroyDhcp4 (
    267   IN OUT IP4_CONFIG2_INSTANCE  *Instance
    268   );
    269 
    270 #endif
    271