1 /** @file
2 Functions implementation related with DHCPv4/v6 for DNS driver.
3 
4 Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR>
5 SPDX-License-Identifier: BSD-2-Clause-Patent
6 
7 **/
8 
9 #ifndef _DNS_DHCP_H_
10 #define _DNS_DHCP_H_
11 
12 //
13 // DHCP DNS related
14 //
15 #pragma pack(1)
16 
17 #define IP4_ETHER_PROTO       0x0800
18 
19 #define DHCP4_OPCODE_REQUEST         1
20 #define DHCP4_MAGIC                  0x63538263 /// network byte order
21 #define DHCP4_TAG_EOP                255  /// End Option
22 
23 #define DHCP4_TAG_TYPE               53
24 #define DHCP4_MSG_REQUEST            3
25 #define DHCP4_MSG_INFORM             8
26 
27 #define DHCP4_TAG_PARA_LIST          55
28 #define DHCP4_TAG_DNS_SERVER         6
29 
30 
31 #define DHCP6_TAG_DNS_REQUEST        6
32 #define DHCP6_TAG_DNS_SERVER         23
33 
34 #define DNS_CHECK_MEDIA_GET_DHCP_WAITING_TIME    EFI_TIMER_PERIOD_SECONDS(20)
35 
36 //
37 // The required Dns4 server information.
38 //
39 typedef struct {
40   UINT32                     *ServerCount;
41   EFI_IPv4_ADDRESS           *ServerList;
42 } DNS4_SERVER_INFOR;
43 
44 //
45 // The required Dns6 server information.
46 //
47 typedef struct {
48   UINT32                     *ServerCount;
49   EFI_IPv6_ADDRESS           *ServerList;
50 } DNS6_SERVER_INFOR;
51 
52 #pragma pack()
53 
54 /**
55   Parse the ACK to get required information
56 
57   @param  Dhcp4            The DHCP4 protocol.
58   @param  Packet           Packet waiting for parse.
59   @param  DnsServerInfor   The required Dns4 server information.
60 
61   @retval EFI_SUCCESS           The DNS information is got from the DHCP ACK.
62   @retval EFI_NO_MAPPING        DHCP failed to acquire address and other information.
63   @retval EFI_DEVICE_ERROR      Other errors as indicated.
64   @retval EFI_OUT_OF_RESOURCES  Failed to allocate memory.
65 
66 **/
67 EFI_STATUS
68 ParseDhcp4Ack (
69   IN EFI_DHCP4_PROTOCOL         *Dhcp4,
70   IN EFI_DHCP4_PACKET           *Packet,
71   IN DNS4_SERVER_INFOR          *DnsServerInfor
72   );
73 
74 /**
75   EFI_DHCP6_INFO_CALLBACK is provided by the consumer of the EFI DHCPv6 Protocol
76   instance to intercept events that occurs in the DHCPv6 Information Request
77   exchange process.
78 
79   @param  This                  Pointer to the EFI_DHCP6_PROTOCOL instance that
80                                 is used to configure this  callback function.
81   @param  Context               Pointer to the context that is initialized in
82                                 the EFI_DHCP6_PROTOCOL.InfoRequest().
83   @param  Packet                Pointer to Reply packet that has been received.
84                                 The EFI DHCPv6 Protocol instance is responsible
85                                 for freeing the buffer.
86 
87   @retval EFI_SUCCESS           The DNS information is got from the DHCP ACK.
88   @retval EFI_DEVICE_ERROR      Other errors as indicated.
89   @retval EFI_OUT_OF_RESOURCES  Failed to allocate memory.
90 **/
91 EFI_STATUS
92 EFIAPI
93 ParseDhcp6Ack (
94   IN EFI_DHCP6_PROTOCOL          *This,
95   IN VOID                        *Context,
96   IN EFI_DHCP6_PACKET            *Packet
97   );
98 
99 /**
100   Parse the DHCP ACK to get Dns4 server information.
101 
102   @param  Instance         The DNS instance.
103   @param  DnsServerCount   Retrieved Dns4 server Ip count.
104   @param  DnsServerList    Retrieved Dns4 server Ip list.
105 
106   @retval EFI_SUCCESS           The Dns4 information is got from the DHCP ACK.
107   @retval EFI_OUT_OF_RESOURCES  Failed to allocate memory.
108   @retval EFI_NO_MEDIA          There was a media error.
109   @retval Others                Other errors as indicated.
110 
111 **/
112 EFI_STATUS
113 GetDns4ServerFromDhcp4 (
114   IN  DNS_INSTANCE               *Instance,
115   OUT UINT32                     *DnsServerCount,
116   OUT EFI_IPv4_ADDRESS           **DnsServerList
117   );
118 
119 /**
120   Parse the DHCP ACK to get Dns6 server information.
121 
122   @param  Image            The handle of the driver image.
123   @param  Controller       The handle of the controller.
124   @param  DnsServerCount   Retrieved Dns6 server Ip count.
125   @param  DnsServerList    Retrieved Dns6 server Ip list.
126 
127   @retval EFI_SUCCESS           The Dns6 information is got from the DHCP ACK.
128   @retval EFI_OUT_OF_RESOURCES  Failed to allocate memory.
129   @retval EFI_NO_MEDIA          There was a media error.
130   @retval Others                Other errors as indicated.
131 
132 **/
133 EFI_STATUS
134 GetDns6ServerFromDhcp6 (
135   IN  EFI_HANDLE                 Image,
136   IN  EFI_HANDLE                 Controller,
137   OUT UINT32                     *DnsServerCount,
138   OUT EFI_IPv6_ADDRESS           **DnsServerList
139   );
140 
141 #endif
142