Return error code that oskit understands. Fixes ftp upload.
[reactos.git] / reactos / drivers / lib / ip / transport / tcp / event.c
index dd011e7..182f20a 100644 (file)
 
 #include "precomp.h"
 
-extern ULONG TCP_IPIdentification;
-extern LIST_ENTRY SleepingThreadsList;
-extern FAST_MUTEX SleepingThreadsLock;
-extern RECURSIVE_MUTEX TCPLock;
-
 int TCPSocketState(void *ClientData,
-                  void *WhichSocket, 
+                  void *WhichSocket,
                   void *WhichConnection,
                   OSK_UINT NewState ) {
-    NTSTATUS Status = STATUS_SUCCESS;
     PCONNECTION_ENDPOINT Connection = WhichConnection;
-    PTCP_COMPLETION_ROUTINE Complete;
-    PTDI_BUCKET Bucket;
-    PLIST_ENTRY Entry;
 
-    TI_DbgPrint(MID_TRACE,("Called: NewState %x (Conn %x) (Change %x)\n", 
+    TI_DbgPrint(MID_TRACE,("Flags: %c%c%c%c\n",
+                          NewState & SEL_CONNECT ? 'C' : 'c',
+                          NewState & SEL_READ    ? 'R' : 'r',
+                          NewState & SEL_FIN     ? 'F' : 'f',
+                          NewState & SEL_ACCEPT  ? 'A' : 'a'));
+
+    TI_DbgPrint(DEBUG_TCP,("Called: NewState %x (Conn %x) (Change %x)\n",
                           NewState, Connection,
-                          Connection ? Connection->State ^ NewState : 
+                          Connection ? Connection->State ^ NewState :
                           NewState));
 
-    TcpipRecursiveMutexEnter( &TCPLock, TRUE );
-
     if( !Connection ) {
-       TI_DbgPrint(MID_TRACE,("Socket closing.\n"));
+       TI_DbgPrint(DEBUG_TCP,("Socket closing.\n"));
        Connection = FileFindConnectionByContext( WhichSocket );
-       if( !Connection ) {
-           TcpipRecursiveMutexLeave( &TCPLock );
+       if( !Connection )
            return 0;
-       } else 
-           TI_DbgPrint(MID_TRACE,("Found socket %x\n", Connection));
+       else
+           TI_DbgPrint(DEBUG_TCP,("Found socket %x\n", Connection));
     }
 
-    if( ((NewState & SEL_CONNECT) || (NewState & SEL_FIN)) &&
-       !(Connection->State & (SEL_CONNECT | SEL_FIN)) ) {
-       while( !IsListEmpty( &Connection->ConnectRequest ) ) {
-           Connection->State |= NewState & (SEL_CONNECT | SEL_FIN);
-           Entry = RemoveHeadList( &Connection->ConnectRequest );
-           Bucket = CONTAINING_RECORD( Entry, TDI_BUCKET, Entry );
-           Complete = Bucket->Request.RequestNotifyObject;
-           TI_DbgPrint(MID_TRACE,
-                       ("Completing Connect Request %x\n", Bucket->Request));
-           if( NewState & SEL_FIN ) Status = STATUS_CONNECTION_REFUSED;
-           TcpipRecursiveMutexLeave( &TCPLock );
-           Complete( Bucket->Request.RequestContext, Status, 0 );
-           TcpipRecursiveMutexEnter( &TCPLock, TRUE );
-           /* Frees the bucket allocated in TCPConnect */
-           PoolFreeBuffer( Bucket );
-       }
-    }
-    if( (NewState & SEL_READ) || (NewState & SEL_FIN) ) {
-       TI_DbgPrint(MID_TRACE,("Readable (or closed): irp list %s\n",
-                              IsListEmpty(&Connection->ReceiveRequest) ?
-                              "empty" : "nonempty"));
-
-       while( !IsListEmpty( &Connection->ReceiveRequest ) ) {
-           PIRP Irp;
-           OSK_UINT RecvLen = 0, Received = 0;
-           OSK_PCHAR RecvBuffer = 0;
-           PMDL Mdl;
-           NTSTATUS Status;
-
-           Entry = RemoveHeadList( &Connection->ReceiveRequest );
-           Bucket = CONTAINING_RECORD( Entry, TDI_BUCKET, Entry );
-           Complete = Bucket->Request.RequestNotifyObject;
-
-           TI_DbgPrint(MID_TRACE,
-                       ("Readable, Completing read request %x\n", 
-                        Bucket->Request));
-
-           Irp = Bucket->Request.RequestContext;
-           Mdl = Irp->MdlAddress;
-
-           TI_DbgPrint(MID_TRACE,
-                       ("Getting the user buffer from %x\n", Mdl));
-
-           NdisQueryBuffer( Mdl, &RecvBuffer, &RecvLen );
-
-           TI_DbgPrint(MID_TRACE,
-                       ("Reading %d bytes to %x\n", RecvLen, RecvBuffer));
-
-           if( (NewState & SEL_FIN) && !RecvLen ) {
-               TI_DbgPrint(MID_TRACE, ("EOF From socket\n"));
-               Status = STATUS_END_OF_FILE;
-               Received = 0;
-           } else {
-               TI_DbgPrint(MID_TRACE, ("Connection: %x\n", Connection));
-               TI_DbgPrint
-                   (MID_TRACE, 
-                    ("Connection->SocketContext: %x\n", 
-                     Connection->SocketContext));
-               TI_DbgPrint(MID_TRACE, ("RecvBuffer: %x\n", RecvBuffer));
-
-               Status = TCPTranslateError
-                   ( OskitTCPRecv( Connection->SocketContext,
-                                   RecvBuffer,
-                                   RecvLen,
-                                   &Received,
-                                   0 ) );
-           }
-
-           TI_DbgPrint(MID_TRACE,("TCP Bytes: %d\n", Received));
-
-           if( Status == STATUS_SUCCESS && Received != 0 ) {
-               TI_DbgPrint(MID_TRACE,("Received %d bytes with status %x\n",
-                                      Received, Status));
-               
-               TI_DbgPrint(MID_TRACE,
-                           ("Completing Receive Request: %x\n", 
-                            Bucket->Request));
-
-               TcpipRecursiveMutexLeave( &TCPLock );
-               Complete( Bucket->Request.RequestContext,
-                         STATUS_SUCCESS, Received );
-               TcpipRecursiveMutexEnter( &TCPLock, TRUE );
-           } else if( Status == STATUS_PENDING || 
-                      (Status == STATUS_SUCCESS && Received == 0) ) {
-               InsertHeadList( &Connection->ReceiveRequest,
-                               &Bucket->Entry );
-               break;
-           } else {
-               TI_DbgPrint(MID_TRACE,
-                           ("Completing Receive request: %x %x\n",
-                            Bucket->Request, Status));
-               TcpipRecursiveMutexLeave( &TCPLock );
-               Complete( Bucket->Request.RequestContext, Status, 0 );
-               TcpipRecursiveMutexEnter( &TCPLock, TRUE );
-           }
-       }
-    } 
+    TI_DbgPrint(MID_TRACE,("Connection signalled: %d\n",
+                          Connection->Signalled));
 
-    TcpipRecursiveMutexLeave( &TCPLock );
+    Connection->SignalState |= NewState;
+    if( !Connection->Signalled ) {
+       Connection->Signalled = TRUE;
+       InsertTailList( &SignalledConnections, &Connection->SignalList );
+    }
 
     return 0;
 }
@@ -148,9 +51,9 @@ int TCPSocketState(void *ClientData,
 void TCPPacketSendComplete( PVOID Context,
                            PNDIS_PACKET NdisPacket,
                            NDIS_STATUS NdisStatus ) {
-    TI_DbgPrint(MID_TRACE,("called %x\n", NdisPacket));
+    TI_DbgPrint(DEBUG_TCP,("called %x\n", NdisPacket));
     FreeNdisPacket(NdisPacket);
-    TI_DbgPrint(MID_TRACE,("done\n"));
+    TI_DbgPrint(DEBUG_TCP,("done\n"));
 }
 
 #define STRINGIFY(x) #x
@@ -169,28 +72,27 @@ int TCPPacketSend(void *ClientData, OSK_PCHAR data, OSK_UINT len ) {
        RemoteAddress.Type = IP_ADDRESS_V4;
        RemoteAddress.Address.IPv4Address = Header->DstAddr;
     } else {
-       DbgPrint("Don't currently handle IPv6\n");
-       KeBugCheck(4);
+       TI_DbgPrint(MIN_TRACE,("Outgoing packet is not IPv4\n"));
+       OskitDumpBuffer( data, len );
+       return OSK_EINVAL;
     }
 
     RemoteAddress.Type = LocalAddress.Type = IP_ADDRESS_V4;
 
-    DbgPrint("OSKIT SENDING PACKET *** %x -> %x\n",
-            LocalAddress.Address.IPv4Address,
-            RemoteAddress.Address.IPv4Address);
-    
-    if(!(NCE = RouteGetRouteToDestination( &RemoteAddress )))
+    if(!(NCE = RouteGetRouteToDestination( &RemoteAddress ))) {
+       TI_DbgPrint(MIN_TRACE,("No route to %s\n", A2S(&RemoteAddress)));
        return OSK_EADDRNOTAVAIL;
+    }
 
-    NdisStatus = AllocatePacketWithBuffer( &Packet.NdisPacket, NULL, 
+    NdisStatus = AllocatePacketWithBuffer( &Packet.NdisPacket, NULL,
                                           MaxLLHeaderSize + len );
-    
+
     if (NdisStatus != NDIS_STATUS_SUCCESS) {
-       TI_DbgPrint(MAX_TRACE, ("Error from NDIS: %08x\n", NdisStatus));
-       return STATUS_NO_MEMORY;
+       TI_DbgPrint(DEBUG_TCP, ("Error from NDIS: %08x\n", NdisStatus));
+       return OSK_ENOBUFS;
     }
 
-    GetDataPtr( Packet.NdisPacket, MaxLLHeaderSize, 
+    GetDataPtr( Packet.NdisPacket, MaxLLHeaderSize,
                (PCHAR *)&Packet.Header, &Packet.ContigSize );
 
     RtlCopyMemory( Packet.Header, data, len );
@@ -209,21 +111,21 @@ int TCPPacketSend(void *ClientData, OSK_PCHAR data, OSK_UINT len ) {
 void *TCPMalloc( void *ClientData,
                 OSK_UINT Bytes, OSK_PCHAR File, OSK_UINT Line ) {
     void *v = PoolAllocateBuffer( Bytes );
-    if( v ) TrackWithTag( FOURCC('f','b','s','d'), v, File, Line );
+    if( v ) TrackWithTag( FOURCC('f','b','s','d'), v, (PCHAR)File, Line );
     return v;
 }
 
 void TCPFree( void *ClientData,
              void *data, OSK_PCHAR File, OSK_UINT Line ) {
-    UntrackFL( File, Line, data );
+    UntrackFL( (PCHAR)File, Line, data );
     PoolFreeBuffer( data );
 }
 
 int TCPSleep( void *ClientData, void *token, int priority, char *msg,
              int tmio ) {
     PSLEEPING_THREAD SleepingThread;
-    
-    TI_DbgPrint(MID_TRACE,
+
+    TI_DbgPrint(DEBUG_TCP,
                ("Called TSLEEP: tok = %x, pri = %d, wmesg = %s, tmio = %x\n",
                 token, priority, msg, tmio));
 
@@ -236,7 +138,7 @@ int TCPSleep( void *ClientData, void *token, int priority, char *msg,
        InsertTailList( &SleepingThreadsList, &SleepingThread->Entry );
        TcpipReleaseFastMutex( &SleepingThreadsLock );
 
-       TI_DbgPrint(MID_TRACE,("Waiting on %x\n", token));
+       TI_DbgPrint(DEBUG_TCP,("Waiting on %x\n", token));
        KeWaitForSingleObject( &SleepingThread->Event,
                               WrSuspended,
                               KernelMode,
@@ -249,7 +151,7 @@ int TCPSleep( void *ClientData, void *token, int priority, char *msg,
 
        PoolFreeBuffer( SleepingThread );
     }
-    TI_DbgPrint(MID_TRACE,("Waiting finished: %x\n", token));
+    TI_DbgPrint(DEBUG_TCP,("Waiting finished: %x\n", token));
     return 0;
 }
 
@@ -261,9 +163,9 @@ void TCPWakeup( void *ClientData, void *token ) {
     Entry = SleepingThreadsList.Flink;
     while( Entry != &SleepingThreadsList ) {
        SleepingThread = CONTAINING_RECORD(Entry, SLEEPING_THREAD, Entry);
-       TI_DbgPrint(MID_TRACE,("Sleeper @ %x\n", SleepingThread));
+       TI_DbgPrint(DEBUG_TCP,("Sleeper @ %x\n", SleepingThread));
        if( SleepingThread->SleepToken == token ) {
-           TI_DbgPrint(MID_TRACE,("Setting event to wake %x\n", token));
+           TI_DbgPrint(DEBUG_TCP,("Setting event to wake %x\n", token));
            KeSetEvent( &SleepingThread->Event, IO_NETWORK_INCREMENT, FALSE );
        }
        Entry = Entry->Flink;