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
ip4/ip4hdr.c@200:5acbc41bf469, 2021-05-20 (annotated)
- 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?
User | Revision | Line number | New 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); } |