]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Main.c
Use Mde library and definition instead of some native definitions in NetLib, to simpl...
[mirror_edk2.git] / MdeModulePkg / Universal / Network / Udp4Dxe / Udp4Main.c
index 4f897cb54bbaad75b5752fdfdbbd188c1872daae..eb013e91500e068460f0405e21c02fbe08501e64 100644 (file)
@@ -80,13 +80,13 @@ Udp4GetModeData (
     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
@@ -96,7 +96,7 @@ Udp4GetModeData (
   //\r
   Status = Ip->GetModeData (Ip, Ip4ModeData, MnpConfigData, SnpModeData);\r
 \r
-  NET_RESTORE_TPL (OldTpl);\r
+  gBS->RestoreTPL (OldTpl);\r
 \r
   return Status;\r
 }\r
@@ -153,6 +153,8 @@ Udp4Configure (
   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
@@ -167,13 +169,18 @@ Udp4Configure (
   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
@@ -232,7 +239,7 @@ Udp4Configure (
       //\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
@@ -251,9 +258,11 @@ Udp4Configure (
       //\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
@@ -275,19 +284,21 @@ Udp4Configure (
     //\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
@@ -332,13 +343,21 @@ Udp4Groups (
   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
@@ -351,7 +370,7 @@ Udp4Groups (
 \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
@@ -370,11 +389,7 @@ Udp4Groups (
   //\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
@@ -382,7 +397,7 @@ Udp4Groups (
 \r
 ON_EXIT:\r
 \r
-  NET_RESTORE_TPL (OldTpl);\r
+  gBS->RestoreTPL (OldTpl);\r
 \r
   return Status;\r
 }\r
@@ -506,6 +521,7 @@ Udp4Transmit (
   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
@@ -527,7 +543,7 @@ Udp4Transmit (
     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
@@ -590,25 +606,26 @@ Udp4Transmit (
     // 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
@@ -617,8 +634,9 @@ Udp4Transmit (
     //\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
@@ -635,8 +653,12 @@ Udp4Transmit (
   //\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
@@ -675,7 +697,7 @@ FREE_PACKET:
 \r
 ON_EXIT:\r
 \r
-  NET_RESTORE_TPL (OldTpl);\r
+  gBS->RestoreTPL (OldTpl);\r
 \r
   return Status;\r
 }\r
@@ -733,7 +755,7 @@ Udp4Receive (
     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
@@ -752,7 +774,8 @@ Udp4Receive (
   //\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
@@ -765,9 +788,14 @@ Udp4Receive (
   //\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
@@ -820,14 +848,19 @@ Udp4Cancel (
     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