- Merge aicom-network-fixes up to r36861

svn path=/trunk/; revision=36864
This commit is contained in:
Cameron Gutman
2008-10-20 21:57:06 +00:00
parent 3e5dc81771
commit 459b97691b
7 changed files with 111 additions and 9 deletions
@@ -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 */
+19 -1
View File
@@ -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);
}
+60 -1
View File
@@ -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);
}
}
}
+1 -1
View File
@@ -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 );
+8 -1
View File
@@ -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;
}
+1 -1
View File
@@ -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;
}
+16 -4
View File
@@ -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);
}