]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Output.c
fixed IP fragment issue which caused the MTU used by IP is less than the one IP expos...
[mirror_edk2.git] / MdeModulePkg / Universal / Network / Ip4Dxe / Ip4Output.c
index af12c960c7f30fabd6ff074e51b8fff19b45e324..7d8745d5a5b2208ef410f4c45c5dd28821a9a2ff 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Transmit the IP4 packet.\r
   \r
-Copyright (c) 2005 - 2006, Intel Corporation.<BR>\r
+Copyright (c) 2005 - 2009, Intel Corporation.<BR>\r
 All rights reserved. This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
@@ -73,7 +73,7 @@ Ip4PrependHead (
   PacketHead->Ver       = 4;\r
   PacketHead->HeadLen   = (UINT8) (HeadLen >> 2);\r
   PacketHead->Tos       = Head->Tos;\r
-  PacketHead->TotalLen  = HTONS (Packet->TotalSize);\r
+  PacketHead->TotalLen  = HTONS ((UINT16) Packet->TotalSize);\r
   PacketHead->Id        = HTONS (Head->Id);\r
   PacketHead->Fragment  = HTONS (Head->Fragment);\r
   PacketHead->Checksum  = 0;\r
@@ -83,7 +83,7 @@ Ip4PrependHead (
   PacketHead->Dst       = HTONL (Head->Dst);\r
   PacketHead->Checksum  = (UINT16) (~NetblockChecksum ((UINT8 *) PacketHead, HeadLen));\r
 \r
-  Packet->Ip            = PacketHead;\r
+  Packet->Ip.Ip4        = PacketHead;\r
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -210,7 +210,7 @@ Ip4SysPacketSent (
 EFI_STATUS\r
 Ip4Output (\r
   IN IP4_SERVICE            *IpSb,\r
-  IN IP4_PROTOCOL           *IpInstance, OPTIONAL\r
+  IN IP4_PROTOCOL           *IpInstance  OPTIONAL,\r
   IN NET_BUF                *Packet,\r
   IN IP4_HEAD               *Head,\r
   IN UINT8                  *Option,\r
@@ -291,11 +291,28 @@ Ip4Output (
     }\r
   }\r
 \r
+  //\r
+  // TODO: currently Option/OptLen are not included into encryption scope.\r
+  //\r
+  Status = Ip4IpSecProcessPacket (\r
+             IpSb, \r
+             Head, \r
+             &Packet, \r
+             Option, \r
+             OptLen, \r
+             EfiIPsecOutBound,\r
+             Context\r
+             );\r
+\r
+  if (EFI_ERROR(Status)) {\r
+    return Status;\r
+  }\r
+\r
   //\r
   // OK, selected the source and route, fragment the packet then send\r
   // them. Tag each fragment other than the first one as spawn from it.\r
   //\r
-  Mtu            = IpSb->SnpMode.MaxPacketSize;\r
+  Mtu            = IpSb->MaxPacketSize + sizeof (IP4_HEAD);\r
   HeadLen        = sizeof (IP4_HEAD) + ((OptLen + 3) & (~0x03));\r
   Head->Id       = mIp4Id++;\r
 \r