A stack which works with or without an Mbed os library. Provides IPv4 or IPv6 with a full 1500 byte buffer.

Dependents:   oldheating gps motorhome heating

Committer:
andrewboyson
Date:
Fri Jan 25 17:37:51 2019 +0000
Revision:
116:60521b29e4c9
Parent:
113:904b40231907
Child:
124:6e558721ec1c
Added backoff delay to DHCP

Who changed what in which revision?

UserRevisionLine numberNew contents of line
andrewboyson 113:904b40231907 1 #include <stdint.h>
andrewboyson 113:904b40231907 2 #include <string.h>
andrewboyson 113:904b40231907 3 #include <stdbool.h>
andrewboyson 113:904b40231907 4
andrewboyson 113:904b40231907 5 #include "log.h"
andrewboyson 113:904b40231907 6 #include "clk.h"
andrewboyson 113:904b40231907 7 #include "mstimer.h"
andrewboyson 113:904b40231907 8 #include "clktime.h"
andrewboyson 113:904b40231907 9 #include "clkntp.h"
andrewboyson 113:904b40231907 10 #include "clkutc.h"
andrewboyson 113:904b40231907 11 #include "clkgov.h"
andrewboyson 113:904b40231907 12 #include "clktm.h"
andrewboyson 113:904b40231907 13 #include "net.h"
andrewboyson 113:904b40231907 14 #include "ntp.h"
andrewboyson 113:904b40231907 15 #include "ntpclient.h"
andrewboyson 113:904b40231907 16 #include "dns.h"
andrewboyson 113:904b40231907 17 #include "ip4.h"
andrewboyson 116:60521b29e4c9 18 #include "resolve.h"
andrewboyson 113:904b40231907 19 #include "action.h"
andrewboyson 113:904b40231907 20
andrewboyson 113:904b40231907 21 #define ONE_BILLION 1000000000ULL
andrewboyson 113:904b40231907 22 #define ONE_MILLION 1000000LL
andrewboyson 113:904b40231907 23
andrewboyson 113:904b40231907 24 char NtpClientQueryServerName[DNS_MAX_LABEL_LENGTH+1];
andrewboyson 113:904b40231907 25 int32_t NtpClientQueryInitialInterval;
andrewboyson 113:904b40231907 26 int32_t NtpClientQueryNormalInterval;
andrewboyson 113:904b40231907 27 int32_t NtpClientQueryRetryInterval;
andrewboyson 113:904b40231907 28
andrewboyson 113:904b40231907 29 bool NtpClientQuerySendRequestsViaIp4 = false;
andrewboyson 113:904b40231907 30 uint32_t NtpClientQueryServerIp4;
andrewboyson 113:904b40231907 31 char NtpClientQueryServerIp6[16];
andrewboyson 113:904b40231907 32
andrewboyson 113:904b40231907 33 static uint64_t startNtpMs = 0;
andrewboyson 113:904b40231907 34 static int intervalTypeNtp = NTP_QUERY_INTERVAL_INITIAL;
andrewboyson 113:904b40231907 35 static bool intervalCompleteNtp()
andrewboyson 113:904b40231907 36 {
andrewboyson 113:904b40231907 37 uint32_t interval;
andrewboyson 113:904b40231907 38 switch(intervalTypeNtp)
andrewboyson 113:904b40231907 39 {
andrewboyson 113:904b40231907 40 case NTP_QUERY_INTERVAL_INITIAL: interval = NtpClientQueryInitialInterval; break;
andrewboyson 113:904b40231907 41 case NTP_QUERY_INTERVAL_NORMAL: interval = NtpClientQueryNormalInterval; break;
andrewboyson 113:904b40231907 42 case NTP_QUERY_INTERVAL_RETRY: interval = NtpClientQueryRetryInterval; break;
andrewboyson 113:904b40231907 43 }
andrewboyson 113:904b40231907 44 return MsTimerHasElapsed(startNtpMs, interval * 1000);
andrewboyson 113:904b40231907 45 }
andrewboyson 113:904b40231907 46 void NtpClientQueryStartInterval(int type)
andrewboyson 113:904b40231907 47 {
andrewboyson 113:904b40231907 48 startNtpMs = MsTimerCount;
andrewboyson 113:904b40231907 49 intervalTypeNtp = type;
andrewboyson 113:904b40231907 50 }
andrewboyson 113:904b40231907 51
andrewboyson 113:904b40231907 52 void writeRequest(void* pPacket, int* pSize)
andrewboyson 113:904b40231907 53 {
andrewboyson 113:904b40231907 54 struct NtpHeader* pHeader = (struct NtpHeader*)pPacket;
andrewboyson 113:904b40231907 55
andrewboyson 113:904b40231907 56 pHeader->Mode = NTP_CLIENT;
andrewboyson 113:904b40231907 57 pHeader->VN = 3;
andrewboyson 113:904b40231907 58 pHeader->LI = 0;
andrewboyson 113:904b40231907 59 pHeader->Stratum = 0;
andrewboyson 113:904b40231907 60 pHeader->Poll = 0;
andrewboyson 113:904b40231907 61 pHeader->Precision = 0;
andrewboyson 113:904b40231907 62 pHeader->RootDelay = 0;
andrewboyson 113:904b40231907 63 pHeader->Dispersion = 0;
andrewboyson 113:904b40231907 64 pHeader->RefIdentifier[0] = 0;
andrewboyson 113:904b40231907 65 pHeader->RefIdentifier[1] = 0;
andrewboyson 113:904b40231907 66 pHeader->RefIdentifier[2] = 0;
andrewboyson 113:904b40231907 67 pHeader->RefIdentifier[3] = 0;
andrewboyson 113:904b40231907 68 pHeader->RefTimeStamp = 0;
andrewboyson 113:904b40231907 69 pHeader->OriTimeStamp = 0;
andrewboyson 113:904b40231907 70 pHeader->RecTimeStamp = 0;
andrewboyson 113:904b40231907 71 pHeader->TraTimeStamp = NetToHost64(ClkTimeToNtpTimeStamp(ClkTimeGet()));
andrewboyson 113:904b40231907 72
andrewboyson 113:904b40231907 73 *pSize = sizeof(struct NtpHeader);
andrewboyson 113:904b40231907 74 }
andrewboyson 113:904b40231907 75
andrewboyson 113:904b40231907 76 int NtpClientQueryPoll(int type, void* pPacket, int* pSize)
andrewboyson 113:904b40231907 77 {
andrewboyson 113:904b40231907 78 if (NtpClientQueryServerName[0]) //An empty name means ntp client is not enabled
andrewboyson 113:904b40231907 79 {
andrewboyson 113:904b40231907 80 if (intervalCompleteNtp()) //Wait for the time out
andrewboyson 113:904b40231907 81 {
andrewboyson 113:904b40231907 82 bool isMulticast = NtpClientQueryServerName[0] == '*';
andrewboyson 116:60521b29e4c9 83 if (isMulticast || Resolve(NtpClientQueryServerName, type, &NtpClientQueryServerIp4, NtpClientQueryServerIp6))
andrewboyson 113:904b40231907 84 {
andrewboyson 113:904b40231907 85 ClkGovIsReceivingTime = false;
andrewboyson 113:904b40231907 86 NtpClientQueryStartInterval(NTP_QUERY_INTERVAL_RETRY);
andrewboyson 113:904b40231907 87 writeRequest(pPacket, pSize);
andrewboyson 113:904b40231907 88
andrewboyson 113:904b40231907 89 if (isMulticast) return MULTICAST_NTP;
andrewboyson 113:904b40231907 90 else return UNICAST_NTP;
andrewboyson 113:904b40231907 91 }
andrewboyson 113:904b40231907 92 }
andrewboyson 113:904b40231907 93 }
andrewboyson 113:904b40231907 94 return DO_NOTHING;
andrewboyson 113:904b40231907 95 }