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
ip4hdr.c
00001 #include <stdbool.h> 00002 #include <stdint.h> 00003 00004 #include "net.h" 00005 00006 char* Ip4HdrPtrVersionIhl (char* pPacket) { return pPacket + 0; } //1 00007 char* Ip4HdrPtrTos (char* pPacket) { return pPacket + 1; } //1 00008 char* Ip4HdrPtrLength (char* pPacket) { return pPacket + 2; } //2 00009 char* Ip4HdrPtrId (char* pPacket) { return pPacket + 4; } //2 00010 char* Ip4HdrPtrFragInfo (char* pPacket) { return pPacket + 6; } //2 00011 char* Ip4HdrPtrTtl (char* pPacket) { return pPacket + 8; } //1 00012 char* Ip4HdrPtrProtocol (char* pPacket) { return pPacket + 9; } //1 00013 char* Ip4HdrPtrChecksum (char* pPacket) { return pPacket + 10; } //2 00014 char* Ip4HdrPtrSrc (char* pPacket) { return pPacket + 12; } //4 00015 char* Ip4HdrPtrDst (char* pPacket) { return pPacket + 16; } //4 00016 const int IP4_HEADER_LENGTH = 20; 00017 00018 uint8_t Ip4HdrGetVersion (char* pPacket) { return *Ip4HdrPtrVersionIhl (pPacket) >> 4; } 00019 int Ip4HdrGetHeaderLen (char* pPacket) { return (*Ip4HdrPtrVersionIhl (pPacket) & 0xF) << 2; } 00020 uint8_t Ip4HdrGetTos (char* pPacket) { return *Ip4HdrPtrTos (pPacket); } 00021 uint16_t Ip4HdrGetLength (char* pPacket) { uint16_t r; NetInvert16(&r, Ip4HdrPtrLength (pPacket)); return r; } 00022 uint16_t Ip4HdrGetId (char* pPacket) { uint16_t r; NetInvert16(&r, Ip4HdrPtrId (pPacket)); return r; } 00023 uint16_t Ip4HdrGetFragOffset (char* pPacket) { uint16_t r; NetInvert16(&r, Ip4HdrPtrFragInfo (pPacket)); return r & 0x1FFF; } 00024 bool Ip4HdrGetDontFrag (char* pPacket) { uint16_t r; NetInvert16(&r, Ip4HdrPtrFragInfo (pPacket)); return r & 0x4000; } 00025 bool Ip4HdrGetMoreFrags (char* pPacket) { uint16_t r; NetInvert16(&r, Ip4HdrPtrFragInfo (pPacket)); return r & 0x8000; } 00026 uint8_t Ip4HdrGetTtl (char* pPacket) { return *Ip4HdrPtrTtl (pPacket); } 00027 uint8_t Ip4HdrGetProtocol (char* pPacket) { return *Ip4HdrPtrProtocol (pPacket); } 00028 uint16_t Ip4HdrGetChecksum (char* pPacket) { uint16_t r; NetDirect16(&r, Ip4HdrPtrChecksum (pPacket)); return r; } 00029 uint32_t Ip4HdrGetSrc (char* pPacket) { uint32_t r; NetDirect32(&r, Ip4HdrPtrSrc (pPacket)); return r; } 00030 uint32_t Ip4HdrGetDst (char* pPacket) { uint32_t r; NetDirect32(&r, Ip4HdrPtrDst (pPacket)); return r; } 00031 00032 void Ip4HdrSetVersion (char* pPacket, uint8_t value) { char* p = Ip4HdrPtrVersionIhl (pPacket); *p = (*p & 0x0F) | (value << 4); } 00033 void Ip4HdrSetHeaderLen (char* pPacket, int value) { char* p = Ip4HdrPtrVersionIhl (pPacket); *p = (*p & 0xF0) | (value >> 2); } 00034 void Ip4HdrSetTos (char* pPacket, uint8_t value) { *Ip4HdrPtrTos (pPacket) = value; } 00035 void Ip4HdrSetLength (char* pPacket, uint16_t value) { NetInvert16(Ip4HdrPtrLength (pPacket), &value); } 00036 void Ip4HdrSetId (char* pPacket, uint16_t value) { NetInvert16(Ip4HdrPtrId (pPacket), &value); } 00037 void Ip4HdrSetFragInfo (char* pPacket, uint16_t value) { NetInvert16(Ip4HdrPtrFragInfo (pPacket), &value); } 00038 void Ip4HdrSetFragOffset (char* pPacket, uint16_t value) 00039 { 00040 uint16_t flagsOffset; 00041 NetInvert16(&flagsOffset, Ip4HdrPtrFragInfo(pPacket)); 00042 flagsOffset &= 0xC000; 00043 flagsOffset |= value; 00044 NetInvert16(Ip4HdrPtrFragInfo(pPacket), &flagsOffset); 00045 } 00046 void Ip4HdrSetDontFrag (char* pPacket, bool value) 00047 { 00048 uint16_t flagsOffset; 00049 NetInvert16(&flagsOffset, Ip4HdrPtrFragInfo(pPacket)); 00050 flagsOffset &= 0xBFFF; 00051 if (value) flagsOffset |= 0x4000; 00052 NetInvert16(Ip4HdrPtrFragInfo(pPacket), &flagsOffset); 00053 } 00054 void Ip4HdrSetMoreFrags (char* pPacket, bool value) 00055 { 00056 uint16_t flagsOffset; 00057 NetInvert16(&flagsOffset, Ip4HdrPtrFragInfo(pPacket)); 00058 flagsOffset &= 0x7FFF; 00059 if (value) flagsOffset |= 0x8000; 00060 NetInvert16(Ip4HdrPtrFragInfo(pPacket), &flagsOffset); 00061 } 00062 void Ip4HdrSetTtl (char* pPacket, uint8_t value) { *Ip4HdrPtrTtl (pPacket) = value; } 00063 void Ip4HdrSetProtocol (char* pPacket, uint8_t value) { *Ip4HdrPtrProtocol (pPacket) = value; } 00064 void Ip4HdrSetChecksum (char* pPacket, uint16_t value) { NetDirect16(Ip4HdrPtrChecksum (pPacket), &value); } //Don't invert the checksum 00065 void Ip4HdrSetSrc (char* pPacket, uint32_t value) { NetDirect32(Ip4HdrPtrSrc (pPacket), &value); } 00066 void Ip4HdrSetDst (char* pPacket, uint32_t value) { NetDirect32(Ip4HdrPtrDst (pPacket), &value); }
Generated on Tue Jul 12 2022 18:53:40 by 1.7.2