X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;ds=sidebyside;f=KernelLand%2FModules%2FIPStack%2Fadapters.c;h=d6185b4ece9ae9444349207818888e9749542871;hb=HEAD;hp=83741dfe582441e48f9e44edd537756a1c6912f1;hpb=11dbd684e9a3d907d43d71a3145205f1a86992fb;p=tpg%2Facess2.git diff --git a/KernelLand/Modules/IPStack/adapters.c b/KernelLand/Modules/IPStack/adapters.c index 83741dfe..d6185b4e 100644 --- a/KernelLand/Modules/IPStack/adapters.c +++ b/KernelLand/Modules/IPStack/adapters.c @@ -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);