X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Modules%2FIPStack%2Farp.c;h=e0912ad8550388756b9d8419f492dc0d9a9961a4;hb=9bd0feb2cd61d6071a2c3e039b35560e608ab627;hp=35532f6f5fc2bfb0f7dc2c49370dc4316feea1d4;hpb=e6eafcb86732068e2094f04a2452098c13256336;p=tpg%2Facess2.git diff --git a/Modules/IPStack/arp.c b/Modules/IPStack/arp.c index 35532f6f..e0912ad8 100644 --- a/Modules/IPStack/arp.c +++ b/Modules/IPStack/arp.c @@ -42,7 +42,7 @@ struct sARP_Cache6 { int giARP_Cache6Space; tMutex glARP_Cache6; #endif - int giARP_LastUpdateID = 0; +volatile int giARP_LastUpdateID = 0; // === CODE === /** @@ -81,13 +81,12 @@ tMacAddr ARP_Resolve4(tInterface *Interface, tIPv4 Address) if( IPStack_CompareAddress(4, &Address, Interface->Address, Interface->SubnetBits) == 0 ) { tRoute *route = IPStack_FindRoute(4, Interface, &Address); - if( route ) { - // If the next hop is defined, use it - // - 0.0.0.0 as the next hop means "no next hop / direct" - if( ((tIPv4*)route->NextHop)->L != 0 ) { - // Recursion: see /Recursion/ - return ARP_Resolve4(Interface, *(tIPv4*)route->NextHop); - } + // If the next hop is defined, use it + // - 0.0.0.0 as the next hop means "no next hop / direct" + if( route && ((tIPv4*)route->NextHop)->L != 0 ) + { + // Recursion: see /Recursion/ + return ARP_Resolve4(Interface, *(tIPv4*)route->NextHop); } } @@ -135,10 +134,14 @@ tMacAddr ARP_Resolve4(tInterface *Interface, tIPv4 Address) // Wait for a reply for(;;) { - while(lastID == giARP_LastUpdateID && now() < timeout) + while(lastID == giARP_LastUpdateID && now() < timeout) { Threads_Yield(); + } - if( now() >= timeout ) break; // Timeout + if( now() >= timeout ) { + Log_Log("ARP4", "Timeout"); + break; // Timeout + } lastID = giARP_LastUpdateID; @@ -148,6 +151,10 @@ tMacAddr ARP_Resolve4(tInterface *Interface, tIPv4 Address) if(gaARP_Cache4[i].IP.L != Address.L) continue; Mutex_Release( &glARP_Cache4 ); + Log_Debug("ARP4", "Return %02x:%02x:%02x:%02x:%02x:%02x", + gaARP_Cache4[i].MAC.B[0], gaARP_Cache4[i].MAC.B[1], + gaARP_Cache4[i].MAC.B[2], gaARP_Cache4[i].MAC.B[3], + gaARP_Cache4[i].MAC.B[4], gaARP_Cache4[i].MAC.B[5]); return gaARP_Cache4[i].MAC; } Mutex_Release( &glARP_Cache4 ); @@ -183,7 +190,6 @@ void ARP_UpdateCache4(tIPv4 SWAddr, tMacAddr HWAddr) i = free; else i = oldest; - gaARP_Cache4[i].IP = SWAddr; } Log_Log("ARP4", "Caching %i.%i.%i.%i (%02x:%02x:%02x:%02x:%02x:%02x) in %i", @@ -192,6 +198,7 @@ void ARP_UpdateCache4(tIPv4 SWAddr, tMacAddr HWAddr) i ); + gaARP_Cache4[i].IP = SWAddr; gaARP_Cache4[i].MAC = HWAddr; gaARP_Cache4[i].LastUpdate = now(); giARP_LastUpdateID ++; @@ -272,33 +279,25 @@ void ARP_int_GetPacket(tAdapter *Adapter, tMacAddr From, int Length, void *Buffe } #endif - Log_Debug("ARP", "Request ID %i", ntohs(req4->Request)); - switch( ntohs(req4->Request) ) { case 1: // You want my IP? - Log_Debug("ARP", "ARP Request Address class %i", req4->SWSize); // Check what type of IP it is switch( req4->SWSize ) { case 4: - 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]); - //Log_Debug("ARP", "to MAC %02x:%02x:%02x:%02x:%02x:%02x", - // req4->DestMac.B[0], req4->DestMac.B[1], - // req4->DestMac.B[2], req4->DestMac.B[3], - // req4->DestMac.B[4], req4->DestMac.B[5]); 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", "Caching sender's IP Address"); ARP_UpdateCache4(req4->SourceIP, req4->SourceMac); req4->DestIP = req4->SourceIP;