X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Modules%2FIPStack%2Ftcp.c;h=cfc3efc08c715c95011e673dfdc239f22565174a;hb=0255883b3e68d607b8250006927575fe15a7f23b;hp=b8c175840d294040cefc9fb5bffca36c45c962e6;hpb=6c5a509b5e14e097ca537c539bc9babe3b8f0c4c;p=tpg%2Facess2.git diff --git a/Modules/IPStack/tcp.c b/Modules/IPStack/tcp.c index b8c17584..cfc3efc0 100644 --- a/Modules/IPStack/tcp.c +++ b/Modules/IPStack/tcp.c @@ -10,10 +10,26 @@ // === PROTOTYPES === void TCP_Initialise(); void *TCP_Open(tInterface *Interface, Uint16 LocalPort, void *Address, Uint16 Port); -void TCP_GetPacket(tInterface *Interface, int Length, void *Buffer); +void TCP_GetPacket(tInterface *Interface, void *Address, int Length, void *Buffer); Uint16 TCP_GetUnusedPort(); int TCP_AllocatePort(Uint16 Port); int TCP_DeallocatePort(Uint16 Port); +// --- Server +tVFS_Node *TCP_Server_Init(tInterface *Interface); +char *TCP_Server_ReadDir(tVFS_Node *Node, int Pos); +tVFS_Node *TCP_Server_FindDir(tVFS_Node *Node, char *Name); + int TCP_Server_IOCtl(tVFS_Node *Node, int ID, void *Data); +void TCP_Server_Close(tVFS_Node *Node); +// --- Client +tVFS_Node *TCP_Client_Init(tInterface *Interface); +Uint64 TCP_Client_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer); +Uint64 TCP_Client_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer); + int TCP_Client_IOCtl(tVFS_Node *Node, int ID, void *Data); +void TCP_Client_Close(tVFS_Node *Node); + +// === TEMPLATES === +tSocketFile gTCP_ServerFile = {NULL, "tcps", TCP_Server_Init}; +tSocketFile gTCP_ClientFile = {NULL, "tcpc", TCP_Client_Init}; // === GLOBALS === int giTCP_NumHalfopen = 0; @@ -29,34 +45,19 @@ Uint32 gaTCP_PortBitmap[0x800]; */ void TCP_Initialise() { - + IPStack_AddFile(&gTCP_ServerFile); + IPStack_AddFile(&gTCP_ClientFile); } /** * \fn void *TCP_Open(tInterface *Interface, Uint16 LocalPort, void *Address, Uint16 Port) * \brief Open a connection to another host using TCP */ -void *TCP_Open(tInterface *Interface, Uint16 LocalPort, void *Address, Uint16 Port) -{ - tTCPConnection *ret = malloc( sizeof(tTCPConnection) ); - - ret->State = TCP_ST_CLOSED; - if(LocalPort == 0) - ret->LocalPort = TCP_GetUnusedPort(); - else - ret->LocalPort = LocalPort; - ret->RemotePort = Port; - - ret->LocalInterface = Interface; - - if(Interface->Type == 6) - ret->RemoteIP.v6 = *(tIPv6*)Address; - else - ret->RemoteIP.v4 = *(tIPv4*)Address; - +void TCP_StartConnection(tTCPConnection *Conn) +{ // SEND PACKET - - return ret; + // Send a TCP SYN to the target to open the connection + return ; } /** @@ -99,7 +100,7 @@ void TCP_GetPacket(tInterface *Interface, void *Address, int Length, void *Buffe return; } - // Open a new connection + // Open a new connection (well, check that it's a SYN) //TODO break; @@ -173,3 +174,115 @@ int TCP_DeallocatePort(Uint16 Port) return 1; } +// --- Server +tVFS_Node *TCP_Server_Init(tInterface *Interface) +{ + return NULL; +} + +char *TCP_Server_ReadDir(tVFS_Node *Node, int Pos) +{ + return NULL; +} + +tVFS_Node *TCP_Server_FindDir(tVFS_Node *Node, char *Name) +{ + return NULL; +} + +int TCP_Server_IOCtl(tVFS_Node *Node, int ID, void *Data) +{ + return 0; +} + +// --- Client +tVFS_Node *TCP_Client_Init(tInterface *Interface) +{ + tTCPConnection *conn = malloc( sizeof(tTCPConnection) ); + + conn->State = TCP_ST_CLOSED; + conn->Interface = Interface; + conn->LocalPort = 0; + conn->RemotePort = 0; + memset( &conn->RemoteIP, 0, sizeof(conn->RemoteIP) ); + + conn->Node.ImplPtr = conn; + conn->Node.NumACLs = 1; + conn->Node.ACLs = &gVFS_ACL_EveryoneRW; + conn->Node.Read = TCP_Client_Read; + conn->Node.Write = TCP_Client_Write; + conn->Node.IOCtl = TCP_Client_IOCtl; + conn->Node.Close = TCP_Client_Close; + + return &conn->Node; +} + +Uint64 TCP_Client_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) +{ + return 0; +} + +Uint64 TCP_Client_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) +{ + return 0; +} + +int TCP_Client_IOCtl(tVFS_Node *Node, int ID, void *Data) +{ + tTCPConnection *conn = Node->ImplPtr; + + switch(ID) + { + case 5: // Get/Set local port + if(!Data) + return conn->LocalPort; + if(conn->State != TCP_ST_CLOSED) + return -1; + if(!CheckMem(Data, sizeof(Uint16))) + return -1; + + if(Threads_GetUID() != 0 && *(Uint16*)Data < 1024) + return -1; + + conn->LocalPort = *(Uint16*)Data; + return 0; + + case 6: // Get/Set remote port + if(!Data) return conn->RemotePort; + if(conn->State != TCP_ST_CLOSED) return -1; + if(!CheckMem(Data, sizeof(Uint16))) return -1; + conn->RemotePort = *(Uint16*)Data; + return 0; + + case 7: // Set Remote IP + if( conn->State != TCP_ST_CLOSED ) + return -1; + if( conn->Interface->Type == 4 ) + { + if(!CheckMem(Data, sizeof(tIPv4))) return -1; + conn->RemoteIP.v4 = *(tIPv4*)Data; + } + else if( conn->Interface->Type == 6 ) + { + if(!CheckMem(Data, sizeof(tIPv6))) return -1; + conn->RemoteIP.v6 = *(tIPv6*)Data; + } + return 0; + + case 8: // Connect + if(conn->LocalPort == -1) + conn->LocalPort = TCP_GetUnusedPort(); + if(conn->RemotePort == -1) + return 0; + + TCP_StartConnection(conn); + return 1; + } + + return 0; +} + +void TCP_Client_Close(tVFS_Node *Node) +{ + free(Node->ImplPtr); +}