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:
136:8a65abb0dc63
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 136:8a65abb0dc63 1 #include <stdbool.h>
andrewboyson 136:8a65abb0dc63 2 #include <stdint.h>
andrewboyson 136:8a65abb0dc63 3
andrewboyson 136:8a65abb0dc63 4 #include "net.h"
andrewboyson 136:8a65abb0dc63 5
andrewboyson 136:8a65abb0dc63 6 char* Ip4HdrPtrVersionIhl (char* pPacket) { return pPacket + 0; } //1
andrewboyson 136:8a65abb0dc63 7 char* Ip4HdrPtrTos (char* pPacket) { return pPacket + 1; } //1
andrewboyson 136:8a65abb0dc63 8 char* Ip4HdrPtrLength (char* pPacket) { return pPacket + 2; } //2
andrewboyson 136:8a65abb0dc63 9 char* Ip4HdrPtrId (char* pPacket) { return pPacket + 4; } //2
andrewboyson 136:8a65abb0dc63 10 char* Ip4HdrPtrFragInfo (char* pPacket) { return pPacket + 6; } //2
andrewboyson 136:8a65abb0dc63 11 char* Ip4HdrPtrTtl (char* pPacket) { return pPacket + 8; } //1
andrewboyson 136:8a65abb0dc63 12 char* Ip4HdrPtrProtocol (char* pPacket) { return pPacket + 9; } //1
andrewboyson 136:8a65abb0dc63 13 char* Ip4HdrPtrChecksum (char* pPacket) { return pPacket + 10; } //2
andrewboyson 136:8a65abb0dc63 14 char* Ip4HdrPtrSrc (char* pPacket) { return pPacket + 12; } //4
andrewboyson 136:8a65abb0dc63 15 char* Ip4HdrPtrDst (char* pPacket) { return pPacket + 16; } //4
andrewboyson 136:8a65abb0dc63 16 const int IP4_HEADER_LENGTH = 20;
andrewboyson 136:8a65abb0dc63 17
andrewboyson 136:8a65abb0dc63 18 uint8_t Ip4HdrGetVersion (char* pPacket) { return *Ip4HdrPtrVersionIhl (pPacket) >> 4; }
andrewboyson 136:8a65abb0dc63 19 int Ip4HdrGetHeaderLen (char* pPacket) { return (*Ip4HdrPtrVersionIhl (pPacket) & 0xF) << 2; }
andrewboyson 136:8a65abb0dc63 20 uint8_t Ip4HdrGetTos (char* pPacket) { return *Ip4HdrPtrTos (pPacket); }
andrewboyson 136:8a65abb0dc63 21 uint16_t Ip4HdrGetLength (char* pPacket) { uint16_t r; NetInvert16(&r, Ip4HdrPtrLength (pPacket)); return r; }
andrewboyson 136:8a65abb0dc63 22 uint16_t Ip4HdrGetId (char* pPacket) { uint16_t r; NetInvert16(&r, Ip4HdrPtrId (pPacket)); return r; }
andrewboyson 136:8a65abb0dc63 23 uint16_t Ip4HdrGetFragOffset (char* pPacket) { uint16_t r; NetInvert16(&r, Ip4HdrPtrFragInfo (pPacket)); return r & 0x1FFF; }
andrewboyson 136:8a65abb0dc63 24 bool Ip4HdrGetDontFrag (char* pPacket) { uint16_t r; NetInvert16(&r, Ip4HdrPtrFragInfo (pPacket)); return r & 0x4000; }
andrewboyson 136:8a65abb0dc63 25 bool Ip4HdrGetMoreFrags (char* pPacket) { uint16_t r; NetInvert16(&r, Ip4HdrPtrFragInfo (pPacket)); return r & 0x8000; }
andrewboyson 136:8a65abb0dc63 26 uint8_t Ip4HdrGetTtl (char* pPacket) { return *Ip4HdrPtrTtl (pPacket); }
andrewboyson 136:8a65abb0dc63 27 uint8_t Ip4HdrGetProtocol (char* pPacket) { return *Ip4HdrPtrProtocol (pPacket); }
andrewboyson 136:8a65abb0dc63 28 uint16_t Ip4HdrGetChecksum (char* pPacket) { uint16_t r; NetDirect16(&r, Ip4HdrPtrChecksum (pPacket)); return r; }
andrewboyson 136:8a65abb0dc63 29 uint32_t Ip4HdrGetSrc (char* pPacket) { uint32_t r; NetDirect32(&r, Ip4HdrPtrSrc (pPacket)); return r; }
andrewboyson 136:8a65abb0dc63 30 uint32_t Ip4HdrGetDst (char* pPacket) { uint32_t r; NetDirect32(&r, Ip4HdrPtrDst (pPacket)); return r; }
andrewboyson 136:8a65abb0dc63 31
andrewboyson 136:8a65abb0dc63 32 void Ip4HdrSetVersion (char* pPacket, uint8_t value) { char* p = Ip4HdrPtrVersionIhl (pPacket); *p = (*p & 0x0F) | (value << 4); }
andrewboyson 136:8a65abb0dc63 33 void Ip4HdrSetHeaderLen (char* pPacket, int value) { char* p = Ip4HdrPtrVersionIhl (pPacket); *p = (*p & 0xF0) | (value >> 2); }
andrewboyson 136:8a65abb0dc63 34 void Ip4HdrSetTos (char* pPacket, uint8_t value) { *Ip4HdrPtrTos (pPacket) = value; }
andrewboyson 136:8a65abb0dc63 35 void Ip4HdrSetLength (char* pPacket, uint16_t value) { NetInvert16(Ip4HdrPtrLength (pPacket), &value); }
andrewboyson 136:8a65abb0dc63 36 void Ip4HdrSetId (char* pPacket, uint16_t value) { NetInvert16(Ip4HdrPtrId (pPacket), &value); }
andrewboyson 136:8a65abb0dc63 37 void Ip4HdrSetFragInfo (char* pPacket, uint16_t value) { NetInvert16(Ip4HdrPtrFragInfo (pPacket), &value); }
andrewboyson 136:8a65abb0dc63 38 void Ip4HdrSetFragOffset (char* pPacket, uint16_t value)
andrewboyson 136:8a65abb0dc63 39 {
andrewboyson 136:8a65abb0dc63 40 uint16_t flagsOffset;
andrewboyson 136:8a65abb0dc63 41 NetInvert16(&flagsOffset, Ip4HdrPtrFragInfo(pPacket));
andrewboyson 136:8a65abb0dc63 42 flagsOffset &= 0xC000;
andrewboyson 136:8a65abb0dc63 43 flagsOffset |= value;
andrewboyson 136:8a65abb0dc63 44 NetInvert16(Ip4HdrPtrFragInfo(pPacket), &flagsOffset);
andrewboyson 136:8a65abb0dc63 45 }
andrewboyson 136:8a65abb0dc63 46 void Ip4HdrSetDontFrag (char* pPacket, bool value)
andrewboyson 136:8a65abb0dc63 47 {
andrewboyson 136:8a65abb0dc63 48 uint16_t flagsOffset;
andrewboyson 136:8a65abb0dc63 49 NetInvert16(&flagsOffset, Ip4HdrPtrFragInfo(pPacket));
andrewboyson 136:8a65abb0dc63 50 flagsOffset &= 0xBFFF;
andrewboyson 136:8a65abb0dc63 51 if (value) flagsOffset |= 0x4000;
andrewboyson 136:8a65abb0dc63 52 NetInvert16(Ip4HdrPtrFragInfo(pPacket), &flagsOffset);
andrewboyson 136:8a65abb0dc63 53 }
andrewboyson 136:8a65abb0dc63 54 void Ip4HdrSetMoreFrags (char* pPacket, bool value)
andrewboyson 136:8a65abb0dc63 55 {
andrewboyson 136:8a65abb0dc63 56 uint16_t flagsOffset;
andrewboyson 136:8a65abb0dc63 57 NetInvert16(&flagsOffset, Ip4HdrPtrFragInfo(pPacket));
andrewboyson 136:8a65abb0dc63 58 flagsOffset &= 0x7FFF;
andrewboyson 136:8a65abb0dc63 59 if (value) flagsOffset |= 0x8000;
andrewboyson 136:8a65abb0dc63 60 NetInvert16(Ip4HdrPtrFragInfo(pPacket), &flagsOffset);
andrewboyson 136:8a65abb0dc63 61 }
andrewboyson 136:8a65abb0dc63 62 void Ip4HdrSetTtl (char* pPacket, uint8_t value) { *Ip4HdrPtrTtl (pPacket) = value; }
andrewboyson 136:8a65abb0dc63 63 void Ip4HdrSetProtocol (char* pPacket, uint8_t value) { *Ip4HdrPtrProtocol (pPacket) = value; }
andrewboyson 136:8a65abb0dc63 64 void Ip4HdrSetChecksum (char* pPacket, uint16_t value) { NetDirect16(Ip4HdrPtrChecksum (pPacket), &value); } //Don't invert the checksum
andrewboyson 136:8a65abb0dc63 65 void Ip4HdrSetSrc (char* pPacket, uint32_t value) { NetDirect32(Ip4HdrPtrSrc (pPacket), &value); }
andrewboyson 136:8a65abb0dc63 66 void Ip4HdrSetDst (char* pPacket, uint32_t value) { NetDirect32(Ip4HdrPtrDst (pPacket), &value); }