X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FModules%2FIPStack%2Flink.c;h=45311d0c007dbef3646d0bb6157a1100f31e1ddd;hb=9122d035c4337d33bf0cc2212eeade4e42a367a2;hp=f0c6367a6b63e73b26ee35817a8fe967d289b4f8;hpb=402d2056165b5503364eeb8639e034edce09067c;p=tpg%2Facess2.git diff --git a/KernelLand/Modules/IPStack/link.c b/KernelLand/Modules/IPStack/link.c index f0c6367a..45311d0c 100644 --- a/KernelLand/Modules/IPStack/link.c +++ b/KernelLand/Modules/IPStack/link.c @@ -16,6 +16,13 @@ #define VALIDATE_CHECKSUM 0 #define MAX_PACKET_SIZE 2048 +// === TYPES === +typedef struct { + Uint16 Type; + tPacketCallback Callback; +} tLink_PktType; + + // === PROTOTYPES === void Link_RegisterType(Uint16 Type, tPacketCallback Callback); void Link_SendPacket(tAdapter *Adapter, Uint16 Type, tMacAddr To, tIPStackBuffer *Buffer); @@ -28,10 +35,7 @@ Uint32 Link_CalculatePartialCRC(Uint32 CRC, const void *Data, int Length); // === GLOBALS === int giRegisteredTypes = 0; int giRegisteredTypeSpace = 0; -struct { - Uint16 Type; - tPacketCallback Callback; -} *gaRegisteredTypes; +tLink_PktType *gaRegisteredTypes; int gbLink_CRCTableGenerated = 0; Uint32 gaiLink_CRCTable[256]; @@ -44,41 +48,45 @@ Uint32 gaiLink_CRCTable[256]; */ void Link_RegisterType(Uint16 Type, tPacketCallback Callback) { - int i; - void *tmp; + tLink_PktType *typeslot = NULL; - for( i = giRegisteredTypes; i -- ; ) + for( int i = 0; i < giRegisteredTypes; i ++) { if(gaRegisteredTypes[i].Type == Type) { Log_Warning("Net Link", "Attempt to register 0x%x twice", Type); return ; } // Ooh! Free slot! - if(gaRegisteredTypes[i].Callback == NULL) break; + if(gaRegisteredTypes[i].Callback == NULL) + { + typeslot = &gaRegisteredTypes[i]; + break; + } } - if(i == -1) + if(typeslot == NULL) { - giRegisteredTypeSpace += 5; - tmp = realloc(gaRegisteredTypes, giRegisteredTypeSpace*sizeof(*gaRegisteredTypes)); - if(!tmp) { - Log_Warning("Net Link", - "Out of heap space! (Attempted to allocate %i)", - giRegisteredTypeSpace*sizeof(*gaRegisteredTypes) - ); - return ; + if( giRegisteredTypes == giRegisteredTypeSpace ) + { + giRegisteredTypeSpace += 5; + void *tmp = realloc(gaRegisteredTypes, giRegisteredTypeSpace*sizeof(tLink_PktType)); + if(!tmp) { + Log_Warning("Net Link", + "Out of heap space! (Attempted to allocate %i)", + giRegisteredTypeSpace*sizeof(tLink_PktType) + ); + return ; + } + gaRegisteredTypes = tmp; } - gaRegisteredTypes = tmp; - i = giRegisteredTypes; - giRegisteredTypes ++; + typeslot = &gaRegisteredTypes[giRegisteredTypes++]; } - gaRegisteredTypes[i].Callback = Callback; - gaRegisteredTypes[i].Type = Type; + typeslot->Callback = Callback; + typeslot->Type = Type; } /** - * \fn void Link_SendPacket(tAdapter *Adapter, Uint16 Type, tMacAddr To, int Length, void *Buffer) * \brief Formats and sends a packet on the specified interface */ void Link_SendPacket(tAdapter *Adapter, Uint16 Type, tMacAddr To, tIPStackBuffer *Buffer) @@ -135,8 +143,9 @@ int Link_HandlePacket(tAdapter *Adapter, tIPStackBuffer *Buffer) #if LINK_LOGPACKETS Log_Log("Net Link", - "Packet from %02x:%02x:%02x:%02x:%02x:%02x" + "eth%i Packet from %02x:%02x:%02x:%02x:%02x:%02x" " to %02x:%02x:%02x:%02x:%02x:%02x (Type=%04x)", + Adapter->Index, hdr->Src.B[0], hdr->Src.B[1], hdr->Src.B[2], hdr->Src.B[3], hdr->Src.B[4], hdr->Src.B[5], hdr->Dest.B[0], hdr->Dest.B[1], hdr->Dest.B[2], @@ -152,31 +161,28 @@ int Link_HandlePacket(tAdapter *Adapter, tIPStackBuffer *Buffer) // TODO: Check checksum #endif + Uint16 type = ntohs(hdr->Type); // Check if there is a registered callback for this packet type - int i; - for( i = giRegisteredTypes; i--; ) + for( int i = giRegisteredTypes; i--; ) { - if(gaRegisteredTypes[i].Type == ntohs(hdr->Type)) break; + if(gaRegisteredTypes[i].Type == type) + { + // Call the callback + gaRegisteredTypes[i].Callback( + Adapter, + hdr->Src, + len - sizeof(tEthernetHeader), + hdr->Data + ); + free(data); + return 0; + } } // No? Ignore it - if( i == -1 ) { - Log_Log("Net Link", "Unregistered type 0x%x", ntohs(hdr->Type)); - - free(data); - return 1; - } - - // Call the callback - gaRegisteredTypes[i].Callback( - Adapter, - hdr->Src, - len - sizeof(tEthernetHeader), - hdr->Data - ); - - free(data); + Log_Log("Net Link", "eth%i Unregistered type 0x%04x", Adapter->Index, type); - return 0; + free(data); + return 1; } // From http://www.cl.cam.ac.uk/research/srg/bluebook/21/crc/node6.html