X-Git-Url: https://oss.titaniummirror.com/gitweb/?a=blobdiff_plain;f=support%2Fsdk%2Fc%2Fblip%2Finclude%2Flib6lowpan.h;h=4596ac960abde51afc1184f856a9f0b94dd640b2;hb=3d5c78e867d6fd52e44894e93e4bd0c172071522;hp=8723c29292ae2071579e077d7c10f332d3958344;hpb=34dda4f22e2b435b6ddec072706809f158e60c7f;p=tinyos-2.x.git diff --git a/support/sdk/c/blip/include/lib6lowpan.h b/support/sdk/c/blip/include/lib6lowpan.h index 8723c292..4596ac96 100644 --- a/support/sdk/c/blip/include/lib6lowpan.h +++ b/support/sdk/c/blip/include/lib6lowpan.h @@ -21,45 +21,58 @@ */ #ifndef _LIB6LOWPAN_H_ #define _LIB6LOWPAN_H_ - #include #include #include "6lowpan.h" #include "ip.h" -#ifdef __TARGET_mips__ -// #warning "Using big endian byte order" -#define ntoh16(X) (X) -#define hton16(X) (X) -#define ntoh32(X) (X) -#define hton32(X) (X) +#if defined(PC) || defined(__TARGET_mips__) +// use library versions if on linux +#include +#define ntoh16(X) ntohs(X) +#define hton16(X) htons(X) +#define ntoh32(X) ntohl(X) +#define hton32(X) htonl(X) + +#if defined(PC) +#define leton16(X) hton16(X) +#ifndef htole16 +#define htole16(X) (X) +#endif +#else #define leton16(X) (((((uint16_t)(X)) << 8) | ((uint16_t)(X) >> 8)) & 0xffff) #define htole16(X) leton16(X) -#else -// #warning "Using little endian byte order" -#define ntoh16(X) (((((uint16_t)(X)) >> 8) | ((uint16_t)(X) << 8)) & 0xffff) -#define hton16(X) (((((uint16_t)(X)) << 8) | ((uint16_t)(X) >> 8)) & 0xffff) +#endif + +#else +// otherwise have to provide our own + #define leton16(X) hton16(X) +#ifndef htole16 #define htole16(X) (X) -#define ntoh32(X) ((((uint32_t)(X) >> 24) & 0x000000ff)| \ - ((((uint32_t)(X) >> 8)) & 0x0000ff00) | \ - ((((uint32_t)(X) << 8)) & 0x00ff0000) | \ - ((((uint32_t)(X) << 24)) & 0xff000000)) - -#define hton32(X) ((((uint32_t)(X) << 24) & 0xff000000)| \ - ((((uint32_t)(X) << 8)) & 0x00ff0000) | \ - ((((uint32_t)(X) >> 8)) & 0x0000ff00) | \ - ((((uint32_t)(X) >> 24)) & 0x000000ff)) #endif +#define ntoh16(X) (((((uint16_t)(X)) >> 8) | ((uint16_t)(X) << 8)) & 0xffff) +#define hton16(X) (((((uint16_t)(X)) << 8) | ((uint16_t)(X) >> 8)) & 0xffff) + +/* this is much more efficient since gcc can insert swpb now. */ +static uint32_t __attribute__((unused)) ntoh32(uint32_t i) { + uint16_t lo = (uint16_t)i; + uint16_t hi = (uint16_t)(i >> 16); + lo = (lo << 8) | (lo >> 8); + hi = (hi << 8) | (hi >> 8); + return (((uint32_t)lo) << 16) | ((uint32_t)hi); +} +#define hton32(X) ntoh32(X) #define ntohs(X) ntoh16(X) #define htons(X) hton16(X) - #define ntohl(X) ntoh32(X) #define htonl(X) hton32(X) +#endif + #ifdef DEF_MEMCPY #define memcpy(X,Y,Z) ip_memcpy(X,Y,Z) @@ -106,10 +119,10 @@ uint8_t setupHeaders(packed_lowmsg_t *packed, uint16_t headers); /* * Test if various protocol features are enabled */ -uint8_t hasMeshHeader(packed_lowmsg_t *msg); -uint8_t hasBcastHeader(packed_lowmsg_t *msg); -uint8_t hasFrag1Header(packed_lowmsg_t *msg); -uint8_t hasFragNHeader(packed_lowmsg_t *msg); +inline uint8_t hasMeshHeader(packed_lowmsg_t *msg); +inline uint8_t hasBcastHeader(packed_lowmsg_t *msg); +inline uint8_t hasFrag1Header(packed_lowmsg_t *msg); +inline uint8_t hasFragNHeader(packed_lowmsg_t *msg); /* * Mesh header fields @@ -117,12 +130,12 @@ uint8_t hasFragNHeader(packed_lowmsg_t *msg); * return FAIL if the message doesn't have a mesh header */ uint8_t getMeshHopsLeft(packed_lowmsg_t *msg, uint8_t *hops); -uint8_t getMeshOriginAddr(packed_lowmsg_t *msg, hw_addr_t *origin); -uint8_t getMeshFinalAddr(packed_lowmsg_t *msg, hw_addr_t *final); +uint8_t getMeshOriginAddr(packed_lowmsg_t *msg, ieee154_saddr_t *origin); +uint8_t getMeshFinalAddr(packed_lowmsg_t *msg, ieee154_saddr_t *final); uint8_t setMeshHopsLeft(packed_lowmsg_t *msg, uint8_t hops); -uint8_t setMeshOriginAddr(packed_lowmsg_t *msg, hw_addr_t origin); -uint8_t setMeshFinalAddr(packed_lowmsg_t *msg, hw_addr_t final); +uint8_t setMeshOriginAddr(packed_lowmsg_t *msg, ieee154_saddr_t origin); +uint8_t setMeshFinalAddr(packed_lowmsg_t *msg, ieee154_saddr_t final); /* * Broadcast header fields @@ -134,19 +147,20 @@ uint8_t setBcastSeqno(packed_lowmsg_t *msg, uint8_t seqno); /* * Fragmentation header fields */ -uint8_t getFragDgramSize(packed_lowmsg_t *msg, uint16_t *size); -uint8_t getFragDgramTag(packed_lowmsg_t *msg, uint16_t *tag); -uint8_t getFragDgramOffset(packed_lowmsg_t *msg, uint8_t *size); +inline uint8_t getFragDgramSize(packed_lowmsg_t *msg, uint16_t *size); +inline uint8_t getFragDgramTag(packed_lowmsg_t *msg, uint16_t *tag); +inline uint8_t getFragDgramOffset(packed_lowmsg_t *msg, uint8_t *size); -uint8_t setFragDgramSize(packed_lowmsg_t *msg, uint16_t size); -uint8_t setFragDgramTag(packed_lowmsg_t *msg, uint16_t tag); -uint8_t setFragDgramOffset(packed_lowmsg_t *msg, uint8_t size); +inline uint8_t setFragDgramSize(packed_lowmsg_t *msg, uint16_t size); +inline uint8_t setFragDgramTag(packed_lowmsg_t *msg, uint16_t tag); +inline uint8_t setFragDgramOffset(packed_lowmsg_t *msg, uint8_t size); /* * IP header compression functions * */ -int getCompressedLen(packed_lowmsg_t *pkt); + +// int getCompressedLen(packed_lowmsg_t *pkt); /* * Pack the header fields of msg into buffer 'buf'. @@ -183,13 +197,16 @@ typedef struct { // if it was not, it is the same as header_end uint8_t *transport_ptr; // points to the source header within the packed fields, IF it contains one. - struct source_header *sh; - struct rinstall_header *rih; + struct ip6_ext *hdr_hop; + struct ip6_route *hdr_route; + struct ip6_ext *hdr_dest; } unpack_info_t; uint8_t *unpackHeaders(packed_lowmsg_t *pkt, unpack_info_t *u_info, uint8_t *dest, uint16_t len); +void adjustPlen(struct ip6_hdr *ip, unpack_info_t *u_info); + /* * Fragmentation routines. */ @@ -203,6 +220,7 @@ typedef struct { uint16_t bytes_rcvd; /* how many bytes from the packet we have received so far */ uint8_t timeout; + uint8_t nxt_hdr; uint8_t *transport_hdr; struct ip_metadata metadata; } reconstruct_t;