diff --git a/reactos/drivers/lib/ip/network/interface.c b/reactos/drivers/lib/ip/network/interface.c index 5608a40dcf3..318d2c30a80 100644 --- a/reactos/drivers/lib/ip/network/interface.c +++ b/reactos/drivers/lib/ip/network/interface.c @@ -59,21 +59,10 @@ UINT CountInterfaces() { NTSTATUS GetInterfaceSpeed( PIP_INTERFACE Interface, PUINT Speed ) { NDIS_STATUS NdisStatus; PLAN_ADAPTER IF = (PLAN_ADAPTER)Interface->Context; + + *Speed = IF->Speed; -#ifdef __NTDRIVER__ - /* Get maximum link speed */ - NdisStatus = NDISCall(IF, - NdisRequestQueryInformation, - OID_GEN_LINK_SPEED, - Speed, - sizeof(UINT)); -#else - (void)IF; - NdisStatus = NDIS_STATUS_SUCCESS; - *Speed = 10000; -#endif - - return + return STATUS_SUCCESS; NdisStatus != NDIS_STATUS_SUCCESS ? STATUS_UNSUCCESSFUL : STATUS_SUCCESS; } diff --git a/reactos/drivers/net/tcpip/datalink/lan.c b/reactos/drivers/net/tcpip/datalink/lan.c index 660004d0c15..595ceeb71f1 100644 --- a/reactos/drivers/net/tcpip/datalink/lan.c +++ b/reactos/drivers/net/tcpip/datalink/lan.c @@ -279,9 +279,6 @@ VOID STDCALL LanReceiveWorker( PVOID Context ) { ExInterlockedRemoveHeadList( &LanWorkList, &LanWorkLock )) ) { WorkItem = CONTAINING_RECORD(ListEntry, LAN_WQ_ITEM, ListEntry); - LanReceiveWorkerCalled++; - ASSERT(LanReceiveWorkerCalled <= TransferDataCompleteCalled); - Packet = WorkItem->Packet; Adapter = WorkItem->Adapter; BytesTransferred = WorkItem->BytesTransferred; @@ -330,6 +327,34 @@ VOID STDCALL LanReceiveWorker( PVOID Context ) { } } +VOID LanSubmitReceiveWork( + NDIS_HANDLE BindingContext, + PNDIS_PACKET Packet, + NDIS_STATUS Status, + UINT BytesTransferred) { + BOOLEAN WorkStart; + PLAN_WQ_ITEM WQItem; + PLAN_ADAPTER Adapter = (PLAN_ADAPTER)BindingContext; + KIRQL OldIrql; + + TcpipAcquireSpinLock( &LanWorkLock, &OldIrql ); + + WQItem = ExAllocatePool( NonPagedPool, sizeof(LAN_WQ_ITEM) ); + if( !WQItem ) { + TcpipReleaseSpinLock( &LanWorkLock, OldIrql ); + return; + } + + WorkStart = IsListEmpty( &LanWorkList ); + WQItem->Packet = Packet; + WQItem->Adapter = Adapter; + WQItem->BytesTransferred = BytesTransferred; + InsertTailList( &LanWorkList, &WQItem->ListEntry ); + if( WorkStart ) + ExQueueWorkItem( &LanWorkItem, CriticalWorkQueue ); + TcpipReleaseSpinLock( &LanWorkLock, OldIrql ); +} + VOID STDCALL ProtocolTransferDataComplete( NDIS_HANDLE BindingContext, PNDIS_PACKET Packet, @@ -347,34 +372,14 @@ VOID STDCALL ProtocolTransferDataComplete( * type and pass it to the correct receive handler */ { - BOOLEAN WorkStart; - PLAN_WQ_ITEM WQItem; - PLAN_ADAPTER Adapter = (PLAN_ADAPTER)BindingContext; - KIRQL OldIrql; - ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); - if( Status != NDIS_STATUS_SUCCESS ) return; - TcpipAcquireSpinLock( &LanWorkLock, &OldIrql ); - TransferDataCompleteCalled++; - ASSERT(TransferDataCompleteCalled <= TransferDataCalled); - WQItem = ExAllocatePool( NonPagedPool, sizeof(LAN_WQ_ITEM) ); - if( !WQItem ) { - TcpipReleaseSpinLock( &LanWorkLock, OldIrql ); - return; - } + if( Status != NDIS_STATUS_SUCCESS ) return; - WorkStart = IsListEmpty( &LanWorkList ); - WQItem->Packet = Packet; - WQItem->Adapter = Adapter; - WQItem->BytesTransferred = BytesTransferred; - InsertTailList( &LanWorkList, &WQItem->ListEntry ); - if( WorkStart ) - ExQueueWorkItem( &LanWorkItem, CriticalWorkQueue ); - TcpipReleaseSpinLock( &LanWorkLock, OldIrql ); + LanSubmitReceiveWork( BindingContext, Packet, Status, BytesTransferred ); } NDIS_STATUS STDCALL ProtocolReceive( @@ -673,10 +678,14 @@ VOID LANTransmit( TI_DbgPrint(MID_TRACE, ("NdisSend Done\n")); TcpipReleaseSpinLock( &Adapter->Lock, OldIrql ); +#if 0 if (NdisStatus != NDIS_STATUS_PENDING) ProtocolSendComplete((NDIS_HANDLE)Context, NdisPacket, NdisStatus); +#endif } else { +#if 0 ProtocolSendComplete((NDIS_HANDLE)Context, NdisPacket, NDIS_STATUS_CLOSED); +#endif } } @@ -935,6 +944,16 @@ VOID BindAdapter( 1 ); } + /* Get maximum link speed */ + NdisStatus = NDISCall(Adapter, + NdisRequestQueryInformation, + OID_GEN_LINK_SPEED, + &IF->Speed, + sizeof(UINT)); + + if( !NT_SUCCESS(NdisStatus) ) + IF->Speed = IP_DEFAULT_LINK_SPEED; + /* Register interface with IP layer */ IPRegisterInterface(IF); @@ -944,6 +963,7 @@ VOID BindAdapter( OID_GEN_CURRENT_PACKET_FILTER, &Adapter->PacketFilter, sizeof(UINT)); + if (NdisStatus != NDIS_STATUS_SUCCESS) { TI_DbgPrint(MID_TRACE, ("Could not set packet filter (0x%X).\n", NdisStatus)); IPDestroyInterface(IF); diff --git a/reactos/drivers/net/tcpip/include/ip.h b/reactos/drivers/net/tcpip/include/ip.h index 55f0d8d76f3..9986897fa3b 100644 --- a/reactos/drivers/net/tcpip/include/ip.h +++ b/reactos/drivers/net/tcpip/include/ip.h @@ -145,6 +145,7 @@ typedef struct _IP_INTERFACE { UINT HeaderSize; /* Size of link level header */ UINT MinFrameSize; /* Minimum frame size in bytes */ UINT MTU; /* Maximum transmission unit */ + UINT Speed; /* Link speed */ IP_ADDRESS Unicast; /* Unicast address */ IP_ADDRESS PointToPoint; /* Point to point address */ IP_ADDRESS Netmask; /* Netmask */ @@ -180,7 +181,7 @@ typedef VOID (*IP_PROTOCOL_HANDLER)( /* Timeout timer constants */ #define IP_TICKS_SECOND 2 /* Two ticks per second */ #define IP_TIMEOUT (1000 / IP_TICKS_SECOND) /* Timeout in milliseconds */ - +#define IP_DEFAULT_LINK_SPEED 10000 extern LIST_ENTRY InterfaceListHead; extern KSPIN_LOCK InterfaceListLock;