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:
- 48:952dddb74b8b
- Parent:
- 47:73af5c0b0dc2
- Child:
- 49:1a6336f2b3f9
diff -r 73af5c0b0dc2 -r 952dddb74b8b eth/arp.cpp
--- a/eth/arp.cpp Thu Oct 26 14:50:24 2017 +0000
+++ b/eth/arp.cpp Tue Oct 31 21:25:09 2017 +0000
@@ -5,7 +5,7 @@
#include "eth.h"
#include "mac.h"
#include "dhcp.h"
-#include "ar.h"
+#include "ar4.h"
#include "nr.h"
#include "io.h"
#include "ip4.h"
@@ -30,26 +30,25 @@
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 struct header* pHeader;
-static void logHeader(void * pPacket)
-{
- struct header* pHeader = (header*)pPacket;
-
+static void logHeader()
+{
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));
- Log (" protocolType = "); EthProtocolLog(pHeader->protocolType); Log("\r\n");
- 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));
- Log(" senderHardwareAddress = "); MacLog(pHeader->senderHardwareAddress); Log("\r\n");
- Log(" senderProtocolAddress = "); Ip4AddressLog(pHeader->senderProtocolAddress); Log("\r\n");
- Log(" targetHardwareAddress = "); MacLog(pHeader->targetHardwareAddress); Log("\r\n");
- Log(" targetProtocolAddress = "); Ip4AddressLog(pHeader->targetProtocolAddress); Log("\r\n");
+ Log (" protocolType = "); EthProtocolLog(pHeader->protocolType); Log("\r\n");
+ 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));
+ Log(" senderHardwareAddress = "); MacLog(pHeader->senderHardwareAddress); Log("\r\n");
+ Log(" senderProtocolAddress = "); Ip4AddressLog(pHeader->senderProtocolAddress); Log("\r\n");
+ Log(" targetHardwareAddress = "); MacLog(pHeader->targetHardwareAddress); Log("\r\n");
+ Log(" targetProtocolAddress = "); Ip4AddressLog(pHeader->targetProtocolAddress); Log("\r\n");
}
else
{
@@ -61,17 +60,24 @@
}
}
+static void (*pTraceBack)(void);
+static void trace()
+{
+ pTraceBack();
+ logHeader();
+}
int ArpHandleReceivedPacket(void (*traceback)(void), char* pSrcMac, void * pPacket, int* pSize, char* pDstMac)
{
- struct header* pHeader = (header*)pPacket;
+ pTraceBack = traceback;
+ pHeader = (header*)pPacket;
int16_t hardwareType = NetToHost16(pHeader->hardwareType);
int16_t protocolType = NetToHost16(pHeader->protocolType);
int8_t hardwareLength = pHeader->hardwareLength;
int8_t protocolLength = pHeader->protocolLength;
int16_t opCode = NetToHost16(pHeader->opCode);
uint32_t targetProtocolAddress = pHeader->targetProtocolAddress;
-
+
if (hardwareType != ETHERNET ) return DO_NOTHING; //This is not ethernet
if (protocolType != IPV4 ) return DO_NOTHING; //This is not IPv4
if (hardwareLength != 6 ) return DO_NOTHING; //This is not a MAC hardware address
@@ -86,7 +92,7 @@
if (NetTraceNewLine) Log("\r\n");
LogTime("ARP received request\r\n");
if (NetTraceStack) traceback();
- logHeader(pPacket);
+ logHeader();
}
MacCopy(pHeader->targetHardwareAddress, pHeader->senderHardwareAddress);
pHeader->targetProtocolAddress = pHeader->senderProtocolAddress;
@@ -94,7 +100,7 @@
pHeader->senderProtocolAddress = DhcpLocalIp;
pHeader->opCode = NetToHost16(REPLY);
MacCopy(pDstMac, pSrcMac);
- if (ArpTrace) logHeader(pPacket);
+ if (ArpTrace) logHeader();
return ActionMakeFromDestAndTrace(UNICAST, ArpTrace && NetTraceStack);
case REPLY:
@@ -103,9 +109,9 @@
if (NetTraceNewLine) Log("\r\n");
LogTime("ARP received reply\r\n");
if (NetTraceStack) traceback();
- logHeader(pPacket);
+ logHeader();
}
- ArAddIp4Record(pHeader->senderHardwareAddress, pHeader->senderProtocolAddress);
+ Ar4AddIpRecord(trace, pHeader->senderHardwareAddress, pHeader->senderProtocolAddress);
NrMakeRequestForNameFromIp4(pHeader->senderProtocolAddress);
return DO_NOTHING;
@@ -117,27 +123,27 @@
{
if (!ArpResolveRequestFlag) return DO_NOTHING;
ArpResolveRequestFlag = false;
-
- struct header* pHeader = (header*)pPacket;
-
+
+ pHeader = (header*)pPacket;
+
pHeader->hardwareType = NetToHost16(ETHERNET);
pHeader->protocolType = NetToHost16(IPV4);
pHeader->hardwareLength = 6;
pHeader->protocolLength = 4;
pHeader->opCode = NetToHost16(REQUEST);
-
+
MacClear(pHeader->targetHardwareAddress);
pHeader->targetProtocolAddress = ArpAddressToResolve;
MacCopy (pHeader->senderHardwareAddress, MacLocal);
pHeader->senderProtocolAddress = DhcpLocalIp;
-
+
*pSize = sizeof(header);
if (ArpTrace)
{
if (NetTraceNewLine) Log("\r\n");
LogTime("ARP send request\r\n");
- logHeader(pPacket);
+ logHeader();
}
return ActionMakeFromDestAndTrace(BROADCAST, ArpTrace && NetTraceStack);
}