//\r
Status = gBS->CreateEvent (\r
EVT_TIMER | EVT_NOTIFY_SIGNAL,\r
- NET_TPL_FAST_TIMER,\r
+ NET_TPL_TIMER,\r
Udp4CheckTimeout,\r
Udp4Service,\r
&Udp4Service->TimeoutEvent\r
Ip4ConfigData->AcceptBroadcast = Udp4ConfigData->AcceptBroadcast;\r
Ip4ConfigData->AcceptPromiscuous = Udp4ConfigData->AcceptPromiscuous;\r
Ip4ConfigData->UseDefaultAddress = Udp4ConfigData->UseDefaultAddress;\r
- Ip4ConfigData->StationAddress = Udp4ConfigData->StationAddress;\r
- Ip4ConfigData->SubnetMask = Udp4ConfigData->SubnetMask;\r
+ CopyMem (&Ip4ConfigData->StationAddress, &Udp4ConfigData->StationAddress, sizeof (EFI_IPv4_ADDRESS));\r
+ CopyMem (&Ip4ConfigData->SubnetMask, &Udp4ConfigData->SubnetMask, sizeof (EFI_IPv4_ADDRESS));\r
\r
//\r
// use the -1 magic number to disable the receiving process of the ip instance.\r
//\r
Token->Status = Status;\r
gBS->SignalEvent (Token->Event);\r
+ NetLibDispatchDpc ();\r
}\r
}\r
\r
//\r
Udp4IcmpHandler ((UDP4_SERVICE_DATA *) Context, IcmpError, NetSession, Packet);\r
}\r
+\r
+ //\r
+ // Dispatch the DPC queued by the NotifyFunction of the rx token's events\r
+ // which are signaled with received data.\r
+ //\r
+ NetLibDispatchDpc ();\r
}\r
\r
\r
// The token is a receive token. Abort it and remove it from the Map.\r
//\r
TokenToCancel = (EFI_UDP4_COMPLETION_TOKEN *) Item->Key;\r
+ NetMapRemoveItem (Map, Item, NULL);\r
\r
TokenToCancel->Status = EFI_ABORTED;\r
gBS->SignalEvent (TokenToCancel->Event);\r
-\r
- NetMapRemoveItem (Map, Item, NULL);\r
}\r
\r
if (Arg != NULL) {\r
\r
**/\r
VOID\r
-Udp4FlushRxData (\r
- IN NET_LIST_ENTRY *RcvdDgramQue\r
+Udp4FlushRcvdDgram (\r
+ IN UDP4_INSTANCE_DATA *Instance\r
)\r
{\r
UDP4_RXDATA_WRAP *Wrap;\r
- EFI_TPL OldTpl;\r
-\r
- OldTpl = NET_RAISE_TPL (NET_TPL_RECYCLE);\r
\r
- while (!NetListIsEmpty (RcvdDgramQue)) {\r
+ while (!NetListIsEmpty (&Instance->RcvdDgramQue)) {\r
//\r
// Iterate all the Wraps in the RcvdDgramQue.\r
//\r
- Wrap = NET_LIST_HEAD (RcvdDgramQue, UDP4_RXDATA_WRAP, Link);\r
+ Wrap = NET_LIST_HEAD (&Instance->RcvdDgramQue, UDP4_RXDATA_WRAP, Link);\r
\r
//\r
// The Wrap will be removed from the RcvdDgramQue by this function call.\r
//\r
Udp4RecycleRxDataWrap (NULL, (VOID *) Wrap);\r
}\r
-\r
- NET_RESTORE_TPL (OldTpl);\r
}\r
\r
\r
EFI_UDP4_COMPLETION_TOKEN *Token;\r
NET_BUF *Dup;\r
EFI_UDP4_RECEIVE_DATA *RxData;\r
+ EFI_TPL OldTpl;\r
\r
if (!NetListIsEmpty (&Instance->RcvdDgramQue) &&\r
!NetMapIsEmpty (&Instance->RxTokens)) {\r
NetbufFree (Wrap->Packet);\r
\r
Wrap->Packet = Dup;\r
- }\r
+ } \r
\r
NetListRemoveHead (&Instance->RcvdDgramQue);\r
\r
Token->Status = EFI_SUCCESS;\r
Token->Packet.RxData = &Wrap->RxData;\r
\r
- gBS->SignalEvent (Token->Event);\r
-\r
+ OldTpl = NET_RAISE_TPL (NET_TPL_RECYCLE);\r
NetListInsertTail (&Instance->DeliveredDgramQue, &Wrap->Link);\r
+ NET_RESTORE_TPL (OldTpl);\r
+\r
+ gBS->SignalEvent (Token->Event);\r
}\r
}\r
\r