/** @file\r
IP6 internal functions to process the incoming packets.\r
\r
- Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
+ Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>\r
+ (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>\r
\r
This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
// check whether THIS.Start < PREV.End for overlap. If two fragments\r
// overlaps, trim the overlapped part off THIS fragment.\r
//\r
- if ((Cur != ListHead) && ((Prev = Cur->BackLink) != ListHead)) {\r
+ if ((Prev = Cur->BackLink) != ListHead) {\r
Fragment = NET_LIST_USER_STRUCT (Prev, NET_BUF, List);\r
Node = IP6_GET_CLIP_INFO (Fragment);\r
\r
EFI_IP6_HEADER ZeroHead;\r
\r
Status = EFI_SUCCESS;\r
+\r
+ if (!mIpSec2Installed) {\r
+ goto ON_EXIT;\r
+ }\r
+ ASSERT (mIpSec != NULL);\r
+\r
Packet = *Netbuf;\r
RecycleEvent = NULL;\r
IpSecWrap = NULL;\r
FragmentCount = Packet->BlockOpNum;\r
ZeroMem (&ZeroHead, sizeof (EFI_IP6_HEADER));\r
\r
- if (mIpSec == NULL) {\r
- gBS->LocateProtocol (&gEfiIpSec2ProtocolGuid, NULL, (VOID **) &mIpSec);\r
-\r
- //\r
- // Check whether the ipsec protocol is available.\r
- //\r
- if (mIpSec == NULL) {\r
- goto ON_EXIT;\r
- }\r
- }\r
-\r
//\r
// Check whether the ipsec enable variable is set.\r
//\r
Ip6NtohHead (*Head);\r
\r
if (EFI_ERROR (Status)) {\r
+ FreePool (OriginalFragmentTable);\r
goto ON_EXIT;\r
}\r
\r
//\r
// For ByPass Packet\r
//\r
+ FreePool (FragmentTable);\r
goto ON_EXIT;\r
+ } else {\r
+ //\r
+ // Free the FragmentTable which allocated before calling the IPsec.\r
+ //\r
+ FreePool (OriginalFragmentTable);\r
}\r
\r
if (Direction == EfiIPsecOutBound && TxWrap != NULL) {\r
TxWrap\r
);\r
if (TxWrap->Packet == NULL) {\r
+ TxWrap->Packet = *Netbuf;\r
Status = EFI_OUT_OF_RESOURCES;\r
goto ON_EXIT;\r
}\r
IP6_GET_CLIP_INFO (Packet),\r
sizeof (IP6_CLIP_INFO)\r
);\r
- \r
+\r
NetIpSecNetbufFree(Packet);\r
*Netbuf = TxWrap->Packet;\r
\r
IpSecWrap = AllocateZeroPool (sizeof (IP6_IPSEC_WRAP));\r
\r
if (IpSecWrap == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ gBS->SignalEvent (RecycleEvent);\r
goto ON_EXIT;\r
}\r
\r
);\r
\r
if (Packet == NULL) {\r
+ Packet = IpSecWrap->Packet;\r
+ gBS->SignalEvent (RecycleEvent);\r
+ FreePool (IpSecWrap);\r
Status = EFI_OUT_OF_RESOURCES;\r
goto ON_EXIT;\r
}\r
NET_BUF_HEAD\r
);\r
if (PacketHead == NULL) {\r
- Status = EFI_OUT_OF_RESOURCES;\r
+ *Netbuf = Packet;\r
+ Status = EFI_OUT_OF_RESOURCES;\r
goto ON_EXIT;\r
}\r
\r
@param[in, out] Packet The received IP6 packet to be processed.\r
@param[in] Flag The link layer flag for the packet received, such\r
as multicast.\r
- @param[out] Payload The pointer to the payload of the recieved packet. \r
- it starts from the first byte of the extension header. \r
+ @param[out] Payload The pointer to the payload of the recieved packet.\r
+ it starts from the first byte of the extension header.\r
@param[out] LastHead The pointer of NextHeader of the last extension\r
header processed by IP6.\r
@param[out] ExtHdrsLen The length of the whole option.\r
@param[out] UnFragmentLen The length of unfragmented length of extension headers.\r
- @param[out] Fragmented Indicate whether the packet is fragmented. \r
+ @param[out] Fragmented Indicate whether the packet is fragmented.\r
@param[out] Head The pointer to the EFI_IP6_Header.\r
\r
@retval EFI_SUCCESS The received packet is well format.\r
OUT UINT8 **LastHead,\r
OUT UINT32 *ExtHdrsLen,\r
OUT UINT32 *UnFragmentLen,\r
- OUT BOOLEAN *Fragmented, \r
+ OUT BOOLEAN *Fragmented,\r
OUT EFI_IP6_HEADER **Head\r
)\r
{\r
// and Packet->TotalLen == Info->Length.\r
//\r
NetbufTrim (*Packet, sizeof (EFI_IP6_HEADER) + *ExtHdrsLen, TRUE);\r
- \r
+\r
return EFI_SUCCESS;\r
}\r
\r
if (EFI_ERROR (IoStatus) || (IpSb->State == IP6_SERVICE_DESTROY)) {\r
goto Drop;\r
}\r
- \r
+\r
//\r
// Pre-Process the Ipv6 Packet and then reassemble if it is necessary.\r
//\r
Status = Ip6PreProcessPacket (\r
- IpSb, \r
- &Packet, \r
- Flag, \r
- &Payload, \r
- &LastHead, \r
- &ExtHdrsLen, \r
- &UnFragmentLen, \r
+ IpSb,\r
+ &Packet,\r
+ Flag,\r
+ &Payload,\r
+ &LastHead,\r
+ &ExtHdrsLen,\r
+ &UnFragmentLen,\r
&Fragmented,\r
&Head\r
);\r
ZeroMem (&ZeroHead, sizeof (EFI_IP6_HEADER));\r
if (0 == CompareMem (Head, &ZeroHead, sizeof (EFI_IP6_HEADER))) {\r
Status = Ip6PreProcessPacket (\r
- IpSb, \r
- &Packet, \r
- Flag, \r
- &Payload, \r
- &LastHead, \r
- &ExtHdrsLen, \r
- &UnFragmentLen, \r
- &Fragmented, \r
+ IpSb,\r
+ &Packet,\r
+ Flag,\r
+ &Payload,\r
+ &LastHead,\r
+ &ExtHdrsLen,\r
+ &UnFragmentLen,\r
+ &Fragmented,\r
&Head\r
);\r
if (EFI_ERROR (Status)) {\r
if (Packet == NULL) {\r
goto Restart;\r
}\r
- \r
+\r
//\r
// Packet may have been changed. The ownership of the packet\r
// is transfered to the packet process logic.\r