return EFI_NOT_STARTED;\r
}\r
\r
- OldTpl = NET_RAISE_TPL (NET_TPL_LOCK);\r
+ OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
\r
if (Udp4ConfigData != NULL) {\r
//\r
// Set the Udp4ConfigData.\r
//\r
- *Udp4ConfigData = Instance->ConfigData;\r
+ CopyMem (Udp4ConfigData, &Instance->ConfigData, sizeof (*Udp4ConfigData));\r
}\r
\r
Ip = Instance->IpInfo->Ip;\r
//\r
Status = Ip->GetModeData (Ip, Ip4ModeData, MnpConfigData, SnpModeData);\r
\r
- NET_RESTORE_TPL (OldTpl);\r
+ gBS->RestoreTPL (OldTpl);\r
\r
return Status;\r
}\r
IP4_ADDR SubnetMask;\r
IP4_ADDR RemoteAddress;\r
EFI_IP4_CONFIG_DATA Ip4ConfigData;\r
+ IP4_ADDR LocalAddr;\r
+ IP4_ADDR RemoteAddr;\r
\r
if (This == NULL) {\r
return EFI_INVALID_PARAMETER;\r
Udp4Service = Instance->Udp4Service;\r
Status = EFI_SUCCESS;\r
\r
- OldTpl = NET_RAISE_TPL (NET_TPL_LOCK);\r
+ OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
\r
if (UdpConfigData != NULL) {\r
\r
- StationAddress = EFI_NTOHL (UdpConfigData->StationAddress);\r
- SubnetMask = EFI_NTOHL (UdpConfigData->SubnetMask);\r
- RemoteAddress = EFI_NTOHL (UdpConfigData->RemoteAddress);\r
+ CopyMem (&StationAddress, &UdpConfigData->StationAddress, sizeof (IP4_ADDR));\r
+ CopyMem (&SubnetMask, &UdpConfigData->SubnetMask, sizeof (IP4_ADDR));\r
+ CopyMem (&RemoteAddress, &UdpConfigData->RemoteAddress, sizeof (IP4_ADDR));\r
+\r
+ StationAddress = NTOHL (StationAddress);\r
+ SubnetMask = NTOHL (SubnetMask);\r
+ RemoteAddress = NTOHL (RemoteAddress);\r
+\r
\r
if (!UdpConfigData->UseDefaultAddress &&\r
(!IP4_IS_VALID_NETMASK (SubnetMask) ||\r
//\r
// Save the configuration data.\r
//\r
- Instance->ConfigData = *UdpConfigData;\r
+ CopyMem (&Instance->ConfigData, UdpConfigData, sizeof (Instance->ConfigData));\r
Instance->ConfigData.StationAddress = Ip4ConfigData.StationAddress;\r
Instance->ConfigData.SubnetMask = Ip4ConfigData.SubnetMask;\r
\r
//\r
// Pre calculate the checksum for the pseudo head, ignore the UDP length first.\r
//\r
+ CopyMem (&LocalAddr, &Instance->ConfigData.StationAddress, sizeof (IP4_ADDR));\r
+ CopyMem (&RemoteAddr, &Instance->ConfigData.RemoteAddress, sizeof (IP4_ADDR));\r
Instance->HeadSum = NetPseudoHeadChecksum (\r
- EFI_IP4 (Instance->ConfigData.StationAddress),\r
- EFI_IP4 (Instance->ConfigData.RemoteAddress),\r
+ LocalAddr,\r
+ RemoteAddr,\r
EFI_IP_PROTO_UDP,\r
0\r
);\r
//\r
// Cancel all the user tokens.\r
//\r
- Udp4InstanceCancelToken (Instance, NULL);\r
+ Instance->Udp4Proto.Cancel (&Instance->Udp4Proto, NULL);\r
\r
//\r
// Remove the buffered RxData for this instance.\r
//\r
- Udp4FlushRxData (&Instance->RcvdDgramQue);\r
+ Udp4FlushRcvdDgram (Instance);\r
+\r
+ ASSERT (IsListEmpty (&Instance->DeliveredDgramQue));\r
}\r
\r
Udp4SetVariableData (Instance->Udp4Service);\r
\r
ON_EXIT:\r
\r
- NET_RESTORE_TPL (OldTpl);\r
+ gBS->RestoreTPL (OldTpl);\r
\r
return Status;\r
}\r
UDP4_INSTANCE_DATA *Instance;\r
EFI_IP4_PROTOCOL *Ip;\r
EFI_TPL OldTpl;\r
+ IP4_ADDR McastIp;\r
\r
- if ((This == NULL) ||\r
- (JoinFlag && (MulticastAddress == NULL)) ||\r
- (JoinFlag && !IP4_IS_MULTICAST (EFI_NTOHL (*MulticastAddress)))) {\r
+ if ((This == NULL) || (JoinFlag && (MulticastAddress == NULL))) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
+ McastIp = 0;\r
+ if (JoinFlag) {\r
+ CopyMem (&McastIp, MulticastAddress, sizeof (IP4_ADDR));\r
+\r
+ if (!IP4_IS_MULTICAST (NTOHL (McastIp))) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ }\r
+\r
Instance = UDP4_INSTANCE_DATA_FROM_THIS (This);\r
\r
if (Instance->IsNoMapping) {\r
\r
Ip = Instance->IpInfo->Ip;\r
\r
- OldTpl = NET_RAISE_TPL (NET_TPL_LOCK);\r
+ OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
\r
//\r
// Invoke the Ip instance the Udp4 instance consumes to do the group operation.\r
//\r
if (JoinFlag) {\r
\r
- NetMapInsertTail (\r
- &Instance->McastIps,\r
- (VOID *) (UINTN) EFI_IP4 (*MulticastAddress),\r
- NULL\r
- );\r
+ NetMapInsertTail (&Instance->McastIps, (VOID *) (UINTN) McastIp, NULL);\r
} else {\r
\r
NetMapIterate (&Instance->McastIps, Udp4LeaveGroup, MulticastAddress);\r
\r
ON_EXIT:\r
\r
- NET_RESTORE_TPL (OldTpl);\r
+ gBS->RestoreTPL (OldTpl);\r
\r
return Status;\r
}\r
NET_BUF *Packet;\r
EFI_UDP4_HEADER *Udp4Header;\r
EFI_UDP4_CONFIG_DATA *ConfigData;\r
+ IP4_ADDR Source;\r
IP4_ADDR Destination;\r
EFI_UDP4_TRANSMIT_DATA *TxData;\r
EFI_UDP4_SESSION_DATA *UdpSessionData;\r
return EFI_NOT_STARTED;\r
}\r
\r
- OldTpl = NET_RAISE_TPL (NET_TPL_LOCK);\r
+ OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
\r
//\r
// Validate the Token, if the token is invalid return the error code.\r
// Set the SourceAddress, SrcPort and Destination according to the specified\r
// UdpSessionData.\r
//\r
- if (EFI_IP4 (UdpSessionData->SourceAddress) != 0) {\r
- Override.SourceAddress = UdpSessionData->SourceAddress;\r
+ if (!EFI_IP4_EQUAL (&UdpSessionData->SourceAddress, &mZeroIp4Addr)) {\r
+ CopyMem (&Override.SourceAddress, &UdpSessionData->SourceAddress, sizeof (EFI_IPv4_ADDRESS));\r
}\r
\r
if (UdpSessionData->SourcePort != 0) {\r
Udp4Header->SrcPort = HTONS (UdpSessionData->SourcePort);\r
}\r
\r
- Destination = EFI_IP4 (UdpSessionData->DestinationAddress);\r
-\r
if (UdpSessionData->DestinationPort != 0) {\r
Udp4Header->DstPort = HTONS (UdpSessionData->DestinationPort);\r
}\r
\r
+ CopyMem (&Source, &Override.SourceAddress, sizeof (IP4_ADDR));\r
+ CopyMem (&Destination, &UdpSessionData->DestinationAddress, sizeof (IP4_ADDR));\r
+\r
//\r
// calculate the pseudo head checksum using the overridden parameters.\r
//\r
HeadSum = NetPseudoHeadChecksum (\r
- EFI_IP4 (Override.SourceAddress),\r
+ Source,\r
Destination,\r
EFI_IP_PROTO_UDP,\r
0\r
//\r
// UdpSessionData is NULL, use the address and port information previously configured.\r
//\r
- Destination = EFI_IP4 (ConfigData->RemoteAddress);\r
- HeadSum = Instance->HeadSum;\r
+ CopyMem (&Destination, &ConfigData->RemoteAddress, sizeof (IP4_ADDR));\r
+\r
+ HeadSum = Instance->HeadSum;\r
}\r
\r
//\r
//\r
// Fill the IpIo Override data.\r
//\r
- EFI_IP4 (Override.GatewayAddress) = (TxData->GatewayAddress != NULL) ?\r
- EFI_IP4 (*(TxData->GatewayAddress)) : 0;\r
+ if (TxData->GatewayAddress != NULL) {\r
+ CopyMem (&Override.GatewayAddress, TxData->GatewayAddress, sizeof (EFI_IPv4_ADDRESS));\r
+ } else {\r
+ ZeroMem (&Override.GatewayAddress, sizeof (EFI_IPv4_ADDRESS));\r
+ }\r
+\r
Override.Protocol = EFI_IP_PROTO_UDP;\r
Override.TypeOfService = ConfigData->TypeOfService;\r
Override.TimeToLive = ConfigData->TimeToLive;\r
\r
ON_EXIT:\r
\r
- NET_RESTORE_TPL (OldTpl);\r
+ gBS->RestoreTPL (OldTpl);\r
\r
return Status;\r
}\r
return EFI_NOT_STARTED;\r
}\r
\r
- OldTpl = NET_RAISE_TPL (NET_TPL_LOCK);\r
+ OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
\r
if (EFI_ERROR (NetMapIterate (&Instance->RxTokens, Udp4TokenExist, Token))||\r
EFI_ERROR (NetMapIterate (&Instance->TxTokens, Udp4TokenExist, Token))) {\r
//\r
Status = NetMapInsertTail (&Instance->RxTokens, Token, NULL);\r
if (EFI_ERROR (Status)) {\r
- return EFI_NOT_READY;\r
+ Status = EFI_NOT_READY;\r
+ goto ON_EXIT;\r
}\r
\r
//\r
//\r
Udp4InstanceDeliverDgram (Instance);\r
\r
+ //\r
+ // Dispatch the DPC queued by the NotifyFunction of Token->Event.\r
+ //\r
+ NetLibDispatchDpc ();\r
+\r
ON_EXIT:\r
\r
- NET_RESTORE_TPL (OldTpl);\r
+ gBS->RestoreTPL (OldTpl);\r
\r
return Status;\r
}\r
return EFI_NOT_STARTED;\r
}\r
\r
- OldTpl = NET_RAISE_TPL (NET_TPL_LOCK);\r
+ OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
\r
//\r
// Cancle the tokens specified by Token for this instance.\r
//\r
Status = Udp4InstanceCancelToken (Instance, Token);\r
\r
- NET_RESTORE_TPL (OldTpl);\r
+ //\r
+ // Dispatch the DPC queued by the NotifyFunction of the canceled token's events.\r
+ //\r
+ NetLibDispatchDpc ();\r
+\r
+ gBS->RestoreTPL (OldTpl);\r
\r
return Status;\r
}\r