Kernel/IPStack - (minor) TODO retransmit timer
[tpg/acess2.git] / KernelLand / Modules / IPStack / adapters.c
index 83741df..d6185b4 100644 (file)
@@ -20,8 +20,8 @@
 void   *IPStack_Adapter_Add(const tIPStack_AdapterType *Type, void *Ptr, const void *HWAddr);
 void   IPStack_Adapter_Del(void *Handle);
 // --- VFS API ---
-char   *Adapter_ReadDir(tVFS_Node *Node, int Pos);
-tVFS_Node      *Adapter_FindDir(tVFS_Node *Node, const char *Name);
+ int   Adapter_ReadDir(tVFS_Node *Node, int Pos, char Name[FILENAME_MAX]);
+tVFS_Node      *Adapter_FindDir(tVFS_Node *Node, const char *Name, Uint Flags);
  int   Adapter_DirIOCtl(tVFS_Node *Node, int Num, void *Data);
  int   Adapter_IOCtl(tVFS_Node *Node, int Num, void *Data);
 // --- "Internal" (IPStack) API ---
@@ -83,10 +83,16 @@ void *IPStack_Adapter_Add(const tIPStack_AdapterType *Type, void *Ptr, const voi
        gpIP_AdapterList_Last->Next = ret;
        gpIP_AdapterList_Last = ret;
        Mutex_Release( &glIP_Adapters );
-       
+
+       Log_Log("IPStack", "Adapter %i: %s %02x:%02x:%02x:%02x:%02x:%02x",
+               ret->Index, Type->Name,
+               ret->HWAddr[0], ret->HWAddr[1], ret->HWAddr[2],
+               ret->HWAddr[3], ret->HWAddr[4], ret->HWAddr[5]
+               );
+
        // Watch the adapter for incoming packets
-       tTID tid = Proc_SpawnWorker(Adapter_int_WatchThread, ret);
-       if(tid < 0) {
+       void *worker = Proc_SpawnWorker(Adapter_int_WatchThread, ret);
+       if(!worker) {
                Log_Warning("IPStack", "Unable to create watcher thread for %p", ret);
        }
        
@@ -130,13 +136,14 @@ void IPStack_Adapter_Del(void *Handle)
 }
 
 // --- VFS API ---
-char *Adapter_ReadDir(tVFS_Node *Node, int Pos)
+int Adapter_ReadDir(tVFS_Node *Node, int Pos, char Dest[FILENAME_MAX])
 {
-       if( Pos < 0 )   return NULL;
+       if( Pos < 0 )   return -EINVAL;
 
        // Loopback
        if( Pos == 0 ) {
-               return strdup("lo");
+               strcpy(Dest, "lo");
+               return 0;
        }
        Pos --;
        
@@ -144,7 +151,8 @@ char *Adapter_ReadDir(tVFS_Node *Node, int Pos)
                tAdapter *a;  int i;\
                for(i=0,a=list; i < Pos && a; i ++, a = a->Next ); \
                if( a ) { \
-                       return Adapter_GetName(a);\
+                       strncpy(Dest, Adapter_GetName(a), FILENAME_MAX);\
+                       return 0;\
                } \
                Pos -= i; \
        } while(0);
@@ -152,10 +160,10 @@ char *Adapter_ReadDir(tVFS_Node *Node, int Pos)
        CHECK_LIST(gpIP_AdapterList, "eth");
        // TODO: Support other types of adapters (wifi, tap, ...)
 
-       return NULL;
+       return -EINVAL;
 }
 
-tVFS_Node *Adapter_FindDir(tVFS_Node *Node, const char *Name)
+tVFS_Node *Adapter_FindDir(tVFS_Node *Node, const char *Name, Uint Flags)
 {
        tAdapter *a = Adapter_GetByName(Name);
        if(!a)
@@ -256,6 +264,8 @@ void Adapter_SendPacket(tAdapter *Handle, tIPStackBuffer *Buffer)
        {
                Handle->Type->SendPacket( Handle->CardHandle, Buffer );
        }
+       
+       IPStack_Buffer_DestroyBuffer(Buffer);
 }
 
 // --- Helpers ---
@@ -344,7 +354,9 @@ void IPStack_SendDebugText(const char *Text)
        if( CPU_HAS_LOCK(&lLock) )
                return ;        // Nested!
        SHORTLOCK(&lLock);
+       #if ARCHDIR_is_x86
        __asm__ __volatile__ ("sti");   // Start interrupts (x86 specific)
+       #endif
 
        // Cache packets until a newline
        static char     cache[1500 - (sizeof(pkt_hdr) + 4)];
@@ -370,13 +382,13 @@ void IPStack_SendDebugText(const char *Text)
        memcpy(buffer, pkt_hdr, sizeof(pkt_hdr));
        memcpy(buffer + sizeof(pkt_hdr), cache, cache_len);
        
-       *(Uint16*)&buffer[14+2] = BigEndian16( sizeof(pkt_hdr)-14 + cache_len );        // IP Size
-       *(Uint16*)&buffer[14+10] = BigEndian16( 0 );    // IP Header
-       *(Uint16*)&buffer[14+20+4] = BigEndian16( 8+cache_len );        // UDP Size
-       *(Uint16*)&buffer[14+20+6] = BigEndian16( 0 );  // UDP Checksum
-       *(Uint32*)&buffer[link_checksum_ofs] = BigEndian32( 0 );        // 802.3 checksum?
+       ((Uint16*)buffer)[(14+2)/2] = BigEndian16( sizeof(pkt_hdr)-14 + cache_len );    // IP Size
+       ((Uint16*)buffer)[(14+10)/2] = BigEndian16( 0 );        // IP Header
+       ((Uint16*)buffer)[(14+20+4)/2] = BigEndian16( 8+cache_len );    // UDP Size
+       ((Uint16*)buffer)[(14+20+6)/2] = BigEndian16( 0 );      // UDP Checksum
+//     *(Uint32*)&buffer[link_checksum_ofs] = BigEndian32( 0 );        // 802.3 checksum?
        // TODO: Calculate checksums
-       *(Uint16*)&buffer[14+10] = BigEndian16( IPv4_Checksum(buffer+14,20) );  // IP Header
+       ((Uint16*)buffer)[(14+10)/2] = BigEndian16( IPv4_Checksum(buffer+14,20) );      // IP Header
        
        // Create buffer
        tIPStackBuffer  *buf = IPStack_Buffer_CreateBuffer(1);

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