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:
Thu May 20 14:32:52 2021 +0000
Revision:
200:5acbc41bf469
Parent:
193:47a953ab571b
Increased number of arp entries from 20 to 30 to accommodate the number of WIZ devices plus a few incoming port 80 calls from the internet.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
andrewboyson 189:e1c7990486c4 1 #include <stdbool.h>
andrewboyson 189:e1c7990486c4 2 #include <stdint.h>
andrewboyson 189:e1c7990486c4 3
andrewboyson 189:e1c7990486c4 4 #include "nr.h"
andrewboyson 193:47a953ab571b 5 #include "ar6.h"
andrewboyson 193:47a953ab571b 6 #include "ndp.h"
andrewboyson 189:e1c7990486c4 7 #include "dnsquery.h"
andrewboyson 189:e1c7990486c4 8 #include "dns.h"
andrewboyson 189:e1c7990486c4 9 #include "eth.h"
andrewboyson 189:e1c7990486c4 10 #include "ip4addr.h"
andrewboyson 193:47a953ab571b 11 #include "ip6addr.h"
andrewboyson 193:47a953ab571b 12 #include "log.h"
andrewboyson 193:47a953ab571b 13 #include "mac.h"
andrewboyson 189:e1c7990486c4 14
andrewboyson 189:e1c7990486c4 15 char NrTest[NR_NAME_MAX_LENGTH];
andrewboyson 189:e1c7990486c4 16
andrewboyson 193:47a953ab571b 17 static int _ipProtocol = 0;
andrewboyson 193:47a953ab571b 18 static int _dnsProtocol = 0;
andrewboyson 193:47a953ab571b 19 static bool _makeRequestForNameFromAddr4 = false;
andrewboyson 193:47a953ab571b 20 static bool _makeRequestForNameFromAddr6 = false;
andrewboyson 193:47a953ab571b 21 static bool _makeRequestForAddr4FromName = false;
andrewboyson 193:47a953ab571b 22 static bool _makeRequestForAddr6FromName = false;
andrewboyson 193:47a953ab571b 23
andrewboyson 193:47a953ab571b 24 static uint32_t _addr4;
andrewboyson 193:47a953ab571b 25 static char _addr6[16];
andrewboyson 189:e1c7990486c4 26
andrewboyson 193:47a953ab571b 27 void NrTestSendRequest(int ipProtocol, int dnsProtocol)
andrewboyson 189:e1c7990486c4 28 {
andrewboyson 193:47a953ab571b 29 _ipProtocol = ipProtocol;
andrewboyson 193:47a953ab571b 30 _dnsProtocol = dnsProtocol;
andrewboyson 193:47a953ab571b 31
andrewboyson 193:47a953ab571b 32 if (NrTest[0])
andrewboyson 193:47a953ab571b 33 {
andrewboyson 193:47a953ab571b 34 _addr4 = Ip4AddrParse(NrTest);
andrewboyson 193:47a953ab571b 35 if (_addr4)
andrewboyson 193:47a953ab571b 36 {
andrewboyson 193:47a953ab571b 37 _makeRequestForNameFromAddr4 = true;
andrewboyson 193:47a953ab571b 38 }
andrewboyson 193:47a953ab571b 39 else
andrewboyson 193:47a953ab571b 40 {
andrewboyson 193:47a953ab571b 41 Ip6AddrParse(NrTest, _addr6);
andrewboyson 193:47a953ab571b 42 if (!Ip6AddrIsEmpty(_addr6))
andrewboyson 193:47a953ab571b 43 {
andrewboyson 193:47a953ab571b 44 _makeRequestForNameFromAddr6 = true;
andrewboyson 193:47a953ab571b 45 }
andrewboyson 193:47a953ab571b 46 else
andrewboyson 193:47a953ab571b 47 {
andrewboyson 193:47a953ab571b 48 _makeRequestForAddr4FromName = true;
andrewboyson 193:47a953ab571b 49 _makeRequestForAddr6FromName = true;
andrewboyson 193:47a953ab571b 50 }
andrewboyson 193:47a953ab571b 51 }
andrewboyson 193:47a953ab571b 52 }
andrewboyson 189:e1c7990486c4 53 }
andrewboyson 193:47a953ab571b 54
andrewboyson 193:47a953ab571b 55 static bool getMacOfDnsServer6()
andrewboyson 190:c4415a7253f5 56 {
andrewboyson 193:47a953ab571b 57 //For IPv6 UDNS check if have the MAC for the DNS server and, if not, request it and stop
andrewboyson 193:47a953ab571b 58 if (_ipProtocol == ETH_IPV6 && _dnsProtocol == DNS_PROTOCOL_UDNS)
andrewboyson 193:47a953ab571b 59 {
andrewboyson 193:47a953ab571b 60 char mac[6];
andrewboyson 193:47a953ab571b 61 Ar6IpToMac(NdpDnsServer, mac);
andrewboyson 193:47a953ab571b 62 if (MacIsEmpty(mac))
andrewboyson 193:47a953ab571b 63 {
andrewboyson 193:47a953ab571b 64 Ar6MakeRequestForMacFromIp(NdpDnsServer); //The request is only repeated if made after a freeze time - call as often as you want.
andrewboyson 193:47a953ab571b 65 return false;
andrewboyson 193:47a953ab571b 66 }
andrewboyson 193:47a953ab571b 67 }
andrewboyson 193:47a953ab571b 68 return true;
andrewboyson 190:c4415a7253f5 69 }
andrewboyson 189:e1c7990486c4 70
andrewboyson 189:e1c7990486c4 71 void NrTestMain(void)
andrewboyson 189:e1c7990486c4 72 {
andrewboyson 189:e1c7990486c4 73 if (DnsQueryIsBusy) return;
andrewboyson 193:47a953ab571b 74
andrewboyson 193:47a953ab571b 75
andrewboyson 193:47a953ab571b 76 if (_makeRequestForNameFromAddr4)
andrewboyson 193:47a953ab571b 77 {
andrewboyson 193:47a953ab571b 78 //if (!getMacOfDnsServer6()) return;
andrewboyson 193:47a953ab571b 79 LogTime("NrTest - making "); DnsProtocolLog(_dnsProtocol); Log(" request over "); EthProtocolLog(_ipProtocol); LogF(" for name from '%s'\r\n", NrTest);
andrewboyson 193:47a953ab571b 80 DnsQueryNameFromIp4(_addr4, _dnsProtocol, _ipProtocol);
andrewboyson 193:47a953ab571b 81 _makeRequestForNameFromAddr4 = false;
andrewboyson 193:47a953ab571b 82 return;
andrewboyson 193:47a953ab571b 83 }
andrewboyson 193:47a953ab571b 84 if (_makeRequestForNameFromAddr6)
andrewboyson 193:47a953ab571b 85 {
andrewboyson 193:47a953ab571b 86 //if (!getMacOfDnsServer6()) return;
andrewboyson 193:47a953ab571b 87 LogTime("NrTest - making "); DnsProtocolLog(_dnsProtocol); Log(" request over "); EthProtocolLog(_ipProtocol); LogF(" for name from '%s'\r\n", NrTest);
andrewboyson 193:47a953ab571b 88 DnsQueryNameFromIp6(_addr6, _dnsProtocol, _ipProtocol);
andrewboyson 193:47a953ab571b 89 _makeRequestForNameFromAddr6 = false;
andrewboyson 193:47a953ab571b 90 return;
andrewboyson 193:47a953ab571b 91 }
andrewboyson 193:47a953ab571b 92 if (_makeRequestForAddr4FromName)
andrewboyson 193:47a953ab571b 93 {
andrewboyson 193:47a953ab571b 94 //if (!getMacOfDnsServer6()) return;
andrewboyson 193:47a953ab571b 95 LogTime("NrTest - making "); DnsProtocolLog(_dnsProtocol); Log(" request over "); EthProtocolLog(_ipProtocol); LogF(" for A from '%s'\r\n", NrTest);
andrewboyson 193:47a953ab571b 96 DnsQueryIp4FromName(NrTest, _dnsProtocol, _ipProtocol);
andrewboyson 193:47a953ab571b 97 _makeRequestForAddr4FromName = false;
andrewboyson 193:47a953ab571b 98 return;
andrewboyson 193:47a953ab571b 99 }
andrewboyson 193:47a953ab571b 100 if (_makeRequestForAddr6FromName)
andrewboyson 193:47a953ab571b 101 {
andrewboyson 193:47a953ab571b 102 //if (!getMacOfDnsServer6()) return;
andrewboyson 193:47a953ab571b 103 LogTime("NrTest - making "); DnsProtocolLog(_dnsProtocol); Log(" request over "); EthProtocolLog(_ipProtocol); LogF(" for AAAA from '%s'\r\n", NrTest);
andrewboyson 193:47a953ab571b 104 DnsQueryIp6FromName(NrTest, _dnsProtocol, _ipProtocol);
andrewboyson 193:47a953ab571b 105 _makeRequestForAddr6FromName = false;
andrewboyson 193:47a953ab571b 106 return;
andrewboyson 193:47a953ab571b 107 }
andrewboyson 189:e1c7990486c4 108 }