diff --git a/reactos/drivers/network/afd/afd/info.c b/reactos/drivers/network/afd/afd/info.c index f2833af7b0d..12c76aa3599 100644 --- a/reactos/drivers/network/afd/afd/info.c +++ b/reactos/drivers/network/afd/afd/info.c @@ -83,11 +83,6 @@ AfdGetSockOrPeerName( PDEVICE_OBJECT DeviceObject, PIRP Irp, 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 @@ AfdGetSockOrPeerName( PDEVICE_OBJECT DeviceObject, PIRP Irp, 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, diff --git a/reactos/drivers/network/afd/afd/lock.c b/reactos/drivers/network/afd/afd/lock.c index 4f7f947d85a..b5178c1c506 100644 --- a/reactos/drivers/network/afd/afd/lock.c +++ b/reactos/drivers/network/afd/afd/lock.c @@ -25,7 +25,7 @@ PVOID LockRequest( PIRP Irp, PIO_STACK_LOCATION IrpSp ) { NULL ); if( Irp->MdlAddress ) { _SEH_TRY { - MmProbeAndLockPages( Irp->MdlAddress, KernelMode, IoModifyAccess ); + MmProbeAndLockPages( Irp->MdlAddress, Irp->RequestorMode, IoModifyAccess ); } _SEH_HANDLE { LockFailed = TRUE; } _SEH_END; diff --git a/reactos/drivers/network/afd/afd/read.c b/reactos/drivers/network/afd/afd/read.c index 365eafcabe8..c5604b2e92f 100644 --- a/reactos/drivers/network/afd/afd/read.c +++ b/reactos/drivers/network/afd/afd/read.c @@ -425,7 +425,7 @@ SatisfyPacketRecvRequest( PAFD_FCB FCB, PIRP Irp, *TotalBytesCopied = BytesToCopy; - if (!RecvReq->TdiFlags & TDI_RECEIVE_PEEK) { + if (!(RecvReq->TdiFlags & TDI_RECEIVE_PEEK)) { FCB->Recv.BytesUsed = 0; } } diff --git a/reactos/drivers/network/afd/afd/tdi.c b/reactos/drivers/network/afd/afd/tdi.c index dbe74cee242..c910293bd73 100644 --- a/reactos/drivers/network/afd/afd/tdi.c +++ b/reactos/drivers/network/afd/afd/tdi.c @@ -74,7 +74,7 @@ static NTSTATUS TdiCall( KeWaitForSingleObject( Event, Executive, - UserMode, + KernelMode, FALSE, NULL); Status = Iosb->Status; @@ -853,7 +853,7 @@ NTSTATUS TdiSend 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 @@ NTSTATUS TdiSend } _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 @@ NTSTATUS TdiReceive( 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 @@ NTSTATUS TdiReceive( _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 @@ NTSTATUS TdiReceiveDatagram( 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 @@ NTSTATUS TdiReceiveDatagram( } _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 @@ NTSTATUS TdiSendDatagram( 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 @@ NTSTATUS TdiSendDatagram( } _SEH_TRY { - MmProbeAndLockPages(Mdl, KernelMode, IoModifyAccess); + MmProbeAndLockPages(Mdl, (*Irp)->RequestorMode, IoModifyAccess); } _SEH_HANDLE { AFD_DbgPrint(MIN_TRACE, ("MmProbeAndLockPages() failed.\n")); IoFreeMdl(Mdl); diff --git a/reactos/drivers/network/tcpip/tcpip/fileobjs.c b/reactos/drivers/network/tcpip/tcpip/fileobjs.c index da337e8d951..414cf5de705 100644 --- a/reactos/drivers/network/tcpip/tcpip/fileobjs.c +++ b/reactos/drivers/network/tcpip/tcpip/fileobjs.c @@ -220,7 +220,7 @@ VOID DeleteConnectionEndpoint( RemoveEntryList(&Connection->ListEntry); TcpipReleaseSpinLock(&ConnectionEndpointListLock, OldIrql); - ExFreePool(Connection); + TCPFreeConnectionEndpoint(Connection); TI_DbgPrint(MAX_TRACE, ("Leaving.\n")); } @@ -387,8 +387,10 @@ NTSTATUS FileCloseAddress( 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 @@ NTSTATUS FileCloseConnection( 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; } diff --git a/reactos/lib/drivers/ip/ip.rbuild b/reactos/lib/drivers/ip/ip.rbuild index ac51d806498..d6ee690692a 100644 --- a/reactos/lib/drivers/ip/ip.rbuild +++ b/reactos/lib/drivers/ip/ip.rbuild @@ -1,6 +1,6 @@ - + include include diff --git a/reactos/lib/drivers/ip/network/icmp.c b/reactos/lib/drivers/ip/network/icmp.c index 3eeb98cb0b1..eda6ccb6a93 100644 --- a/reactos/lib/drivers/ip/network/icmp.c +++ b/reactos/lib/drivers/ip/network/icmp.c @@ -181,6 +181,7 @@ VOID ICMPTransmit( */ { PNEIGHBOR_CACHE_ENTRY NCE; + NTSTATUS Status; TI_DbgPrint(DEBUG_ICMP, ("Called.\n")); @@ -191,7 +192,11 @@ VOID ICMPTransmit( /* 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", diff --git a/reactos/lib/drivers/ip/network/ip.c b/reactos/lib/drivers/ip/network/ip.c index d49f15da0a6..2ea6796becc 100644 --- a/reactos/lib/drivers/ip/network/ip.c +++ b/reactos/lib/drivers/ip/network/ip.c @@ -150,12 +150,17 @@ VOID IPDispatchProtocol( 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 ); + } } diff --git a/reactos/lib/drivers/ip/network/loopback.c b/reactos/lib/drivers/ip/network/loopback.c index cd142b12a74..acb227ddef5 100644 --- a/reactos/lib/drivers/ip/network/loopback.c +++ b/reactos/lib/drivers/ip/network/loopback.c @@ -196,6 +196,7 @@ NDIS_STATUS LoopRegisterAdapter( AddrInitIPv4(&Loopback->Unicast, LOOPBACK_ADDRESS_IPv4); AddrInitIPv4(&Loopback->Netmask, LOOPBACK_ADDRMASK_IPv4); + AddrInitIPv4(&Loopback->Broadcast, LOOPBACK_BCASTADDR_IPv4); IPRegisterInterface(Loopback); diff --git a/reactos/lib/drivers/ip/network/neighbor.c b/reactos/lib/drivers/ip/network/neighbor.c index e9f13ffc41f..3e87ee55698 100644 --- a/reactos/lib/drivers/ip/network/neighbor.c +++ b/reactos/lib/drivers/ip/network/neighbor.c @@ -28,13 +28,20 @@ VOID NBCompleteSend( PVOID Context, 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 @@ VOID NBUpdateNeighbor( */ { 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 @@ BOOLEAN NBQueuePacket( * 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 @@ BOOLEAN NBQueuePacket( /* FIXME: Should we limit the number of queued packets? */ - Lock = &NCE->Table->Lock; + HashValue = *(PULONG)(&NCE->Address.Address); + HashValue ^= HashValue >> 16; + HashValue ^= HashValue >> 8; + HashValue ^= HashValue >> 4; + HashValue &= NB_HASHMASK; - TcpipAcquireSpinLock(Lock, &OldIrql); + 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 ); diff --git a/reactos/lib/drivers/ip/transport/tcp/accept.c b/reactos/lib/drivers/ip/transport/tcp/accept.c index 2132b17f6a1..b588b7db1df 100644 --- a/reactos/lib/drivers/ip/transport/tcp/accept.c +++ b/reactos/lib/drivers/ip/transport/tcp/accept.c @@ -112,13 +112,14 @@ VOID TCPAbortListenForSocket( PCONNECTION_ENDPOINT Listener, 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 ); diff --git a/reactos/lib/drivers/ip/transport/tcp/tcp.c b/reactos/lib/drivers/ip/transport/tcp/tcp.c index bdf7fd53a0a..5579813ba21 100644 --- a/reactos/lib/drivers/ip/transport/tcp/tcp.c +++ b/reactos/lib/drivers/ip/transport/tcp/tcp.c @@ -36,7 +36,6 @@ static VOID HandleSignalledConnection( PCONNECTION_ENDPOINT Connection, /* 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 @@ PCONNECTION_ENDPOINT TCPAllocateConnectionEndpoint( PVOID ClientContext ) { } 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 @@ VOID TCPRemoveIRP( PCONNECTION_ENDPOINT Endpoint, PIRP Irp ) { 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 ) {