Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: oldheating gps motorhome heating
Diff: eth/arp.cpp
- Revision:
- 43:bc028d5a6424
- Parent:
- 42:222a4f45f916
- Child:
- 44:83ce5ace337b
--- a/eth/arp.cpp Sun Oct 15 17:54:09 2017 +0000 +++ b/eth/arp.cpp Thu Oct 19 20:56:58 2017 +0000 @@ -8,10 +8,13 @@ #include "ar.h" #include "nr.h" #include "io.h" +#include "ip4.h" #define REQUEST 1 #define REPLY 2 +bool ArpTrace = false; + uint32_t ArpAddressToResolve; bool ArpResolveRequestFlag = false; @@ -27,6 +30,44 @@ char targetHardwareAddress[6]; //nbytes: (ar$tha) Hardware address of target of this packet (if known). uint32_t targetProtocolAddress; //mbytes: (ar$tpa) Protocol address of target. }; + +static void logHeader(void * pPacket) +{ + struct header* pHeader = (header*)pPacket; + char text[30]; + + if (NetTraceVerbose) + { + LogTime("ARP header\r\n"); + if (NetToHost16(pHeader->hardwareType) == ETHERNET) Log (" hardwareType = ETHERNET\r\n"); + else LogF(" hardwareType = %d\r\n", NetToHost16(pHeader->hardwareType)); + EthProtocolToString(NetToHost16(pHeader->protocolType), sizeof(text), text); + LogF(" protocolType = %s\r\n", text); + LogF(" hardwareLength = %d\r\n", pHeader->hardwareLength); + LogF(" protocolLength = %d\r\n", pHeader->protocolLength); + if (NetToHost16(pHeader->opCode) == REQUEST) Log (" opCode = REQUEST\r\n"); + else if (NetToHost16(pHeader->opCode) == REPLY ) Log (" opCode = REPLY\r\n"); + else LogF(" opCode = %d\r\n", NetToHost16(pHeader->opCode)); + MacToString(pHeader->senderHardwareAddress, sizeof(text), text); + LogF(" senderHardwareAddress = %s\r\n", text); + Ip4AddressToString(pHeader->senderProtocolAddress, sizeof(text), text); + LogF(" senderProtocolAddress = %s\r\n", text); + MacToString(pHeader->targetHardwareAddress, sizeof(text), text); + LogF(" targetHardwareAddress = %s\r\n", text); + Ip4AddressToString(pHeader->targetProtocolAddress, sizeof(text), text); + LogF(" targetProtocolAddress = %s\r\n", text); + } + else + { + Log("ARP header "); + MacToString (pHeader->senderHardwareAddress, sizeof(text), text); Log(text); + Ip4AddressToString(pHeader->senderProtocolAddress, sizeof(text), text); Log("["); LogF(text); Log("] >>> "); + MacToString (pHeader->targetHardwareAddress, sizeof(text), text); LogF(text); + Ip4AddressToString(pHeader->targetProtocolAddress, sizeof(text), text); Log("["); LogF(text); Log("]\r\n"); + + } +} + int ArpHandleReceivedPacket(void (*traceback)(void), char* pSrcMac, void * pPacket, int* pSize, char* pDstMac) { struct header* pHeader = (header*)pPacket; @@ -46,17 +87,34 @@ switch (opCode) { case REQUEST: + if (ArpTrace) + { + if (NetTraceNewLine) Log("\r\n"); + LogTime("ARP received request\r\n"); + logHeader(pPacket); + if (NetTraceStack) traceback(); + } MacCopy(pHeader->targetHardwareAddress, pHeader->senderHardwareAddress); - pHeader->targetProtocolAddress = pHeader->senderProtocolAddress; + pHeader->targetProtocolAddress = pHeader->senderProtocolAddress; MacCopy(pHeader->senderHardwareAddress, MacLocal); - pHeader->senderProtocolAddress = DhcpLocalIp; - pHeader->opCode = NetToHost16(REPLY); + pHeader->senderProtocolAddress = DhcpLocalIp; + pHeader->opCode = NetToHost16(REPLY); MacCopy(pDstMac, pSrcMac); - return UNICAST; + if (ArpTrace) logHeader(pPacket); + return ActionMakeFromDestAndTrace(UNICAST, ArpTrace && NetTraceStack); + case REPLY: + if (ArpTrace) + { + if (NetTraceNewLine) Log("\r\n"); + LogTime("ARP received reply\r\n"); + logHeader(pPacket); + if (NetTraceStack) traceback(); + } ArAddIp4Record(pHeader->senderHardwareAddress, pHeader->senderProtocolAddress); NrMakeRequestForNameFromIp4(pHeader->senderProtocolAddress); return DO_NOTHING; + default: return DO_NOTHING; } @@ -65,7 +123,7 @@ { if (!ArpResolveRequestFlag) return DO_NOTHING; ArpResolveRequestFlag = false; - + struct header* pHeader = (header*)pPacket; pHeader->hardwareType = NetToHost16(ETHERNET); @@ -76,10 +134,16 @@ MacClear(pHeader->targetHardwareAddress); pHeader->targetProtocolAddress = ArpAddressToResolve; - MacCopy(pHeader->senderHardwareAddress, MacLocal); - pHeader->senderProtocolAddress = DhcpLocalIp; + MacCopy (pHeader->senderHardwareAddress, MacLocal); + pHeader->senderProtocolAddress = DhcpLocalIp; *pSize = sizeof(header); - return BROADCAST; + if (ArpTrace) + { + if (NetTraceNewLine) Log("\r\n"); + LogTime("ARP send request\r\n"); + logHeader(pPacket); + } + return ActionMakeFromDestAndTrace(BROADCAST, ArpTrace && NetTraceStack); }