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: ip6/icmp/ndp/rs.cpp
- Revision:
- 46:40d33e9037e4
- Child:
- 47:73af5c0b0dc2
diff -r 3dd57903ec99 -r 40d33e9037e4 ip6/icmp/ndp/rs.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ip6/icmp/ndp/rs.cpp Tue Oct 24 07:01:35 2017 +0000
@@ -0,0 +1,90 @@
+#include "mbed.h"
+#include "log.h"
+#include "net.h"
+#include "ndp.h"
+#include "ip6.h"
+#include "slaac.h"
+#include "clock.h"
+#include "action.h"
+#include "mac.h"
+
+bool RsTrace = false;
+
+bool go = false;
+
+#define REPEAT_DELAY_TIME 60
+static uint32_t delayTime = 10000000; //Reset whenever a message is sent and blocks another send until count exceeds REPEAT_DELAY_TIME
+
+int RsGetWaitingSolicitation(void* pPacket, int* pSize, uint8_t* pType, uint8_t* pCode)
+{
+ if (!go) return DO_NOTHING;
+ go = false;
+
+ __packed struct header
+ {
+ uint32_t reserved;
+ };
+ struct header* pHeader = (header*)pPacket;
+ pHeader->reserved = 0;
+ *pSize = sizeof(struct header);
+ *pType = 133; //Router solicitation
+ *pCode = 0;
+
+ char* pData = (char*)pHeader + sizeof(struct header);
+ char* p = pData;
+
+ p += NdpAddOptionSourceMac(p, MacLocal);
+
+ *pSize = sizeof(struct header) + p - pData;
+
+ if (RsTrace)
+ {
+ if (NetTraceNewLine) Log("\r\n");
+ LogTime("NDP send router solicit\r\n");
+ if (NetTraceVerbose)
+ {
+ Log("RS header\r\n");
+ NdpLogOptions(pData, *pSize);
+ }
+ else
+ {
+ Log("RS header\r\n");
+ }
+ }
+
+ return ActionMakeFromDestAndTrace(MULTICAST_ROUTER, RsTrace && NetTraceStack);
+
+}
+
+static void checkIfGo()
+{
+ if (delayTime < REPEAT_DELAY_TIME) return; //Don't retry within the delay time
+
+ if (NdpLifetime && NdpElapsedTime < (NdpLifetime >> 1)) return; //Do nothing if within half the life
+
+ if (!NdpLifetime || NdpElapsedTime >= NdpLifetime)
+ {
+ if (RsTrace)
+ {
+ if (NetTraceNewLine) Log("\r\n");
+ LogTime("NDP lifetime has expired: clear global prefix\r\n");
+ }
+ NdpLifetime = 0;
+ Ip6Clear(NdpPrefix);
+ SlaacMakeGlobal(NdpPrefix);
+ Ip6Clear(NdpDnsServer);
+ }
+
+ delayTime = 0;
+ go = true;
+}
+
+void RsMain()
+{
+ if (ClockTicked)
+ {
+ NdpElapsedTime++;
+ delayTime++;
+ }
+ checkIfGo();
+}