- Leftover 2 from 42210
[reactos.git] / reactos / lib / drivers / ip / transport / udp / udp.c
index ed39e07..a723eea 100644 (file)
@@ -10,7 +10,6 @@
 
 #include "precomp.h"
 
-
 BOOLEAN UDPInitialized = FALSE;
 PORT_SET UDPPorts;
 
@@ -47,8 +46,6 @@ NTSTATUS AddUDPHeaderIPv4(
     if (!NT_SUCCESS(Status))
         return Status;
 
-    /* Build UDP header */
-    UDPHeader = (PUDP_HEADER)((ULONG_PTR)IPPacket->Data - sizeof(UDP_HEADER));
     /* Port values are already big-endian values */
     UDPHeader->SourcePort = LocalPort;
     UDPHeader->DestPort   = RemotePort;
@@ -57,8 +54,6 @@ NTSTATUS AddUDPHeaderIPv4(
     /* Length of UDP header and data */
     UDPHeader->Length     = WH2N(DataLength + sizeof(UDP_HEADER));
 
-    IPPacket->Data        = ((PCHAR)UDPHeader) + sizeof(UDP_HEADER);
-
     TI_DbgPrint(MID_TRACE, ("Packet: %d ip %d udp %d payload\n",
                            (PCHAR)UDPHeader - (PCHAR)IPPacket->Header,
                            (PCHAR)IPPacket->Data - (PCHAR)UDPHeader,
@@ -93,8 +88,6 @@ NTSTATUS BuildUDPPacket(
 
     /* FIXME: Assumes IPv4 */
     IPInitializePacket(Packet, IP_ADDRESS_V4);
-    if (!Packet)
-       return STATUS_INSUFFICIENT_RESOURCES;
 
     Packet->TotalSize = sizeof(IPv4_HEADER) + sizeof(UDP_HEADER) + DataLen;
 
@@ -168,44 +161,58 @@ NTSTATUS UDPSendDatagram(
     IP_PACKET Packet;
     PTA_IP_ADDRESS RemoteAddressTa = (PTA_IP_ADDRESS)ConnInfo->RemoteAddress;
     IP_ADDRESS RemoteAddress;
+    IP_ADDRESS LocalAddress;
     USHORT RemotePort;
     NTSTATUS Status;
     PNEIGHBOR_CACHE_ENTRY NCE;
 
     TI_DbgPrint(MID_TRACE,("Sending Datagram(%x %x %x %d)\n",
-                          AddrFile, ConnInfo, BufferData, DataSize));
+                                                  AddrFile, ConnInfo, BufferData, DataSize));
     TI_DbgPrint(MID_TRACE,("RemoteAddressTa: %x\n", RemoteAddressTa));
 
     switch( RemoteAddressTa->Address[0].AddressType ) {
     case TDI_ADDRESS_TYPE_IP:
-       RemoteAddress.Type = IP_ADDRESS_V4;
-       RemoteAddress.Address.IPv4Address =
-           RemoteAddressTa->Address[0].Address[0].in_addr;
-       RemotePort = RemoteAddressTa->Address[0].Address[0].sin_port;
-       break;
+               RemoteAddress.Type = IP_ADDRESS_V4;
+               RemoteAddress.Address.IPv4Address =
+                       RemoteAddressTa->Address[0].Address[0].in_addr;
+               RemotePort = RemoteAddressTa->Address[0].Address[0].sin_port;
+               break;
 
     default:
-       return STATUS_UNSUCCESSFUL;
+               return STATUS_UNSUCCESSFUL;
+    }
+
+    if(!(NCE = RouteGetRouteToDestination( &RemoteAddress ))) {
+               return STATUS_NETWORK_UNREACHABLE;
+    }
+
+    LocalAddress = AddrFile->Address;
+    if (AddrIsUnspecified(&LocalAddress))
+    {
+        /* If the local address is unspecified (0),
+         * then use the unicast address of the
+         * interface we're sending over
+         */
+        LocalAddress = NCE->Interface->Unicast;
     }
 
     Status = BuildUDPPacket( &Packet,
-                            &RemoteAddress,
-                            RemotePort,
-                            &AddrFile->Address,
-                            AddrFile->Port,
-                            BufferData,
-                            DataSize );
+                                                        &RemoteAddress,
+                                                        RemotePort,
+                                                        &LocalAddress,
+                                                        AddrFile->Port,
+                                                        BufferData,
+                                                        DataSize );
 
     if( !NT_SUCCESS(Status) )
-       return Status;
+               return Status;
 
-    if(!(NCE = RouteGetRouteToDestination( &RemoteAddress ))) {
+    if (!NT_SUCCESS(Status = IPSendDatagram( &Packet, NCE, UDPSendPacketComplete, NULL )))
+    {
         FreeNdisPacket(Packet.NdisPacket);
-       return STATUS_UNSUCCESSFUL;
+        return Status;
     }
 
-    IPSendDatagram( &Packet, NCE, UDPSendPacketComplete, NULL );
-
     return STATUS_SUCCESS;
 }
 
@@ -305,12 +312,12 @@ NTSTATUS UDPStartup(
  *     Status of operation
  */
 {
+  NTSTATUS Status;
+
 #ifdef __NTDRIVER__
   RtlZeroMemory(&UDPStats, sizeof(UDP_STATISTICS));
 #endif
   
-  NTSTATUS Status;
-
   Status = PortsStartup( &UDPPorts, 1, UDP_STARTING_PORT + UDP_DYNAMIC_PORTS );
 
   if( !NT_SUCCESS(Status) ) return Status;