]> git.proxmox.com Git - mirror_edk2.git/blame - EdkModulePkg/Universal/Network/PxeDhcp4/Dxe/PxeDhcp4Release.c
Clean up the following module msa files, they are three networt and two PCD modules.
[mirror_edk2.git] / EdkModulePkg / Universal / Network / PxeDhcp4 / Dxe / PxeDhcp4Release.c
CommitLineData
878ddf1f 1/*++\r
2\r
26aa0c2f 3Copyright (c) 2006 - 2007, Intel Corporation \r
878ddf1f 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
26aa0c2f 68 FreePool (This->Data);\r
878ddf1f 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
26aa0c2f 99 FreePool (This->Data);\r
878ddf1f 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
26aa0c2f 110 FreePool (This->Data);\r
878ddf1f 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
26aa0c2f 142 FreePool (This->Data);\r
878ddf1f 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
26aa0c2f 153 FreePool (This->Data);\r
878ddf1f 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
26aa0c2f 184 FreePool (This->Data);\r
878ddf1f 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
26aa0c2f 236 FreePool (This->Data);\r
878ddf1f 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