]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Library/DxeIpIoLib/DxeIpIoLib.c
1. Add DPC protocol and DpcLib library in MdeModulePkg.
[mirror_edk2.git] / MdeModulePkg / Library / DxeIpIoLib / DxeIpIoLib.c
index 608bdd297ea2e960e8eb0f3e8537af6dfa0eded0..279ada7b11e63adeefaa68f23f037497371d9234 100644 (file)
@@ -71,6 +71,13 @@ STATIC ICMP_ERROR_INFO  mIcmpErrMap[10] = {
   {FALSE, TRUE}\r
 };\r
 \r
+STATIC\r
+VOID\r
+EFIAPI\r
+IpIoTransmitHandlerDpc (\r
+  IN VOID      *Context\r
+  );\r
+\r
 STATIC\r
 VOID\r
 EFIAPI\r
@@ -430,7 +437,7 @@ IpIoCreateSndEntry (
     //\r
     // Set the fields of OverrideData\r
     //\r
-    NetCopyMem (OverrideData, Override, sizeof (*OverrideData));\r
+    CopyMem (OverrideData, Override, sizeof (*OverrideData));\r
   }\r
 \r
   //\r
@@ -523,7 +530,6 @@ IpIoDestroySndEntry (
 /**\r
   Notify function for IP transmit token.\r
 \r
-  @param  Event                 The event signaled.\r
   @param  Context               The context passed in by the event notifier.\r
 \r
   @return None.\r
@@ -532,8 +538,7 @@ IpIoDestroySndEntry (
 STATIC\r
 VOID\r
 EFIAPI\r
-IpIoTransmitHandler (\r
-  IN EFI_EVENT Event,\r
+IpIoTransmitHandlerDpc (\r
   IN VOID      *Context\r
   )\r
 {\r
@@ -556,11 +561,34 @@ IpIoTransmitHandler (
   IpIoDestroySndEntry (SndEntry);\r
 }\r
 \r
+/**\r
+  Notify function for IP transmit token.\r
+\r
+  @param  Event                 The event signaled.\r
+  @param  Context               The context passed in by the event notifier.\r
+\r
+  @return None.\r
+\r
+**/\r
+\r
+STATIC\r
+VOID\r
+EFIAPI\r
+IpIoTransmitHandler (\r
+  IN EFI_EVENT Event,\r
+  IN VOID      *Context\r
+  )\r
+{\r
+  //\r
+  // Request IpIoTransmitHandlerDpc as a DPC at TPL_CALLBACK\r
+  //\r
+  NetLibQueueDpc (TPL_CALLBACK, IpIoTransmitHandlerDpc, Context);\r
+}\r
+\r
 \r
 /**\r
   The dummy handler for the dummy IP receive token.\r
 \r
-  @param  Evt                   The event signaled.\r
   @param  Context               The context passed in by the event notifier.\r
 \r
   @return None.\r
@@ -569,20 +597,22 @@ IpIoTransmitHandler (
 STATIC\r
 VOID\r
 EFIAPI\r
-IpIoDummyHandler (\r
-  IN EFI_EVENT Event,\r
+IpIoDummyHandlerDpc (\r
   IN VOID      *Context\r
   )\r
 {\r
   IP_IO_IP_INFO             *IpInfo;\r
   EFI_IP4_COMPLETION_TOKEN  *DummyToken;\r
 \r
-  ASSERT (Event && Context);\r
-\r
   IpInfo      = (IP_IO_IP_INFO *) Context;\r
   DummyToken  = &(IpInfo->DummyRcvToken);\r
 \r
-  if (EFI_SUCCESS == DummyToken->Status) {\r
+  if (EFI_ABORTED == DummyToken->Status) {\r
+    //\r
+    // The reception is actively aborted by the consumer, directly return.\r
+    //\r
+    return;\r
+  } else if (EFI_SUCCESS == DummyToken->Status) {\r
     ASSERT (DummyToken->Packet.RxData);\r
 \r
     gBS->SignalEvent (DummyToken->Packet.RxData->RecycleSignal);\r
@@ -593,8 +623,7 @@ IpIoDummyHandler (
 \r
 \r
 /**\r
-  Notify function for the IP receive token, used to process\r
-  the received IP packets.\r
+  Request IpIoDummyHandlerDpc as a DPC at TPL_CALLBACK.\r
 \r
   @param  Event                 The event signaled.\r
   @param  Context               The context passed in by the event notifier.\r
@@ -605,10 +634,33 @@ IpIoDummyHandler (
 STATIC\r
 VOID\r
 EFIAPI\r
-IpIoListenHandler (\r
+IpIoDummyHandler (\r
   IN EFI_EVENT Event,\r
   IN VOID      *Context\r
   )\r
+{\r
+  //\r
+  // Request IpIoDummyHandlerDpc as a DPC at TPL_CALLBACK\r
+  //\r
+  NetLibQueueDpc (TPL_CALLBACK, IpIoDummyHandlerDpc, Context);\r
+}\r
+\r
+\r
+/**\r
+  Notify function for the IP receive token, used to process\r
+  the received IP packets.\r
+\r
+  @param  Context               The context passed in by the event notifier.\r
+\r
+  @return None.\r
+\r
+**/\r
+STATIC\r
+VOID\r
+EFIAPI\r
+IpIoListenHandlerDpc (\r
+  IN VOID      *Context\r
+  )\r
 {\r
   IP_IO                 *IpIo;\r
   EFI_STATUS            Status;\r
@@ -623,6 +675,13 @@ IpIoListenHandler (
   Status  = IpIo->RcvToken.Status;\r
   RxData  = IpIo->RcvToken.Packet.RxData;\r
 \r
+  if (EFI_ABORTED == Status) {\r
+    //\r
+    // The reception is actively aborted by the consumer, directly return.\r
+    //\r
+    return;\r
+  }\r
+\r
   if (((EFI_SUCCESS != Status) && (EFI_ICMP_ERROR != Status)) || (NULL == RxData)) {\r
     //\r
     // Only process the normal packets and the icmp error packets, if RxData is NULL\r
@@ -689,6 +748,30 @@ Resume:
 }\r
 \r
 \r
+/**\r
+  Request IpIoListenHandlerDpc as a DPC at TPL_CALLBACK\r
+\r
+  @param  Event                 The event signaled.\r
+  @param  Context               The context passed in by the event notifier.\r
+\r
+  @return None.\r
+\r
+**/\r
+STATIC\r
+VOID\r
+EFIAPI\r
+IpIoListenHandler (\r
+  IN EFI_EVENT Event,\r
+  IN VOID      *Context\r
+  )\r
+{\r
+  //\r
+  // Request IpIoListenHandlerDpc as a DPC at TPL_CALLBACK\r
+  //\r
+  NetLibQueueDpc (TPL_CALLBACK, IpIoListenHandlerDpc, Context);\r
+}\r
+\r
+\r
 /**\r
   Create a new IP_IO instance.\r
 \r