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

ip6/ip6hdr.c

Committer:
andrewboyson
Date:
2020-04-02
Revision:
167:3ba4e3c49631
Parent:
136:8a65abb0dc63

File content as of revision 167:3ba4e3c49631:

#include <stdbool.h>
#include <stdint.h>

#include "net.h"

char* Ip6HdrPtrVersionTrafficFlow (char* pPacket) { return pPacket +   0; } //4
char* Ip6HdrPtrPayloadLength      (char* pPacket) { return pPacket +   4; } //2
char* Ip6HdrPtrProtocol           (char* pPacket) { return pPacket +   6; } //1
char* Ip6HdrPtrHopLimit           (char* pPacket) { return pPacket +   7; } //1
char* Ip6HdrPtrSrc                (char* pPacket) { return pPacket +   8; } //16
char* Ip6HdrPtrDst                (char* pPacket) { return pPacket +  24; } //16
const int IP6_HEADER_LENGTH = 40;

int  Ip6HdrGetVersion   (char* pPacket) { int32_t r; NetDirect32(&r, Ip6HdrPtrVersionTrafficFlow(pPacket)); return (r >> 4) & 0x0F; }
int  Ip6HdrGetPayloadLen(char* pPacket) { int16_t r; NetInvert16(&r, Ip6HdrPtrPayloadLength     (pPacket)); return  r;              }
int  Ip6HdrGetProtocol  (char* pPacket) { return                     *Ip6HdrPtrProtocol         (pPacket);                          }
int  Ip6HdrGetHopLimit  (char* pPacket) { return                     *Ip6HdrPtrHopLimit         (pPacket);                          }

void Ip6HdrSetVersion   (char* pPacket, int value) { value <<= 4; NetDirect32(Ip6HdrPtrVersionTrafficFlow(pPacket), &value); }
void Ip6HdrSetPayloadLen(char* pPacket, int value) {              NetInvert16(Ip6HdrPtrPayloadLength     (pPacket), &value); }
void Ip6HdrSetProtocol  (char* pPacket, int value) {                         *Ip6HdrPtrProtocol          (pPacket) = value;  }
void Ip6HdrSetHopLimit  (char* pPacket, int value) {                         *Ip6HdrPtrHopLimit          (pPacket) = value;  }