* IPPacket = Pointer to IP packet
*/
{
- IP_ADDRESS Address;
-
TI_DbgPrint(DEBUG_IP, ("Received IPv4 datagram.\n"));
IPPacket->HeaderSize = (((PIPv4_HEADER)IPPacket->Header)->VerIHL & 0x0F) << 2;
/* FIXME: Should we allow packets to be received on the wrong interface? */
/* XXX Find out if this packet is destined for us */
-
- if( AddrLocateADEv4( IPPacket->DstAddr.Address.IPv4Address, &Address ) ) {
- ProcessFragment( IF, IPPacket );
- } else {
- PNEIGHBOR_CACHE_ENTRY NCE;
-
- if((NCE = RouteGetRouteToDestination( &IPPacket->DstAddr ))) {
- IPSendDatagram( IPPacket, NCE, NULL, NULL );
- }
- }
+ ProcessFragment(IF, IPPacket);
#if 0
} else {
/* This packet is not destined for us. If we are a router,
return STATUS_SUCCESS;
}
-void TCPMarkForDisconnect( PCONNECTION_ENDPOINT Context, BOOLEAN Marked ) {
- Context->Disconnecting = Marked;
-}
-
/* EOF */
#define TCPOPTLEN_MAX_SEG_SIZE 0x4
-#define TCP_CANCEL_DISCONNECT 0
-#define TCP_CANCEL_CLOSE 1
-
/* Data offset; 32-bit words (leftmost 4 bits); convert to bytes */
#define TCP_DATA_OFFSET(DataOffset)(((DataOffset) & 0xF0) >> (4-2))
KEVENT Event;
} SLEEPING_THREAD, *PSLEEPING_THREAD;
-typedef struct _CANCEL_REQUEST {
- LIST_ENTRY Entry;
- PVOID Context;
- PIRP Irp;
- UINT Flags, Type;
-} CANCEL_REQUEST, *PCANCEL_REQUEST;
-
/* Retransmission timeout constants */
/* Lower bound for retransmission timeout in TCP timer ticks */
NTSTATUS TCPShutdown(
VOID);
-void TCPMarkForDisconnect(
- PCONNECTION_ENDPOINT Connection, BOOLEAN Marked );
-
#endif /* __TCP_H */
extern KSPIN_LOCK InterfaceListLock;
extern LIST_ENTRY AddressFileListHead;
extern KSPIN_LOCK AddressFileListLock;
-extern LIST_ENTRY CancelQueue;
-extern KSPIN_LOCK CancelQueueLock;
-extern WORK_QUEUE_ITEM CancelQueueWork;
extern NDIS_HANDLE GlobalPacketPool;
extern NDIS_HANDLE GlobalBufferPool;
extern KSPIN_LOCK EntityListLock;
* notification service to the client */
UINT SignalState; /* Active signals from oskit */
BOOLEAN Signalled; /* Are we a member of the signal list */
- BOOLEAN Disconnecting; /* Cancelling an irp .. we need to leave it
- * alone for now */
} CONNECTION_ENDPOINT, *PCONNECTION_ENDPOINT;
#include "precomp.h"
#include <pseh/pseh.h>
-extern VOID DeleteConnectionEndpoint( PCONNECTION_ENDPOINT Endpoint );
-
NTSTATUS DispPrepareIrpForCancel(
PTRANSPORT_CONTEXT Context,
PIRP Irp,
TI_DbgPrint(DEBUG_IRP, ("Done Completing IRP\n"));
}
-VOID DDKAPI CancelQueuePassiveHandler( PVOID CancelRequestVoid )
-{
- KIRQL OldIrql;
- PCANCEL_REQUEST CancelReq;
- PLIST_ENTRY CqEntry;
-
- KeAcquireSpinLock( &CancelQueueLock, &OldIrql );
-
- TI_DbgPrint(DEBUG_IRP,("CANCEL QUEUE: Starting\n"));
-
- for( CqEntry = CancelQueue.Flink;
- CqEntry != &CancelQueue;
- ) {
- CancelReq = CONTAINING_RECORD(CqEntry, CANCEL_REQUEST, Entry);
- ExInterlockedRemoveHeadList( &CancelQueue, &CancelQueueLock );
- CqEntry = CancelQueue.Flink;
-
- KeReleaseSpinLock( &CancelQueueLock, OldIrql );
-
- TI_DbgPrint(DEBUG_IRP,("CANCEL QUEUE: Executing %x\n", CancelReq));
-
- switch( CancelReq->Type ) {
- case TCP_CANCEL_DISCONNECT:
- TCPDisconnect
- ( CancelReq->Context,
- CancelReq->Flags,
- NULL,
- NULL,
- DispDataRequestComplete,
- CancelReq->Irp );
- break;
-
- case TCP_CANCEL_CLOSE:
- TCPClose( CancelReq->Context );
- DeleteConnectionEndpoint( CancelReq->Context );
- break;
- }
-
- TCPMarkForDisconnect( CancelReq->Context, FALSE );
-
- ExFreePool( CancelReq );
-
- KeAcquireSpinLock( &CancelQueueLock, &OldIrql );
- }
-
- TI_DbgPrint(DEBUG_IRP,("CANCEL QUEUE: Ending\n"));
-
- KeReleaseSpinLock( &CancelQueueLock, OldIrql );
-}
VOID DDKAPI DispCancelRequest(
PDEVICE_OBJECT Device,
PTRANSPORT_CONTEXT TranContext;
PFILE_OBJECT FileObject;
UCHAR MinorFunction;
- PCANCEL_REQUEST CancelRequest;
/*NTSTATUS Status = STATUS_SUCCESS;*/
TI_DbgPrint(DEBUG_IRP, ("Called.\n"));
/* Try canceling the request */
switch(MinorFunction) {
case TDI_SEND:
+ TCPDisconnect
+ ( TranContext->Handle.ConnectionContext,
+ TDI_DISCONNECT_RELEASE,
+ NULL,
+ NULL,
+ DispDataRequestComplete,
+ Irp );
+ break;
+
case TDI_RECEIVE:
- CancelRequest = ExAllocatePoolWithTag
- ( sizeof(CANCEL_REQUEST), NonPagedPool, FOURCC('T','c','k','O') );
- TCPMarkForDisconnect( TranContext->Handle.ConnectionContext, TRUE );
- if( CancelRequest ) {
- TI_DbgPrint(DEBUG_IRP,("CANCEL QUEUE:-> %x\n", CancelRequest));
- CancelRequest->Flags = TDI_DISCONNECT_RELEASE |
- (MinorFunction == TDI_RECEIVE) ? TDI_DISCONNECT_ABORT : 0;
- CancelRequest->Context = TranContext->Handle.ConnectionContext;
- CancelRequest->Irp = Irp;
- CancelRequest->Type = TCP_CANCEL_DISCONNECT;
- ExInterlockedInsertTailList
- ( &CancelQueue, &CancelRequest->Entry, &CancelQueueLock );
- ExQueueWorkItem( &CancelQueueWork, CriticalWorkQueue );
- }
+ TCPDisconnect
+ ( TranContext->Handle.ConnectionContext,
+ TDI_DISCONNECT_ABORT | TDI_DISCONNECT_RELEASE,
+ NULL,
+ NULL,
+ DispDataRequestComplete,
+ Irp );
break;
case TDI_SEND_DATAGRAM:
#include "precomp.h"
+
/* List of all address file objects managed by this driver */
LIST_ENTRY AddressFileListHead;
KSPIN_LOCK AddressFileListLock;
KIRQL OldIrql;
PADDRESS_FILE AddrFile;
NTSTATUS Status = STATUS_SUCCESS;
- PCANCEL_REQUEST CancelReq;
TI_DbgPrint(MID_TRACE, ("Called.\n"));
switch (AddrFile->Protocol) {
case IPPROTO_TCP:
TCPFreePort( AddrFile->Port );
- if( AddrFile->Listener ) {
- CancelReq = ExAllocatePoolWithTag
- ( sizeof(CANCEL_REQUEST), NonPagedPool, FOURCC('T','c','l','s') );
- if( CancelReq ) {
- CancelReq->Type = TCP_CANCEL_CLOSE;
- CancelReq->Context = AddrFile->Listener;
- AddrFile->Listener = NULL;
- ExQueueWorkItem( &CancelQueueWork, CriticalWorkQueue );
- }
- }
+ if( AddrFile->Listener )
+ TCPClose( AddrFile->Listener );
break;
case IPPROTO_UDP:
{
PCONNECTION_ENDPOINT Connection;
NTSTATUS Status = STATUS_SUCCESS;
- PCANCEL_REQUEST CancelReq;
TI_DbgPrint(MID_TRACE, ("Called.\n"));
Connection = Request->Handle.ConnectionContext;
- CancelReq = ExAllocatePoolWithTag
- ( sizeof(CANCEL_REQUEST), NonPagedPool, FOURCC('T','c','l','s') );
- if( CancelReq ) {
- CancelReq->Type = TCP_CANCEL_CLOSE;
- CancelReq->Context = Connection;
- ExQueueWorkItem( &CancelQueueWork, CriticalWorkQueue );
- }
+ TcpipRecursiveMutexEnter( &TCPLock, TRUE );
+ TCPClose(Connection);
+ DeleteConnectionEndpoint(Connection);
+ TcpipRecursiveMutexLeave( &TCPLock );
TI_DbgPrint(MAX_TRACE, ("Leaving.\n"));
KSPIN_LOCK IpWorkLock;
WORK_QUEUE_ITEM IpWorkItem;
-/* Cancel Queue */
-LIST_ENTRY CancelQueue;
-KSPIN_LOCK CancelQueueLock;
-WORK_QUEUE_ITEM CancelQueueWork;
-extern VOID DDKAPI CancelQueuePassiveHandler( PVOID Context );
-
VOID TiWriteErrorLog(
PDRIVER_OBJECT DriverContext,
NTSTATUS ErrorCode,
InitializeListHead(&InterfaceListHead);
KeInitializeSpinLock(&InterfaceListLock);
- /* Initialize cancellation queue */
- InitializeListHead(&CancelQueue);
- KeInitializeSpinLock(&CancelQueueLock);
- ExInitializeWorkItem( &CancelQueueWork, CancelQueuePassiveHandler, NULL );
-
/* Initialize network level protocol subsystem */
IPStartup(RegistryPath);