Misc Changes
[tpg/acess2.git] / Modules / IPStack / arp.c
index 3f91939..ec10f39 100644 (file)
@@ -16,7 +16,7 @@ extern tInterface     *IPv6_GetInterface(tAdapter *Adapter, tIPv6 Address, int Broad
 
 // === PROTOTYPES ===
  int   ARP_Initialise();
- int   ARP_int_Resolve4(tInterface *Interface, tIPv4 Address);
+tMacAddr       ARP_Resolve4(tInterface *Interface, tIPv4 Address);
 void   ARP_int_GetPacket(tAdapter *Adapter, tMacAddr From, int Length, void *Buffer);
 
 // === GLOBALS ===
@@ -64,6 +64,7 @@ tMacAddr ARP_Resolve4(tInterface *Interface, tIPv4 Address)
 {
         int    lastID;
         int    i;
+       struct sArpRequest4     req;
        
        ENTER("pInterface xAddress", Interface, Address);
        
@@ -87,37 +88,12 @@ tMacAddr ARP_Resolve4(tInterface *Interface, tIPv4 Address)
        RELEASE( &glARP_Cache4 );
        
        lastID = giARP_LastUpdateID;
-       ARP_int_Resolve4(Interface, Address);
-       for(;;)
-       {
-               while(lastID == giARP_LastUpdateID)     Threads_Yield();
-               lastID = giARP_LastUpdateID;
-               
-               LOCK( &glARP_Cache4 );
-               for( i = 0; i < giARP_Cache4Space; i++ )
-               {
-                       if(gaARP_Cache4[i].IP.L != Address.L)   continue;
-                       
-                       RELEASE( &glARP_Cache4 );
-                       return gaARP_Cache4[i].MAC;
-               }
-               RELEASE( &glARP_Cache4 );
-       }
-}
-
-/**
- * \fn int ARP_int_Resolve4(tInterface *Interface, tIPv4 Address)
- * \brief Request the network to resolve an IPv4 Address
- * \return Boolean Success
- */
-int ARP_int_Resolve4(tInterface *Interface, tIPv4 Address)
-{
-       struct sArpRequest4     req;
        
+       // Create request
        Log("[ARP4 ] Asking for address %i.%i.%i.%i",
                Address.B[0], Address.B[1], Address.B[2], Address.B[3]
                );
-       req.HWType = htons(0x100);      // Ethernet
+       req.HWType = htons(0x0001);     // Ethernet
        req.Type   = htons(0x0800);
        req.HWSize = 6;
        req.SWSize = 4;
@@ -127,9 +103,25 @@ int ARP_int_Resolve4(tInterface *Interface, tIPv4 Address)
        req.DestMac = cMAC_BROADCAST;
        req.DestIP = Address;
        
+       // Send Request
        Link_SendPacket(Interface->Adapter, 0x0806, req.DestMac, sizeof(struct sArpRequest4), &req);
        
-       return 0;
+       // Wait for a reply
+       for(;;)
+       {
+               while(lastID == giARP_LastUpdateID)     Threads_Yield();
+               lastID = giARP_LastUpdateID;
+               
+               LOCK( &glARP_Cache4 );
+               for( i = 0; i < giARP_Cache4Space; i++ )
+               {
+                       if(gaARP_Cache4[i].IP.L != Address.L)   continue;
+                       
+                       RELEASE( &glARP_Cache4 );
+                       return gaARP_Cache4[i].MAC;
+               }
+               RELEASE( &glARP_Cache4 );
+       }
 }
 
 /**
@@ -160,8 +152,15 @@ void ARP_UpdateCache4(tIPv4 SWAddr, tMacAddr HWAddr)
                gaARP_Cache4[i].IP = SWAddr;
        }
        
+       Log("[ARP  ] 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].MAC = HWAddr;
        gaARP_Cache4[i].LastUpdate = now();
+       giARP_LastUpdateID ++;
        RELEASE(&glARP_Cache4);
 }
 
@@ -195,6 +194,7 @@ void ARP_UpdateCache6(tIPv6 SWAddr, tMacAddr HWAddr)
        
        gaARP_Cache6[i].IP = SWAddr;
        gaARP_Cache6[i].LastUpdate = now();
+       giARP_LastUpdateID ++;
        RELEASE(&glARP_Cache6);
 }
 
@@ -312,5 +312,9 @@ void ARP_int_GetPacket(tAdapter *Adapter, tMacAddr From, int Length, void *Buffe
                }
                
                break;
+       
+       default:
+               Warning("[ARP  ] Unknown Request ID %i", ntohs(req4->Request));
+               break;
        }
 }

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