From 459b97691bdaf509f2fac0aa060a0c5f241c061e Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Mon, 20 Oct 2008 21:57:06 +0000 Subject: [PATCH] - Merge aicom-network-fixes up to r36861 svn path=/trunk/; revision=36864 --- .../drivers/network/ndis/include/miniport.h | 6 ++ reactos/drivers/network/ndis/ndis/miniport.c | 20 +++++- reactos/drivers/network/ndis/ndis/protocol.c | 61 ++++++++++++++++++- reactos/lib/drivers/ip/network/neighbor.c | 2 +- reactos/lib/drivers/ip/network/ports.c | 9 ++- reactos/lib/drivers/ip/network/router.c | 2 +- reactos/lib/drivers/ip/network/transmit.c | 20 ++++-- 7 files changed, 111 insertions(+), 9 deletions(-) diff --git a/reactos/drivers/network/ndis/include/miniport.h b/reactos/drivers/network/ndis/include/miniport.h index 90ffb0335cb..2302ddbde16 100644 --- a/reactos/drivers/network/ndis/include/miniport.h +++ b/reactos/drivers/network/ndis/include/miniport.h @@ -163,6 +163,12 @@ VOID NTAPI MiniportWorker(IN PVOID WorkItem); +VOID NTAPI +MiniSendComplete( + IN NDIS_HANDLE MiniportAdapterHandle, + IN PNDIS_PACKET Packet, + IN NDIS_STATUS Status); + #endif /* __MINIPORT_H */ /* EOF */ diff --git a/reactos/drivers/network/ndis/ndis/miniport.c b/reactos/drivers/network/ndis/ndis/miniport.c index ae7231c7d25..0f300d812ce 100644 --- a/reactos/drivers/network/ndis/ndis/miniport.c +++ b/reactos/drivers/network/ndis/ndis/miniport.c @@ -265,11 +265,29 @@ MiniResetComplete( IN BOOLEAN AddressingReset) { PLOGICAL_ADAPTER Adapter = MiniportAdapterHandle; + PLIST_ENTRY CurrentEntry; + PADAPTER_BINDING AdapterBinding; KIRQL OldIrql; - NDIS_DbgPrint(MIN_TRACE, ("FIXME: MiniResetComplete is partially implemented\n")); + NdisMIndicateStatus(Adapter, NDIS_STATUS_RESET_END, NULL, 0); + KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql); + + CurrentEntry = Adapter->ProtocolListHead.Flink; + + while (CurrentEntry != &Adapter->ProtocolListHead) + { + AdapterBinding = CONTAINING_RECORD(CurrentEntry, ADAPTER_BINDING, AdapterListEntry); + + (*AdapterBinding->ProtocolBinding->Chars.ResetCompleteHandler)( + AdapterBinding->NdisOpenBlock.ProtocolBindingContext, + Status); + + CurrentEntry = CurrentEntry->Flink; + } + Adapter->MiniportBusy = FALSE; + KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql); } diff --git a/reactos/drivers/network/ndis/ndis/protocol.c b/reactos/drivers/network/ndis/ndis/protocol.c index 046101f283b..9121f8f1d1f 100644 --- a/reactos/drivers/network/ndis/ndis/protocol.c +++ b/reactos/drivers/network/ndis/ndis/protocol.c @@ -296,7 +296,66 @@ ProSendPackets( IN PPNDIS_PACKET PacketArray, IN UINT NumberOfPackets) { - UNIMPLEMENTED + PADAPTER_BINDING AdapterBinding = NdisBindingHandle; + PLOGICAL_ADAPTER Adapter = AdapterBinding->Adapter; + KIRQL RaiseOldIrql; + NDIS_STATUS NdisStatus; + UINT i; + + if(Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.SendPacketsHandler) + { + if(Adapter->NdisMiniportBlock.Flags & NDIS_ATTRIBUTE_DESERIALIZE) + { + (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.SendPacketsHandler)( + Adapter->NdisMiniportBlock.MiniportAdapterContext, PacketArray, NumberOfPackets); + for (i = 0; i < NumberOfPackets; i++) + { + NdisStatus = NDIS_GET_PACKET_STATUS(PacketArray[i]); + if (NdisStatus != NDIS_STATUS_PENDING) + MiniSendComplete(Adapter, PacketArray[i], NdisStatus); + } + } + else + { + /* SendPackets is called at DISPATCH_LEVEL for all serialized miniports */ + KeRaiseIrql(DISPATCH_LEVEL, &RaiseOldIrql); + (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.SendPacketsHandler)( + Adapter->NdisMiniportBlock.MiniportAdapterContext, PacketArray, NumberOfPackets); + KeLowerIrql(RaiseOldIrql); + for (i = 0; i < NumberOfPackets; i++) + { + NdisStatus = NDIS_GET_PACKET_STATUS(PacketArray[i]); + if (NdisStatus != NDIS_STATUS_PENDING) + MiniSendComplete(Adapter, PacketArray[i], NdisStatus); + } + } + } + else + { + if(Adapter->NdisMiniportBlock.Flags & NDIS_ATTRIBUTE_DESERIALIZE) + { + for (i = 0; i < NumberOfPackets; i++) + { + NdisStatus = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.SendHandler)( + Adapter->NdisMiniportBlock.MiniportAdapterContext, PacketArray[i], 0); + if (NdisStatus != NDIS_STATUS_PENDING) + MiniSendComplete(Adapter, PacketArray[i], NdisStatus); + } + } + else + { + /* Send is called at DISPATCH_LEVEL for all serialized miniports */ + KeRaiseIrql(DISPATCH_LEVEL, &RaiseOldIrql); + for (i = 0; i < NumberOfPackets; i++) + { + NdisStatus = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.SendHandler)( + Adapter->NdisMiniportBlock.MiniportAdapterContext, PacketArray[i], 0); + if (NdisStatus != NDIS_STATUS_PENDING) + MiniSendComplete(Adapter, PacketArray[i], NdisStatus); + } + KeLowerIrql(RaiseOldIrql); + } + } } diff --git a/reactos/lib/drivers/ip/network/neighbor.c b/reactos/lib/drivers/ip/network/neighbor.c index f777d9145fd..3eee6265019 100644 --- a/reactos/lib/drivers/ip/network/neighbor.c +++ b/reactos/lib/drivers/ip/network/neighbor.c @@ -76,7 +76,7 @@ VOID NBFlushPacketQueue( PNEIGHBOR_CACHE_ENTRY NCE, ASSERT_KM_POINTER(Packet->Complete); Packet->Complete( Packet->Context, Packet->Packet, - NDIS_STATUS_REQUEST_ABORTED ); + ErrorCode ); } PoolFreeBuffer( Packet ); diff --git a/reactos/lib/drivers/ip/network/ports.c b/reactos/lib/drivers/ip/network/ports.c index 04ec39946c4..6630b5e77c3 100644 --- a/reactos/lib/drivers/ip/network/ports.c +++ b/reactos/lib/drivers/ip/network/ports.c @@ -44,6 +44,7 @@ BOOLEAN AllocatePort( PPORT_SET PortSet, ULONG Port ) { Port = htons(Port); ASSERT(Port >= PortSet->StartingPort); + ASSERT(Port < PortSet->StartingPort + PortSet->PortsToOversee); Port -= PortSet->StartingPort; ExAcquireFastMutex( &PortSet->Mutex ); @@ -67,7 +68,7 @@ ULONG AllocateAnyPort( PPORT_SET PortSet ) { Next -= PortSet->StartingPort; ExAcquireFastMutex( &PortSet->Mutex ); - AllocatedPort = RtlFindClearBits( &PortSet->ProtoBitmap, 1, 0 ); + AllocatedPort = RtlFindClearBits( &PortSet->ProtoBitmap, 1, Next ); if( AllocatedPort != (ULONG)-1 ) { RtlSetBit( &PortSet->ProtoBitmap, AllocatedPort ); AllocatedPort += PortSet->StartingPort; @@ -77,6 +78,9 @@ ULONG AllocateAnyPort( PPORT_SET PortSet ) { AllocatedPort = htons(AllocatedPort); + ASSERT(AllocatedPort >= PortSet->StartingPort); + ASSERT(AllocatedPort < PortSet->StartingPort + PortSet->PortsToOversee); + return AllocatedPort; } @@ -109,5 +113,8 @@ ULONG AllocatePortFromRange( PPORT_SET PortSet, ULONG Lowest, ULONG Highest ) { AllocatedPort = htons(AllocatedPort); + ASSERT(AllocatedPort >= PortSet->StartingPort); + ASSERT(AllocatedPort < PortSet->StartingPort + PortSet->PortsToOversee); + return AllocatedPort; } diff --git a/reactos/lib/drivers/ip/network/router.c b/reactos/lib/drivers/ip/network/router.c index 8e4c62cb925..4706efb9414 100644 --- a/reactos/lib/drivers/ip/network/router.c +++ b/reactos/lib/drivers/ip/network/router.c @@ -390,7 +390,7 @@ NTSTATUS RouterRemoveRoute(PIP_ADDRESS Target, PIP_ADDRESS Router) TI_DbgPrint(DEBUG_ROUTER, ("Leaving\n")); - return Found ? STATUS_NO_SUCH_FILE : STATUS_SUCCESS; + return Found ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL; } diff --git a/reactos/lib/drivers/ip/network/transmit.c b/reactos/lib/drivers/ip/network/transmit.c index 810c4854337..4684ddf487f 100644 --- a/reactos/lib/drivers/ip/network/transmit.c +++ b/reactos/lib/drivers/ip/network/transmit.c @@ -28,6 +28,7 @@ VOID IPSendComplete */ { PIPFRAGMENT_CONTEXT IFC = (PIPFRAGMENT_CONTEXT)Context; + NTSTATUS Status; TI_DbgPrint (MAX_TRACE, @@ -35,8 +36,14 @@ VOID IPSendComplete Context, NdisPacket, NdisStatus)); if (NT_SUCCESS(NdisStatus) && PrepareNextFragment(IFC)) { - /* A fragment was prepared for transmission, so send it */ - IPSendFragment(IFC->NdisPacket, IFC->NCE, IFC); + /* A fragment was prepared for transmission, so send it */ + Status = IPSendFragment(IFC->NdisPacket, IFC->NCE, IFC); + if (!NT_SUCCESS(Status)) + { + FreeNdisPacket(IFC->NdisPacket); + IFC->Complete(IFC->Context, IFC->Datagram, Status); + exFreePool(IFC); + } } else { TI_DbgPrint(MAX_TRACE, ("Calling completion handler.\n")); @@ -87,7 +94,7 @@ BOOLEAN PrepareNextFragment( TI_DbgPrint(MAX_TRACE, ("Called. IFC (0x%X)\n", IFC)); - if (IFC->BytesLeft != 0) { + if (IFC->BytesLeft > 0) { TI_DbgPrint(MAX_TRACE, ("Preparing 1 fragment.\n")); @@ -203,7 +210,12 @@ NTSTATUS SendFragments( /* Prepare next fragment for transmission and send it */ - PrepareNextFragment(IFC); + if (!PrepareNextFragment(IFC)) { + FreeNdisPacket(IFC->NdisPacket); + ExFreePool(IFC); + return NDIS_STATUS_FAILURE; + } + return IPSendFragment(IFC->NdisPacket, NCE, IFC); }