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