From 12604c6f997b3dae92ae93d3d7fa46509ce684e5 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 27 Sep 2008 21:25:27 +0000 Subject: [PATCH] - Merge aicom-network-fixes up to r36558 svn path=/trunk/; revision=36559 --- reactos/drivers/network/afd/afd/tdiconn.c | 13 ++-- .../drivers/network/dd/ne2000/ne2000/8390.c | 2 + .../drivers/network/dd/ne2000/ne2000/main.c | 11 ++- .../drivers/network/ndis/include/miniport.h | 2 +- reactos/drivers/network/ndis/ndis/miniport.c | 73 ++++++++++++++----- reactos/drivers/network/ndis/ndis/protocol.c | 27 ++----- reactos/drivers/network/tcpip/datalink/lan.c | 13 +--- reactos/lib/drivers/ip/network/ip.c | 8 +- 8 files changed, 83 insertions(+), 66 deletions(-) diff --git a/reactos/drivers/network/afd/afd/tdiconn.c b/reactos/drivers/network/afd/afd/tdiconn.c index b574020a6aa..cb12dace20e 100644 --- a/reactos/drivers/network/afd/afd/tdiconn.c +++ b/reactos/drivers/network/afd/afd/tdiconn.c @@ -194,6 +194,8 @@ TdiBuildConnectionInfoPair ULONG TdiAddressSize; PTDI_CONNECTION_INFORMATION FromTdiConn, ToTdiConn; + if (!From) return STATUS_INVALID_PARAMETER; + /* FIXME: Get from socket information */ TdiAddressSize = TdiAddressSizeFromType(From->Address[0].AddressType); SizeOfEntry = TdiAddressSize + sizeof(TDI_CONNECTION_INFORMATION); @@ -207,15 +209,10 @@ TdiBuildConnectionInfoPair RtlZeroMemory( LayoutFrame, 2 * SizeOfEntry ); - FromTdiConn = (PTDI_CONNECTION_INFORMATION)LayoutFrame; - ToTdiConn = (PTDI_CONNECTION_INFORMATION)LayoutFrame + SizeOfEntry; + FromTdiConn = (PTDI_CONNECTION_INFORMATION)LayoutFrame; + ToTdiConn = (PTDI_CONNECTION_INFORMATION)LayoutFrame + SizeOfEntry; - if (From != NULL) { - TdiBuildConnectionInfoInPlace( FromTdiConn, From ); - } else { - TdiBuildNullConnectionInfoInPlace( FromTdiConn, - From->Address[0].AddressType ); - } + TdiBuildConnectionInfoInPlace( FromTdiConn, From ); TdiBuildConnectionInfoInPlace( ToTdiConn, To ); diff --git a/reactos/drivers/network/dd/ne2000/ne2000/8390.c b/reactos/drivers/network/dd/ne2000/ne2000/8390.c index bfe993434ea..7e9d58e6c9a 100644 --- a/reactos/drivers/network/dd/ne2000/ne2000/8390.c +++ b/reactos/drivers/network/dd/ne2000/ne2000/8390.c @@ -544,6 +544,8 @@ static VOID NICStartTransmit( NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); + if (Adapter->TXCurrent < 0) return; + //FrameStart = Adapter->TXStart + Adapter->TXCurrent * DRIVER_BLOCK_SIZE; //FrameStart = Adapter->TXStart; FrameStart = (UCHAR)(Adapter->TXStart + (UCHAR)(Adapter->TXCurrent * BUFFERS_PER_TX_BUF)); diff --git a/reactos/drivers/network/dd/ne2000/ne2000/main.c b/reactos/drivers/network/dd/ne2000/ne2000/main.c index c948665ae12..0def256dea9 100644 --- a/reactos/drivers/network/dd/ne2000/ne2000/main.c +++ b/reactos/drivers/network/dd/ne2000/ne2000/main.c @@ -669,13 +669,9 @@ static NDIS_STATUS STDCALL MiniportSend( ASSERT_IRQL_EQUAL(DISPATCH_LEVEL); +#ifndef NOCARD NDIS_DbgPrint(MID_TRACE, ("Queueing packet.\n")); -#ifdef NOCARD - NdisMSendComplete(Adapter->MiniportAdapterHandle, - Packet, - NDIS_STATUS_SUCCESS); -#else /* Queue the packet on the transmit queue */ RESERVED(Packet)->Next = NULL; if (Adapter->TXQueueHead == NULL) { @@ -688,8 +684,11 @@ static NDIS_STATUS STDCALL MiniportSend( /* Transmit the packet */ NICTransmit(Adapter); -#endif + return NDIS_STATUS_PENDING; +#else + return NDIS_STATUS_SUCCESS; +#endif } diff --git a/reactos/drivers/network/ndis/include/miniport.h b/reactos/drivers/network/ndis/include/miniport.h index 3423e7e8388..8f090a5b155 100644 --- a/reactos/drivers/network/ndis/include/miniport.h +++ b/reactos/drivers/network/ndis/include/miniport.h @@ -146,7 +146,7 @@ MiniDequeueWorkItem( NDIS_STATUS MiniDoRequest( - PNDIS_MINIPORT_BLOCK Adapter, + PLOGICAL_ADAPTER Adapter, PNDIS_REQUEST NdisRequest); BOOLEAN diff --git a/reactos/drivers/network/ndis/ndis/miniport.c b/reactos/drivers/network/ndis/ndis/miniport.c index bf77c746cfb..d05f7cb332f 100644 --- a/reactos/drivers/network/ndis/ndis/miniport.c +++ b/reactos/drivers/network/ndis/ndis/miniport.c @@ -326,8 +326,10 @@ MiniRequestComplete( Request, Status); } - KeLowerIrql(OldIrql); + KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock); Adapter->MiniportBusy = FALSE; + KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock); + KeLowerIrql(OldIrql); } VOID NTAPI @@ -357,8 +359,10 @@ MiniSendComplete( AdapterBinding->NdisOpenBlock.ProtocolBindingContext, Packet, Status); - KeLowerIrql(OldIrql); + KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock); Adapter->MiniportBusy = FALSE; + KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock); + KeLowerIrql(OldIrql); } @@ -392,8 +396,10 @@ MiniTransferDataComplete( AdapterBinding->NdisOpenBlock.ProtocolBindingContext, Packet, Status); - KeLowerIrql(OldIrql); + KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock); Adapter->MiniportBusy = FALSE; + KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock); + KeLowerIrql(OldIrql); } @@ -619,14 +625,18 @@ MiniReset( * Status of the operation */ { - NDIS_STATUS Status = NDIS_STATUS_FAILURE; + NDIS_STATUS Status; KIRQL OldIrql; - /* FIXME: What should we return if there isn't a reset handler? */ + if (Adapter->MiniportBusy) { + KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql); + MiniQueueWorkItem(Adapter, NdisWorkItemResetRequested, NULL); + KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql); + return NDIS_STATUS_PENDING; + } KeRaiseIrql(DISPATCH_LEVEL, &OldIrql); - if (Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.ResetHandler) - Status = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.ResetHandler)( + Status = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.ResetHandler)( Adapter->NdisMiniportBlock.MiniportAdapterContext, AddressingReset); KeLowerIrql(OldIrql); @@ -763,7 +773,7 @@ MiniDequeueWorkItem( NDIS_STATUS MiniDoRequest( - PNDIS_MINIPORT_BLOCK Adapter, + PLOGICAL_ADAPTER Adapter, PNDIS_REQUEST NdisRequest) /* * FUNCTION: Sends a request to a miniport @@ -778,14 +788,14 @@ MiniDoRequest( KIRQL OldIrql; NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n")); - Adapter->MediaRequest = NdisRequest; + Adapter->NdisMiniportBlock.MediaRequest = NdisRequest; KeRaiseIrql(DISPATCH_LEVEL, &OldIrql); switch (NdisRequest->RequestType) { case NdisRequestQueryInformation: - Status = (*Adapter->DriverHandle->MiniportCharacteristics.QueryInformationHandler)( - Adapter->MiniportAdapterContext, + Status = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.QueryInformationHandler)( + Adapter->NdisMiniportBlock.MiniportAdapterContext, NdisRequest->DATA.QUERY_INFORMATION.Oid, NdisRequest->DATA.QUERY_INFORMATION.InformationBuffer, NdisRequest->DATA.QUERY_INFORMATION.InformationBufferLength, @@ -794,8 +804,8 @@ MiniDoRequest( break; case NdisRequestSetInformation: - Status = (*Adapter->DriverHandle->MiniportCharacteristics.SetInformationHandler)( - Adapter->MiniportAdapterContext, + Status = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.SetInformationHandler)( + Adapter->NdisMiniportBlock.MiniportAdapterContext, NdisRequest->DATA.SET_INFORMATION.Oid, NdisRequest->DATA.SET_INFORMATION.InformationBuffer, NdisRequest->DATA.SET_INFORMATION.InformationBufferLength, @@ -807,6 +817,12 @@ MiniDoRequest( Status = NDIS_STATUS_FAILURE; } + if (Status == NDIS_STATUS_PENDING) { + KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock); + Adapter->MiniportBusy = TRUE; + KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock); + } + KeLowerIrql(OldIrql); return Status; } @@ -829,8 +845,10 @@ NdisMQueryInformationComplete( KeRaiseIrql(DISPATCH_LEVEL, &OldIrql); if( Adapter->NdisMiniportBlock.QueryCompleteHandler ) (Adapter->NdisMiniportBlock.QueryCompleteHandler)(MiniportAdapterHandle, Status); - KeLowerIrql(OldIrql); + KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock); Adapter->MiniportBusy = FALSE; + KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock); + KeLowerIrql(OldIrql); } VOID NTAPI MiniportWorker(IN PVOID WorkItem) @@ -841,6 +859,7 @@ VOID NTAPI MiniportWorker(IN PVOID WorkItem) NDIS_STATUS NdisStatus; PVOID WorkItemContext; NDIS_WORK_ITEM_TYPE WorkItemType; + BOOLEAN AddressingReset; KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql); @@ -938,6 +957,16 @@ VOID NTAPI MiniportWorker(IN PVOID WorkItem) break; case NdisWorkItemResetRequested: + KeRaiseIrql(DISPATCH_LEVEL, &OldIrql); + NdisStatus = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.ResetHandler)( + Adapter->NdisMiniportBlock.MiniportAdapterContext, + &AddressingReset); + KeLowerIrql(OldIrql); + + if (NdisStatus == NDIS_STATUS_PENDING) + break; + + MiniResetComplete(Adapter, NdisStatus, AddressingReset); break; case NdisWorkItemResetInProgress: @@ -947,7 +976,7 @@ VOID NTAPI MiniportWorker(IN PVOID WorkItem) break; case NdisWorkItemRequest: - NdisStatus = MiniDoRequest(&Adapter->NdisMiniportBlock, (PNDIS_REQUEST)WorkItemContext); + NdisStatus = MiniDoRequest(Adapter, (PNDIS_REQUEST)WorkItemContext); if (NdisStatus == NDIS_STATUS_PENDING) break; @@ -976,8 +1005,11 @@ VOID NTAPI MiniportWorker(IN PVOID WorkItem) } } - if( NdisStatus != NDIS_STATUS_PENDING ) - Adapter->MiniportBusy = FALSE; + if( NdisStatus != NDIS_STATUS_PENDING ) { + KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql); + Adapter->MiniportBusy = FALSE; + KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql); + } ExFreePool(WorkItem); } @@ -1004,6 +1036,7 @@ VOID NTAPI MiniportDpc( NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n")); NdisWorkItem = ExAllocatePool(NonPagedPool, sizeof(NDIS_WORK_ITEM)); + if (!NdisWorkItem) return; WorkItem = (PWORK_QUEUE_ITEM)NdisWorkItem->WrapperReserved; @@ -1496,7 +1529,7 @@ NdisIPnPStartDevice( if (Stack->Parameters.StartDevice.AllocatedResourcesTranslated != NULL) { - ResourceCount = Stack->Parameters.StartDevice.AllocatedResources->List[0]. + ResourceCount = Stack->Parameters.StartDevice.AllocatedResourcesTranslated->List[0]. PartialResourceList.Count; ResourceListSize = FIELD_OFFSET(CM_RESOURCE_LIST, List[0].PartialResourceList. @@ -2108,8 +2141,10 @@ NdisMSetInformationComplete( ASSERT(Adapter); KeRaiseIrql(DISPATCH_LEVEL, &OldIrql); (Adapter->NdisMiniportBlock.SetCompleteHandler)(MiniportAdapterHandle, Status); - KeLowerIrql(OldIrql); + KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock); Adapter->MiniportBusy = FALSE; + KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock); + KeLowerIrql(OldIrql); } diff --git a/reactos/drivers/network/ndis/ndis/protocol.c b/reactos/drivers/network/ndis/ndis/protocol.c index fdb804f7f52..7ea8dc46b33 100644 --- a/reactos/drivers/network/ndis/ndis/protocol.c +++ b/reactos/drivers/network/ndis/ndis/protocol.c @@ -43,6 +43,8 @@ NdisCompleteBindAdapter( { PROTOCOL_BINDING *Protocol = (PROTOCOL_BINDING *)BindAdapterContext; + if (!NT_SUCCESS(Status)) return; + /* Put protocol binding struct on global list */ ExInterlockedInsertTailList(&ProtocolListHead, &Protocol->ListEntry, &ProtocolListLock); } @@ -119,8 +121,6 @@ ProRequest( */ { KIRQL OldIrql; - BOOLEAN QueueWorkItem = FALSE; - NDIS_STATUS NdisStatus; PADAPTER_BINDING AdapterBinding; PLOGICAL_ADAPTER Adapter; PNDIS_REQUEST_MAC_BLOCK MacBlock = (PNDIS_REQUEST_MAC_BLOCK)NdisRequest->MacReserved; @@ -141,26 +141,15 @@ ProRequest( NDIS_DbgPrint(MAX_TRACE, ("acquiring miniport block lock\n")); KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql); { - if(Adapter->MiniportBusy) - QueueWorkItem = TRUE; + if (Adapter->MiniportBusy) { + MiniQueueWorkItem(Adapter, NdisWorkItemRequest, (PVOID)NdisRequest); + KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql); + return NDIS_STATUS_PENDING; + } } - - /* MiniQueueWorkItem must be called at IRQL >= DISPATCH_LEVEL */ - if (QueueWorkItem) - { - MiniQueueWorkItem(Adapter, NdisWorkItemRequest, (PVOID)NdisRequest); - KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql); - return NDIS_STATUS_PENDING; - } - KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql); - NdisStatus = MiniDoRequest(&Adapter->NdisMiniportBlock, NdisRequest); - - if( NdisStatus == NDIS_STATUS_PENDING ) - Adapter->MiniportBusy = TRUE; - - return NdisStatus; + return MiniDoRequest(Adapter, NdisRequest); } diff --git a/reactos/drivers/network/tcpip/datalink/lan.c b/reactos/drivers/network/tcpip/datalink/lan.c index 9a026bceb18..930b6ba3dd5 100644 --- a/reactos/drivers/network/tcpip/datalink/lan.c +++ b/reactos/drivers/network/tcpip/datalink/lan.c @@ -485,16 +485,9 @@ NDIS_STATUS STDCALL ProtocolReceive( } else { - if (NdisStatus == NDIS_STATUS_SUCCESS) - { - NdisTransferData(&NdisStatus, Adapter->NdisHandle, - MacReceiveContext, 0, PacketSize, - NdisPacket, &BytesTransferred); - } - else - { - BytesTransferred = 0; - } + NdisTransferData(&NdisStatus, Adapter->NdisHandle, + MacReceiveContext, 0, PacketSize, + NdisPacket, &BytesTransferred); } TI_DbgPrint(DEBUG_DATALINK, ("Calling complete\n")); diff --git a/reactos/lib/drivers/ip/network/ip.c b/reactos/lib/drivers/ip/network/ip.c index 4daf364151b..d49f15da0a6 100644 --- a/reactos/lib/drivers/ip/network/ip.c +++ b/reactos/lib/drivers/ip/network/ip.c @@ -242,12 +242,14 @@ VOID IPAddInterfaceRoute( PIP_INTERFACE IF ) { NUD_PERMANENT); if (!NCE) { TI_DbgPrint(MIN_TRACE, ("Could not create NCE.\n")); + return; } AddrWidenAddress( &NetworkAddress, &IF->Unicast, &IF->Netmask ); if (!RouterAddRoute(&NetworkAddress, &IF->Netmask, NCE, 1)) { TI_DbgPrint(MIN_TRACE, ("Could not add route due to insufficient resources.\n")); + return; } /* Allow TCP to hang some configuration on this interface */ @@ -352,10 +354,10 @@ VOID IPRegisterProtocol( * To unregister a protocol handler, call this function with Handler = NULL */ { -#ifdef DBG - if (ProtocolNumber >= IP_PROTOCOL_TABLE_SIZE) + if (ProtocolNumber >= IP_PROTOCOL_TABLE_SIZE) { TI_DbgPrint(MIN_TRACE, ("Protocol number is out of range (%d).\n", ProtocolNumber)); -#endif + return; + } ProtocolTable[ProtocolNumber] = Handler; }