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