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