]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Main.c
Import ArpDxe, Dhcp4Dxe, Ip4Dxe, Mtftp4Dxe, PxeBcDxe and PxeDhcp4Dxe.
[mirror_edk2.git] / MdeModulePkg / Universal / Network / Udp4Dxe / Udp4Main.c
index 5343bd5c4bedd152df1fedabb4d7eb67f7d848ed..b3daacba231d80d18f29a31dafecdfcdd77fc37f 100644 (file)
@@ -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
@@ -171,9 +173,14 @@ Udp4Configure (
 \r
   if (UdpConfigData != NULL) {\r
 \r
-    StationAddress = EFI_NTOHL (UdpConfigData->StationAddress);\r
-    SubnetMask     = EFI_NTOHL (UdpConfigData->SubnetMask);\r
-    RemoteAddress  = EFI_NTOHL (UdpConfigData->RemoteAddress);\r
+    NetCopyMem (&StationAddress, &UdpConfigData->StationAddress, sizeof (IP4_ADDR));\r
+    NetCopyMem (&SubnetMask, &UdpConfigData->SubnetMask, sizeof (IP4_ADDR));\r
+    NetCopyMem (&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
@@ -251,9 +258,11 @@ Udp4Configure (
       //\r
       // Pre calculate the checksum for the pseudo head, ignore the UDP length first.\r
       //\r
+      NetCopyMem (&LocalAddr, &Instance->ConfigData.StationAddress, sizeof (IP4_ADDR));\r
+      NetCopyMem (&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
@@ -332,13 +341,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
+    NetCopyMem (&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
@@ -370,11 +387,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
@@ -506,6 +519,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
@@ -590,25 +604,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
+      NetCopyMem (&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
+    NetCopyMem (&Source, &Override.SourceAddress, sizeof (IP4_ADDR));\r
+    NetCopyMem (&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 +632,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
+    NetCopyMem (&Destination, &ConfigData->RemoteAddress, sizeof (IP4_ADDR));\r
+\r
+    HeadSum = Instance->HeadSum;\r
   }\r
 \r
   //\r
@@ -635,8 +651,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
+    NetCopyMem (&Override.GatewayAddress, TxData->GatewayAddress, sizeof (EFI_IPv4_ADDRESS));\r
+  } else {\r
+    NetZeroMem (&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