Kernel/PTYs - NL->CR translation (disabled)
[tpg/acess2.git] / KernelLand / Modules / IPStack / arp.c
index 5ca128b..5b9303b 100644 (file)
 #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);
@@ -221,17 +266,20 @@ void ARP_UpdateCache4(tIPv4 SWAddr, tMacAddr HWAddr)
                else
                        i = oldest;
        }
-       
-       Log_Log("ARP4", "Caching %i.%i.%i.%i (%02x:%02x:%02x:%02x:%02x:%02x) in %i",
-               SWAddr.B[0], SWAddr.B[1], SWAddr.B[2], SWAddr.B[3],
-               HWAddr.B[0], HWAddr.B[1], HWAddr.B[2], HWAddr.B[3], HWAddr.B[4], HWAddr.B[5],
-               i
-               );
+
+       if( memcmp(&gaARP_Cache4[i].MAC, &HWAddr, sizeof(HWAddr)) != 0 )
+       {
+               Log_Log("ARP4", "Caching %i.%i.%i.%i (%02x:%02x:%02x:%02x:%02x:%02x) in %i",
+                       SWAddr.B[0], SWAddr.B[1], SWAddr.B[2], SWAddr.B[3],
+                       HWAddr.B[0], HWAddr.B[1], HWAddr.B[2], HWAddr.B[3], HWAddr.B[4], HWAddr.B[5],
+                       i
+                       );
                
-       gaARP_Cache4[i].IP = SWAddr;
-       gaARP_Cache4[i].MAC = HWAddr;
-       gaARP_Cache4[i].LastUpdate = now();
-       Semaphore_Signal(&gARP_Cache4Semaphore, giARP_WaitingThreads);
+               gaARP_Cache4[i].IP = SWAddr;
+               gaARP_Cache4[i].MAC = HWAddr;
+               gaARP_Cache4[i].LastUpdate = now();
+               Semaphore_Signal(&gARP_Cache4Semaphore, giARP_WaitingThreads);
+       }
        Mutex_Release(&glARP_Cache4);
 }
 
@@ -316,18 +364,18 @@ 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",
-                               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->SourceMac.B[0], req4->SourceMac.B[1],
-                               req4->SourceMac.B[2], req4->SourceMac.B[3],
-                               req4->SourceMac.B[4], req4->SourceMac.B[5]);
                        iface = IPv4_GetInterface(Adapter, req4->DestIP, 0);
                        if( iface )
                        {
+                               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],
+                                       req4->SourceMac.B[0], req4->SourceMac.B[1],
+                                       req4->SourceMac.B[2], req4->SourceMac.B[3],
+                                       req4->SourceMac.B[4], req4->SourceMac.B[5]);
                                ARP_UpdateCache4(req4->SourceIP, req4->SourceMac);
                                
                                req4->DestIP = req4->SourceIP;
@@ -342,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

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