From 42c8a616ec45dce2f0981ecb13a3eb47450c921d Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 20 Sep 2008 00:39:55 +0000 Subject: [PATCH] - Merge aicom-network-fixes up to r36337 svn path=/trunk/; revision=36338 --- reactos/drivers/network/ndis/ndis/config.c | 14 ++------------ reactos/drivers/network/ndis/ndis/control.c | 1 + reactos/drivers/network/ndis/ndis/miniport.c | 9 ++++++--- reactos/drivers/network/tcpip/datalink/lan.c | 10 +++++----- reactos/drivers/network/tcpip/tcpip/fileobjs.c | 5 +++++ reactos/drivers/network/tcpip/tcpip/pool.c | 2 ++ reactos/lib/drivers/ip/network/transmit.c | 5 +---- reactos/lib/drivers/ip/transport/tcp/accept.c | 13 +++++++++---- reactos/lib/drivers/ip/transport/tcp/event.c | 7 ++++--- 9 files changed, 35 insertions(+), 31 deletions(-) diff --git a/reactos/drivers/network/ndis/ndis/config.c b/reactos/drivers/network/ndis/ndis/config.c index 233a1f453ea..c369d7a49ec 100644 --- a/reactos/drivers/network/ndis/ndis/config.c +++ b/reactos/drivers/network/ndis/ndis/config.c @@ -68,17 +68,6 @@ NdisWriteConfiguration( PVOID Data; WCHAR Buff[25]; - if(ParameterType != NdisParameterInteger && - ParameterType != NdisParameterHexInteger && - ParameterType != NdisParameterString && - ParameterType != NdisParameterMultiString && - ParameterType != NdisParameterBinary - ) - { - *Status = NDIS_STATUS_NOT_SUPPORTED; - return; - } - /* reset parameter type to standard reg types */ switch(ParameterType) { @@ -118,7 +107,7 @@ NdisWriteConfiguration( break; default: - *Status = NDIS_STATUS_FAILURE; + *Status = NDIS_STATUS_NOT_SUPPORTED; return; } @@ -342,6 +331,7 @@ NdisReadConfiguration( ) { NDIS_DbgPrint(MID_TRACE,("unsupported parameter type\n")); + *Status = NDIS_STATUS_NOT_SUPPORTED; return; } diff --git a/reactos/drivers/network/ndis/ndis/control.c b/reactos/drivers/network/ndis/ndis/control.c index 3dd216234d6..50139895ecd 100644 --- a/reactos/drivers/network/ndis/ndis/control.c +++ b/reactos/drivers/network/ndis/ndis/control.c @@ -87,6 +87,7 @@ NdisAcquireReadWriteLock( } } } + Lock->Context = PsGetCurrentThread(); LockState->LockState = 3; } } diff --git a/reactos/drivers/network/ndis/ndis/miniport.c b/reactos/drivers/network/ndis/ndis/miniport.c index 76317028a6f..ed3b99b4f57 100644 --- a/reactos/drivers/network/ndis/ndis/miniport.c +++ b/reactos/drivers/network/ndis/ndis/miniport.c @@ -818,7 +818,10 @@ VOID NTAPI MiniportWorker(IN PVOID WorkItem) KeLowerIrql(RaiseOldIrql); } } - if( NdisStatus != NDIS_STATUS_PENDING ) { + + if( NdisStatus == NDIS_STATUS_RESOURCES ) + MiniQueueWorkItem(Adapter, WorkItemType, WorkItemContext); + else if( NdisStatus != NDIS_STATUS_PENDING ) { NdisMSendComplete ( Adapter, (PNDIS_PACKET)WorkItemContext, NdisStatus ); Adapter->MiniportBusy = FALSE; @@ -1143,7 +1146,6 @@ NdisMRegisterAdapterShutdownHandler( * ShutdownHandler: Function to call to handle the bugcheck * NOTES: * - I'm not sure about ShutdownContext - * - FIXME - memory leak below */ { PLOGICAL_ADAPTER Adapter = (PLOGICAL_ADAPTER)MiniportHandle; @@ -1164,9 +1166,10 @@ NdisMRegisterAdapterShutdownHandler( BugcheckContext->ShutdownHandler = ShutdownHandler; BugcheckContext->DriverContext = ShutdownContext; - /* not sure if this needs to be initialized or not... oh well, it's a leak. */ BugcheckContext->CallbackRecord = ExAllocatePool(NonPagedPool, sizeof(KBUGCHECK_CALLBACK_RECORD)); + KeInitializeCallbackRecord(BugcheckContext->CallbackRecord); + KeRegisterBugCheckCallback(BugcheckContext->CallbackRecord, NdisIBugcheckCallback, BugcheckContext, sizeof(BugcheckContext), (PUCHAR)"Ndis Miniport"); } diff --git a/reactos/drivers/network/tcpip/datalink/lan.c b/reactos/drivers/network/tcpip/datalink/lan.c index c82ad0440d0..9a026bceb18 100644 --- a/reactos/drivers/network/tcpip/datalink/lan.c +++ b/reactos/drivers/network/tcpip/datalink/lan.c @@ -1207,11 +1207,6 @@ NDIS_STATUS LANRegisterAdapter( /* Convert returned link speed to bps (it is in 100bps increments) */ IF->Speed = Speed * 100L; - /* Add adapter to the adapter list */ - ExInterlockedInsertTailList(&AdapterListHead, - &IF->ListEntry, - &AdapterListLock); - /* Bind adapter to IP layer */ if( !BindAdapter(IF, RegistryPath) ) { TI_DbgPrint(DEBUG_DATALINK,("denying adapter %wZ (BindAdapter)\n", AdapterName)); @@ -1219,6 +1214,11 @@ NDIS_STATUS LANRegisterAdapter( return NDIS_STATUS_NOT_ACCEPTED; } + /* Add adapter to the adapter list */ + ExInterlockedInsertTailList(&AdapterListHead, + &IF->ListEntry, + &AdapterListLock); + TI_DbgPrint(DEBUG_DATALINK, ("Leaving.\n")); return NDIS_STATUS_SUCCESS; diff --git a/reactos/drivers/network/tcpip/tcpip/fileobjs.c b/reactos/drivers/network/tcpip/tcpip/fileobjs.c index 546df6f782d..054dd981701 100644 --- a/reactos/drivers/network/tcpip/tcpip/fileobjs.c +++ b/reactos/drivers/network/tcpip/tcpip/fileobjs.c @@ -409,6 +409,11 @@ NTSTATUS FileOpenConnection( Status = TCPSocket( Connection, AF_INET, SOCK_STREAM, IPPROTO_TCP ); + if( !NT_SUCCESS(Status) ) { + TCPFreeConnectionEndpoint( Connection ); + return Status; + } + /* Return connection endpoint file object */ Request->Handle.ConnectionContext = Connection; diff --git a/reactos/drivers/network/tcpip/tcpip/pool.c b/reactos/drivers/network/tcpip/tcpip/pool.c index 9ded1ac6639..0ca22a3eb31 100644 --- a/reactos/drivers/network/tcpip/tcpip/pool.c +++ b/reactos/drivers/network/tcpip/tcpip/pool.c @@ -26,6 +26,8 @@ PVOID PoolAllocateBuffer( Buffer = ExAllocatePool(NonPagedPool, Size); + RtlZeroMemory(Buffer, Size); + TI_DbgPrint(DEBUG_MEMORY, ("Allocated (%i) bytes at (0x%X).\n", Size, Buffer)); return Buffer; diff --git a/reactos/lib/drivers/ip/network/transmit.c b/reactos/lib/drivers/ip/network/transmit.c index bc9e1d9bcb4..3fdc7ff9e0b 100644 --- a/reactos/lib/drivers/ip/network/transmit.c +++ b/reactos/lib/drivers/ip/network/transmit.c @@ -34,10 +34,7 @@ VOID IPSendComplete ("Called. Context (0x%X) NdisPacket (0x%X) NdisStatus (0x%X)\n", Context, NdisPacket, NdisStatus)); - /* FIXME: Stop sending fragments and cleanup datagram buffers if - there was an error */ - - if (PrepareNextFragment(IFC)) { + if (NT_SUCCESS(NdisStatus) && PrepareNextFragment(IFC)) { /* A fragment was prepared for transmission, so send it */ IPSendFragment(IFC->NdisPacket, IFC->NCE, IFC); } else { diff --git a/reactos/lib/drivers/ip/transport/tcp/accept.c b/reactos/lib/drivers/ip/transport/tcp/accept.c index e13cd09baba..447d39b6162 100644 --- a/reactos/lib/drivers/ip/transport/tcp/accept.c +++ b/reactos/lib/drivers/ip/transport/tcp/accept.c @@ -117,6 +117,7 @@ VOID TCPAbortListenForSocket( PCONNECTION_ENDPOINT Listener, if( Bucket->AssociatedEndpoint == Connection ) { RemoveEntryList( ListEntry->Blink ); ExFreePool( Bucket ); + break; } } @@ -141,10 +142,14 @@ NTSTATUS TCPAccept if( Status == STATUS_PENDING ) { Bucket = ExAllocatePool( NonPagedPool, sizeof(*Bucket) ); - Bucket->AssociatedEndpoint = Connection; - Bucket->Request.RequestNotifyObject = Complete; - Bucket->Request.RequestContext = Context; - InsertHeadList( &Listener->ListenRequest, &Bucket->Entry ); + + if( Bucket ) { + Bucket->AssociatedEndpoint = Connection; + Bucket->Request.RequestNotifyObject = Complete; + Bucket->Request.RequestContext = Context; + InsertHeadList( &Listener->ListenRequest, &Bucket->Entry ); + } else + Status = STATUS_NO_MEMORY; } TcpipRecursiveMutexLeave( &TCPLock ); diff --git a/reactos/lib/drivers/ip/transport/tcp/event.c b/reactos/lib/drivers/ip/transport/tcp/event.c index 39de1147472..1e4c571eefb 100644 --- a/reactos/lib/drivers/ip/transport/tcp/event.c +++ b/reactos/lib/drivers/ip/transport/tcp/event.c @@ -104,8 +104,7 @@ int TCPPacketSend(void *ClientData, OSK_PCHAR data, OSK_UINT len ) { IPSendDatagram( &Packet, NCE, TCPPacketSendComplete, NULL ); - if( !NT_SUCCESS(NdisStatus) ) return OSK_EINVAL; - else return 0; + return 0; } int TCPSleep( void *ClientData, void *token, int priority, char *msg, @@ -144,7 +143,9 @@ int TCPSleep( void *ClientData, void *token, int priority, char *msg, TcpipRecursiveMutexEnter( &TCPLock, TRUE ); PoolFreeBuffer( SleepingThread ); - } + } else + return OSK_ENOBUFS; + TI_DbgPrint(DEBUG_TCP,("Waiting finished: %x\n", token)); return 0; }