mirror of
https://github.com/reactos/reactos.git
synced 2026-07-06 02:44:24 +08:00
- Merge aicom-network-fixes up to r36558
svn path=/trunk/; revision=36559
This commit is contained in:
@@ -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 );
|
||||
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -146,7 +146,7 @@ MiniDequeueWorkItem(
|
||||
|
||||
NDIS_STATUS
|
||||
MiniDoRequest(
|
||||
PNDIS_MINIPORT_BLOCK Adapter,
|
||||
PLOGICAL_ADAPTER Adapter,
|
||||
PNDIS_REQUEST NdisRequest);
|
||||
|
||||
BOOLEAN
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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"));
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user