AcessNative - Implimented (serverside) TCP
authorJohn Hodge <[email protected]>
Wed, 3 Oct 2012 03:39:49 +0000 (11:39 +0800)
committerJohn Hodge <[email protected]>
Wed, 3 Oct 2012 03:39:49 +0000 (11:39 +0800)
- This should allow AxWin to start (as it sends almost 4MiB framebuffer updates)

AcessNative/acesskernel_src/Makefile
AcessNative/acesskernel_src/helpers.c
AcessNative/acesskernel_src/include/arch.h
AcessNative/acesskernel_src/include/threads_int.h
AcessNative/acesskernel_src/server.c
AcessNative/acesskernel_src/threads.c
AcessNative/ld-acess_src/exports.h
AcessNative/syscalls.h
BuildConf/x86/default.mk
KernelLand/Kernel/include/hal_proc.h
KernelLand/Kernel/include/rwlock.h

index 0d63d5f..fddfbcc 100644 (file)
@@ -13,7 +13,7 @@ endif
 \r
 KERNEL_SRC = ../../KernelLand/Kernel/\r
 \r
-KERNEL_OBJ := logging.o adt.o lib.o drvutil.o debug.o messages.o\r
+KERNEL_OBJ := logging.o adt.o lib.o libc.o debug.o messages.o drvutil_disk.o drvutil_video.o\r
 KERNEL_OBJ += vfs/main.o vfs/open.o vfs/acls.o vfs/io.o vfs/dir.o\r
 KERNEL_OBJ += vfs/nodecache.o vfs/mount.o vfs/memfile.o vfs/select.o\r
 KERNEL_OBJ += vfs/fs/root.o vfs/fs/devfs.o\r
@@ -35,7 +35,7 @@ DEPFILES  = $(filter %.o,$(OBJ) $(N_OBJ) $(K_OBJ))
 DEPFILES := $(DEPFILES:%=%.dep)\r
 \r
 CPPFLAGS += -I include/ -I $(KERNEL_SRC)include/\r
-CFLAGS += -Wall -g\r
+CFLAGS += -Wall -g -std=gnu99\r
 LDFLAGS += -lSDL -lSDLmain -g -Wl,--defsym,__buildnum=$(BUILD_NUM)\r
 \r
 ifeq ($(PLATFORM),win)\r
@@ -79,8 +79,12 @@ $(N_OBJ): obj-$(PLATFORM)/%.o: %.c
 \r
 $(BUILDINFO_SRC): $(filter-out $(BUILDINFO_OBJ), $(OBJ)) Makefile\r
        @echo "" > $@\r
+       $(eval _GITHASH=$(shell git log -n 1 | head -n 1 | awk '{print $$2}'))\r
+       $(eval _GITCHANGED=$(shell git status --porcelain | grep -c '^ M '))\r
        @echo "const char gsKernelVersion[] = \"$(ACESS_VERSION)\";" >> $@\r
-       @echo "const char gsGitHash[] = \""`git log -n 1 | head -n 1 | awk '{print $$2}'`"\";" >> $@\r
+       @echo "const char gsGitHash[] = \"$(_GITHASH)\";" >> $@\r
+       @echo "const char gsBuildInfo[] = \"Acess2 v$(KERNEL_VERSION) $(ARCH)-$(PLATFORM)\\\\r\\\\n\"" >> $@\r
+       @echo "                           \"Build $(shell hostname --fqdn):$(BUILD_NUM) Git $(_GITHASH) - $(_GITCHANGED) modified\";" >> $@\r
        @echo "const int giBuildNumber = $(BUILD_NUM);" >> $@\r
 $(BUILDINFO_OBJ): $(BUILDINFO_SRC)\r
        @echo [CC] -o $@\r
index fb3e48c..3cf273e 100644 (file)
@@ -93,6 +93,10 @@ void Heap_Deallocate(void *Ptr)
        free(Ptr);
 }
 
