X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;ds=sidebyside;f=KernelLand%2FModules%2FIPStack%2Farp.c;h=c81f4c2ae3e931224fd28a419194df91ca464edd;hb=43ed567babb1a9084d732519dc2f6d4214310115;hp=2957eeeac487c6efbf5fec35b8121ca1627459b0;hpb=2a49f5a6be4fd478ae4249115ff2a3bf0e34d7e5;p=tpg%2Facess2.git diff --git a/KernelLand/Modules/IPStack/arp.c b/KernelLand/Modules/IPStack/arp.c index 2957eeea..c81f4c2a 100644 --- a/KernelLand/Modules/IPStack/arp.c +++ b/KernelLand/Modules/IPStack/arp.c @@ -16,6 +16,20 @@ #define ARP_CACHE_SIZE 128 #define ARP_MAX_AGE (60*60*1000) // 1Hr +typedef struct sARP_CacheEnt +{ + void *Layer3Addr; + tMacAddr L2Addr; + Sint64 LastUpdate; + Sint64 LastUsed; +} tARP_CacheEnt; +typedef struct sARP_Cache +{ + size_t AddrSize; + int nCacheEnts; + tARP_CacheEnt Cache[]; +} tARP_Cache; + // === IMPORTS === extern tInterface *IPv4_GetInterface(tAdapter *Adapter, tIPv4 Address, int Broadcast); #if ARPv6 @@ -28,6 +42,7 @@ tMacAddr ARP_Resolve4(tInterface *Interface, tIPv4 Address); void ARP_int_GetPacket(tAdapter *Adapter, tMacAddr From, int Length, void *Buffer); // === GLOBALS === + int giARP_WaitingThreads; struct sARP_Cache4 { tIPv4 IP; tMacAddr MAC; @@ -37,7 +52,6 @@ struct sARP_Cache4 { int giARP_Cache4Space; tMutex glARP_Cache4; tSemaphore gARP_Cache4Semaphore; - int giARP_WaitingThreads; #if ARPv6 struct sARP_Cache6 { tIPv6 IP; @@ -50,6 +64,24 @@ tMutex glARP_Cache6; #endif // === CODE === +tARP_Cache *ARP_int_CreateCache(unsigned int NumCacheEntries, size_t AddrSize) +{ + size_t len = sizeof(tARP_Cache) + NumCacheEntries * (sizeof(tARP_CacheEnt) + AddrSize); + tARP_Cache *ret = calloc(len, 1); + + ret->nCacheEnts = NumCacheEntries; + ret->AddrSize = AddrSize; + + char *addr_storage_pos = (void*)&ret->Cache[NumCacheEntries]; + + for( int i = 0; i < NumCacheEntries; i ++ ) + { + ret->Cache[i].Layer3Addr = addr_storage_pos; + addr_storage_pos += AddrSize; + } + + return ret; +} /** * \fn int ARP_Initialise() * \brief Initalise the ARP section @@ -71,6 +103,22 @@ int ARP_Initialise() return 1; } +tMacAddr ARP_Resolve(tInterface *Interface, void *Address) +{ + switch(Interface->Type) + { + case AF_INET4: + return ARP_Resolve4(Interface, *(tIPv4*)Address); +// case AF_INET6: +// ret = ARP_int_CacheLookup(Interface, 16, Address); +// if(ret == cMAC_ZERO) { +// // TODO: Send ICMPv6 ND requests +// } +// return ret; + } + return cMAC_ZERO; +} + /** * \brief Resolves a MAC address from an IPv4 address */ @@ -158,9 +206,6 @@ tMacAddr ARP_Resolve4(tInterface *Interface, tIPv4 Address) // Send Request Link_SendPacket(Interface->Adapter, 0x0806, req.DestMac, buffer); - - // Clean up - IPStack_Buffer_DestroyBuffer(buffer); // Wait for a reply Time_ScheduleTimer(NULL, Interface->TimeoutDelay); @@ -319,12 +364,12 @@ void ARP_int_GetPacket(tAdapter *Adapter, tMacAddr From, int Length, void *Buffe switch( req4->SWSize ) { case 4: - Log_Debug("ARP", "ARP Request IPv4 Address %i.%i.%i.%i from %i.%i.%i.%i", + Log_Debug("ARP", "ARP Request IPv4 Address %i.%i.%i.%i from %i.%i.%i.%i" + " (%02x:%02x:%02x:%02x:%02x:%02x)", req4->DestIP.B[0], req4->DestIP.B[1], req4->DestIP.B[2], req4->DestIP.B[3], req4->SourceIP.B[0], req4->SourceIP.B[1], - req4->SourceIP.B[2], req4->SourceIP.B[3]); - Log_Debug("ARP", " from MAC %02x:%02x:%02x:%02x:%02x:%02x", + req4->SourceIP.B[2], req4->SourceIP.B[3], req4->SourceMac.B[0], req4->SourceMac.B[1], req4->SourceMac.B[2], req4->SourceMac.B[3], req4->SourceMac.B[4], req4->SourceMac.B[5]); @@ -345,9 +390,10 @@ void ARP_int_GetPacket(tAdapter *Adapter, tMacAddr From, int Length, void *Buffe // Assumes only a header and footer at link layer tIPStackBuffer *buffer = IPStack_Buffer_CreateBuffer(3); - IPStack_Buffer_AppendSubBuffer(buffer, sizeof(struct sArpRequest4), 0, req4, NULL, NULL); + IPStack_Buffer_AppendSubBuffer(buffer, + sizeof(struct sArpRequest4), 0, req4, + NULL, NULL); Link_SendPacket(Adapter, 0x0806, req4->DestMac, buffer); - IPStack_Buffer_DestroyBuffer(buffer); } break; #if ARPv6