65 #include "dev/watchdog.h" 66 #include "net/link-stats.h" 71 #include "net/ipv6/uipbuf.h" 81 #define LOG_MODULE "6LoWPAN" 82 #define LOG_LEVEL LOG_LEVEL_6LOWPAN 84 #define GET16(ptr,index) (((uint16_t)((ptr)[index] << 8)) | ((ptr)[(index) + 1])) 85 #define SET16(ptr,index,value) do { \ 86 (ptr)[index] = ((value) >> 8) & 0xff; \ 87 (ptr)[index + 1] = (value) & 0xff; \ 93 #define PACKETBUF_FRAG_PTR (packetbuf_ptr) 94 #define PACKETBUF_FRAG_DISPATCH_SIZE 0 95 #define PACKETBUF_FRAG_TAG 2 96 #define PACKETBUF_FRAG_OFFSET 4 99 #define PACKETBUF_IPHC_BUF ((uint8_t *)(packetbuf_ptr + packetbuf_hdr_len)) 100 #define PACKETBUF_PAYLOAD_END ((uint8_t *)(packetbuf_ptr + mac_max_payload)) 102 #define PACKETBUF_6LO_PTR (packetbuf_ptr + packetbuf_hdr_len) 103 #define PACKETBUF_6LO_DISPATCH 0 104 #define PACKETBUF_6LO_ENCODING 1 105 #define PACKETBUF_6LO_TTL 2 107 #define PACKETBUF_6LO_HC_UDP_PTR (packetbuf_ptr + packetbuf_hdr_len) 108 #define PACKETBUF_6LO_HC_UDP_DISPATCH 0 109 #define PACKETBUF_6LO_HC_UDP_HC1_ENCODING 1 110 #define PACKETBUF_6LO_HC_UDP_UDP_ENCODING 2 111 #define PACKETBUF_6LO_HC_UDP_TTL 3 112 #define PACKETBUF_6LO_HC_UDP_PORTS 4 113 #define PACKETBUF_6LO_HC_UDP_CHKSUM 5 120 #define SICSLOWPAN_IP_BUF(buf) ((struct uip_ip_hdr *)buf) 121 #define SICSLOWPAN_UDP_BUF(buf) ((struct uip_udp_hdr *)&buf[UIP_IPH_LEN]) 122 #define SICSLOWPAN_IPPAYLOAD_BUF(buf) (&buf[UIP_IPH_LEN]) 124 #define UIP_IPPAYLOAD_BUF_POS(pos) (&uip_buf[UIP_IPH_LEN + (pos)]) 125 #define UIP_UDP_BUF_POS(pos) ((struct uip_udp_hdr *)UIP_IPPAYLOAD_BUF_POS(pos)) 126 #define UIP_EXT_HDR_LEN 2 131 #ifdef SICSLOWPAN_CONF_COMPRESS_EXT_HDR 132 #define COMPRESS_EXT_HDR SICSLOWPAN_CONF_COMPRESS_EXT_HDR 135 #define COMPRESS_EXT_HDR 1 139 #define IS_COMPRESSABLE_PROTO(x) (x == UIP_PROTO_UDP \ 140 || x == UIP_PROTO_HBHO \ 141 || x == UIP_PROTO_DESTO \ 142 || x == UIP_PROTO_ROUTING \ 143 || x == UIP_PROTO_FRAG) 145 #define IS_COMPRESSABLE_PROTO(x) (x == UIP_PROTO_UDP) 196 static int last_rssi;
202 #if SICSLOWPAN_CONF_FRAG 203 static uint16_t my_tag;
209 #ifdef SICSLOWPAN_CONF_FRAGMENT_BUFFERS 210 #define SICSLOWPAN_FRAGMENT_BUFFERS SICSLOWPAN_CONF_FRAGMENT_BUFFERS 212 #define SICSLOWPAN_FRAGMENT_BUFFERS 12 220 #ifdef SICSLOWPAN_CONF_REASS_CONTEXTS 221 #define SICSLOWPAN_REASS_CONTEXTS SICSLOWPAN_CONF_REASS_CONTEXTS 223 #define SICSLOWPAN_REASS_CONTEXTS 2 227 #ifdef SICSLOWPAN_CONF_FRAGMENT_SIZE 228 #define SICSLOWPAN_FRAGMENT_SIZE SICSLOWPAN_CONF_FRAGMENT_SIZE 231 #define SICSLOWPAN_FRAGMENT_SIZE (127 - 2 - 15) 235 #if SICSLOWPAN_FRAGMENT_SIZE > 255 236 #error Too large SICSLOWPAN_FRAGMENT_SIZE set. 240 #define SICSLOWPAN_FIRST_FRAGMENT_SIZE (SICSLOWPAN_FRAGMENT_SIZE + 38) 243 struct sicslowpan_frag_info {
253 uint16_t reassembled_len;
255 struct timer reass_timer;
258 uint16_t first_frag_len;
261 uint8_t first_frag[SICSLOWPAN_FIRST_FRAGMENT_SIZE];
264 static struct sicslowpan_frag_info frag_info[SICSLOWPAN_REASS_CONTEXTS];
266 struct sicslowpan_frag_buf {
273 uint8_t data[SICSLOWPAN_FRAGMENT_SIZE];
276 static struct sicslowpan_frag_buf frag_buf[SICSLOWPAN_FRAGMENT_BUFFERS];
280 clear_fragments(uint8_t frag_info_index)
284 frag_info[frag_info_index].len = 0;
285 for(i = 0; i < SICSLOWPAN_FRAGMENT_BUFFERS; i++) {
286 if(frag_buf[i].len > 0 && frag_buf[i].index == frag_info_index) {
296 timeout_fragments(
int not_context)
300 for(i = 0; i < SICSLOWPAN_REASS_CONTEXTS; i++) {
301 if(frag_info[i].len > 0 && i != not_context &&
304 count += clear_fragments(i);
311 store_fragment(uint8_t index, uint8_t offset)
318 if(len <= 0 || len > SICSLOWPAN_FRAGMENT_SIZE) {
323 for(i = 0; i < SICSLOWPAN_FRAGMENT_BUFFERS; i++) {
324 if(frag_buf[i].len == 0) {
327 frag_buf[i].offset = offset;
328 frag_buf[i].len = len;
329 frag_buf[i].index = index;
341 add_fragment(uint16_t tag, uint16_t frag_size, uint8_t offset)
349 for(i = 0; i < SICSLOWPAN_REASS_CONTEXTS; i++) {
351 if(frag_info[i].len > 0 &&
timer_expired(&frag_info[i].reass_timer)) {
356 if(found < 0 && frag_info[i].len == 0) {
364 LOG_WARN(
"reassembly: failed to store new fragment session - tag: %d\n", tag);
369 frag_info[found].len = frag_size;
370 frag_info[found].tag = tag;
372 packetbuf_addr(PACKETBUF_ADDR_SENDER));
380 for(i = 0; i < SICSLOWPAN_REASS_CONTEXTS; i++) {
381 if(frag_info[i].tag == tag && frag_info[i].len > 0 &&
382 linkaddr_cmp(&frag_info[i].sender, packetbuf_addr(PACKETBUF_ADDR_SENDER))) {
391 LOG_WARN(
"reassembly: failed to store N-fragment - could not find session - tag: %d offset: %d\n", tag, offset);
396 len = store_fragment(i, offset);
397 if(len < 0 && timeout_fragments(i) > 0) {
398 len = store_fragment(i, offset);
401 frag_info[i].reassembled_len += len;
406 LOG_WARN(
"reassembly: failed to store fragment - packet reassembly will fail tag:%d l\n", frag_info[i].tag);
419 if(frag_info[context].len < frag_info[context].first_frag_len ||
420 frag_info[context].len >
sizeof(
uip_buf)) {
421 LOG_WARN(
"input: invalid total size of fragments\n");
422 clear_fragments(context);
427 memcpy((uint8_t *)
UIP_IP_BUF, (uint8_t *)frag_info[context].first_frag,
428 frag_info[context].first_frag_len);
431 memset((uint8_t *)UIP_IP_BUF + frag_info[context].first_frag_len, 0,
432 frag_info[context].len - frag_info[context].first_frag_len);
434 for(i = 0; i < SICSLOWPAN_FRAGMENT_BUFFERS; i++) {
436 if(frag_buf[i].len > 0 && frag_buf[i].index == context) {
437 if((frag_buf[i].offset << 3) + frag_buf[i].len >
sizeof(
uip_buf)) {
438 LOG_WARN(
"input: invalid fragment offset\n");
439 clear_fragments(context);
442 memcpy((uint8_t *)UIP_IP_BUF + (uint16_t)(frag_buf[i].offset << 3),
443 (uint8_t *)frag_buf[i].data, frag_buf[i].len);
447 clear_fragments(context);
458 static struct netstack_sniffer *callback = NULL;
461 netstack_sniffer_add(
struct netstack_sniffer *s)
467 netstack_sniffer_remove(
struct netstack_sniffer *s)
473 set_packet_attrs(
void)
477 packetbuf_set_attr(PACKETBUF_ATTR_NETWORK_ID,
UIP_IP_BUF->proto);
481 c = UIP_UDP_BUF_POS(0)->srcport;
482 if(UIP_UDP_BUF_POS(0)->destport < c) {
483 c = UIP_UDP_BUF_POS(0)->destport;
485 }
else if(
UIP_IP_BUF->proto == UIP_PROTO_TCP) {
486 c = UIP_TCP_BUF->srcport;
487 if(UIP_TCP_BUF->destport < c) {
488 c = UIP_TCP_BUF->destport;
490 }
else if(
UIP_IP_BUF->proto == UIP_PROTO_ICMP6) {
494 packetbuf_set_attr(PACKETBUF_ATTR_CHANNEL, c);
504 #if SICSLOWPAN_COMPRESSION >= SICSLOWPAN_COMPRESSION_IPHC 510 #if SICSLOWPAN_CONF_MAX_ADDR_CONTEXTS > 0 512 addr_contexts[SICSLOWPAN_CONF_MAX_ADDR_CONTEXTS];
528 const uint8_t unc_llconf[] = {0x0f,0x28,0x22,0x20};
535 const uint8_t unc_ctxconf[] = {0x00,0x88,0x82,0x80};
542 const uint8_t unc_mxconf[] = {0x0f, 0x25, 0x23, 0x21};
545 const uint8_t llprefix[] = {0xfe, 0x80};
548 static const uint8_t ttl_values[] = {0, 1, 64, 255};
559 #if SICSLOWPAN_CONF_MAX_ADDR_CONTEXTS > 0 562 if((addr_contexts[i].used == 1) &&
563 uip_ipaddr_prefixcmp(&addr_contexts[i].prefix, ipaddr, 64)) {
564 return &addr_contexts[i];
576 #if SICSLOWPAN_CONF_MAX_ADDR_CONTEXTS > 0 579 if((addr_contexts[i].used == 1) &&
580 addr_contexts[i].number == number) {
581 return &addr_contexts[i];
589 compress_addr_64(uint8_t bitpos, uip_ipaddr_t *
ipaddr, uip_lladdr_t *lladdr)
614 uncompress_addr(uip_ipaddr_t *
ipaddr, uint8_t
const prefix[],
615 uint8_t pref_post_count, uip_lladdr_t *lladdr)
617 uint8_t prefcount = pref_post_count >> 4;
618 uint8_t postcount = pref_post_count & 0x0f;
620 prefcount = prefcount == 15 ? 16 : prefcount;
621 postcount = postcount == 15 ? 16 : postcount;
623 LOG_DBG(
"uncompression: address %d %d ", prefcount, postcount);
626 memcpy(
ipaddr, prefix, prefcount);
628 if(prefcount + postcount < 16) {
629 memset(&
ipaddr->u8[prefcount], 0, 16 - (prefcount + postcount));
633 if(postcount == 2 && prefcount < 11) {
639 }
else if (prefcount > 0) {
687 uint8_t tmp, iphc0, iphc1, *next_hdr, *next_nhc;
689 struct uip_udp_hdr *udp_buf;
691 if(LOG_DBG_ENABLED) {
693 LOG_DBG(
"compression: before (%d): ",
UIP_IP_BUF->len[1]);
694 for(ndx = 0; ndx <
UIP_IP_BUF->len[1] + 40; ndx++) {
695 uint8_t data = ((uint8_t *) (
UIP_IP_BUF))[ndx];
696 LOG_DBG_(
"%02x", data);
703 #define CHECK_BUFFER_SPACE(writelen) do { \ 704 if(hc06_ptr + (writelen) >= PACKETBUF_PAYLOAD_END) { \ 705 LOG_WARN("Not enough packetbuf space to compress header (%u bytes, %u left). Aborting.\n", \ 706 (unsigned)(writelen), (unsigned)(PACKETBUF_PAYLOAD_END - hc06_ptr)); \ 716 CHECK_BUFFER_SPACE(38);
725 iphc0 = SICSLOWPAN_DISPATCH_IPHC;
727 PACKETBUF_IPHC_BUF[2] = 0;
742 LOG_DBG(
"compression: dest or src ipaddr - setting CID\n");
743 iphc1 |= SICSLOWPAN_IPHC_CID;
757 tmp = ((tmp & 0x03) << 6) | (tmp >> 2);
762 iphc0 |= SICSLOWPAN_IPHC_FL_C;
766 iphc0 |= SICSLOWPAN_IPHC_TC_C;
777 iphc0 |= SICSLOWPAN_IPHC_TC_C;
794 if(IS_COMPRESSABLE_PROTO(
UIP_IP_BUF->proto)) {
795 iphc0 |= SICSLOWPAN_IPHC_NH_C;
799 if((iphc0 & SICSLOWPAN_IPHC_NH_C) == 0) {
813 iphc0 |= SICSLOWPAN_IPHC_TTL_1;
816 iphc0 |= SICSLOWPAN_IPHC_TTL_64;
819 iphc0 |= SICSLOWPAN_IPHC_TTL_255;
829 LOG_DBG(
"compression: addr unspecified - setting SAC\n");
830 iphc1 |= SICSLOWPAN_IPHC_SAC;
831 iphc1 |= SICSLOWPAN_IPHC_SAM_00;
835 LOG_DBG(
"compression: src with context - setting CID & SAC ctx: %d\n",
837 iphc1 |= SICSLOWPAN_IPHC_CID | SICSLOWPAN_IPHC_SAC;
838 PACKETBUF_IPHC_BUF[2] |= context->number << 4;
841 iphc1 |= compress_addr_64(SICSLOWPAN_IPHC_SAM_BIT,
848 iphc1 |= compress_addr_64(SICSLOWPAN_IPHC_SAM_BIT,
852 iphc1 |= SICSLOWPAN_IPHC_SAM_00;
860 iphc1 |= SICSLOWPAN_IPHC_M;
861 if(sicslowpan_is_mcast_addr_compressable8(&
UIP_IP_BUF->destipaddr)) {
862 iphc1 |= SICSLOWPAN_IPHC_DAM_11;
866 }
else if(sicslowpan_is_mcast_addr_compressable32(&
UIP_IP_BUF->destipaddr)) {
867 iphc1 |= SICSLOWPAN_IPHC_DAM_10;
872 }
else if(sicslowpan_is_mcast_addr_compressable48(&
UIP_IP_BUF->destipaddr)) {
873 iphc1 |= SICSLOWPAN_IPHC_DAM_01;
879 iphc1 |= SICSLOWPAN_IPHC_DAM_00;
888 iphc1 |= SICSLOWPAN_IPHC_DAC;
889 PACKETBUF_IPHC_BUF[2] |= context->number;
892 iphc1 |= compress_addr_64(SICSLOWPAN_IPHC_DAM_BIT,
894 (uip_lladdr_t *)link_destaddr);
900 iphc1 |= compress_addr_64(SICSLOWPAN_IPHC_DAM_BIT,
901 &
UIP_IP_BUF->destipaddr, (uip_lladdr_t *)link_destaddr);
904 iphc1 |= SICSLOWPAN_IPHC_DAM_00;
918 LOG_DBG(
"compression: first header: %d\n", *next_hdr);
919 while(next_hdr != NULL && IS_COMPRESSABLE_PROTO(*next_hdr)) {
920 LOG_DBG(
"compression: next header: %d\n", *next_hdr);
925 proto = SICSLOWPAN_NHC_ETX_HDR_HBHO;
926 case UIP_PROTO_ROUTING:
927 proto = proto == -1 ? SICSLOWPAN_NHC_ETX_HDR_ROUTING : proto;
929 proto = proto == -1 ? SICSLOWPAN_NHC_ETX_HDR_FRAG : proto;
930 case UIP_PROTO_DESTO:
933 struct uip_ext_hdr *ext_hdr =
934 (
struct uip_ext_hdr *) UIP_IPPAYLOAD_BUF_POS(ext_hdr_len);
936 proto = proto == -1 ? SICSLOWPAN_NHC_ETX_HDR_DESTO : proto;
938 len = (ext_hdr->len << 3) + 8;
939 LOG_DBG(
"compression: next header %d (len:%d)\n", *next_hdr, len);
941 next_hdr = &ext_hdr->next;
945 if(!IS_COMPRESSABLE_PROTO(*next_hdr)) {
946 CHECK_BUFFER_SPACE(1);
948 LOG_DBG(
"compression: keeping the next header in this ext hdr: %d\n",
952 CHECK_BUFFER_SPACE(len);
955 ext_hdr = (
struct uip_ext_hdr *)
hc06_ptr;
956 ext_hdr->len = len - 2;
963 *next_nhc = SICSLOWPAN_NHC_EXT_HDR |
964 (IS_COMPRESSABLE_PROTO(*next_hdr) ? SICSLOWPAN_NHC_BIT : 0) |
973 udp_buf = UIP_UDP_BUF_POS(ext_hdr_len);
974 LOG_DBG(
"compression: inlined UDP ports on send side: %x, %x\n",
977 if(((
UIP_HTONS(udp_buf->srcport) & 0xfff0) == SICSLOWPAN_UDP_4_BIT_PORT_MIN) &&
978 ((
UIP_HTONS(udp_buf->destport) & 0xfff0) == SICSLOWPAN_UDP_4_BIT_PORT_MIN)) {
980 *next_nhc = SICSLOWPAN_NHC_UDP_CS_P_11;
981 LOG_DBG(
"IPHC: remove 12 b of both source & dest with prefix 0xFOB\n");
982 CHECK_BUFFER_SPACE(1);
985 SICSLOWPAN_UDP_4_BIT_PORT_MIN) << 4) +
986 (uint8_t)((
UIP_HTONS(udp_buf->destport) -
987 SICSLOWPAN_UDP_4_BIT_PORT_MIN));
989 }
else if((
UIP_HTONS(udp_buf->destport) & 0xff00) == SICSLOWPAN_UDP_8_BIT_PORT_MIN) {
991 *next_nhc = SICSLOWPAN_NHC_UDP_CS_P_01;
992 LOG_DBG(
"IPHC: leave source, remove 8 bits of dest with prefix 0xF0\n");
993 CHECK_BUFFER_SPACE(3);
994 memcpy(
hc06_ptr, &udp_buf->srcport, 2);
996 (uint8_t)((
UIP_HTONS(udp_buf->destport) -
997 SICSLOWPAN_UDP_8_BIT_PORT_MIN));
999 }
else if((
UIP_HTONS(udp_buf->srcport) & 0xff00) == SICSLOWPAN_UDP_8_BIT_PORT_MIN) {
1001 *next_nhc = SICSLOWPAN_NHC_UDP_CS_P_10;
1002 LOG_DBG(
"IPHC: remove 8 bits of source with prefix 0xF0, leave dest. hch: %i\n", *next_nhc);
1003 CHECK_BUFFER_SPACE(3);
1005 (uint8_t)((
UIP_HTONS(udp_buf->srcport) -
1006 SICSLOWPAN_UDP_8_BIT_PORT_MIN));
1007 memcpy(
hc06_ptr + 1, &udp_buf->destport, 2);
1011 *next_nhc = SICSLOWPAN_NHC_UDP_CS_P_00;
1012 LOG_DBG(
"IPHC: cannot compress UDP headers\n");
1013 CHECK_BUFFER_SPACE(4);
1014 memcpy(
hc06_ptr, &udp_buf->srcport, 4);
1018 CHECK_BUFFER_SPACE(2);
1019 memcpy(
hc06_ptr, &udp_buf->udpchksum, 2);
1026 LOG_ERR(
"compression: could not handle compression of header");
1029 if(next_hdr != NULL) {
1032 LOG_DBG(
"compression: last header could is not compressed: %d\n", *next_hdr);
1035 PACKETBUF_IPHC_BUF[0] = iphc0;
1036 PACKETBUF_IPHC_BUF[1] = iphc1;
1038 if(LOG_DBG_ENABLED) {
1042 uint8_t data = ((uint8_t *) packetbuf_ptr)[ndx];
1043 LOG_DBG_(
"%02x", data);
1075 uint8_t tmp, iphc0, iphc1, nhc;
1076 struct uip_ext_hdr *exthdr;
1077 uint8_t* last_nextheader;
1078 uint8_t* ip_payload;
1079 uint8_t ext_hdr_len = 0;
1084 #define CHECK_READ_SPACE(readlen) \ 1085 if((hc06_ptr - packetbuf_ptr) + (readlen) > cmpr_len) { \ 1086 LOG_WARN("Not enough packetbuf space to decompress header (%u bytes, %u left). Aborting.\n", \ 1087 (unsigned)(readlen), (unsigned)(cmpr_len - (hc06_ptr - packetbuf_ptr))); \ 1098 iphc0 = PACKETBUF_IPHC_BUF[0];
1099 iphc1 = PACKETBUF_IPHC_BUF[1];
1102 if(iphc1 & SICSLOWPAN_IPHC_CID) {
1103 LOG_DBG(
"uncompression: CID flag set - increase header with one\n");
1108 if((iphc0 & SICSLOWPAN_IPHC_FL_C) == 0) {
1110 if((iphc0 & SICSLOWPAN_IPHC_TC_C) == 0) {
1112 CHECK_READ_SPACE(4);
1113 memcpy(&SICSLOWPAN_IP_BUF(buf)->tcflow,
hc06_ptr + 1, 3);
1118 SICSLOWPAN_IP_BUF(buf)->vtc = 0x60 | ((tmp >> 2) & 0x0f);
1120 SICSLOWPAN_IP_BUF(buf)->tcflow = ((tmp >> 2) & 0x30) | (tmp << 6) |
1121 (SICSLOWPAN_IP_BUF(buf)->tcflow & 0x0f);
1124 SICSLOWPAN_IP_BUF(buf)->vtc = 0x60;
1126 CHECK_READ_SPACE(3);
1127 SICSLOWPAN_IP_BUF(buf)->tcflow = (*
hc06_ptr & 0x0F) |
1129 memcpy(&SICSLOWPAN_IP_BUF(buf)->flow,
hc06_ptr + 1, 2);
1135 if((iphc0 & SICSLOWPAN_IPHC_TC_C) == 0) {
1137 CHECK_READ_SPACE(1);
1138 SICSLOWPAN_IP_BUF(buf)->vtc = 0x60 | ((*
hc06_ptr >> 2) & 0x0f);
1139 SICSLOWPAN_IP_BUF(buf)->tcflow = ((*hc06_ptr << 6) & 0xC0) | ((*hc06_ptr >> 2) & 0x30);
1140 SICSLOWPAN_IP_BUF(buf)->flow = 0;
1144 SICSLOWPAN_IP_BUF(buf)->vtc = 0x60;
1145 SICSLOWPAN_IP_BUF(buf)->tcflow = 0;
1146 SICSLOWPAN_IP_BUF(buf)->flow = 0;
1151 if((iphc0 & SICSLOWPAN_IPHC_NH_C) == 0) {
1153 CHECK_READ_SPACE(1);
1154 SICSLOWPAN_IP_BUF(buf)->proto = *
hc06_ptr;
1155 LOG_DBG(
"uncompression: next header inline: %d\n", SICSLOWPAN_IP_BUF(buf)->proto);
1160 if((iphc0 & 0x03) != SICSLOWPAN_IPHC_TTL_I) {
1161 SICSLOWPAN_IP_BUF(buf)->ttl = ttl_values[iphc0 & 0x03];
1163 CHECK_READ_SPACE(1);
1164 SICSLOWPAN_IP_BUF(buf)->ttl = *
hc06_ptr;
1169 tmp = ((iphc1 & SICSLOWPAN_IPHC_SAM_11) >> SICSLOWPAN_IPHC_SAM_BIT) & 0x03;
1172 if(iphc1 & SICSLOWPAN_IPHC_SAC) {
1173 uint8_t sci = (iphc1 & SICSLOWPAN_IPHC_CID) ?
1174 PACKETBUF_IPHC_BUF[2] >> 4 : 0;
1179 if(context == NULL) {
1180 LOG_ERR(
"uncompression: error context not found\n");
1185 uncompress_addr(&SICSLOWPAN_IP_BUF(buf)->srcipaddr,
1186 tmp != 0 ? context->prefix : NULL, unc_ctxconf[tmp],
1187 (uip_lladdr_t *)packetbuf_addr(PACKETBUF_ADDR_SENDER));
1190 uncompress_addr(&SICSLOWPAN_IP_BUF(buf)->srcipaddr, llprefix, unc_llconf[tmp],
1191 (uip_lladdr_t *)packetbuf_addr(PACKETBUF_ADDR_SENDER));
1196 tmp = ((iphc1 & SICSLOWPAN_IPHC_DAM_11) >> SICSLOWPAN_IPHC_DAM_BIT) & 0x03;
1199 if(iphc1 & SICSLOWPAN_IPHC_M) {
1201 if(iphc1 & SICSLOWPAN_IPHC_DAC) {
1209 uint8_t prefix[] = {0xff, 0x02};
1210 if(tmp > 0 && tmp < 3) {
1211 CHECK_READ_SPACE(1);
1216 uncompress_addr(&SICSLOWPAN_IP_BUF(buf)->destipaddr, prefix,
1217 unc_mxconf[tmp], NULL);
1222 if(iphc1 & SICSLOWPAN_IPHC_DAC) {
1223 uint8_t dci = (iphc1 & SICSLOWPAN_IPHC_CID) ? PACKETBUF_IPHC_BUF[2] & 0x0f : 0;
1227 if(context == NULL) {
1228 LOG_ERR(
"uncompression: error context not found\n");
1231 uncompress_addr(&SICSLOWPAN_IP_BUF(buf)->destipaddr, context->prefix,
1233 (uip_lladdr_t *)packetbuf_addr(PACKETBUF_ADDR_RECEIVER));
1236 uncompress_addr(&SICSLOWPAN_IP_BUF(buf)->destipaddr, llprefix,
1238 (uip_lladdr_t *)packetbuf_addr(PACKETBUF_ADDR_RECEIVER));
1244 nhc = iphc0 & SICSLOWPAN_IPHC_NH_C;
1246 last_nextheader = &SICSLOWPAN_IP_BUF(buf)->proto;
1247 ip_payload = SICSLOWPAN_IPPAYLOAD_BUF(buf);
1249 CHECK_READ_SPACE(1);
1250 while(nhc && (*
hc06_ptr & SICSLOWPAN_NHC_MASK) == SICSLOWPAN_NHC_EXT_HDR) {
1251 uint8_t eid = (*
hc06_ptr & 0x0e) >> 1;
1261 CHECK_READ_SPACE(1);
1265 LOG_DBG(
"uncompression: next header is inlined. Next: %d\n", next);
1267 CHECK_READ_SPACE(1);
1271 LOG_DBG(
"uncompression: found ext header id: %d next: %d len: %d\n", eid, next, len);
1273 case SICSLOWPAN_NHC_ETX_HDR_HBHO:
1276 case SICSLOWPAN_NHC_ETX_HDR_ROUTING:
1277 proto = UIP_PROTO_ROUTING;
1279 case SICSLOWPAN_NHC_ETX_HDR_FRAG:
1280 proto = UIP_PROTO_FRAG;
1282 case SICSLOWPAN_NHC_ETX_HDR_DESTO:
1283 proto = UIP_PROTO_DESTO;
1286 LOG_DBG(
"uncompression: error unsupported ext header\n");
1289 *last_nextheader = proto;
1292 if((ip_payload - buf) + UIP_EXT_HDR_LEN + len > buf_size) {
1293 LOG_WARN(
"uncompression: cannot write ext header beyond target buffer\n");
1298 exthdr = (
struct uip_ext_hdr *)ip_payload;
1299 exthdr->len = (UIP_EXT_HDR_LEN + len) / 8;
1300 if(exthdr->len == 0) {
1301 LOG_WARN(
"Extension header length is below 8\n");
1305 exthdr->next = next;
1306 last_nextheader = &exthdr->next;
1309 CHECK_READ_SPACE(len + 1);
1310 memcpy((uint8_t *)exthdr + UIP_EXT_HDR_LEN,
hc06_ptr, len);
1314 ip_payload += (exthdr->len + 1) * 8;
1315 ext_hdr_len += (exthdr->len + 1) * 8;
1317 LOG_DBG(
"uncompression: %d len: %d exthdr len: %d (calc: %d)\n",
1318 proto, len, exthdr->len, (exthdr->len + 1) * 8);
1322 CHECK_READ_SPACE(1);
1323 if(nhc && (*
hc06_ptr & SICSLOWPAN_NHC_UDP_MASK) == SICSLOWPAN_NHC_UDP_ID) {
1324 struct uip_udp_hdr *udp_buf = (
struct uip_udp_hdr *)ip_payload;
1326 uint8_t checksum_compressed;
1327 *last_nextheader = UIP_PROTO_UDP;
1328 checksum_compressed = *
hc06_ptr & SICSLOWPAN_NHC_UDP_CHECKSUMC;
1329 LOG_DBG(
"uncompression: incoming header value: %i\n", *
hc06_ptr);
1330 switch(*
hc06_ptr & SICSLOWPAN_NHC_UDP_CS_P_11) {
1331 case SICSLOWPAN_NHC_UDP_CS_P_00:
1333 CHECK_READ_SPACE(5);
1334 memcpy(&udp_buf->srcport,
hc06_ptr + 1, 2);
1335 memcpy(&udp_buf->destport,
hc06_ptr + 3, 2);
1336 LOG_DBG(
"uncompression: UDP ports (ptr+5): %x, %x\n",
1342 case SICSLOWPAN_NHC_UDP_CS_P_01:
1344 LOG_DBG(
"uncompression: destination address\n");
1345 CHECK_READ_SPACE(4);
1346 memcpy(&udp_buf->srcport,
hc06_ptr + 1, 2);
1347 udp_buf->destport =
UIP_HTONS(SICSLOWPAN_UDP_8_BIT_PORT_MIN + (*(
hc06_ptr + 3)));
1348 LOG_DBG(
"uncompression: UDP ports (ptr+4): %x, %x\n",
1353 case SICSLOWPAN_NHC_UDP_CS_P_10:
1355 LOG_DBG(
"uncompression: source address\n");
1356 CHECK_READ_SPACE(4);
1357 udp_buf->srcport =
UIP_HTONS(SICSLOWPAN_UDP_8_BIT_PORT_MIN +
1359 memcpy(&udp_buf->destport,
hc06_ptr + 2, 2);
1360 LOG_DBG(
"uncompression: UDP ports (ptr+4): %x, %x\n",
1365 case SICSLOWPAN_NHC_UDP_CS_P_11:
1367 CHECK_READ_SPACE(2);
1368 udp_buf->srcport =
UIP_HTONS(SICSLOWPAN_UDP_4_BIT_PORT_MIN +
1370 udp_buf->destport =
UIP_HTONS(SICSLOWPAN_UDP_4_BIT_PORT_MIN +
1372 LOG_DBG(
"uncompression: UDP ports (ptr+2): %x, %x\n",
1378 LOG_DBG(
"uncompression: error unsupported UDP compression\n");
1381 if(!checksum_compressed) {
1382 CHECK_READ_SPACE(2);
1383 memcpy(&udp_buf->udpchksum,
hc06_ptr, 2);
1385 LOG_DBG(
"uncompression: checksum included\n");
1387 LOG_DBG(
"uncompression: checksum *NOT* included\n");
1392 udp_buf->udplen =
UIP_HTONS(ip_len == 0 ? udp_len :
1393 ip_len - UIP_IPH_LEN - ext_hdr_len);
1394 LOG_DBG(
"uncompression: UDP length: %u (ext: %u) ip_len: %d udp_len: %d\n",
1395 UIP_HTONS(udp_buf->udplen), ext_hdr_len, ip_len, udp_len);
1405 LOG_DBG(
"uncompression: IP payload length: %d. %u - %u + %u - %u\n", len,
1409 SICSLOWPAN_IP_BUF(buf)->len[0] = len >> 8;
1410 SICSLOWPAN_IP_BUF(buf)->len[1] = len & 0x00FF;
1413 SICSLOWPAN_IP_BUF(buf)->len[0] = (ip_len - UIP_IPH_LEN) >> 8;
1414 SICSLOWPAN_IP_BUF(buf)->len[1] = (ip_len - UIP_IPH_LEN) & 0x00FF;
1422 #if SICSLOWPAN_COMPRESSION == SICSLOWPAN_COMPRESSION_6LORH 1431 PACKETBUF_6LO_PTR[PACKETBUF_6LO_DISPATCH] = SICSLOWPAN_DISPATCH_PAGING | (page & 0x0f);
1453 if((PACKETBUF_6LO_PTR[PACKETBUF_6LO_DISPATCH] & SICSLOWPAN_DISPATCH_PAGING_MASK) == SICSLOWPAN_DISPATCH_PAGING) {
1455 curr_page = PACKETBUF_6LO_PTR[PACKETBUF_6LO_DISPATCH] & 0x0f;
1484 #if SICSLOWPAN_COMPRESSION == SICSLOWPAN_COMPRESSION_IPV6 1486 compress_hdr_ipv6(linkaddr_t *link_destaddr)
1508 const linkaddr_t *dest;
1510 if(callback != NULL) {
1511 callback->output_callback(status);
1516 dest = packetbuf_addr(PACKETBUF_ADDR_RECEIVER);
1522 link_stats_packet_sent(dest, status, transmissions);
1525 NETSTACK_ROUTING.
link_callback(dest, status, transmissions);
1543 packetbuf_set_addr(PACKETBUF_ADDR_RECEIVER, dest);
1545 #if NETSTACK_CONF_BRIDGE_MODE 1547 packetbuf_set_addr(PACKETBUF_ADDR_SENDER,(
void*)&
uip_lladdr);
1558 #if SICSLOWPAN_CONF_FRAG 1568 fragment_copy_payload_and_send(uint16_t uip_offset, linkaddr_t *dest) {
1577 q = queuebuf_new_from_packetbuf();
1579 LOG_WARN(
"output: could not allocate queuebuf, dropping fragment\n");
1587 queuebuf_to_packetbuf(q);
1593 LOG_ERR(
"output: error in fragment tx, dropping subsequent fragments.\n");
1636 if(localdest == NULL) {
1642 LOG_INFO(
"output: sending IPv6 packet with len %d\n",
uip_len);
1645 packetbuf_set_attr(PACKETBUF_ATTR_MAX_MAC_TRANSMISSIONS,
1646 uipbuf_get_attr(UIPBUF_ATTR_MAX_MAC_TRANSMISSIONS));
1649 packetbuf_set_addr(PACKETBUF_ADDR_RECEIVER, &dest);
1650 #if LLSEC802154_USES_AUX_HEADER 1652 packetbuf_set_attr(PACKETBUF_ATTR_SECURITY_LEVEL,
1653 uipbuf_get_attr(UIPBUF_ATTR_LLSEC_LEVEL));
1654 #if LLSEC802154_USES_EXPLICIT_KEYS 1655 packetbuf_set_attr(PACKETBUF_ATTR_KEY_INDEX,
1656 uipbuf_get_attr(UIPBUF_ATTR_LLSEC_KEY_ID));
1664 LOG_WARN(
"output: failed to calculate payload size - dropping packet\n");
1669 #if SICSLOWPAN_COMPRESSION == SICSLOWPAN_COMPRESSION_IPV6 1670 compress_hdr_ipv6(&dest);
1672 #if SICSLOWPAN_COMPRESSION == SICSLOWPAN_COMPRESSION_6LORH 1680 #if SICSLOWPAN_COMPRESSION >= SICSLOWPAN_COMPRESSION_IPHC 1691 packetbuf_set_addr(PACKETBUF_ADDR_RECEIVER, &dest);
1694 LOG_INFO(
"output: header len %d -> %d, total len %d -> %d, MAC max payload %d, frag_needed %d\n",
1700 #if SICSLOWPAN_CONF_FRAG 1702 uint16_t processed_ip_out_len;
1719 int fragn_max_payload = (
mac_max_payload - SICSLOWPAN_FRAGN_HDR_LEN) & 0xfffffff8;
1721 int last_fragn_max_payload =
mac_max_payload - SICSLOWPAN_FRAGN_HDR_LEN;
1723 int middle_fragn_total_payload = MAX(total_payload - frag1_payload - last_fragn_max_payload, 0);
1725 int fragment_count = 2;
1726 if(middle_fragn_total_payload > 0) {
1727 fragment_count += 1 + (middle_fragn_total_payload - 1) / fragn_max_payload;
1730 int freebuf = queuebuf_numfree() - 1;
1731 LOG_INFO(
"output: fragmentation needed, fragments: %u, free queuebufs: %u\n",
1732 fragment_count, freebuf);
1734 if(freebuf < fragment_count) {
1735 LOG_WARN(
"output: dropping packet, not enough free bufs (needed: %u, free: %u)\n",
1736 fragment_count, freebuf);
1740 if(frag1_payload < 0) {
1744 LOG_WARN(
"output: compressed header does not fit first fragment\n");
1751 frag_tag = my_tag++;
1758 SET16(PACKETBUF_FRAG_PTR, PACKETBUF_FRAG_DISPATCH_SIZE,
1759 ((SICSLOWPAN_DISPATCH_FRAG1 << 8) |
uip_len));
1760 SET16(PACKETBUF_FRAG_PTR, PACKETBUF_FRAG_TAG, frag_tag);
1767 LOG_INFO(
"output: fragment %d/%d (tag %d, payload %d)\n",
1768 curr_frag + 1, fragment_count,
1778 SET16(PACKETBUF_FRAG_PTR, PACKETBUF_FRAG_DISPATCH_SIZE,
1779 ((SICSLOWPAN_DISPATCH_FRAGN << 8) |
uip_len));
1785 while(processed_ip_out_len <
uip_len) {
1788 PACKETBUF_FRAG_PTR[PACKETBUF_FRAG_OFFSET] = processed_ip_out_len >> 3;
1791 if(
uip_len - processed_ip_out_len > last_fragn_max_payload) {
1793 packetbuf_payload_len = fragn_max_payload;
1796 packetbuf_payload_len =
uip_len - processed_ip_out_len;
1801 LOG_INFO(
"output: fragment %d/%d (tag %d, payload %d, offset %d)\n",
1802 curr_frag + 1, fragment_count,
1803 frag_tag, packetbuf_payload_len, processed_ip_out_len);
1804 if(fragment_copy_payload_and_send(processed_ip_out_len, &dest) == 0) {
1811 LOG_ERR(
"output: Packet too large to be sent without fragmentation support; dropping packet\n");
1821 LOG_ERR(
"output: uip_len is smaller than uncomp_hdr_len (%d < %d)",
1850 uint16_t frag_size = 0;
1852 uint8_t frag_offset = 0;
1854 uint16_t buffer_size;
1856 #if SICSLOWPAN_CONF_FRAG 1857 uint8_t is_fragment = 0;
1858 int8_t frag_context = 0;
1861 uint16_t frag_tag = 0;
1862 uint8_t first_fragment = 0, last_fragment = 0;
1866 link_stats_input_callback(packetbuf_addr(PACKETBUF_ADDR_SENDER));
1876 LOG_WARN(
"input: empty packet\n");
1889 last_rssi = (
signed short)packetbuf_attr(PACKETBUF_ATTR_RSSI);
1890 uipbuf_set_attr(UIPBUF_ATTR_RSSI, packetbuf_attr(PACKETBUF_ATTR_RSSI));
1891 uipbuf_set_attr(UIPBUF_ATTR_LINK_QUALITY, packetbuf_attr(PACKETBUF_ATTR_LINK_QUALITY));
1894 #if SICSLOWPAN_CONF_FRAG 1900 switch((GET16(PACKETBUF_FRAG_PTR, PACKETBUF_FRAG_DISPATCH_SIZE) >> 8) & SICSLOWPAN_DISPATCH_FRAG_MASK) {
1901 case SICSLOWPAN_DISPATCH_FRAG1:
1903 frag_size = GET16(PACKETBUF_FRAG_PTR, PACKETBUF_FRAG_DISPATCH_SIZE) & 0x07ff;
1904 frag_tag = GET16(PACKETBUF_FRAG_PTR, PACKETBUF_FRAG_TAG);
1909 LOG_INFO(
"input: received first element of a fragmented packet (tag %d, len %d)\n",
1910 frag_tag, frag_size);
1913 frag_context = add_fragment(frag_tag, frag_size, frag_offset);
1915 if(frag_context == -1) {
1916 LOG_ERR(
"input: failed to allocate new reassembly context\n");
1920 buffer = frag_info[frag_context].first_frag;
1921 buffer_size = SICSLOWPAN_FIRST_FRAGMENT_SIZE;
1923 case SICSLOWPAN_DISPATCH_FRAGN:
1928 frag_offset = PACKETBUF_FRAG_PTR[PACKETBUF_FRAG_OFFSET];
1929 frag_tag = GET16(PACKETBUF_FRAG_PTR, PACKETBUF_FRAG_TAG);
1930 frag_size = GET16(PACKETBUF_FRAG_PTR, PACKETBUF_FRAG_DISPATCH_SIZE) & 0x07ff;
1935 frag_context = add_fragment(frag_tag, frag_size, frag_offset);
1937 if(frag_context == -1) {
1938 LOG_ERR(
"input: reassembly context not found (tag %d)\n", frag_tag);
1946 if(frag_info[frag_context].reassembled_len >= frag_size) {
1955 if(is_fragment && !first_fragment) {
1965 LOG_INFO(
"input: page 1, 6LoRH\n");
1968 LOG_ERR(
"input: page %u not supported\n",
curr_page);
1974 (PACKETBUF_6LO_PTR[PACKETBUF_6LO_DISPATCH] & SICSLOWPAN_DISPATCH_IPHC_MASK) == SICSLOWPAN_DISPATCH_IPHC) {
1975 LOG_DBG(
"uncompression: IPHC dispatch\n");
1977 LOG_ERR(
"input: failed to decompress IPHC packet\n");
1980 }
else if(PACKETBUF_6LO_PTR[PACKETBUF_6LO_DISPATCH] == SICSLOWPAN_DISPATCH_IPV6) {
1981 LOG_DBG(
"uncompression: IPV6 dispatch\n");
1991 LOG_ERR(
"uncompression: unknown dispatch: 0x%02x, or IPHC disabled\n",
1992 PACKETBUF_6LO_PTR[PACKETBUF_6LO_DISPATCH] & SICSLOWPAN_DISPATCH_IPHC_MASK);
1996 #if SICSLOWPAN_CONF_FRAG 2007 LOG_ERR(
"input: packet dropped due to header > total packet\n");
2012 #if SICSLOWPAN_CONF_FRAG 2014 LOG_INFO(
"input: fragment (tag %d, payload %d, offset %d) -- %u %u\n",
2023 if(req_size >
sizeof(
uip_buf)) {
2024 #if SICSLOWPAN_CONF_FRAG 2026 "input: packet and fragment context %u dropped, minimum required IP_BUF size: %d+%d+%d=%d (current size: %u)\n",
2032 clear_fragments(frag_context);
2040 if(buffer != NULL) {
2046 #if SICSLOWPAN_CONF_FRAG 2049 if(first_fragment != 0) {
2055 if(last_fragment != 0) {
2056 frag_info[frag_context].reassembled_len = frag_size;
2058 if(!copy_frags2uip(frag_context)) {
2068 if(!is_fragment || last_fragment) {
2070 if(is_fragment != 0 && last_fragment != 0) {
2078 LOG_INFO(
"input: received IPv6 packet with len %d\n",
2081 if(LOG_DBG_ENABLED) {
2083 LOG_DBG(
"uncompression: after (%u):",
UIP_IP_BUF->len[1]);
2084 for (ndx = 0; ndx <
UIP_IP_BUF->len[1] + 40; ndx++) {
2085 uint8_t data = ((uint8_t *) (
UIP_IP_BUF))[ndx];
2086 LOG_DBG_(
"%02x", data);
2094 callback->input_callback();
2097 #if LLSEC802154_USES_AUX_HEADER 2102 uipbuf_set_attr(UIPBUF_ATTR_LLSEC_LEVEL,
2103 packetbuf_attr(PACKETBUF_ATTR_SECURITY_LEVEL));
2104 #if LLSEC802154_USES_EXPLICIT_KEYS 2105 uipbuf_set_attr(UIPBUF_ATTR_LLSEC_KEY_ID,
2106 packetbuf_attr(PACKETBUF_ATTR_KEY_INDEX));
2111 #if SICSLOWPAN_CONF_FRAG 2121 sicslowpan_init(
void)
2124 #if SICSLOWPAN_COMPRESSION == SICSLOWPAN_COMPRESSION_IPHC 2130 #if SICSLOWPAN_CONF_MAX_ADDR_CONTEXTS > 0 2131 addr_contexts[0].used = 1;
2132 addr_contexts[0].number = 0;
2133 #ifdef SICSLOWPAN_CONF_ADDR_CONTEXT_0 2134 SICSLOWPAN_CONF_ADDR_CONTEXT_0;
2136 addr_contexts[0].prefix[0] = UIP_DS6_DEFAULT_PREFIX_0;
2137 addr_contexts[0].prefix[1] = UIP_DS6_DEFAULT_PREFIX_1;
2141 #if SICSLOWPAN_CONF_MAX_ADDR_CONTEXTS > 1 2145 #ifdef SICSLOWPAN_CONF_ADDR_CONTEXT_1 2147 addr_contexts[1].used = 1;
2148 addr_contexts[1].number = 1;
2149 SICSLOWPAN_CONF_ADDR_CONTEXT_1;
2150 #ifdef SICSLOWPAN_CONF_ADDR_CONTEXT_2 2152 addr_contexts[2].used = 1;
2153 addr_contexts[2].number = 2;
2154 SICSLOWPAN_CONF_ADDR_CONTEXT_2;
2157 addr_contexts[i].used = 0;
2160 addr_contexts[i].used = 0;
2170 sicslowpan_get_last_rssi(
void)
static uip_ipaddr_t ipaddr
Pointer to prefix information option in uip_buf.
void * packetbuf_dataptr(void)
Get a pointer to the data in the packetbuf.
The MAC layer transmission could not be performed because of a fatal error.
#define UIP_IP_BUF
Direct access to IPv6 header.
static uint8_t packetbuf_hdr_len
packetbuf_hdr_len is the total length of (the processed) 6lowpan headers (fragment headers...
uip_lladdr_t uip_lladdr
Host L2 address.
void timer_set(struct timer *t, clock_time_t interval)
Set a timer.
Header for the Contiki/uIP interface.
static void digest_paging_dispatch(void)
Digest 6lorh headers before IPHC.
static volatile uint64_t count
Num.
void packetbuf_clear(void)
Clear and reset the packetbuf.
uint16_t uip_len
The length of the packet in the uip_buf buffer.
static int packetbuf_payload_len
The length of the payload in the Packetbuf buffer.
#define UIP_ICMP_BUF
Direct access to ICMP, UDP, and TCP headers and payload, with implicit ext header offset (global uip_...
void(* link_callback)(const linkaddr_t *addr, int status, int numtx)
Called by lower layers after every packet transmission.
static void send_packet(linkaddr_t *dest)
This function is called by the 6lowpan code to send out a packet.
#define UIP_PROTO_HBHO
extension headers types
#define UIP_BUFSIZE
The size of the uIP packet buffer.
static void digest_6lorh_hdr(void)
Digest 6lorh headers before IPHC.
static void packet_sent(void *ptr, int status, int transmissions)
Callback function for the MAC packet sent callback.
void uip_ds6_link_callback(int status, int numtx)
The callback function to update link-layer stats in a neighbor cache.
void uip_ds6_set_addr_iid(uip_ipaddr_t *ipaddr, uip_lladdr_t *lladdr)
set the last 64 bits of an IP address based on the MAC address
const linkaddr_t linkaddr_null
The null link-layer address.
static uint8_t output(const linkaddr_t *localdest)
Take an IP packet and format it to be sent on an 802.15.4 network using 6lowpan.
Header file for IPv6-related data structures.
uint16_t packetbuf_datalen(void)
Get the length of the data in the packetbuf.
Configuration options for uIP.
#define sicslowpan_is_iid_16_bit_compressable(a)
check whether we can compress the IID in address 'a' to 16 bits.
static int mac_max_payload
mac_max_payload is the maimum payload space on the MAC frame.
#define CLOCK_SECOND
A second, measured in system clock time.
#define uip_is_addr_mac_addr_based(a, m)
was addr (a) forged based on the mac address m a type is uip_ipaddr_t m type is uiplladdr_t ...
static void add_paging_dispatch(uint8_t page)
Adds Paging dispatch byte.
Header file for the Packet queue buffer management
#define SICSLOWPAN_COMPRESSION
Do we compress the IP header or not.
static uint8_t uncomp_hdr_len
uncomp_hdr_len is the length of the headers before compression (if HC2 is used this includes the UDP ...
static int last_tx_status
the result of the last transmitted fragment
The structure of a network driver in Contiki.
static uint8_t curr_page
The current page (RFC 4944)
#define SICSLOWPAN_REASS_MAXAGE
Timeout for packet reassembly at the 6lowpan layer (should be < 60s)
static uint8_t * hc06_ptr
pointer to the byte where to write next inline field.
#define uip_is_addr_unspecified(a)
Is IPv6 address a the unspecified address a is of type uip_ipaddr_t.
Routing driver header file
#define uip_buf
Macro to access uip_aligned_buf as an array of bytes.
int timer_expired(struct timer *t)
Check if a timer has expired.
The header for fragments.
void linkaddr_copy(linkaddr_t *dest, const linkaddr_t *src)
Copy a link-layer address.
#define uip_is_addr_mcast(a)
is address a multicast address, see RFC 4291 a is of type uip_ipaddr_t*
#define SICSLOWPAN_CONF_MAX_ADDR_CONTEXTS
If we use IPHC compression, how many address contexts do we support.
int linkaddr_cmp(const linkaddr_t *addr1, const linkaddr_t *addr2)
Compare two link-layer addresses.
#define UIP_HTONS(n)
Convert 16-bit quantity from host byte order to network byte order.
void(* send)(mac_callback_t sent_callback, void *ptr)
Send a packet from the packetbuf.
Header file for the uIP TCP/IP stack.
static int compress_hdr_iphc(linkaddr_t *link_destaddr)
Compress IP/UDP header.
static void add_6lorh_hdr(void)
Adds 6lorh headers before IPHC.
Header file for the Packet buffer (packetbuf) management
Include file for the Contiki low-layer network stack (NETSTACK)
int(* max_payload)(void)
Read out estimated max payload size based on payload in packetbuf.
void watchdog_periodic(void)
Writes the WDT clear sequence.
Header file for the 6lowpan implementation (RFC4944 and draft-hui-6lowpan-hc-01) ...
#define uip_is_addr_linklocal(a)
is addr (a) a link local unicast address, see RFC 4291 i.e.
The MAC layer transmission was OK.
Header file for the logging system
static void input(void)
Process a received 6lowpan packet.
static struct sicslowpan_addr_context * addr_context_lookup_by_number(uint8_t number)
find the context with the given number
static struct sicslowpan_addr_context * addr_context_lookup_by_prefix(uip_ipaddr_t *ipaddr)
find the context corresponding to prefix ipaddr
void packetbuf_set_datalen(uint16_t len)
Set the length of the data in the packetbuf.
void tcpip_input(void)
Deliver an incoming packet to the TCP/IP stack.
static uint8_t * packetbuf_ptr
A pointer to the packetbuf buffer.
static struct sicslowpan_addr_context * context
Addresses contexts for IPHC.
The MAC layer did not get an acknowledgement for the packet.
static bool uncompress_hdr_iphc(uint8_t *buf, uint16_t buf_size, uint16_t ip_len)
Uncompress IPHC (i.e., IPHC and LOWPAN_UDP) headers and put them in sicslowpan_buf.