]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Impl.c
1. Add DPC protocol and DpcLib library in MdeModulePkg.
[mirror_edk2.git] / MdeModulePkg / Universal / Network / Ip4Dxe / Ip4Impl.c
index 40c5daacd885804f82c11534cfa0f6eed2805be6..04ca79578f0be8c3388addcbd01be20cdfa8c8e2 100644 (file)
@@ -214,7 +214,6 @@ Ip4ServiceConfigMnp (
   it will configure the default interface and default route table\r
   with the configuration information retrieved by IP4_CONFIGURE.\r
 \r
-  @param  Event                  The event that is signalled.\r
   @param  Context                The IP4 service binding instance.\r
 \r
   @return None\r
@@ -222,8 +221,7 @@ Ip4ServiceConfigMnp (
 **/\r
 VOID\r
 EFIAPI\r
-Ip4AutoConfigCallBack (\r
-  IN EFI_EVENT              Event,\r
+Ip4AutoConfigCallBackDpc (\r
   IN VOID                   *Context\r
   )\r
 {\r
@@ -252,7 +250,7 @@ Ip4AutoConfigCallBack (
   // frames on the default address, and when the default interface is\r
   // freed, Ip4AcceptFrame won't be informed.\r
   //\r
-  if (Event == IpSb->ReconfigEvent) {\r
+  if (IpSb->ActiveEvent == IpSb->ReconfigEvent) {\r
 \r
     if (IpSb->DefaultInterface->Configured) {\r
       IpIf = Ip4CreateInterface (IpSb->Mnp, IpSb->Controller, IpSb->Image);\r
@@ -360,6 +358,40 @@ ON_EXIT:
   NetFreePool (Data);\r
 }\r
 \r
+VOID\r
+EFIAPI\r
+Ip4AutoConfigCallBack (\r
+  IN EFI_EVENT              Event,\r
+  IN VOID                   *Context\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Request Ip4AutoConfigCallBackDpc as a DPC at TPL_CALLBACK\r
+\r
+Arguments:\r
+\r
+  Event   - The event that is signalled.\r
+  Context - The IP4 service binding instance.\r
+\r
+Returns:\r
+\r
+  None\r
+\r
+--*/\r
+{\r
+  IP4_SERVICE  *IpSb;\r
+\r
+  IpSb              = (IP4_SERVICE *) Context;\r
+  IpSb->ActiveEvent = Event;\r
+\r
+  //\r
+  // Request Ip4AutoConfigCallBackDpc as a DPC at TPL_CALLBACK\r
+  //\r
+  NetLibQueueDpc (TPL_CALLBACK, Ip4AutoConfigCallBackDpc, Context);\r
+}\r
+\r
 \r
 /**\r
   Start the auto configuration for this IP service instance.\r
@@ -401,7 +433,7 @@ Ip4StartAutoConfig (
 \r
   Status = gBS->CreateEvent (\r
                   EVT_NOTIFY_SIGNAL,\r
-                  TPL_CALLBACK,\r
+                  NET_TPL_EVENT,\r
                   Ip4AutoConfigCallBack,\r
                   IpSb,\r
                   &IpSb->ReconfigEvent\r
@@ -764,7 +796,7 @@ Ip4StationAddressValid (
     return FALSE;\r
   }\r
 \r
-  NetBrdcastMask = mIp4AllMasks[NET_MIN (Len, Type << 3)];\r
+  NetBrdcastMask = mIp4AllMasks[MIN (Len, Type << 3)];\r
 \r
   if (Ip == (Ip | ~NetBrdcastMask)) {\r
     return FALSE;\r
@@ -1356,6 +1388,11 @@ Ip4FreeTxToken (
 \r
   if (Wrap->Sent) {\r
     gBS->SignalEvent (Wrap->Token->Event);\r
+\r
+    //\r
+    // Dispatch the DPC queued by the NotifyFunction of Token->Event.\r
+    //\r
+    NetLibDispatchDpc ();\r
   }\r
 \r
   NetFreePool (Wrap);\r
@@ -1562,6 +1599,12 @@ EfiIp4Transmit (
     goto ON_EXIT;\r
   }\r
 \r
+  //\r
+  // Mark the packet sent before output it. Mark it not sent again if the\r
+  // returned status is not EFI_SUCCESS;\r
+  //\r
+  Wrap->Sent = TRUE;\r
+\r
   Status = Ip4Output (\r
              IpSb,\r
              IpInstance,\r
@@ -1575,16 +1618,10 @@ EfiIp4Transmit (
              );\r
 \r
   if (EFI_ERROR (Status)) {\r
+    Wrap->Sent = FALSE;\r
     NetbufFree (Wrap->Packet);\r
-    goto ON_EXIT;\r
   }\r
 \r
-  //\r
-  // Mark the packet sent, so when Ip4FreeTxToken is called, it\r
-  // will signal the upper layer.\r
-  //\r
-  Wrap->Sent = TRUE;\r
-\r
 ON_EXIT:\r
   NET_RESTORE_TPL (OldTpl);\r
   return Status;\r
@@ -1668,6 +1705,12 @@ EfiIp4Receive (
 \r
   Status = Ip4InstanceDeliverPacket (IpInstance);\r
 \r
+  //\r
+  // Dispatch the DPC queued by the NotifyFunction of this instane's receive\r
+  // event.\r
+  //\r
+  NetLibDispatchDpc ();\r
+\r
 ON_EXIT:\r
   NET_RESTORE_TPL (OldTpl);\r
   return Status;\r
@@ -1820,7 +1863,11 @@ Ip4Cancel (
   // for Token!=NULL and it is cancelled.\r
   //\r
   Status = NetMapIterate (&IpInstance->RxTokens, Ip4CancelRxTokens, Token);\r
-\r
+  //\r
+  // Dispatch the DPCs queued by the NotifyFunction of the canceled rx token's\r
+  // events.\r
+  //\r
+  NetLibDispatchDpc ();\r
   if (EFI_ERROR (Status)) {\r
     if ((Token != NULL) && (Status == EFI_ABORTED)) {\r
       return EFI_SUCCESS;\r