+void Heap_Dump(void)
+{
+}
+
 tPAddr MM_GetPhysAddr(tVAddr VAddr)
 {
        return VAddr;   // HACK!
@@ -121,3 +125,8 @@ Sint64 now(void)
        return tv.tv_sec * 1000 + tv.tv_usec/1000;
 }
 
+void IPStack_SendDebugText(const char *str)
+{
+       // nop
+}
+
index b63d1bb..03474cf 100644 (file)
@@ -37,6 +37,7 @@ struct sShortSpinlock
 
 #define SHORTLOCK(...)
 #define SHORTREL(...)
+#define CPU_HAS_LOCK(...)      0
 
 //#define      NUM_CFG_ENTRIES 10
 
index f070a50..1294a5f 100644 (file)
@@ -72,7 +72,7 @@ enum {
        THREAD_STAT_DEAD,       // Awaiting burial (free)
        THREAD_STAT_BURIED      // If it's still on the list here, something's wrong
 };
-extern tThread *Threads_GetThread(Uint TID);
+extern struct sThread  *Threads_GetThread(Uint TID);
 
 #endif
 
index 78f7fa1..2e3f3a9 100644 (file)
 # include <unistd.h>
 # include <sys/socket.h>
 # include <netinet/in.h>
+# include <arpa/inet.h>        // inet_ntop
 #endif
 #include "../syscalls.h"
 //#include <debug.h>
 
-#define        USE_TCP 0
+#define        USE_TCP 1
 #define MAX_CLIENTS    16
 
 // === TYPES ===
