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