]> git.proxmox.com Git - mirror_edk2.git/blame - EdkModulePkg/Universal/Network/PxeDhcp4/Dxe/PxeDhcp4Release.c
Fix component name bugs when input Controller Name is invalid
[mirror_edk2.git] / EdkModulePkg / Universal / Network / PxeDhcp4 / Dxe / PxeDhcp4Release.c
CommitLineData
878ddf1f 1/*++\r
2\r
3Copyright (c) 2006, 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 PxeDhcp4Release.c\r
14 \r
15Abstract:\r
16 Transmit release packet, free allocations and shutdown PxeDhcp4.\r
17\r
18--*/\r
19\r
20\r
21#include "PxeDhcp4.h"\r
22\r
23/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
24EFI_STATUS\r
25EFIAPI\r
26PxeDhcp4Release (\r
27 IN EFI_PXE_DHCP4_PROTOCOL *This\r
28 )\r
29{\r
30 PXE_DHCP4_PRIVATE_DATA *Private;\r
31 EFI_IP_ADDRESS ServerIp;\r
32 EFI_IP_ADDRESS client_ip;\r
33 EFI_IP_ADDRESS gateway_ip;\r
34 EFI_IP_ADDRESS subnet_mask;\r
35 EFI_STATUS efi_status;\r
36 DHCP4_OP *op;\r
37 UINT8 op_list[20];\r
38\r
39 //\r
40 // Check for invalid parameters.\r
41 //\r
42 if (This == NULL) {\r
43 return EFI_INVALID_PARAMETER;\r
44 }\r
45 //\r
46 // Release does nothing if the protocol has never been setup.\r
47 //\r
48 if (This->Data == NULL) {\r
49 return EFI_NOT_STARTED;\r
50 }\r
51 //\r
52 // Fail if we do not have valid instance data.\r
53 //\r
54 Private = PXE_DHCP4_PRIVATE_DATA_FROM_THIS (This);\r
55\r
56 if (Private == NULL) {\r
57 return EFI_INVALID_PARAMETER;\r
58 }\r
59\r
60 if (Private->PxeBc == NULL) {\r
61 return EFI_DEVICE_ERROR;\r
62 }\r
63 //\r
64 // If this is a BOOTP session and there is not a DHCP Ack\r
65 // packet, just release storage and return.\r
66 //\r
67 if (This->Data->IsBootp || !This->Data->IsAck) {\r
68 gBS->FreePool (This->Data);\r
69 This->Data = NULL;\r
70\r
71 if (Private->StopPxeBc) {\r
72 Private->PxeBc->Stop (Private->PxeBc);\r
73 }\r
74\r
75 return EFI_SUCCESS;\r
76 }\r
77 //\r
78 // Build option list for DHCP Release packet.\r
79 // If any errors occur, just release storage and return.\r
80 //\r
81 //\r
82 // Message type is first.\r
83 //\r
84 op_list[0] = DHCP4_MESSAGE_TYPE;\r
85 op_list[1] = 1;\r
86 op_list[2] = DHCP4_MESSAGE_TYPE_RELEASE;\r
87\r
88 //\r
89 // Followed by server identifier.\r
90 //\r
91 efi_status = find_opt (\r
92 &This->Data->Request,\r
93 DHCP4_SERVER_IDENTIFIER,\r
94 0,\r
95 &op\r
96 );\r
97\r
98 if (EFI_ERROR (efi_status)) {\r
99 gBS->FreePool (This->Data);\r
100 This->Data = NULL;\r
101\r
102 if (Private->StopPxeBc) {\r
103 Private->PxeBc->Stop (Private->PxeBc);\r
104 }\r
105\r
106 return EFI_SUCCESS;\r
107 }\r
108\r
109 if (op->len != 4) {\r
110 gBS->FreePool (This->Data);\r
111 This->Data = NULL;\r
112\r
113 if (Private->StopPxeBc) {\r
114 Private->PxeBc->Stop (Private->PxeBc);\r
115 }\r
116\r
117 return EFI_SUCCESS;\r
118 }\r
119\r
120 CopyMem (&ServerIp, op->data, 4);\r
121\r
122 op_list[3] = DHCP4_SERVER_IDENTIFIER;\r
123 op_list[4] = 4;\r
124 CopyMem (&op_list[5], &ServerIp, 4);\r
125\r
126 //\r
127 // Followed by end.\r
128 //\r
129 op_list[9] = DHCP4_END;\r
130\r
131 //\r
132 // We need a subnet mask for IP stack operation.\r
133 //\r
134 efi_status = find_opt (\r
135 &This->Data->AckNak,\r
136 DHCP4_SUBNET_MASK,\r
137 0,\r
138 &op\r
139 );\r
140\r
141 if (EFI_ERROR (efi_status)) {\r
142 gBS->FreePool (This->Data);\r
143 This->Data = NULL;\r
144\r
145 if (Private->StopPxeBc) {\r
146 Private->PxeBc->Stop (Private->PxeBc);\r
147 }\r
148\r
149 return EFI_SUCCESS;\r
150 }\r
151\r
152 if (op->len != 4) {\r
153 gBS->FreePool (This->Data);\r
154 This->Data = NULL;\r
155\r
156 if (Private->StopPxeBc) {\r
157 Private->PxeBc->Stop (Private->PxeBc);\r
158 }\r
159\r
160 return EFI_SUCCESS;\r
161 }\r
162\r
163 ZeroMem (&subnet_mask, sizeof (EFI_IP_ADDRESS));\r
164 CopyMem (&subnet_mask, op->data, 4);\r
165\r
166 //\r
167 // Gateway IP address may be needed.\r
168 //\r
169 ZeroMem (&gateway_ip, sizeof (EFI_IP_ADDRESS));\r
170 CopyMem (&gateway_ip, &This->Data->AckNak.dhcp4.giaddr, 4);\r
171\r
172 //\r
173 // Client IP address needed for IP stack operation.\r
174 //\r
175 ZeroMem (&client_ip, sizeof (EFI_IP_ADDRESS));\r
176 CopyMem (&client_ip, &This->Data->AckNak.dhcp4.yiaddr, 4);\r
177\r
178 //\r
179 // Enable UDP...\r
180 //\r
181 efi_status = start_udp (Private, &client_ip, &subnet_mask);\r
182\r
183 if (EFI_ERROR (efi_status)) {\r
184 gBS->FreePool (This->Data);\r
185 This->Data = NULL;\r
186\r
187 if (Private->StopPxeBc) {\r
188 Private->PxeBc->Stop (Private->PxeBc);\r
189 }\r
190\r
191 return efi_status;\r
192 }\r
193 //\r
194 // Gather information out of DHCP request packet needed for\r
195 // DHCP release packet.\r
196 //\r
197 //\r
198 // Setup DHCP Release packet.\r
199 //\r
200 CopyMem (&This->Data->Request.dhcp4.ciaddr, &client_ip, 4);\r
201\r
202 ZeroMem (&This->Data->Request.dhcp4.yiaddr, 12);\r
203\r
204 ZeroMem (&This->Data->Request.dhcp4.sname, 64 + 128);\r
205\r
206 This->Data->Request.dhcp4.hops = 0;\r
207 This->Data->Request.dhcp4.secs = 0;\r
208 This->Data->Request.dhcp4.flags = 0;\r
209\r
210 ZeroMem (\r
211 &This->Data->Request.dhcp4.options,\r
212 sizeof This->Data->Request.dhcp4.options\r
213 );\r
214\r
215 CopyMem (&This->Data->Request.dhcp4.options, op_list, 10);\r
216\r
217 //\r
218 // Transmit DHCP Release packet.\r
219 //\r
220 tx_udp (\r
221 Private,\r
222 &ServerIp,\r
223 &gateway_ip,\r
224 &client_ip,\r
225 &This->Data->Request,\r
226 DHCP4_MAX_PACKET_SIZE - (DHCP4_UDP_HEADER_SIZE + DHCP4_IP_HEADER_SIZE)\r
227 );\r
228\r
229 gBS->Stall (1000000); /* 1/10th second */\r
230\r
231 //\r
232 // Shutdown PXE BaseCode and release local storage.\r
233 //\r
234 stop_udp (Private);\r
235\r
236 gBS->FreePool (This->Data);\r
237 This->Data = NULL;\r
238\r
239 if (Private->StopPxeBc) {\r
240 Private->PxeBc->Stop (Private->PxeBc);\r
241 }\r
242\r
243 return EFI_SUCCESS;\r
244}\r
245\r
246/* eof - PxeDhcp4Release.c */\r