]> git.proxmox.com Git - mirror_edk2.git/blame - NetworkPkg/IpSecDxe/IkePacket.c
NetworkPkg: Clean up source files
[mirror_edk2.git] / NetworkPkg / IpSecDxe / IkePacket.c
CommitLineData
9166f840 1/** @file\r
2 IKE Packet related operation.\r
3\r
f75a7f56 4 Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.<BR>\r
9166f840 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 "IpSecDebug.h"\r
17#include "Ikev2/Utility.h"\r
18\r
19/**\r
20 Allocate a buffer for the IKE_PACKET and intitalize its Header and payloadlist.\r
21\r
22 @return The pointer of the IKE_PACKET.\r
23\r
24**/\r
25IKE_PACKET *\r
26IkePacketAlloc (\r
27 VOID\r
28 )\r
29{\r
30 IKE_PACKET *IkePacket;\r
31\r
32 IkePacket = (IKE_PACKET *) AllocateZeroPool (sizeof (IKE_PACKET));\r
33 if (IkePacket == NULL) {\r
34 return NULL;\r
35 }\r
36\r
37 IkePacket->RefCount = 1;\r
38 InitializeListHead (&IkePacket->PayloadList);\r
f75a7f56 39\r
9166f840 40 IkePacket->Header = (IKE_HEADER *) AllocateZeroPool (sizeof (IKE_HEADER));\r
41 if (IkePacket->Header == NULL) {\r
42 FreePool (IkePacket);\r
43 return NULL;\r
44 }\r
45 return IkePacket;\r
46}\r
47\r
48/**\r
49 Free the IkePacket by the specified IKE_PACKET pointer.\r
50\r
51 @param[in] IkePacket The pointer of the IKE_PACKET to be freed.\r
52\r
53**/\r
54VOID\r
55IkePacketFree (\r
56 IN IKE_PACKET *IkePacket\r
57 )\r
58{\r
59 LIST_ENTRY *Entry;\r
60 IKE_PAYLOAD *IkePayload;\r
61\r
62 if (IkePacket == NULL) {\r
63 return;\r
64 }\r
65 //\r
66 // Check if the Packet is referred by others.\r
67 //\r
68 if (--IkePacket->RefCount == 0) {\r
69 //\r
70 // Free IkePacket header\r
71 //\r
72 if (!IkePacket->IsHdrExt && IkePacket->Header != NULL) {\r
73 FreePool (IkePacket->Header);\r
74 }\r
75 //\r
76 // Free the PayloadsBuff\r
77 //\r
78 if (!IkePacket->IsPayloadsBufExt && IkePacket->PayloadsBuf != NULL) {\r
79 FreePool (IkePacket->PayloadsBuf);\r
80 }\r
81 //\r
82 // Iterate payloadlist and free all payloads\r
83 //\r
84 for (Entry = (IkePacket)->PayloadList.ForwardLink; Entry != &(IkePacket)->PayloadList;) {\r
85 IkePayload = IKE_PAYLOAD_BY_PACKET (Entry);\r
86 Entry = Entry->ForwardLink;\r
87\r
88 IkePayloadFree (IkePayload);\r
89 }\r
90\r
91 FreePool (IkePacket);\r
92 }\r
93}\r
94\r
95/**\r
96 Callback funtion of NetbufFromExt()\r
f75a7f56
LG
97\r
98 @param[in] Arg The data passed from the NetBufFromExe().\r
9166f840 99\r
100**/\r
101VOID\r
1d8fa5e9 102EFIAPI\r
9166f840 103IkePacketNetbufFree (\r
104 IN VOID *Arg\r
105 )\r
106{\r
107 //\r
108 // TODO: add something if need.\r
109 //\r
110}\r
111\r
112/**\r
113 Copy the NetBuf into a IKE_PACKET sturcture.\r
f75a7f56
LG
114\r
115 Create a IKE_PACKET and fill the received IKE header into the header of IKE_PACKET\r
9166f840 116 and copy the recieved packet without IKE HEADER to the PayloadBuf of IKE_PACKET.\r
117\r
f75a7f56 118 @param[in] Netbuf The pointer of the Netbuf which contains the whole received\r
9166f840 119 IKE packet.\r
120\r
121 @return The pointer of the IKE_PACKET which contains the received packet.\r
122\r
123**/\r
124IKE_PACKET *\r
125IkePacketFromNetbuf (\r
126 IN NET_BUF *Netbuf\r
127 )\r
128{\r
129 IKE_PACKET *IkePacket;\r
130\r
131 IkePacket = NULL;\r
132 if (Netbuf->TotalSize < sizeof (IKE_HEADER)) {\r
133 goto Error;\r
134 }\r
135\r
136 IkePacket = IkePacketAlloc ();\r
137 if (IkePacket == NULL) {\r
138 return NULL;\r
139 }\r
140 //\r
141 // Copy the IKE header from Netbuf to IkePacket->Hdr\r
142 //\r
143 NetbufCopy (Netbuf, 0, sizeof (IKE_HEADER), (UINT8 *) IkePacket->Header);\r
144 //\r
145 // Net order to host order\r
146 //\r
147 IkeHdrNetToHost (IkePacket->Header);\r
148 if (IkePacket->Header->Length < Netbuf->TotalSize) {\r
149 goto Error;\r
150 }\r
151\r
152 IkePacket->PayloadTotalSize = IkePacket->Header->Length - sizeof (IKE_HEADER);\r
153 IkePacket->PayloadsBuf = (UINT8 *) AllocateZeroPool (IkePacket->PayloadTotalSize);\r
154\r
155 if (IkePacket->PayloadsBuf == NULL) {\r
156 goto Error;\r
157 }\r
158 //\r
159 // Copy the IKE packet without the header into the IkePacket->PayloadsBuf.\r
160 //\r
161 NetbufCopy (Netbuf, sizeof (IKE_HEADER), (UINT32) IkePacket->PayloadTotalSize, IkePacket->PayloadsBuf);\r
162 return IkePacket;\r
163\r
164Error:\r
165 if (IkePacket != NULL) {\r
166 IkePacketFree (IkePacket);\r
167 }\r
168\r
169 return NULL;\r
170}\r
171\r
172/**\r
173 Convert the format from IKE_PACKET to NetBuf.\r
174\r
175 @param[in] SessionCommon Pointer of related IKE_COMMON_SESSION\r
176 @param[in] IkePacket Pointer of IKE_PACKET to be copy to NetBuf\r
f75a7f56
LG
177 @param[in] IkeType The IKE type to pointer the packet is for which IKE\r
178 phase. Now it supports IKE_SA_TYPE, IKE_CHILDSA_TYPE,\r
9166f840 179 IKE_INFO_TYPE.\r
180\r
181 @return a pointer of Netbuff which contains the IKE_PACKE in network order.\r
f75a7f56 182\r
9166f840 183**/\r
184NET_BUF *\r
185IkeNetbufFromPacket (\r
186 IN UINT8 *SessionCommon,\r
187 IN IKE_PACKET *IkePacket,\r
188 IN UINTN IkeType\r
189 )\r
190{\r
191 NET_BUF *Netbuf;\r
192 NET_FRAGMENT *Fragments;\r
193 UINTN Index;\r
194 UINTN NumPayloads;\r
195 LIST_ENTRY *PacketEntry;\r
196 LIST_ENTRY *Entry;\r
197 IKE_PAYLOAD *IkePayload;\r
6771c1d6
JW
198 EFI_STATUS RetStatus;\r
199\r
200 RetStatus = EFI_SUCCESS;\r
9166f840 201\r
202 if (!IkePacket->IsEncoded) {\r
203 IkePacket->IsEncoded = TRUE;\r
204 //\r
205 // Convert Host order to Network order for IKE_PACKET header and payloads\r
206 // Encryption payloads if needed\r
207 //\r
208 if (((IKEV2_SESSION_COMMON *) SessionCommon)->IkeVer == 2) {\r
6771c1d6
JW
209 RetStatus = Ikev2EncodePacket ((IKEV2_SESSION_COMMON *) SessionCommon, IkePacket, IkeType);\r
210 if (EFI_ERROR (RetStatus)) {\r
211 return NULL;\r
212 }\r
f75a7f56 213\r
9166f840 214 } else {\r
215 //\r
6771c1d6 216 // If IKEv1 support, check it here.\r
9166f840 217 //\r
218 return NULL;\r
219 }\r
220 }\r
221\r
222 NumPayloads = 0;\r
223 //\r
224 // Get the number of the payloads\r
225 //\r
226 NET_LIST_FOR_EACH (PacketEntry, &(IkePacket)->PayloadList) {\r
f75a7f56 227\r
9166f840 228 NumPayloads++;\r
229 }\r
230 //\r
231 // Allocate the Framgents according to the numbers of the IkePayload\r
232 //\r
233 Fragments = (NET_FRAGMENT *) AllocateZeroPool ((1 + NumPayloads) * sizeof (NET_FRAGMENT));\r
234 if (Fragments == NULL) {\r
235 return NULL;\r
236 }\r
237\r
238 Fragments[0].Bulk = (UINT8 *) IkePacket->Header;\r
239 Fragments[0].Len = sizeof (IKE_HEADER);\r
240 Index = 0;\r
241\r
242 //\r
243 // Set payloads to the Framgments.\r
244 //\r
245 NET_LIST_FOR_EACH (Entry, &(IkePacket)->PayloadList) {\r
246 IkePayload = IKE_PAYLOAD_BY_PACKET (Entry);\r
247\r
248 Fragments[Index + 1].Bulk = IkePayload->PayloadBuf;\r
249 Fragments[Index + 1].Len = (UINT32) IkePayload->PayloadSize;\r
250 Index++;\r
251 }\r
252\r
253 Netbuf = NetbufFromExt (\r
254 Fragments,\r
255 (UINT32) (NumPayloads + 1),\r
256 0,\r
257 0,\r
258 IkePacketNetbufFree,\r
259 NULL\r
260 );\r
f75a7f56 261\r
9166f840 262 FreePool (Fragments);\r
263 return Netbuf;\r
264}\r
265\r