]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Library/DxeIpIoLib/DxeIpIoLib.c
MdeModulePkg BrotliLib: Fix the regression logic issue in loop
[mirror_edk2.git] / MdeModulePkg / Library / DxeIpIoLib / DxeIpIoLib.c
index d5fddb678fa018bf5df58021a2cab2ce5eacf381..9a70e9075d9abe43d2b3691bc36b344aadf838b7 100644 (file)
@@ -1,8 +1,9 @@
 /** @file\r
   IpIo Library.\r
 \r
-Copyright (c) 2005 - 2009, Intel Corporation.<BR>\r
-All rights reserved. This program and the accompanying materials\r
+(C) Copyright 2014 Hewlett-Packard Development Company, L.P.<BR>\r
+Copyright (c) 2005 - 2016, Intel Corporation. All rights reserved.<BR>\r
+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
 http://opensource.org/licenses/bsd-license.php\r
@@ -587,6 +588,7 @@ IpIoIcmpHandler (
 \r
 **/\r
 VOID\r
+EFIAPI\r
 IpIoExtFree (\r
   IN VOID  *Event\r
   )\r
@@ -615,7 +617,7 @@ IP_IO_SEND_ENTRY *
 IpIoCreateSndEntry (\r
   IN OUT IP_IO             *IpIo,\r
   IN OUT NET_BUF           *Pkt,\r
-  IN     VOID              *Sender,\r
+  IN     IP_IO_IP_PROTOCOL Sender,\r
   IN     VOID              *Context    OPTIONAL,\r
   IN     VOID              *NotifyData OPTIONAL,\r
   IN     EFI_IP_ADDRESS    *Dest       OPTIONAL,\r
@@ -702,7 +704,7 @@ IpIoCreateSndEntry (
 \r
     Ip4TxData = &TxData->Ip4TxData;\r
 \r
-    CopyMem (&Ip4TxData->DestinationAddress, Dest, sizeof (EFI_IPv4_ADDRESS));\r
+    IP4_COPY_ADDRESS (&Ip4TxData->DestinationAddress, Dest);\r
 \r
     Ip4TxData->OverrideData    = &OverrideData->Ip4OverrideData;\r
     Ip4TxData->OptionsLength   = 0;\r
@@ -940,15 +942,15 @@ IpIoDummyHandlerDpc (
   // Continue the receive.\r
   //\r
   if (IpInfo->IpVersion == IP_VERSION_4) {\r
-    ((EFI_IP4_PROTOCOL *) (IpInfo->Ip))->Receive (\r
-                                           (EFI_IP4_PROTOCOL *) (IpInfo->Ip),\r
-                                           &IpInfo->DummyRcvToken.Ip4Token\r
-                                           );\r
+    IpInfo->Ip.Ip4->Receive (\r
+                      IpInfo->Ip.Ip4,\r
+                      &IpInfo->DummyRcvToken.Ip4Token\r
+                      );\r
   } else {\r
-    ((EFI_IP6_PROTOCOL *) (IpInfo->Ip))->Receive (\r
-                                           (EFI_IP6_PROTOCOL *) (IpInfo->Ip),\r
-                                           &IpInfo->DummyRcvToken.Ip6Token\r
-                                           );\r
+    IpInfo->Ip.Ip6->Receive (\r
+                      IpInfo->Ip.Ip6,\r
+                      &IpInfo->DummyRcvToken.Ip6Token\r
+                      );\r
   }\r
 }\r
 \r
@@ -990,12 +992,10 @@ IpIoListenHandlerDpc (
   IP_IO                 *IpIo;\r
   EFI_STATUS            Status;\r
   IP_IO_IP_RX_DATA      *RxData;\r
-  VOID                  *Ip;\r
   EFI_NET_SESSION_DATA  Session;\r
   NET_BUF               *Pkt;\r
 \r
   IpIo = (IP_IO *) Context;\r
-  Ip   = IpIo->Ip;\r
 \r
   if (IpIo->IpVersion == IP_VERSION_4) {\r
     Status = IpIo->RcvToken.Ip4Token.Status;\r
@@ -1029,42 +1029,58 @@ IpIoListenHandlerDpc (
 \r
   if (IpIo->IpVersion == IP_VERSION_4) {\r
     if ((EFI_IP4 (RxData->Ip4RxData.Header->SourceAddress) != 0) &&\r
-      !NetIp4IsUnicast (EFI_NTOHL (((EFI_IP4_RECEIVE_DATA *) RxData)->Header->SourceAddress), 0)) {\r
+        (IpIo->SubnetMask != 0) &&\r
+        IP4_NET_EQUAL (IpIo->StationIp, EFI_NTOHL (((EFI_IP4_RECEIVE_DATA *) RxData)->Header->SourceAddress), IpIo->SubnetMask) &&\r
+        !NetIp4IsUnicast (EFI_NTOHL (((EFI_IP4_RECEIVE_DATA *) RxData)->Header->SourceAddress), IpIo->SubnetMask)) {\r
+      //\r
+      // The source address is not zero and it's not a unicast IP address, discard it.\r
+      //\r
+      goto CleanUp;\r
+    }\r
+\r
+    if (RxData->Ip4RxData.DataLength == 0) {\r
+      //\r
+      // Discard zero length data payload packet.\r
+      //\r
+      goto CleanUp;\r
+    }\r
+\r
     //\r
-    // The source address is not zero and it's not a unicast IP address, discard it.\r
+    // Create a netbuffer representing IPv4 packet\r
     //\r
-    goto CleanUp;\r
-  }\r
-\r
-  //\r
-  // Create a netbuffer representing IPv4 packet\r
-  //\r
-  Pkt = NetbufFromExt (\r
-          (NET_FRAGMENT *) RxData->Ip4RxData.FragmentTable,\r
-          RxData->Ip4RxData.FragmentCount,\r
-          0,\r
-          0,\r
-          IpIoExtFree,\r
-          RxData->Ip4RxData.RecycleSignal\r
-          );\r
-  if (NULL == Pkt) {\r
-    goto CleanUp;\r
-  }\r
+    Pkt = NetbufFromExt (\r
+            (NET_FRAGMENT *) RxData->Ip4RxData.FragmentTable,\r
+            RxData->Ip4RxData.FragmentCount,\r
+            0,\r
+            0,\r
+            IpIoExtFree,\r
+            RxData->Ip4RxData.RecycleSignal\r
+            );\r
+    if (NULL == Pkt) {\r
+      goto CleanUp;\r
+    }\r
 \r
-  //\r
-  // Create a net session\r
-  //\r
-  Session.Source.Addr[0] = EFI_IP4 (RxData->Ip4RxData.Header->SourceAddress);\r
-  Session.Dest.Addr[0]   = EFI_IP4 (RxData->Ip4RxData.Header->DestinationAddress);\r
-  Session.IpHdr.Ip4Hdr   = RxData->Ip4RxData.Header;\r
-  Session.IpHdrLen       = RxData->Ip4RxData.HeaderLength;\r
-  Session.IpVersion      = IP_VERSION_4;\r
+    //\r
+    // Create a net session\r
+    //\r
+    Session.Source.Addr[0] = EFI_IP4 (RxData->Ip4RxData.Header->SourceAddress);\r
+    Session.Dest.Addr[0]   = EFI_IP4 (RxData->Ip4RxData.Header->DestinationAddress);\r
+    Session.IpHdr.Ip4Hdr   = RxData->Ip4RxData.Header;\r
+    Session.IpHdrLen       = RxData->Ip4RxData.HeaderLength;\r
+    Session.IpVersion      = IP_VERSION_4;\r
   } else {\r
 \r
     if (!NetIp6IsValidUnicast(&RxData->Ip6RxData.Header->SourceAddress)) {\r
       goto CleanUp;\r
     }\r
     \r
+    if (RxData->Ip6RxData.DataLength == 0) {\r
+      //\r
+      // Discard zero length data payload packet.\r
+      //\r
+      goto CleanUp;\r
+    }\r
+    \r
     //\r
     // Create a netbuffer representing IPv6 packet\r
     //\r
@@ -1124,9 +1140,9 @@ CleanUp:
 Resume:\r
 \r
   if (IpIo->IpVersion == IP_VERSION_4){\r
-    ((EFI_IP4_PROTOCOL *) Ip)->Receive (Ip, &(IpIo->RcvToken.Ip4Token));\r
+    IpIo->Ip.Ip4->Receive (IpIo->Ip.Ip4, &(IpIo->RcvToken.Ip4Token));\r
   } else {\r
-    ((EFI_IP6_PROTOCOL *) Ip)->Receive (Ip, &(IpIo->RcvToken.Ip6Token));\r
+    IpIo->Ip.Ip6->Receive (IpIo->Ip.Ip6, &(IpIo->RcvToken.Ip6Token));\r
   }\r
 }\r
 \r
@@ -1265,7 +1281,6 @@ IpIoOpen (
   )\r
 {\r
   EFI_STATUS        Status;\r
-  VOID              *Ip;\r
   UINT8             IpVersion;\r
 \r
   if (IpIo->IsConfigured) {\r
@@ -1276,22 +1291,33 @@ IpIoOpen (
 \r
   ASSERT ((IpVersion == IP_VERSION_4) || (IpVersion == IP_VERSION_6));\r
 \r
-  Ip = IpIo->Ip;\r
-\r
   //\r
   // configure ip\r
   //\r
   if (IpVersion == IP_VERSION_4){\r
-    Status = ((EFI_IP4_PROTOCOL *) Ip)->Configure (\r
-                                          (EFI_IP4_PROTOCOL *) Ip,\r
-                                          &OpenData->IpConfigData.Ip4CfgData\r
-                                          );\r
+    //\r
+    // RawData mode is no supported.\r
+    //\r
+    ASSERT (!OpenData->IpConfigData.Ip4CfgData.RawData);\r
+    if (OpenData->IpConfigData.Ip4CfgData.RawData) {\r
+      return EFI_UNSUPPORTED;\r
+    }\r
+\r
+    if (!OpenData->IpConfigData.Ip4CfgData.UseDefaultAddress) {\r
+      IpIo->StationIp = EFI_NTOHL (OpenData->IpConfigData.Ip4CfgData.StationAddress);\r
+      IpIo->SubnetMask = EFI_NTOHL (OpenData->IpConfigData.Ip4CfgData.SubnetMask);\r
+    }\r
+    \r
+    Status = IpIo->Ip.Ip4->Configure (\r
+                             IpIo->Ip.Ip4,\r
+                             &OpenData->IpConfigData.Ip4CfgData\r
+                             );\r
   } else {\r
 \r
-    Status = ((EFI_IP6_PROTOCOL *) Ip)->Configure (\r
-                                          (EFI_IP6_PROTOCOL *) Ip\r
-                                          &OpenData->IpConfigData.Ip6CfgData\r
-                                          );\r
+    Status = IpIo->Ip.Ip6->Configure (\r
+                             IpIo->Ip.Ip6\r
+                             &OpenData->IpConfigData.Ip6CfgData\r
+                             );\r
   }\r
 \r
   if (EFI_ERROR (Status)) {\r
@@ -1304,13 +1330,13 @@ IpIoOpen (
   // @bug its code\r
   //\r
   if (IpVersion == IP_VERSION_4){\r
-    Status = ((EFI_IP4_PROTOCOL *) Ip)->Routes (\r
-                                          (EFI_IP4_PROTOCOL *) Ip,\r
-                                          TRUE,\r
-                                          &mZeroIp4Addr,\r
-                                          &mZeroIp4Addr,\r
-                                          &mZeroIp4Addr\r
-                                          );\r
+    Status = IpIo->Ip.Ip4->Routes (\r
+                             IpIo->Ip.Ip4,\r
+                             TRUE,\r
+                             &mZeroIp4Addr,\r
+                             &mZeroIp4Addr,\r
+                             &mZeroIp4Addr\r
+                             );\r
 \r
     if (EFI_ERROR (Status) && (EFI_NOT_FOUND != Status)) {\r
       return Status;\r
@@ -1329,24 +1355,24 @@ IpIoOpen (
     //\r
     // start to listen incoming packet\r
     //\r
-    Status = ((EFI_IP4_PROTOCOL *) Ip)->Receive (\r
-                                          (EFI_IP4_PROTOCOL *) Ip,\r
-                                          &(IpIo->RcvToken.Ip4Token)\r
-                                          );\r
+    Status = IpIo->Ip.Ip4->Receive (\r
+                             IpIo->Ip.Ip4,\r
+                             &(IpIo->RcvToken.Ip4Token)\r
+                             );\r
     if (EFI_ERROR (Status)) {\r
-      ((EFI_IP4_PROTOCOL *) Ip)->Configure ((EFI_IP4_PROTOCOL *) Ip, NULL);\r
+      IpIo->Ip.Ip4->Configure (IpIo->Ip.Ip4, NULL);\r
       goto ErrorExit;\r
     }\r
 \r
   } else {\r
 \r
     IpIo->Protocol = OpenData->IpConfigData.Ip6CfgData.DefaultProtocol;\r
-    Status = ((EFI_IP6_PROTOCOL *) Ip)->Receive (\r
-                                          (EFI_IP6_PROTOCOL *) Ip,\r
-                                          &(IpIo->RcvToken.Ip6Token)\r
-                                          );\r
+    Status = IpIo->Ip.Ip6->Receive (\r
+                             IpIo->Ip.Ip6,\r
+                             &(IpIo->RcvToken.Ip6Token)\r
+                             );\r
     if (EFI_ERROR (Status)) {\r
-      ((EFI_IP6_PROTOCOL *) Ip)->Configure ((EFI_IP6_PROTOCOL *) Ip, NULL);\r
+      IpIo->Ip.Ip6->Configure (IpIo->Ip.Ip6, NULL);\r
       goto ErrorExit;\r
     }\r
   }\r
@@ -1379,7 +1405,6 @@ IpIoStop (
   )\r
 {\r
   EFI_STATUS        Status;\r
-  VOID              *Ip;\r
   IP_IO_IP_INFO     *IpInfo;\r
   UINT8             IpVersion;\r
 \r
@@ -1396,15 +1421,13 @@ IpIoStop (
   //\r
   RemoveEntryList (&IpIo->Entry);\r
 \r
-  Ip = IpIo->Ip;\r
-\r
   //\r
   // Configure NULL Ip\r
   //\r
   if (IpVersion == IP_VERSION_4) {\r
-    Status = ((EFI_IP4_PROTOCOL *) Ip)->Configure ((EFI_IP4_PROTOCOL *) Ip, NULL);\r
+    Status = IpIo->Ip.Ip4->Configure (IpIo->Ip.Ip4, NULL);\r
   } else {\r
-    Status = ((EFI_IP6_PROTOCOL *) Ip)->Configure ((EFI_IP6_PROTOCOL *) Ip, NULL);\r
+    Status = IpIo->Ip.Ip6->Configure (IpIo->Ip.Ip6, NULL);\r
   }\r
   if (EFI_ERROR (Status)) {\r
     return Status;\r
@@ -1423,7 +1446,7 @@ IpIoStop (
   }\r
 \r
   //\r
-  // All pending send tokens should be flushed by reseting the IP instances.\r
+  // All pending send tokens should be flushed by resetting the IP instances.\r
   //\r
   ASSERT (IsListEmpty (&IpIo->PendingSndList));\r
 \r
@@ -1516,7 +1539,7 @@ IpIoSend (
   )\r
 {\r
   EFI_STATUS        Status;\r
-  VOID              *Ip;\r
+  IP_IO_IP_PROTOCOL Ip;\r
   IP_IO_SEND_ENTRY  *SndEntry;\r
 \r
   ASSERT ((IpIo->IpVersion != IP_VERSION_4) || (Dest != NULL));\r
@@ -1539,15 +1562,15 @@ IpIoSend (
   // Send this Packet\r
   //\r
   if (IpIo->IpVersion == IP_VERSION_4){\r
-    Status = ((EFI_IP4_PROTOCOL *) Ip)->Transmit (\r
-                                          (EFI_IP4_PROTOCOL *) Ip,\r
-                                          &SndEntry->SndToken.Ip4Token\r
-                                          );\r
+    Status = Ip.Ip4->Transmit (\r
+                       Ip.Ip4,\r
+                       &SndEntry->SndToken.Ip4Token\r
+                       );\r
   } else {\r
-    Status = ((EFI_IP6_PROTOCOL *) Ip)->Transmit (\r
-                                          (EFI_IP6_PROTOCOL *) Ip,\r
-                                          &SndEntry->SndToken.Ip6Token\r
-                                          );\r
+    Status = Ip.Ip6->Transmit (\r
+                       Ip.Ip6,\r
+                       &SndEntry->SndToken.Ip6Token\r
+                       );\r
   }\r
 \r
   if (EFI_ERROR (Status)) {\r
@@ -1574,7 +1597,7 @@ IpIoCancelTxToken (
 {\r
   LIST_ENTRY        *Node;\r
   IP_IO_SEND_ENTRY  *SndEntry;\r
-  VOID              *Ip;\r
+  IP_IO_IP_PROTOCOL Ip;\r
 \r
   ASSERT ((IpIo != NULL) && (Packet != NULL));\r
 \r
@@ -1587,15 +1610,15 @@ IpIoCancelTxToken (
       Ip = SndEntry->Ip;\r
 \r
       if (IpIo->IpVersion == IP_VERSION_4) {\r
-        ((EFI_IP4_PROTOCOL *) Ip)->Cancel (\r
-                                     (EFI_IP4_PROTOCOL *) Ip,\r
-                                     &SndEntry->SndToken.Ip4Token\r
-                                     );\r
+        Ip.Ip4->Cancel (\r
+                  Ip.Ip4,\r
+                  &SndEntry->SndToken.Ip4Token\r
+                  );\r
       } else {\r
-        ((EFI_IP6_PROTOCOL *) Ip)->Cancel (\r
-                                     (EFI_IP6_PROTOCOL *) Ip,\r
-                                     &SndEntry->SndToken.Ip6Token\r
-                                     );\r
+        Ip.Ip6->Cancel (\r
+                  Ip.Ip6,\r
+                  &SndEntry->SndToken.Ip6Token\r
+                  );\r
       }\r
 \r
       break;\r
@@ -1729,7 +1752,7 @@ IpIoConfigIp (
   )\r
 {\r
   EFI_STATUS         Status;\r
-  VOID               *Ip;\r
+  IP_IO_IP_PROTOCOL  Ip;\r
   UINT8              IpVersion;\r
   EFI_IP4_MODE_DATA  Ip4ModeData;\r
   EFI_IP6_MODE_DATA  Ip6ModeData;\r
@@ -1752,9 +1775,9 @@ IpIoConfigIp (
   Ip = IpInfo->Ip;\r
 \r
   if (IpInfo->IpVersion == IP_VERSION_4) {\r
-    Status = ((EFI_IP4_PROTOCOL *) Ip)->Configure ((EFI_IP4_PROTOCOL *) Ip, IpConfigData);\r
+    Status = Ip.Ip4->Configure (Ip.Ip4, IpConfigData);\r
   } else {\r
-    Status = ((EFI_IP6_PROTOCOL *) Ip)->Configure ((EFI_IP6_PROTOCOL *) Ip, IpConfigData);\r
+    Status = Ip.Ip6->Configure (Ip.Ip6, IpConfigData);\r
   }\r
 \r
   if (EFI_ERROR (Status)) {\r
@@ -1765,15 +1788,15 @@ IpIoConfigIp (
     if (IpInfo->IpVersion == IP_VERSION_4){\r
 \r
       if (((EFI_IP4_CONFIG_DATA *) IpConfigData)->UseDefaultAddress) {\r
-        ((EFI_IP4_PROTOCOL *) Ip)->GetModeData (\r
-                                     (EFI_IP4_PROTOCOL *) Ip\r
-                                     &Ip4ModeData, \r
-                                     NULL, \r
-                                     NULL\r
-                                     );\r
-\r
-        ((EFI_IP4_CONFIG_DATA*) IpConfigData)->StationAddress = Ip4ModeData.ConfigData.StationAddress;\r
-        ((EFI_IP4_CONFIG_DATA*) IpConfigData)->SubnetMask     = Ip4ModeData.ConfigData.SubnetMask;\r
+        Ip.Ip4->GetModeData (\r
+                  Ip.Ip4\r
+                  &Ip4ModeData, \r
+                  NULL, \r
+                  NULL\r
+                  );\r
+\r
+        IP4_COPY_ADDRESS (&((EFI_IP4_CONFIG_DATA*) IpConfigData)->StationAddress, &Ip4ModeData.ConfigData.StationAddress);\r
+        IP4_COPY_ADDRESS (&((EFI_IP4_CONFIG_DATA*) IpConfigData)->SubnetMask, &Ip4ModeData.ConfigData.SubnetMask);\r
     }\r
 \r
       CopyMem (\r
@@ -1787,21 +1810,20 @@ IpIoConfigIp (
         sizeof (IP4_ADDR)\r
         );\r
 \r
-      Status = ((EFI_IP4_PROTOCOL *) Ip)->Receive (\r
-                                            (EFI_IP4_PROTOCOL *) Ip,\r
-                                            &IpInfo->DummyRcvToken.Ip4Token\r
-                                            );\r
+      Status = Ip.Ip4->Receive (\r
+                         Ip.Ip4,\r
+                         &IpInfo->DummyRcvToken.Ip4Token\r
+                         );\r
     if (EFI_ERROR (Status)) {\r
-        ((EFI_IP4_PROTOCOL*)Ip)->Configure (Ip, NULL);\r
+      Ip.Ip4->Configure (Ip.Ip4, NULL);\r
     }\r
   } else {\r
-\r
-      ((EFI_IP6_PROTOCOL *) Ip)->GetModeData (\r
-                                   (EFI_IP6_PROTOCOL *) Ip,\r
-                                   &Ip6ModeData,\r
-                                   NULL,\r
-                                   NULL\r
-                                   );\r
+    Ip.Ip6->GetModeData (\r
+              Ip.Ip6,\r
+              &Ip6ModeData,\r
+              NULL,\r
+              NULL\r
+              );\r
 \r
       if (Ip6ModeData.IsConfigured) {\r
         CopyMem (\r
@@ -1845,12 +1867,12 @@ IpIoConfigIp (
         sizeof (EFI_IPv6_ADDRESS)\r
         );\r
 \r
-      Status = ((EFI_IP6_PROTOCOL *) Ip)->Receive (\r
-                                            (EFI_IP6_PROTOCOL *) Ip,\r
-                                            &IpInfo->DummyRcvToken.Ip6Token\r
-                                            );\r
+      Status = Ip.Ip6->Receive (\r
+                         Ip.Ip6,\r
+                         &IpInfo->DummyRcvToken.Ip6Token\r
+                         );\r
       if (EFI_ERROR (Status)) {\r
-        ((EFI_IP6_PROTOCOL *) Ip)->Configure ((EFI_IP6_PROTOCOL *) Ip, NULL);\r
+        Ip.Ip6->Configure (Ip.Ip6, NULL);\r
       }\r
     }  \r
   } else {\r
@@ -1905,10 +1927,10 @@ IpIoRemoveIp (
   RemoveEntryList (&IpInfo->Entry);\r
 \r
   if (IpVersion == IP_VERSION_4){\r
-    ((EFI_IP4_PROTOCOL *) (IpInfo->Ip))->Configure (\r
-                                           (EFI_IP4_PROTOCOL *) (IpInfo->Ip),\r
-                                           NULL\r
-                                           );\r
+    IpInfo->Ip.Ip4->Configure (\r
+                      IpInfo->Ip.Ip4,\r
+                      NULL\r
+                      );\r
     IpIoCloseProtocolDestroyIpChild (\r
       IpIo->Controller,\r
       IpIo->Image,\r
@@ -1920,10 +1942,10 @@ IpIoRemoveIp (
 \r
   } else {\r
 \r
-    ((EFI_IP6_PROTOCOL *) (IpInfo->Ip))->Configure (\r
-                                           (EFI_IP6_PROTOCOL *) (IpInfo->Ip),\r
-                                           NULL\r
-                                           );\r
+    IpInfo->Ip.Ip6->Configure (\r
+                      IpInfo->Ip.Ip6,\r
+                      NULL\r
+                      );\r
 \r
     IpIoCloseProtocolDestroyIpChild (\r
       IpIo->Controller,\r
@@ -2150,7 +2172,7 @@ IpIoRefreshNeighbor (
     return EFI_NOT_STARTED;\r
   }\r
 \r
-  Ip = (EFI_IP6_PROTOCOL *) (IpIo->Ip);\r
+  Ip = IpIo->Ip.Ip6;\r
 \r
   return Ip->Neighbors (Ip, FALSE, &Neighbor->v6, NULL, Timeout, TRUE);\r
 }\r