]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - MdeModulePkg/Universal/Network/PxeDhcp4Dxe/PxeDhcp4Setup.c
1. Sync the latest network stack. Add NetLibCreateIPv4DPathNode () in netlib library.
[mirror_edk2.git] / MdeModulePkg / Universal / Network / PxeDhcp4Dxe / PxeDhcp4Setup.c
... / ...
CommitLineData
1/** @file\r
2\r
3Copyright (c) 2004, Intel Corporation\r
4All rights reserved. This program and the accompanying materials\r
5are licensed and made available under the terms and conditions of the BSD License\r
6which accompanies this distribution. The full text of the license may be found at\r
7http://opensource.org/licenses/bsd-license.php\r
8\r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
11\r
12Module Name:\r
13 PxeDhcp4Setup.c\r
14\r
15Abstract:\r
16\r
17\r
18**/\r
19\r
20#include "PxeDhcp4.h"\r
21\r
22/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
23EFI_STATUS\r
24EFIAPI\r
25PxeDhcp4Setup (\r
26 IN EFI_PXE_DHCP4_PROTOCOL *This,\r
27 IN EFI_PXE_DHCP4_DATA *Data\r
28 )\r
29{\r
30 PXE_DHCP4_PRIVATE_DATA *Private;\r
31 DHCP4_HEADER *Packet;\r
32 EFI_STATUS EfiStatus;\r
33 UINT8 *OpLen;\r
34 UINT8 *OpPtr;\r
35\r
36 //\r
37 // Return error if parameters are invalid.\r
38 //\r
39 if (This == NULL) {\r
40 return EFI_INVALID_PARAMETER;\r
41 }\r
42\r
43 Private = PXE_DHCP4_PRIVATE_DATA_FROM_THIS (This);\r
44\r
45 if (Private == NULL) {\r
46 return EFI_INVALID_PARAMETER;\r
47 }\r
48\r
49 if (This->Data != NULL) {\r
50 return EFI_ALREADY_STARTED;\r
51 }\r
52\r
53 if (Private->PxeBc == NULL) {\r
54 return EFI_DEVICE_ERROR;\r
55 }\r
56 //\r
57 // Check contents of provided Data structure.\r
58 //\r
59 if (Data != NULL) {\r
60 //\r
61 // Do protocol state checks first.\r
62 //\r
63 if (Data->SelectCompleted) {\r
64 if (!Data->InitCompleted || !Data->SetupCompleted) {\r
65 return EFI_INVALID_PARAMETER;\r
66 }\r
67\r
68 if (Data->IsBootp && !Data->IsAck) {\r
69 return EFI_INVALID_PARAMETER;\r
70 }\r
71 } else if (Data->InitCompleted) {\r
72 if (!Data->SetupCompleted || Data->IsBootp || Data->IsAck) {\r
73 return EFI_INVALID_PARAMETER;\r
74 }\r
75 } else if (Data->SetupCompleted) {\r
76 if (Data->IsBootp || Data->IsAck) {\r
77 return EFI_INVALID_PARAMETER;\r
78 }\r
79 }\r
80 //\r
81 // Do packet content checks.\r
82 //\r
83 if (Data->SetupCompleted) {\r
84 //\r
85 // %%TBD - check discover packet\r
86 //\r
87 }\r
88\r
89 if (Data->SelectCompleted) {\r
90 if (Data->IsBootp) {\r
91 //\r
92 // %%TBD - check offer packet\r
93 //\r
94 if (CompareMem (\r
95 &Data->Discover,\r
96 &Data->Request,\r
97 sizeof (DHCP4_PACKET)\r
98 )) {\r
99 return EFI_INVALID_PARAMETER;\r
100 }\r
101\r
102 if (CompareMem (\r
103 &Data->Offer,\r
104 &Data->AckNak,\r
105 sizeof (DHCP4_PACKET)\r
106 )) {\r
107 return EFI_INVALID_PARAMETER;\r
108 }\r
109 } else {\r
110 //\r
111 // %%TBD - check offer, request & acknak packets\r
112 //\r
113 }\r
114 }\r
115 }\r
116 //\r
117 // Allocate data structure. Return error\r
118 // if there is not enough available memory.\r
119 //\r
120 This->Data = AllocatePool (sizeof (EFI_PXE_DHCP4_DATA));\r
121 if (This->Data == NULL) {\r
122 return EFI_OUT_OF_RESOURCES;\r
123 }\r
124 //\r
125 // Start PxeBc because we want to use its UdpWrite, UdpRead and\r
126 // SetFilter calls.\r
127 //\r
128 EfiStatus = Private->PxeBc->Start (Private->PxeBc, FALSE);\r
129\r
130 if (EFI_ERROR (EfiStatus)) {\r
131 if (EfiStatus != EFI_ALREADY_STARTED) {\r
132 FreePool (This->Data);\r
133 This->Data = NULL;\r
134 Private->PxeBc->Stop (Private->PxeBc);\r
135 return EfiStatus;\r
136 }\r
137\r
138 Private->StopPxeBc = FALSE;\r
139 } else {\r
140 Private->StopPxeBc = TRUE;\r
141 }\r
142 //\r
143 // Use new data.\r
144 //\r
145 if (Data != NULL) {\r
146 CopyMem (This->Data, Data, sizeof (EFI_PXE_DHCP4_DATA));\r
147 return EFI_SUCCESS;\r
148 }\r
149 //\r
150 // Initialize new public data structure.\r
151 //\r
152 ZeroMem (This->Data, sizeof (EFI_PXE_DHCP4_DATA));\r
153\r
154 //\r
155 // Fill in default DHCP discover packet.\r
156 // Check for MAC addresses of strange lengths, just in case.\r
157 //\r
158 Packet = &This->Data->Discover.dhcp4;\r
159\r
160 Packet->op = BOOTP_REQUEST;\r
161\r
162 Packet->htype = Private->Snp->Mode->IfType;\r
163\r
164 if (Private->Snp->Mode->HwAddressSize > 16) {\r
165 Packet->hlen = 16;\r
166 } else {\r
167 Packet->hlen = (UINT8) Private->Snp->Mode->HwAddressSize;\r
168 }\r
169\r
170 Packet->hops = 0; /* Set to zero per RFC 2131. */\r
171\r
172 if (Packet->hlen < sizeof Packet->xid) {\r
173 if (Packet->hlen != 0) {\r
174 CopyMem (\r
175 &Packet->xid,\r
176 &Private->Snp->Mode->CurrentAddress,\r
177 Packet->hlen\r
178 );\r
179 }\r
180 } else {\r
181 CopyMem (\r
182 &Packet->xid,\r
183 &Private->Snp->Mode->CurrentAddress.Addr[Packet->hlen - sizeof Packet->xid],\r
184 sizeof Packet->xid\r
185 );\r
186 }\r
187 //\r
188 // %%TBD - xid should be randomized\r
189 //\r
190 Packet->secs = htons (DHCP4_INITIAL_SECONDS);\r
191\r
192 Packet->flags = htons (DHCP4_BROADCAST_FLAG);\r
193\r
194 if (Packet->hlen != 0) {\r
195 CopyMem (Packet->chaddr, &Private->Snp->Mode->CurrentAddress, Packet->hlen);\r
196 }\r
197\r
198 Packet->magik = htonl (DHCP4_MAGIK_NUMBER);\r
199\r
200 OpPtr = Packet->options;\r
201\r
202 *OpPtr++ = DHCP4_MESSAGE_TYPE;\r
203 *OpPtr++ = 1;\r
204 *OpPtr++ = DHCP4_MESSAGE_TYPE_DISCOVER;\r
205\r
206 *OpPtr++ = DHCP4_MAX_MESSAGE_SIZE;\r
207 *OpPtr++ = 2;\r
208 *OpPtr++ = (UINT8) ((DHCP4_DEFAULT_MAX_MESSAGE_SIZE >> 8) & 0xFF);\r
209 *OpPtr++ = (UINT8) (DHCP4_DEFAULT_MAX_MESSAGE_SIZE & 0xFF);\r
210\r
211 *OpPtr++ = DHCP4_PARAMETER_REQUEST_LIST;\r
212 OpLen = OpPtr;\r
213 *OpPtr++ = 0;\r
214 *OpPtr++ = DHCP4_SUBNET_MASK;\r
215 *OpPtr++ = DHCP4_TIME_OFFSET;\r
216 *OpPtr++ = DHCP4_ROUTER_LIST;\r
217 *OpPtr++ = DHCP4_TIME_SERVERS;\r
218 *OpPtr++ = DHCP4_NAME_SERVERS;\r
219 *OpPtr++ = DHCP4_DNS_SERVERS;\r
220 *OpPtr++ = DHCP4_HOST_NAME;\r
221 *OpPtr++ = DHCP4_BOOT_FILE_SIZE;\r
222 *OpPtr++ = DHCP4_MESSAGE_TYPE;\r
223 *OpPtr++ = DHCP4_DOMAIN_NAME;\r
224 *OpPtr++ = DHCP4_ROOT_PATH;\r
225 *OpPtr++ = DHCP4_EXTENSION_PATH;\r
226 *OpPtr++ = DHCP4_MAX_DATAGRAM_SIZE;\r
227 *OpPtr++ = DHCP4_DEFAULT_TTL;\r
228 *OpPtr++ = DHCP4_BROADCAST_ADDRESS;\r
229 *OpPtr++ = DHCP4_NIS_DOMAIN_NAME;\r
230 *OpPtr++ = DHCP4_NIS_SERVERS;\r
231 *OpPtr++ = DHCP4_NTP_SERVERS;\r
232 *OpPtr++ = DHCP4_VENDOR_SPECIFIC;\r
233 *OpPtr++ = DHCP4_REQUESTED_IP_ADDRESS;\r
234 *OpPtr++ = DHCP4_LEASE_TIME;\r
235 *OpPtr++ = DHCP4_SERVER_IDENTIFIER;\r
236 *OpPtr++ = DHCP4_RENEWAL_TIME;\r
237 *OpPtr++ = DHCP4_REBINDING_TIME;\r
238 *OpPtr++ = DHCP4_CLASS_IDENTIFIER;\r
239 *OpPtr++ = DHCP4_TFTP_SERVER_NAME;\r
240 *OpPtr++ = DHCP4_BOOTFILE;\r
241 *OpPtr++ = 128;\r
242 *OpPtr++ = 129;\r
243 *OpPtr++ = 130;\r
244 *OpPtr++ = 131;\r
245 *OpPtr++ = 132;\r
246 *OpPtr++ = 133;\r
247 *OpPtr++ = 134;\r
248 *OpPtr++ = 135;\r
249 *OpLen = (UINT8) ((OpPtr - OpLen) - 1);\r
250\r
251 *OpPtr++ = DHCP4_END;\r
252\r
253 This->Data->SetupCompleted = TRUE;\r
254\r
255 return EFI_SUCCESS;\r
256}\r
257\r
258/* eof - PxeDhcp4Setup.c */\r