1/** @file
2  Functions declaration related with DHCPv6 for HTTP boot driver.
3
4Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>
5This program and the accompanying materials are licensed and made available under
6the terms and conditions of the BSD License that accompanies this distribution.
7The full text of the license may be found at
8http://opensource.org/licenses/bsd-license.php.
9
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12
13**/
14
15
16#ifndef __EFI_HTTP_BOOT_DHCP6_H__
17#define __EFI_HTTP_BOOT_DHCP6_H__
18
19#define HTTP_BOOT_OFFER_MAX_NUM                16
20#define HTTP_BOOT_DHCP6_OPTION_MAX_NUM         16
21#define HTTP_BOOT_DHCP6_OPTION_MAX_SIZE        312
22#define HTTP_BOOT_DHCP6_PACKET_MAX_SIZE        1472
23#define HTTP_BOOT_IP6_ROUTE_TABLE_TIMEOUT      10
24#define HTTP_BOOT_DEFAULT_HOPLIMIT             64
25#define HTTP_BOOT_DEFAULT_LIFETIME             50000
26
27#define HTTP_BOOT_DHCP6_ENTERPRISE_NUM        343   // TODO: IANA TBD: temporarily using Intel's
28#define HTTP_BOOT_DHCP6_MAX_BOOT_FILE_SIZE    65535 //   It's a limitation of bit length, 65535*512 bytes.
29
30#define HTTP_BOOT_DHCP6_IDX_IA_NA             0
31#define HTTP_BOOT_DHCP6_IDX_BOOT_FILE_URL     1
32#define HTTP_BOOT_DHCP6_IDX_BOOT_FILE_PARAM   2
33#define HTTP_BOOT_DHCP6_IDX_VENDOR_CLASS      3
34#define HTTP_BOOT_DHCP6_IDX_DNS_SERVER        4
35#define HTTP_BOOT_DHCP6_IDX_MAX               5
36
37#pragma pack(1)
38typedef struct {
39  UINT16 OpCode[256];
40} HTTP_BOOT_DHCP6_OPTION_ORO;
41
42typedef struct {
43  UINT8 Type;
44  UINT8 MajorVer;
45  UINT8 MinorVer;
46} HTTP_BOOT_DHCP6_OPTION_UNDI;
47
48typedef struct {
49  UINT16 Type;
50} HTTP_BOOT_DHCP6_OPTION_ARCH;
51
52typedef struct {
53  UINT8 ClassIdentifier[11];
54  UINT8 ArchitecturePrefix[5];
55  UINT8 ArchitectureType[5];
56  UINT8 Lit3[1];
57  UINT8 InterfaceName[4];
58  UINT8 Lit4[1];
59  UINT8 UndiMajor[3];
60  UINT8 UndiMinor[3];
61} HTTP_BOOT_CLASS_ID;
62
63typedef struct {
64  UINT32             Vendor;
65  UINT16             ClassLen;
66  HTTP_BOOT_CLASS_ID ClassId;
67} HTTP_BOOT_DHCP6_OPTION_VENDOR_CLASS;
68
69#pragma pack()
70
71typedef union {
72  HTTP_BOOT_DHCP6_OPTION_ORO            *Oro;
73  HTTP_BOOT_DHCP6_OPTION_UNDI           *Undi;
74  HTTP_BOOT_DHCP6_OPTION_ARCH           *Arch;
75  HTTP_BOOT_DHCP6_OPTION_VENDOR_CLASS   *VendorClass;
76} HTTP_BOOT_DHCP6_OPTION_ENTRY;
77
78#define HTTP_CACHED_DHCP6_PACKET_MAX_SIZE  (OFFSET_OF (EFI_DHCP6_PACKET, Dhcp6) + HTTP_BOOT_DHCP6_PACKET_MAX_SIZE)
79
80typedef union {
81  EFI_DHCP6_PACKET        Offer;
82  EFI_DHCP6_PACKET        Ack;
83  UINT8                   Buffer[HTTP_CACHED_DHCP6_PACKET_MAX_SIZE];
84} HTTP_BOOT_DHCP6_PACKET;
85
86typedef struct {
87  HTTP_BOOT_DHCP6_PACKET      Packet;
88  HTTP_BOOT_OFFER_TYPE        OfferType;
89  EFI_DHCP6_PACKET_OPTION     *OptList[HTTP_BOOT_DHCP6_IDX_MAX];
90  VOID                        *UriParser;
91} HTTP_BOOT_DHCP6_PACKET_CACHE;
92
93#define GET_NEXT_DHCP6_OPTION(Opt) \
94  (EFI_DHCP6_PACKET_OPTION *) ((UINT8 *) (Opt) + \
95  sizeof (EFI_DHCP6_PACKET_OPTION) + (NTOHS ((Opt)->OpLen)) - 1)
96
97#define GET_DHCP6_OPTION_SIZE(Pkt)  \
98  ((Pkt)->Length - sizeof (EFI_DHCP6_HEADER))
99
100/**
101  Start the S.A.R.R DHCPv6 process to acquire the IPv6 address and other Http boot information.
102
103  @param[in]  Private           Pointer to HTTP_BOOT private data.
104
105  @retval EFI_SUCCESS           The S.A.R.R process successfully finished.
106  @retval Others                Failed to finish the S.A.R.R process.
107
108**/
109EFI_STATUS
110HttpBootDhcp6Sarr (
111  IN HTTP_BOOT_PRIVATE_DATA         *Private
112  );
113
114/**
115  Set the IP6 policy to Automatic.
116
117  @param[in]  Private             The pointer to HTTP_BOOT_PRIVATE_DATA.
118
119  @retval     EFI_SUCCESS         Switch the IP policy succesfully.
120  @retval     Others              Unexpect error happened.
121
122**/
123EFI_STATUS
124HttpBootSetIp6Policy (
125  IN HTTP_BOOT_PRIVATE_DATA        *Private
126  );
127
128/**
129  This function will register the default DNS addresses to the network device.
130
131  @param[in]  Private             The pointer to HTTP_BOOT_PRIVATE_DATA.
132  @param[in]  DataLength          Size of the buffer pointed to by DnsServerData in bytes.
133  @param[in]  DnsServerData       Point a list of DNS server address in an array
134                                  of EFI_IPv6_ADDRESS instances.
135
136  @retval     EFI_SUCCESS         The DNS configuration has been configured successfully.
137  @retval     Others              Failed to configure the address.
138
139**/
140EFI_STATUS
141HttpBootSetIp6Dns (
142  IN HTTP_BOOT_PRIVATE_DATA         *Private,
143  IN UINTN                          DataLength,
144  IN VOID                           *DnsServerData
145  );
146
147/**
148  This function will register the IPv6 gateway address to the network device.
149
150  @param[in]  Private             The pointer to HTTP_BOOT_PRIVATE_DATA.
151
152  @retval     EFI_SUCCESS         The new IP configuration has been configured successfully.
153  @retval     Others              Failed to configure the address.
154
155**/
156EFI_STATUS
157HttpBootSetIp6Gateway (
158  IN HTTP_BOOT_PRIVATE_DATA         *Private
159  );
160
161/**
162  This function will register the station IP address.
163
164  @param[in]  Private             The pointer to HTTP_BOOT_PRIVATE_DATA.
165
166  @retval     EFI_SUCCESS         The new IP address has been configured successfully.
167  @retval     Others              Failed to configure the address.
168
169**/
170EFI_STATUS
171HttpBootSetIp6Address (
172  IN HTTP_BOOT_PRIVATE_DATA         *Private
173  );
174
175#endif
176