X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Modules%2FIPStack%2Farp.c;h=ec10f39667e0183379bd234877190b428f042c3c;hb=351dd3b194833c923bad0292e9019320fb2a41fa;hp=3f919399424cabe68ba414c9a81703736048b635;hpb=6bc21db109c4d8d3219ad58fc5cc76ec76e6c6b7;p=tpg%2Facess2.git diff --git a/Modules/IPStack/arp.c b/Modules/IPStack/arp.c index 3f919399..ec10f396 100644 --- a/Modules/IPStack/arp.c +++ b/Modules/IPStack/arp.c @@ -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; } }