Author: cgutman Date: Sun Nov 9 12:17:00 2008 New Revision: 37267
URL: http://svn.reactos.org/svn/reactos?rev=37267&view=rev Log: - Merge aicom-network-fixes up to r37266
Modified: trunk/reactos/drivers/network/afd/afd/info.c trunk/reactos/drivers/network/afd/afd/lock.c trunk/reactos/drivers/network/afd/afd/read.c trunk/reactos/drivers/network/afd/afd/tdi.c trunk/reactos/drivers/network/tcpip/tcpip/fileobjs.c trunk/reactos/lib/drivers/ip/ip.rbuild trunk/reactos/lib/drivers/ip/network/icmp.c trunk/reactos/lib/drivers/ip/network/ip.c trunk/reactos/lib/drivers/ip/network/loopback.c trunk/reactos/lib/drivers/ip/network/neighbor.c trunk/reactos/lib/drivers/ip/transport/tcp/accept.c trunk/reactos/lib/drivers/ip/transport/tcp/tcp.c
Modified: trunk/reactos/drivers/network/afd/afd/info.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/afd/afd/inf... ============================================================================== --- trunk/reactos/drivers/network/afd/afd/info.c [iso-8859-1] (original) +++ trunk/reactos/drivers/network/afd/afd/info.c [iso-8859-1] Sun Nov 9 12:17:00 2008 @@ -83,11 +83,6 @@
if( !SocketAcquireStateLock( FCB ) ) return LostSocket( Irp );
- if( FCB->AddressFile.Object == NULL) { - return UnlockAndMaybeComplete( FCB, STATUS_INVALID_PARAMETER, Irp, 0, - NULL ); - } - Mdl = IoAllocateMdl ( Irp->UserBuffer, IrpSp->Parameters.DeviceIoControl.OutputBufferLength, @@ -105,11 +100,21 @@
if( NT_SUCCESS(Status) ) { if( Local ) { + if( FCB->AddressFile.Object == NULL ) { + return UnlockAndMaybeComplete( FCB, STATUS_INVALID_PARAMETER, Irp, 0, + NULL ); + } + Status = TdiQueryInformation ( FCB->AddressFile.Object, TDI_QUERY_ADDRESS_INFO, Mdl ); } else { + if( FCB->Connection.Object == NULL ) { + return UnlockAndMaybeComplete( FCB, STATUS_INVALID_PARAMETER, Irp, 0, + NULL ); + } + if( NT_SUCCESS ( Status = TdiBuildNullConnectionInfo ( &ConnInfo,
Modified: trunk/reactos/drivers/network/afd/afd/lock.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/afd/afd/loc... ============================================================================== --- trunk/reactos/drivers/network/afd/afd/lock.c [iso-8859-1] (original) +++ trunk/reactos/drivers/network/afd/afd/lock.c [iso-8859-1] Sun Nov 9 12:17:00 2008 @@ -25,7 +25,7 @@ NULL ); if( Irp->MdlAddress ) { _SEH_TRY { - MmProbeAndLockPages( Irp->MdlAddress, KernelMode, IoModifyAccess ); + MmProbeAndLockPages( Irp->MdlAddress, Irp->RequestorMode, IoModifyAccess ); } _SEH_HANDLE { LockFailed = TRUE; } _SEH_END;
Modified: trunk/reactos/drivers/network/afd/afd/read.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/afd/afd/rea... ============================================================================== --- trunk/reactos/drivers/network/afd/afd/read.c [iso-8859-1] (original) +++ trunk/reactos/drivers/network/afd/afd/read.c [iso-8859-1] Sun Nov 9 12:17:00 2008 @@ -425,7 +425,7 @@
*TotalBytesCopied = BytesToCopy;
- if (!RecvReq->TdiFlags & TDI_RECEIVE_PEEK) { + if (!(RecvReq->TdiFlags & TDI_RECEIVE_PEEK)) { FCB->Recv.BytesUsed = 0; } }
Modified: trunk/reactos/drivers/network/afd/afd/tdi.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/afd/afd/tdi... ============================================================================== --- trunk/reactos/drivers/network/afd/afd/tdi.c [iso-8859-1] (original) +++ trunk/reactos/drivers/network/afd/afd/tdi.c [iso-8859-1] Sun Nov 9 12:17:00 2008 @@ -74,7 +74,7 @@ KeWaitForSingleObject( Event, Executive, - UserMode, + KernelMode, FALSE, NULL); Status = Iosb->Status; @@ -853,7 +853,7 @@ BufferLength, /* Length of buffer */ FALSE, /* Not secondary */ FALSE, /* Don't charge quota */ - *Irp); /* use IRP */ + *Irp); /* Use IRP */ if (!Mdl) { AFD_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); IoFreeIrp(*Irp); @@ -862,7 +862,7 @@ }
_SEH_TRY { - MmProbeAndLockPages(Mdl, KernelMode, IoModifyAccess); + MmProbeAndLockPages(Mdl, (*Irp)->RequestorMode, IoModifyAccess); } _SEH_HANDLE { AFD_DbgPrint(MIN_TRACE, ("MmProbeAndLockPages() failed.\n")); IoFreeMdl(Mdl); @@ -934,7 +934,7 @@ BufferLength, /* Length of buffer */ FALSE, /* Not secondary */ FALSE, /* Don't charge quota */ - *Irp); /* Don't use IRP */ + *Irp); /* Use IRP */ if (!Mdl) { AFD_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); IoFreeIrp(*Irp); @@ -944,7 +944,7 @@
_SEH_TRY { AFD_DbgPrint(MIN_TRACE, ("probe and lock\n")); - MmProbeAndLockPages(Mdl, KernelMode, IoModifyAccess); + MmProbeAndLockPages(Mdl, (*Irp)->RequestorMode, IoModifyAccess); AFD_DbgPrint(MIN_TRACE, ("probe and lock done\n")); } _SEH_HANDLE { AFD_DbgPrint(MIN_TRACE, ("MmProbeAndLockPages() failed.\n")); @@ -1034,7 +1034,7 @@ BufferLength, /* Length of buffer */ FALSE, /* Not secondary */ FALSE, /* Don't charge quota */ - *Irp); /* Don't use IRP */ + *Irp); /* Use IRP */ if (!Mdl) { AFD_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); IoFreeIrp(*Irp); @@ -1043,7 +1043,7 @@ }
_SEH_TRY { - MmProbeAndLockPages(Mdl, KernelMode, IoModifyAccess); + MmProbeAndLockPages(Mdl, (*Irp)->RequestorMode, IoModifyAccess); } _SEH_HANDLE { AFD_DbgPrint(MIN_TRACE, ("MmProbeAndLockPages() failed.\n")); IoFreeMdl(Mdl); @@ -1132,7 +1132,7 @@ BufferLength, /* Length of buffer */ FALSE, /* Not secondary */ FALSE, /* Don't charge quota */ - *Irp); /* Don't use IRP */ + *Irp); /* Use IRP */
if (!Mdl) { AFD_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); @@ -1142,7 +1142,7 @@ }
_SEH_TRY { - MmProbeAndLockPages(Mdl, KernelMode, IoModifyAccess); + MmProbeAndLockPages(Mdl, (*Irp)->RequestorMode, IoModifyAccess); } _SEH_HANDLE { AFD_DbgPrint(MIN_TRACE, ("MmProbeAndLockPages() failed.\n")); IoFreeMdl(Mdl);
Modified: trunk/reactos/drivers/network/tcpip/tcpip/fileobjs.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/tcpip/tcpip... ============================================================================== --- trunk/reactos/drivers/network/tcpip/tcpip/fileobjs.c [iso-8859-1] (original) +++ trunk/reactos/drivers/network/tcpip/tcpip/fileobjs.c [iso-8859-1] Sun Nov 9 12:17:00 2008 @@ -220,7 +220,7 @@ RemoveEntryList(&Connection->ListEntry); TcpipReleaseSpinLock(&ConnectionEndpointListLock, OldIrql);
- ExFreePool(Connection); + TCPFreeConnectionEndpoint(Connection);
TI_DbgPrint(MAX_TRACE, ("Leaving.\n")); } @@ -387,8 +387,10 @@ switch (AddrFile->Protocol) { case IPPROTO_TCP: TCPFreePort( AddrFile->Port ); - if( AddrFile->Listener ) - TCPClose( AddrFile->Listener ); + if( AddrFile->Listener ) { + TCPClose( AddrFile->Listener ); + ExFreePool( AddrFile->Listener ); + } break;
case IPPROTO_UDP: @@ -488,20 +490,18 @@ PTDI_REQUEST Request) { PCONNECTION_ENDPOINT Connection; - NTSTATUS Status = STATUS_SUCCESS;
TI_DbgPrint(MID_TRACE, ("Called.\n"));
Connection = Request->Handle.ConnectionContext;
TcpipRecursiveMutexEnter( &TCPLock, TRUE ); - TCPClose(Connection); DeleteConnectionEndpoint(Connection); TcpipRecursiveMutexLeave( &TCPLock );
TI_DbgPrint(MAX_TRACE, ("Leaving.\n"));
- return Status; + return STATUS_SUCCESS; }
Modified: trunk/reactos/lib/drivers/ip/ip.rbuild URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/drivers/ip/ip.rbuild?re... ============================================================================== --- trunk/reactos/lib/drivers/ip/ip.rbuild [iso-8859-1] (original) +++ trunk/reactos/lib/drivers/ip/ip.rbuild [iso-8859-1] Sun Nov 9 12:17:00 2008 @@ -1,6 +1,6 @@ <?xml version="1.0"?> <!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd"> -<module name="ip" type="staticlibrary" allowwarnings="true"> +<module name="ip" type="staticlibrary"> <define name="__NTDRIVER__"/> <include base="tcpip">include</include> <include base="oskittcp">include</include>
Modified: trunk/reactos/lib/drivers/ip/network/icmp.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/drivers/ip/network/icmp... ============================================================================== --- trunk/reactos/lib/drivers/ip/network/icmp.c [iso-8859-1] (original) +++ trunk/reactos/lib/drivers/ip/network/icmp.c [iso-8859-1] Sun Nov 9 12:17:00 2008 @@ -181,6 +181,7 @@ */ { PNEIGHBOR_CACHE_ENTRY NCE; + NTSTATUS Status;
TI_DbgPrint(DEBUG_ICMP, ("Called.\n"));
@@ -191,7 +192,11 @@ /* Get a route to the destination address */ if ((NCE = RouteGetRouteToDestination(&IPPacket->DstAddr))) { /* Send the packet */ - IPSendDatagram(IPPacket, NCE, Complete, Context); + Status = IPSendDatagram(IPPacket, NCE, Complete, Context); + if (!NT_SUCCESS(Status)) + { + Complete(Context, IPPacket->NdisPacket, Status); + } } else { /* No route to destination (or no free resources) */ TI_DbgPrint(DEBUG_ICMP, ("No route to destination address 0x%X.\n",
Modified: trunk/reactos/lib/drivers/ip/network/ip.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/drivers/ip/network/ip.c... ============================================================================== --- trunk/reactos/lib/drivers/ip/network/ip.c [iso-8859-1] (original) +++ trunk/reactos/lib/drivers/ip/network/ip.c [iso-8859-1] Sun Nov 9 12:17:00 2008 @@ -150,12 +150,17 @@ Protocol = 0; }
- /* Call the appropriate protocol handler */ - (*ProtocolTable[Protocol])(Interface, IPPacket); - /* Special case for ICMP -- ICMP can be caught by a SOCK_RAW but also - * must be handled here. */ - if( Protocol == IPPROTO_ICMP ) - ICMPReceive( Interface, IPPacket ); + if (Protocol < IP_PROTOCOL_TABLE_SIZE && + Protocol >= 0) + { + /* Call the appropriate protocol handler */ + (*ProtocolTable[Protocol])(Interface, IPPacket); + + /* Special case for ICMP -- ICMP can be caught by a SOCK_RAW but also + * must be handled here. */ + if( Protocol == IPPROTO_ICMP ) + ICMPReceive( Interface, IPPacket ); + } }
Modified: trunk/reactos/lib/drivers/ip/network/loopback.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/drivers/ip/network/loop... ============================================================================== --- trunk/reactos/lib/drivers/ip/network/loopback.c [iso-8859-1] (original) +++ trunk/reactos/lib/drivers/ip/network/loopback.c [iso-8859-1] Sun Nov 9 12:17:00 2008 @@ -196,6 +196,7 @@
AddrInitIPv4(&Loopback->Unicast, LOOPBACK_ADDRESS_IPv4); AddrInitIPv4(&Loopback->Netmask, LOOPBACK_ADDRMASK_IPv4); + AddrInitIPv4(&Loopback->Broadcast, LOOPBACK_BCASTADDR_IPv4);
IPRegisterInterface(Loopback);
Modified: trunk/reactos/lib/drivers/ip/network/neighbor.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/drivers/ip/network/neig... ============================================================================== --- trunk/reactos/lib/drivers/ip/network/neighbor.c [iso-8859-1] (original) +++ trunk/reactos/lib/drivers/ip/network/neighbor.c [iso-8859-1] Sun Nov 9 12:17:00 2008 @@ -28,13 +28,20 @@ VOID NBSendPackets( PNEIGHBOR_CACHE_ENTRY NCE ) { PLIST_ENTRY PacketEntry; PNEIGHBOR_PACKET Packet; + UINT HashValue;
if(!(NCE->State & NUD_CONNECTED)) return;
+ HashValue = *(PULONG)(&NCE->Address.Address); + HashValue ^= HashValue >> 16; + HashValue ^= HashValue >> 8; + HashValue ^= HashValue >> 4; + HashValue &= NB_HASHMASK; + /* Send any waiting packets */ PacketEntry = ExInterlockedRemoveHeadList(&NCE->PacketQueue, - &NCE->Table->Lock); + &NeighborCache[HashValue].Lock); if( PacketEntry != NULL ) { Packet = CONTAINING_RECORD( PacketEntry, NEIGHBOR_PACKET, Next );
@@ -333,15 +340,22 @@ */ { KIRQL OldIrql; + UINT HashValue;
TI_DbgPrint(DEBUG_NCACHE, ("Called. NCE (0x%X) LinkAddress (0x%X) State (0x%X).\n", NCE, LinkAddress, State));
- TcpipAcquireSpinLock(&NCE->Table->Lock, &OldIrql); + HashValue = *(PULONG)(&NCE->Address.Address); + HashValue ^= HashValue >> 16; + HashValue ^= HashValue >> 8; + HashValue ^= HashValue >> 4; + HashValue &= NB_HASHMASK; + + TcpipAcquireSpinLock(&NeighborCache[HashValue].Lock, &OldIrql);
RtlCopyMemory(NCE->LinkAddress, LinkAddress, NCE->LinkAddressLength); NCE->State = State;
- TcpipReleaseSpinLock(&NCE->Table->Lock, OldIrql); + TcpipReleaseSpinLock(&NeighborCache[HashValue].Lock, OldIrql);
if( NCE->State & NUD_CONNECTED ) NBSendPackets( NCE ); @@ -444,9 +458,9 @@ * TRUE if the packet was successfully queued, FALSE if not */ { - PKSPIN_LOCK Lock; KIRQL OldIrql; PNEIGHBOR_PACKET Packet; + UINT HashValue;
TI_DbgPrint (DEBUG_NCACHE, @@ -457,16 +471,20 @@
/* FIXME: Should we limit the number of queued packets? */
- Lock = &NCE->Table->Lock; - - TcpipAcquireSpinLock(Lock, &OldIrql); + HashValue = *(PULONG)(&NCE->Address.Address); + HashValue ^= HashValue >> 16; + HashValue ^= HashValue >> 8; + HashValue ^= HashValue >> 4; + HashValue &= NB_HASHMASK; + + TcpipAcquireSpinLock(&NeighborCache[HashValue].Lock, &OldIrql);
Packet->Complete = PacketComplete; Packet->Context = PacketContext; Packet->Packet = NdisPacket; InsertTailList( &NCE->PacketQueue, &Packet->Next );
- TcpipReleaseSpinLock(Lock, OldIrql); + TcpipReleaseSpinLock(&NeighborCache[HashValue].Lock, OldIrql);
if( NCE->State & NUD_CONNECTED ) NBSendPackets( NCE );
Modified: trunk/reactos/lib/drivers/ip/transport/tcp/accept.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/drivers/ip/transport/tc... ============================================================================== --- trunk/reactos/lib/drivers/ip/transport/tcp/accept.c [iso-8859-1] (original) +++ trunk/reactos/lib/drivers/ip/transport/tcp/accept.c [iso-8859-1] Sun Nov 9 12:17:00 2008 @@ -112,13 +112,14 @@ ListEntry = Listener->ListenRequest.Flink; while ( ListEntry != &Listener->ListenRequest ) { Bucket = CONTAINING_RECORD(ListEntry, TDI_BUCKET, Entry); - ListEntry = ListEntry->Flink;
if( Bucket->AssociatedEndpoint == Connection ) { - RemoveEntryList( ListEntry->Blink ); + RemoveEntryList( &Bucket->Entry ); ExFreePool( Bucket ); break; } + + ListEntry = ListEntry->Flink; }
TcpipRecursiveMutexLeave( &TCPLock );
Modified: trunk/reactos/lib/drivers/ip/transport/tcp/tcp.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/drivers/ip/transport/tc... ============================================================================== --- trunk/reactos/lib/drivers/ip/transport/tcp/tcp.c [iso-8859-1] (original) +++ trunk/reactos/lib/drivers/ip/transport/tcp/tcp.c [iso-8859-1] Sun Nov 9 12:17:00 2008 @@ -36,7 +36,6 @@ /* Things that can happen when we try the initial connection */ if( NewState & SEL_CONNECT ) { while( !IsListEmpty( &Connection->ConnectRequest ) ) { - Connection->State |= NewState; Entry = RemoveHeadList( &Connection->ConnectRequest ); TI_DbgPrint(DEBUG_TCP, ("Connect Event\n"));
@@ -283,8 +282,7 @@ }
VOID TCPFreeConnectionEndpoint( PCONNECTION_ENDPOINT Connection ) { - TI_DbgPrint(MAX_TRACE,("FIXME: Cancel all pending requests\n")); - /* XXX Cancel all pending requests */ + TCPClose( Connection ); ExFreePool( Connection ); }
@@ -839,7 +837,7 @@
TcpipAcquireSpinLock( &Endpoint->Lock, &OldIrql );
- for( i = 0; i < sizeof( ListHead ) / sizeof( ListHead[0] ); i++ ) { + for( i = 0; i < 4; i++ ) { for( Entry = ListHead[i]->Flink; Entry != ListHead[i]; Entry = Entry->Flink ) {