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
**/\r
VOID\r
EFIAPI\r
-Ip4AutoConfigCallBack (\r
- IN EFI_EVENT Event,\r
+Ip4AutoConfigCallBackDpc (\r
IN VOID *Context\r
)\r
{\r
// 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
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
\r
Status = gBS->CreateEvent (\r
EVT_NOTIFY_SIGNAL,\r
- TPL_CALLBACK,\r
+ NET_TPL_EVENT,\r
Ip4AutoConfigCallBack,\r
IpSb,\r
&IpSb->ReconfigEvent\r
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
\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
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
);\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
\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
// 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