mirror of
https://github.com/reactos/reactos.git
synced 2025-04-28 09:29:07 +00:00
[IP]
- Bind to the address specified in AddressFile instead of always binding to the outgoing interface's unicast address - Get the NCE using the local address (if specified) so we don't end up sending from one interface using another interface's address as the source svn path=/branches/aicom-network-branch/; revision=44810
This commit is contained in:
parent
94b49d77a3
commit
2caa9c0981
4 changed files with 53 additions and 20 deletions
|
@ -178,9 +178,6 @@ NTSTATUS ICMPSendDatagram(
|
||||||
|
|
||||||
TI_DbgPrint(MID_TRACE,("About to get route to destination\n"));
|
TI_DbgPrint(MID_TRACE,("About to get route to destination\n"));
|
||||||
|
|
||||||
if(!(NCE = RouteGetRouteToDestination( &RemoteAddress )))
|
|
||||||
return STATUS_NETWORK_UNREACHABLE;
|
|
||||||
|
|
||||||
LocalAddress = AddrFile->Address;
|
LocalAddress = AddrFile->Address;
|
||||||
if (AddrIsUnspecified(&LocalAddress))
|
if (AddrIsUnspecified(&LocalAddress))
|
||||||
{
|
{
|
||||||
|
@ -188,8 +185,16 @@ NTSTATUS ICMPSendDatagram(
|
||||||
* then use the unicast address of the
|
* then use the unicast address of the
|
||||||
* interface we're sending over
|
* interface we're sending over
|
||||||
*/
|
*/
|
||||||
|
if(!(NCE = RouteGetRouteToDestination( &RemoteAddress )))
|
||||||
|
return STATUS_NETWORK_UNREACHABLE;
|
||||||
|
|
||||||
LocalAddress = NCE->Interface->Unicast;
|
LocalAddress = NCE->Interface->Unicast;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(!(NCE = NBLocateNeighbor( &LocalAddress )))
|
||||||
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
Status = PrepareICMPPacket( NCE->Interface,
|
Status = PrepareICMPPacket( NCE->Interface,
|
||||||
&Packet,
|
&Packet,
|
||||||
|
|
|
@ -218,12 +218,6 @@ NTSTATUS RawIPSendDatagram(
|
||||||
|
|
||||||
TI_DbgPrint(MID_TRACE,("About to get route to destination\n"));
|
TI_DbgPrint(MID_TRACE,("About to get route to destination\n"));
|
||||||
|
|
||||||
if(!(NCE = RouteGetRouteToDestination( &RemoteAddress )))
|
|
||||||
{
|
|
||||||
KeReleaseSpinLock(&AddrFile->Lock, OldIrql);
|
|
||||||
return STATUS_NETWORK_UNREACHABLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
LocalAddress = AddrFile->Address;
|
LocalAddress = AddrFile->Address;
|
||||||
if (AddrIsUnspecified(&LocalAddress))
|
if (AddrIsUnspecified(&LocalAddress))
|
||||||
{
|
{
|
||||||
|
@ -231,8 +225,20 @@ NTSTATUS RawIPSendDatagram(
|
||||||
* then use the unicast address of the
|
* then use the unicast address of the
|
||||||
* interface we're sending over
|
* interface we're sending over
|
||||||
*/
|
*/
|
||||||
|
if(!(NCE = RouteGetRouteToDestination( &RemoteAddress ))) {
|
||||||
|
KeReleaseSpinLock(&AddrFile->Lock, OldIrql);
|
||||||
|
return STATUS_NETWORK_UNREACHABLE;
|
||||||
|
}
|
||||||
|
|
||||||
LocalAddress = NCE->Interface->Unicast;
|
LocalAddress = NCE->Interface->Unicast;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(!(NCE = NBLocateNeighbor( &LocalAddress ))) {
|
||||||
|
KeReleaseSpinLock(&AddrFile->Lock, OldIrql);
|
||||||
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Status = BuildRawIpPacket( AddrFile,
|
Status = BuildRawIpPacket( AddrFile,
|
||||||
&Packet,
|
&Packet,
|
||||||
|
|
|
@ -631,11 +631,6 @@ NTSTATUS TCPConnect
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(NCE = RouteGetRouteToDestination(&RemoteAddress)))
|
|
||||||
{
|
|
||||||
return STATUS_NETWORK_UNREACHABLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Freed in TCPSocketState */
|
/* Freed in TCPSocketState */
|
||||||
TI_DbgPrint(DEBUG_TCP,
|
TI_DbgPrint(DEBUG_TCP,
|
||||||
("Connecting to address %x:%x\n",
|
("Connecting to address %x:%x\n",
|
||||||
|
@ -644,10 +639,30 @@ NTSTATUS TCPConnect
|
||||||
|
|
||||||
AddressToConnect.sin_family = AF_INET;
|
AddressToConnect.sin_family = AF_INET;
|
||||||
AddressToBind = AddressToConnect;
|
AddressToBind = AddressToConnect;
|
||||||
AddressToBind.sin_addr.s_addr = NCE->Interface->Unicast.Address.IPv4Address;
|
|
||||||
|
|
||||||
KeAcquireSpinLock(&Connection->Lock, &OldIrql);
|
KeAcquireSpinLock(&Connection->Lock, &OldIrql);
|
||||||
|
|
||||||
|
if (!Connection->AddressFile)
|
||||||
|
{
|
||||||
|
KeReleaseSpinLock(&Connection->Lock, OldIrql);
|
||||||
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (AddrIsUnspecified(&Connection->AddressFile->Address))
|
||||||
|
{
|
||||||
|
if (!(NCE = RouteGetRouteToDestination(&RemoteAddress)))
|
||||||
|
{
|
||||||
|
KeReleaseSpinLock(&Connection->Lock, OldIrql);
|
||||||
|
return STATUS_NETWORK_UNREACHABLE;
|
||||||
|
}
|
||||||
|
|
||||||
|
AddressToBind.sin_addr.s_addr = NCE->Interface->Unicast.Address.IPv4Address;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
AddressToBind.sin_addr.s_addr = Connection->AddressFile->Address.Address.IPv4Address;
|
||||||
|
}
|
||||||
|
|
||||||
Status = TCPTranslateError
|
Status = TCPTranslateError
|
||||||
( OskitTCPBind( Connection->SocketContext,
|
( OskitTCPBind( Connection->SocketContext,
|
||||||
&AddressToBind,
|
&AddressToBind,
|
||||||
|
|
|
@ -193,11 +193,6 @@ NTSTATUS UDPSendDatagram(
|
||||||
return STATUS_UNSUCCESSFUL;
|
return STATUS_UNSUCCESSFUL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!(NCE = RouteGetRouteToDestination( &RemoteAddress ))) {
|
|
||||||
KeReleaseSpinLock(&AddrFile->Lock, OldIrql);
|
|
||||||
return STATUS_NETWORK_UNREACHABLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
LocalAddress = AddrFile->Address;
|
LocalAddress = AddrFile->Address;
|
||||||
if (AddrIsUnspecified(&LocalAddress))
|
if (AddrIsUnspecified(&LocalAddress))
|
||||||
{
|
{
|
||||||
|
@ -205,8 +200,20 @@ NTSTATUS UDPSendDatagram(
|
||||||
* then use the unicast address of the
|
* then use the unicast address of the
|
||||||
* interface we're sending over
|
* interface we're sending over
|
||||||
*/
|
*/
|
||||||
|
if(!(NCE = RouteGetRouteToDestination( &RemoteAddress ))) {
|
||||||
|
KeReleaseSpinLock(&AddrFile->Lock, OldIrql);
|
||||||
|
return STATUS_NETWORK_UNREACHABLE;
|
||||||
|
}
|
||||||
|
|
||||||
LocalAddress = NCE->Interface->Unicast;
|
LocalAddress = NCE->Interface->Unicast;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(!(NCE = NBLocateNeighbor( &LocalAddress ))) {
|
||||||
|
KeReleaseSpinLock(&AddrFile->Lock, OldIrql);
|
||||||
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Status = BuildUDPPacket( AddrFile,
|
Status = BuildUDPPacket( AddrFile,
|
||||||
&Packet,
|
&Packet,
|
||||||
|
|
Loading…
Reference in a new issue