@@ -27,6 +28,7 @@ typedef struct {
         int    ClientID;
        SDL_Thread      *WorkerThread;
        #if USE_TCP
+        int    Socket;
        #else
        tRequestHeader  *CurrentRequest;
        struct sockaddr_in      ClientAddr;
@@ -42,6 +44,7 @@ extern void   Threads_SetThread(int TID);
 // HACK: Should have these in a header
 extern void    Log_Debug(const char *Subsys, const char *Message, ...);
 extern void    Log_Notice(const char *Subsys, const char *Message, ...);
+extern void    Log_Warning(const char *Subsys, const char *Message, ...);
 
 // === PROTOTYPES ===
 tClient        *Server_GetClient(int ClientID);
@@ -102,12 +105,19 @@ tClient *Server_GetClient(int ClientID)
        
        // Allocate a thread for the process
        ret->ClientID = ClientID;
+       #if USE_TCP
+       ret->Socket = 0;
+       #else
        ret->CurrentRequest = NULL;
+       #endif
                
        if( !ret->WorkerThread ) {
+               #if USE_TCP
+               #else
                ret->WaitFlag = SDL_CreateCond();
                ret->Mutex = SDL_CreateMutex();
                SDL_mutexP( ret->Mutex );
+               #endif
                ret->WorkerThread = SDL_CreateThread( Server_WorkerThread, ret );
        }
        
@@ -117,14 +127,76 @@ tClient *Server_GetClient(int ClientID)
 int Server_WorkerThread(void *ClientPtr)
 {
        tClient *Client = ClientPtr;
+       
+       #if USE_TCP
+       for( ;; )
+       {
+               fd_set  fds;
+                int    nfd = Client->Socket;
+               FD_ZERO(&fds);
+               FD_SET(Client->Socket, &fds);
+               
+               select(nfd, &fds, NULL, NULL, NULL);    // TODO: Timeouts?
+               
+               if( FD_ISSET(Client->Socket, &fds) )
+               {
+                       const int       ciMaxParamCount = 6;
+                       char    lbuf[sizeof(tRequestHeader) + ciMaxParamCount*sizeof(tRequestValue)];
+                       tRequestHeader  *hdr = (void*)lbuf;
+                       size_t  len = recv(Client->Socket, hdr, sizeof(*hdr), 0);
+                       if( len != sizeof(hdr) ) {
+                               // Oops?
+                       }
+
+                       if( hdr->NParams > ciMaxParamCount ) {
+                               // Oops.
+                       }
+
+                       len = recv(Client->Socket, hdr->Params, hdr->NParams*sizeof(tRequestValue), 0);
+                       if( len != hdr->NParams*sizeof(tRequestValue) ) {
+                               // Oops.
+                       }
+
+                       // Get buffer size
+                       size_t  hdrsize = sizeof(tRequestHeader) + hdr->NParams*sizeof(tRequestValue);
+                       size_t  bufsize = hdrsize;
+                        int    i;
+                       for( i = 0; i < hdr->NParams; i ++ )
+                       {
+                               if( hdr->Params[i].Flags & ARG_FLAG_ZEROED )
+                                       ;
+                               else {
+                                       bufsize += hdr->Params[i].Length;
+                               }
+                       }
+
+                       // Allocate full buffer
+                       hdr = malloc(bufsize);
+                       memcpy(hdr, lbuf, hdrsize);
+                       len = recv(Client->Socket, hdr->Params + hdr->NParams, bufsize - hdrsize, 0);
+                       if( len != bufsize - hdrsize ) {
+                               // Oops?
+                       }
+
+                        int    retlen;
+                       tRequestHeader  *retHeader;
+                       retHeader = SyscallRecieve(hdr, &retlen);
+                       if( !retHeader ) {
+                               // Some sort of error
+                       }
+                       
+                       send(Client->Socket, retHeader, retlen, 0); 
+
+                       // Clean up
+                       free(hdr);
+               }
+       }
+       #else
        tRequestHeader  *retHeader;
        tRequestHeader  errorHeader;
         int    retSize = 0;
         int    sentSize;
         int    cur_client_id = 0;
-       
-       #if USE_TCP
-       #else
        for( ;; )
        {
                // Wait for something to do
@@ -253,18 +325,55 @@ int Server_ListenThread(void *Unused)
        for( ;; )
        {
                #if USE_TCP
-               struct sockaddr_in      client;
-               uint    clientSize = sizeof(client);
-                int    clientSock = accept(gSocket, (struct sockaddr*)&client, &clientSize);
+               struct sockaddr_in      clientaddr;
+               socklen_t       clientSize = sizeof(clientaddr);
+                int    clientSock = accept(gSocket, (struct sockaddr*)&clientaddr, &clientSize);
                if( clientSock < 0 ) {
                        perror("SyscallServer - accept");
                        break ;
                }
+
+               char    addrstr[4*8+8+1];
+               inet_ntop(clientaddr.sin_family, &clientaddr.sin_addr, addrstr, sizeof(addrstr));
+               Log_Debug("Server", "Client connection %s:%i\n", addrstr, ntohs(clientaddr.sin_port));
                
-               Log("Client connection %x:%i\n",
-                       ntohl(client.sin_addr), ntohs(client.sin_port)
-                       );
+               // Perform auth
+               size_t  len;
+               tRequestAuthHdr authhdr;
+               len = recv(clientSock, &authhdr, sizeof(authhdr), 0);
+               if( len != sizeof(authhdr) ) {
+                       // Some form of error?
+               }
+               
+               tClient *client;
+               if( authhdr.pid == 0 ) {
+                       // Allocate PID and client structure/thread
+                       client = Server_GetClient(0);
+                       client->Socket = clientSock;
+                       authhdr.pid = client->ClientID;
+               }
+               else {
+                       // Get client structure and make sure it's unused
+                       // - Auth token / verifcation?
+                       client = Server_GetClient(authhdr.pid);
+                       if( client->Socket != 0 ) {
+                               Log_Warning("Server", "Client (%i)%p owned by FD%i but %s:%i tried to use it",
+                                       authhdr.pid, client, addrstr, clientaddr.sin_port);
+                               authhdr.pid = 0;
+                       }
+                       else {
+                               client->Socket = clientSock;
+                       }
+               }
                
+               len = send(clientSock, &authhdr, sizeof(authhdr), 0);
+               if( len != sizeof(authhdr) ) {
+                       // Ok, this is an error
+                       perror("Sending auth reply");
+               }
+
+               // All done, client thread should be watching now               
+
                #else
                char    data[BUFSIZ];
                tRequestHeader  *req = (void*)data;
index c390a03..a7aace8 100644 (file)
@@ -15,6 +15,7 @@
 #include <acess.h>
 #include <mutex.h>
 #include <semaphore.h>
+#include <rwlock.h>
 #include <events.h>
 #include <threads_int.h>
 
@@ -333,6 +334,33 @@ int Semaphore_Signal(tSemaphore *Sem, int AmmountToAdd)
        return AmmountToAdd;
 }
 
+// --------------------------------------------------------------------
+// Event handling
+// --------------------------------------------------------------------
+int RWLock_AcquireRead(tRWLock *Lock)
+{
+       if( !Lock->ReaderWaiting ) {
+               Lock->ReaderWaiting = malloc(sizeof(pthread_rwlock_t));
+               pthread_rwlock_init( (void*)Lock->ReaderWaiting, 0 );
+       }
+       pthread_rwlock_rdlock( (void*)Lock->ReaderWaiting );
+       return 0;
+}
+int RWLock_AcquireWrite(tRWLock *Lock)
+{
+       if( !Lock->ReaderWaiting ) {
+               Lock->ReaderWaiting = malloc(sizeof(pthread_rwlock_t));
+               pthread_rwlock_init( (void*)Lock->ReaderWaiting, 0 );
+       }
+       pthread_rwlock_wrlock( (void*)Lock->ReaderWaiting );
+       return 0;
+}
+void RWLock_Release(tRWLock *Lock)
+{
+       pthread_rwlock_unlock( (void*)Lock->ReaderWaiting );
+}
+
+
 // --------------------------------------------------------------------
 // Event handling
 // --------------------------------------------------------------------
index feb5bfd..121a3ae 100644 (file)
@@ -8,6 +8,8 @@
 #ifndef _EXPORTS_H_
 #define _EXPORTS_H_
 
+#include <stddef.h>
+
 // Syscall request (used by acess_*)
 extern uint64_t        _Syscall(int SyscallID, const char *ArgTypes, ...);
 
index d1a0bdc..37bc88c 100644 (file)
  * uint8_t     paramData[SUM(params[].Lengh)];
  */
 
+typedef struct {
+       uint32_t        pid;
+       uint32_t        key;
+} tRequestAuthHdr;
+
 typedef struct sRequestValue {
        /// \see eArgumentTypes
        uint16_t        Type;
index 5d153f5..ff8de6e 100644 (file)
@@ -10,7 +10,8 @@ MODULES += Display/BochsGA
 MODULES += Input/PS2KbMouse
 MODULES += x86/ISADMA x86/VGAText
 
-MODULES += USB/Core USB/UHCI USB/EHCI
+MODULES += USB/Core USB/UHCI
+#MODULES += USB/EHCI
 #USB/OHCI
 MODULES += USB/HID USB/MSC
 #MODULES += Interfaces/UDI
index bb9dd4f..5c03bda 100644 (file)
@@ -13,6 +13,7 @@
  * \brief Achitecture defined thread/process management functions
  */
 
+#include <threads.h>
 #include <threads_int.h>
 
 /**
index a6f46b5..e0d4207 100644 (file)
@@ -37,7 +37,7 @@ struct sRWLock
  */
 extern int     RWLock_AcquireRead(tRWLock *Lock);
 
-extern int     RWLock_AcquireWrite(tRWLock *LOck);
+extern int     RWLock_AcquireWrite(tRWLock *Lock);
 
 /**
  * \brief Release a held mutex

UCC git Repository :: git.ucc.asn.au