]> git.proxmox.com Git - mirror_edk2.git/blame - NetworkPkg/IpSecDxe/IpSecDriver.c
Add CONSTRUCTOR to BaseDebugLibSerialPort to call SerialPortInitialize() in the Seria...
[mirror_edk2.git] / NetworkPkg / IpSecDxe / IpSecDriver.c
CommitLineData
a3bcde70
HT
1/** @file\r
2 Driver Binding Protocol for IPsec Driver.\r
3\r
4 Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
5\r
6 This program and the accompanying materials\r
7 are licensed and made available under the terms and conditions of the BSD License\r
8 which accompanies this distribution. The full text of the license may be found at\r
9 http://opensource.org/licenses/bsd-license.php.\r
10\r
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13\r
14**/\r
15\r
16#include <Library/UdpIoLib.h>\r
17#include "IpSecConfigImpl.h"\r
18#include "IpSecDebug.h"\r
19\r
20/**\r
21 Test to see if this driver supports ControllerHandle.\r
22\r
23 @param[in] This Protocol instance pointer.\r
24 @param[in] ControllerHandle Handle of device to test.\r
25 @param[in] RemainingDevicePath Optional parameter used to pick a specific child\r
26 device to start.\r
27\r
28 @retval EFI_SUCCES This driver supports this device.\r
29 @retval EFI_ALREADY_STARTED This driver is already running on this device.\r
30 @retval other This driver does not support this device.\r
31\r
32**/\r
33EFI_STATUS\r
34EFIAPI\r
35IpSecDriverBindingSupported (\r
36 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
37 IN EFI_HANDLE ControllerHandle,\r
38 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL\r
39 )\r
40{\r
41 //\r
42 //TODO: Add Udp4Protocol and Udp6Protocol testing.\r
43 //\r
44 return EFI_UNSUPPORTED;\r
45}\r
46\r
47/**\r
48 Start this driver on ControllerHandle.\r
49\r
50 @param[in] This Protocol instance pointer.\r
51 @param[in] ControllerHandle Handle of device to bind driver to.\r
52 @param[in] RemainingDevicePath Optional parameter used to pick a specific child\r
53 device to start.\r
54\r
55 @retval EFI_SUCCES This driver is added to ControllerHandle\r
56 @retval EFI_ALREADY_STARTED This driver is already running on ControllerHandle\r
57 @retval EFI_DEVICE_ERROR The device could not be started due to a device error.\r
58 Currently not implemented.\r
59 @retval other This driver does not support this device\r
60\r
61**/\r
62EFI_STATUS\r
63EFIAPI\r
64IpSecDriverBindingStart (\r
65 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
66 IN EFI_HANDLE ControllerHandle,\r
67 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL\r
68 )\r
69{\r
70 //\r
71 //TODO: Add Udp4Io and Udp6Io creation for the IKE.\r
72 //\r
73 return EFI_SUCCESS;\r
74}\r
75\r
76/**\r
77 Stop this driver on ControllerHandle.\r
78\r
79 @param[in] This Protocol instance pointer.\r
80 @param[in] ControllerHandle Handle of a device to stop the driver on.\r
81 @param[in] NumberOfChildren Number of Handles in ChildHandleBuffer. If the number of\r
82 children is zero, stop the entire bus driver.\r
83 @param[in] ChildHandleBuffer List of Child Handles to Stop.\r
84\r
85 @retval EFI_SUCCES This driver removed ControllerHandle.\r
86 @retval other This driver was not removed from this device.\r
87\r
88**/\r
89EFI_STATUS\r
90EFIAPI\r
91IpSecDriverBindingStop (\r
92 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
93 IN EFI_HANDLE ControllerHandle,\r
94 IN UINTN NumberOfChildren,\r
95 IN EFI_HANDLE *ChildHandleBuffer\r
96 )\r
97{\r
98 //\r
99 //TODO: Add UdpIo4 and UdpIo6 destruction when the Udp driver unload or stop.\r
100 //\r
101 return EFI_UNSUPPORTED;\r
102}\r
103\r
104EFI_DRIVER_BINDING_PROTOCOL gIpSecDriverBinding = {\r
105 IpSecDriverBindingSupported,\r
106 IpSecDriverBindingStart,\r
107 IpSecDriverBindingStop,\r
108 0xa,\r
109 NULL,\r
110 NULL\r
111};\r
112\r
113/**\r
114 This is a callback function when the mIpSecInstance.DisabledEvent is signaled.\r
115\r
116 @param[in] Event Event whose notification function is being invoked.\r
117 @param[in] Context Pointer to the notification function's context.\r
118\r
119**/\r
120VOID\r
121EFIAPI\r
122IpSecCleanupAllSa (\r
123 IN EFI_EVENT Event,\r
124 IN VOID *Context\r
125 )\r
126{\r
127 IPSEC_PRIVATE_DATA *Private;\r
128 UINT8 Value;\r
129 EFI_STATUS Status;\r
130\r
131 Private = (IPSEC_PRIVATE_DATA *) Context;\r
132\r
133 //\r
134 // Set the Status Variable\r
135 //\r
136 Value = IPSEC_STATUS_DISABLED;\r
137 Status = gRT->SetVariable (\r
138 IPSECCONFIG_STATUS_NAME,\r
139 &gEfiIpSecConfigProtocolGuid,\r
140 EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
141 sizeof (Value),\r
142 &Value\r
143 );\r
144 if (!EFI_ERROR (Status)) {\r
145 Private->IpSec.DisabledFlag = TRUE;\r
146 }\r
147\r
148}\r
149\r
150/**\r
151 This is the declaration of an EFI image entry point. This entry point is\r
152 the same for UEFI Applications, UEFI OS Loaders, and UEFI Drivers, including\r
153 both device drivers and bus drivers.\r
154\r
155 The entry point for IPsec driver which installs the driver binding,\r
156 component name protocol, IPsec Config protcolon, and IPsec protocol in\r
157 its ImageHandle.\r
158\r
159 @param[in] ImageHandle The firmware allocated handle for the UEFI image.\r
160 @param[in] SystemTable A pointer to the EFI System Table.\r
161\r
162 @retval EFI_SUCCESS The operation completed successfully.\r
163 @retval EFI_ALREADY_STARTED The IPsec driver has been already loaded.\r
164 @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources.\r
165 @retval Others The operation is failed.\r
166\r
167**/\r
168EFI_STATUS\r
169EFIAPI\r
170IpSecDriverEntryPoint (\r
171 IN EFI_HANDLE ImageHandle,\r
172 IN EFI_SYSTEM_TABLE *SystemTable\r
173 )\r
174{\r
175 EFI_STATUS Status;\r
176 IPSEC_PRIVATE_DATA *Private;\r
68d3f2fb 177 EFI_IPSEC2_PROTOCOL *IpSec;\r
a3bcde70
HT
178\r
179 //\r
180 // Check whether ipsec protocol has already been installed.\r
181 //\r
182 Status = gBS->LocateProtocol (&gEfiIpSecProtocolGuid, NULL, (VOID **) &IpSec);\r
183\r
184 if (!EFI_ERROR (Status)) {\r
185 DEBUG ((DEBUG_WARN, "_ModuleEntryPoint: IpSec has been already loaded\n"));\r
186 Status = EFI_ALREADY_STARTED;\r
187 goto ON_EXIT;\r
188 }\r
189\r
190 Status = gBS->LocateProtocol (&gEfiDpcProtocolGuid, NULL, (VOID **) &mDpc);\r
191\r
192 if (EFI_ERROR (Status)) {\r
193 DEBUG ((DEBUG_ERROR, "_ModuleEntryPoint: Failed to locate EfiDpcProtocol\n"));\r
194 goto ON_EXIT;\r
195 }\r
196\r
197 Private = AllocateZeroPool (sizeof (IPSEC_PRIVATE_DATA));\r
198\r
199 if (Private == NULL) {\r
200 DEBUG ((DEBUG_ERROR, "_ModuleEntryPoint: Failed to allocate private data\n"));\r
201 Status = EFI_OUT_OF_RESOURCES;\r
202 goto ON_EXIT;\r
203 }\r
204 //\r
205 // Create disable event to cleanup all sa when ipsec disabled by user.\r
206 //\r
207 Status = gBS->CreateEvent (\r
208 EVT_NOTIFY_SIGNAL,\r
209 TPL_CALLBACK,\r
210 IpSecCleanupAllSa,\r
211 Private,\r
212 &mIpSecInstance.DisabledEvent\r
213 );\r
214 if (EFI_ERROR (Status)) {\r
215 DEBUG ((DEBUG_ERROR, "_ModuleEntryPoint: Failed to create disable event\n"));\r
216 goto ON_FREE_PRIVATE;\r
217 }\r
218\r
219 Private->Signature = IPSEC_PRIVATE_DATA_SIGNATURE;\r
220 Private->ImageHandle = ImageHandle;\r
68d3f2fb 221 CopyMem (&Private->IpSec, &mIpSecInstance, sizeof (EFI_IPSEC2_PROTOCOL));\r
a3bcde70
HT
222\r
223 //\r
224 // Initilize Private's members. Thess members is used for IKE.\r
225 //\r
226 InitializeListHead (&Private->Udp4List);\r
227 InitializeListHead (&Private->Udp6List);\r
228 InitializeListHead (&Private->Ikev1SessionList);\r
229 InitializeListHead (&Private->Ikev1EstablishedList);\r
230 InitializeListHead (&Private->Ikev2SessionList);\r
231 InitializeListHead (&Private->Ikev2EstablishedList);\r
232\r
233 //\r
234 // Initialize the ipsec config data and restore it from variable.\r
235 //\r
236 Status = IpSecConfigInitialize (Private);\r
237 if (EFI_ERROR (Status)) {\r
238 DEBUG ((DEBUG_ERROR, "_ModuleEntryPoint: Failed to initialize IpSecConfig\n"));\r
239 goto ON_CLOSE_EVENT;\r
240 }\r
241 //\r
242 // Install ipsec protocol which is used by ip driver to process ipsec header.\r
243 //\r
244 Status = gBS->InstallMultipleProtocolInterfaces (\r
245 &Private->Handle,\r
246 &gEfiIpSecProtocolGuid,\r
247 &Private->IpSec,\r
248 NULL\r
249 );\r
250 if (EFI_ERROR (Status)) {\r
251 goto ON_UNINSTALL_CONFIG;\r
252 }\r
253\r
254 Status = EfiLibInstallDriverBindingComponentName2 (\r
255 ImageHandle,\r
256 SystemTable,\r
257 &gIpSecDriverBinding,\r
258 ImageHandle,\r
259 &gIpSecComponentName,\r
260 &gIpSecComponentName2\r
261 );\r
262 if (EFI_ERROR (Status)) {\r
263 goto ON_UNINSTALL_CONFIG;\r
264 }\r
265\r
266 return Status;\r
267\r
268ON_UNINSTALL_CONFIG:\r
269 gBS->UninstallProtocolInterface (\r
270 Private->Handle,\r
271 &gEfiIpSecConfigProtocolGuid,\r
272 &Private->IpSecConfig\r
273 );\r
274ON_CLOSE_EVENT:\r
275 gBS->CloseEvent (mIpSecInstance.DisabledEvent);\r
276 mIpSecInstance.DisabledEvent = NULL;\r
277ON_FREE_PRIVATE:\r
278 FreePool (Private);\r
279ON_EXIT:\r
280 return Status;\r
281}\r
282\r