62 #include "dev/watchdog.h"
65 #include "net/ipv6/uip-ds6.h"
74 #define DEBUG DEBUG_PRINT
80 #define PRINTFI(...) PRINTF(__VA_ARGS__)
81 #define PRINTFO(...) PRINTF(__VA_ARGS__)
82 #define PRINTPACKETBUF() PRINTF("packetbuf buffer: "); for(p = 0; p < packetbuf_datalen(); p++){PRINTF("%.2X", *(packetbuf_ptr + p));} PRINTF("\n")
83 #define PRINTUIPBUF() PRINTF("UIP buffer: "); for(p = 0; p < uip_len; p++){PRINTF("%.2X", uip_buf[p]);}PRINTF("\n")
84 #define PRINTSICSLOWPANBUF() PRINTF("SICSLOWPAN buffer: "); for(p = 0; p < sicslowpan_len; p++){PRINTF("%.2X", sicslowpan_buf[p]);}PRINTF("\n")
88 #define PRINTPACKETBUF()
90 #define PRINTSICSLOWPANBUF()
96 #define UIP_LOG(m) uip_log(m)
101 #ifdef SICSLOWPAN_CONF_MAX_MAC_TRANSMISSIONS
102 #define SICSLOWPAN_MAX_MAC_TRANSMISSIONS SICSLOWPAN_CONF_MAX_MAC_TRANSMISSIONS
104 #define SICSLOWPAN_MAX_MAC_TRANSMISSIONS 4
107 #ifndef SICSLOWPAN_COMPRESSION
108 #ifdef SICSLOWPAN_CONF_COMPRESSION
109 #define SICSLOWPAN_COMPRESSION SICSLOWPAN_CONF_COMPRESSION
111 #define SICSLOWPAN_COMPRESSION SICSLOWPAN_COMPRESSION_IPV6
115 #define GET16(ptr,index) (((uint16_t)((ptr)[index] << 8)) | ((ptr)[(index) + 1]))
116 #define SET16(ptr,index,value) do { \
117 (ptr)[index] = ((value) >> 8) & 0xff; \
118 (ptr)[index + 1] = (value) & 0xff; \
124 #define PACKETBUF_FRAG_PTR (packetbuf_ptr)
125 #define PACKETBUF_FRAG_DISPATCH_SIZE 0
126 #define PACKETBUF_FRAG_TAG 2
127 #define PACKETBUF_FRAG_OFFSET 4
130 #define PACKETBUF_IPHC_BUF ((uint8_t *)(packetbuf_ptr + packetbuf_hdr_len))
132 #define PACKETBUF_HC1_PTR (packetbuf_ptr + packetbuf_hdr_len)
133 #define PACKETBUF_HC1_DISPATCH 0
134 #define PACKETBUF_HC1_ENCODING 1
135 #define PACKETBUF_HC1_TTL 2
137 #define PACKETBUF_HC1_HC_UDP_PTR (packetbuf_ptr + packetbuf_hdr_len)
138 #define PACKETBUF_HC1_HC_UDP_DISPATCH 0
139 #define PACKETBUF_HC1_HC_UDP_HC1_ENCODING 1
140 #define PACKETBUF_HC1_HC_UDP_UDP_ENCODING 2
141 #define PACKETBUF_HC1_HC_UDP_TTL 3
142 #define PACKETBUF_HC1_HC_UDP_PORTS 4
143 #define PACKETBUF_HC1_HC_UDP_CHKSUM 5
148 #define SICSLOWPAN_IP_BUF ((struct uip_ip_hdr *)&sicslowpan_buf[UIP_LLH_LEN])
149 #define SICSLOWPAN_UDP_BUF ((struct uip_udp_hdr *)&sicslowpan_buf[UIP_LLIPH_LEN])
151 #define UIP_IP_BUF ((struct uip_ip_hdr *)&uip_buf[UIP_LLH_LEN])
152 #define UIP_UDP_BUF ((struct uip_udp_hdr *)&uip_buf[UIP_LLIPH_LEN])
153 #define UIP_TCP_BUF ((struct uip_tcp_hdr *)&uip_buf[UIP_LLIPH_LEN])
154 #define UIP_ICMP_BUF ((struct uip_icmp_hdr *)&uip_buf[UIP_LLIPH_LEN])
159 #ifdef SICSLOWPAN_CONF_MAC_MAX_PAYLOAD
160 #define MAC_MAX_PAYLOAD SICSLOWPAN_CONF_MAC_MAX_PAYLOAD
162 #define MAC_MAX_PAYLOAD 102
169 #ifdef SICSLOWPAN_CONF_COMPRESSION_THRESHOLD
170 #define COMPRESSION_THRESHOLD SICSLOWPAN_CONF_COMPRESSION_THRESHOLD
172 #define COMPRESSION_THRESHOLD 0
178 #ifdef SICSLOWPAN_NH_COMPRESSOR
188 static uint8_t *packetbuf_ptr;
195 static uint8_t packetbuf_hdr_len;
203 static int packetbuf_payload_len;
209 static uint8_t uncomp_hdr_len;
214 static int last_tx_status;
217 #if SICSLOWPAN_CONF_FRAG
222 static uint16_t sicslowpan_len;
230 #define sicslowpan_buf (sicslowpan_aligned_buf.u8)
238 static uint16_t processed_ip_in_len;
241 static uint16_t my_tag;
244 static uint16_t reass_tag;
247 linkaddr_t frag_sender;
250 static struct timer reass_timer;
256 #define sicslowpan_buf uip_buf
257 #define sicslowpan_len uip_len
260 static int last_rssi;
265 static struct rime_sniffer *callback =
NULL;
268 rime_sniffer_add(
struct rime_sniffer *s)
274 rime_sniffer_remove(
struct rime_sniffer *s)
284 packetbuf_set_attr(PACKETBUF_ATTR_NETWORK_ID,
UIP_IP_BUF->proto);
288 c = UIP_UDP_BUF->srcport;
289 if(UIP_UDP_BUF->destport < c) {
290 c = UIP_UDP_BUF->destport;
292 }
else if(
UIP_IP_BUF->proto == UIP_PROTO_TCP) {
293 c = UIP_TCP_BUF->srcport;
294 if(UIP_TCP_BUF->destport < c) {
295 c = UIP_TCP_BUF->destport;
297 }
else if(
UIP_IP_BUF->proto == UIP_PROTO_ICMP6) {
301 packetbuf_set_attr(PACKETBUF_ATTR_CHANNEL, c);
311 #if SICSLOWPAN_COMPRESSION == SICSLOWPAN_COMPRESSION_HC06
317 #if SICSLOWPAN_CONF_MAX_ADDR_CONTEXTS > 0
326 static uint8_t *hc06_ptr;
335 const uint8_t unc_llconf[] = {0x0f,0x28,0x22,0x20};
342 const uint8_t unc_ctxconf[] = {0x00,0x88,0x82,0x80};
349 const uint8_t unc_mxconf[] = {0x0f, 0x25, 0x23, 0x21};
352 const uint8_t llprefix[] = {0xfe, 0x80};
355 static const uint8_t ttl_values[] = {0, 1, 64, 255};
363 addr_context_lookup_by_prefix(uip_ipaddr_t *ipaddr)
366 #if SICSLOWPAN_CONF_MAX_ADDR_CONTEXTS > 0
369 if((addr_contexts[i].used == 1) &&
370 uip_ipaddr_prefixcmp(&addr_contexts[i].prefix, ipaddr, 64)) {
371 return &addr_contexts[i];
380 addr_context_lookup_by_number(uint8_t number)
383 #if SICSLOWPAN_CONF_MAX_ADDR_CONTEXTS > 0
386 if((addr_contexts[i].used == 1) &&
387 addr_contexts[i].number == number) {
388 return &addr_contexts[i];
396 compress_addr_64(uint8_t bitpos, uip_ipaddr_t *ipaddr,
uip_lladdr_t *lladdr)
402 memcpy(hc06_ptr, &ipaddr->u16[7], 2);
407 memcpy(hc06_ptr, &ipaddr->u16[4], 8);
421 uncompress_addr(uip_ipaddr_t *ipaddr, uint8_t
const prefix[],
424 uint8_t prefcount = pref_post_count >> 4;
425 uint8_t postcount = pref_post_count & 0x0f;
427 prefcount = prefcount == 15 ? 16 : prefcount;
428 postcount = postcount == 15 ? 16 : postcount;
430 PRINTF(
"Uncompressing %d + %d => ", prefcount, postcount);
433 memcpy(ipaddr, prefix, prefcount);
435 if(prefcount + postcount < 16) {
436 memset(&ipaddr->u8[prefcount], 0, 16 - (prefcount + postcount));
439 memcpy(&ipaddr->u8[16 - postcount], hc06_ptr, postcount);
440 if(postcount == 2 && prefcount < 11) {
442 ipaddr->u8[11] = 0xff;
443 ipaddr->u8[12] = 0xfe;
445 hc06_ptr += postcount;
446 }
else if (prefcount > 0) {
491 compress_hdr_hc06(linkaddr_t *link_destaddr)
493 uint8_t tmp, iphc0, iphc1;
496 PRINTF(
"before compression (%d): ",
UIP_IP_BUF->len[1]);
497 for(ndx = 0; ndx <
UIP_IP_BUF->len[1] + 40; ndx++) {
498 uint8_t data = ((uint8_t *) (
UIP_IP_BUF))[ndx];
499 PRINTF(
"%02x", data);
505 hc06_ptr = packetbuf_ptr + 2;
513 iphc0 = SICSLOWPAN_DISPATCH_IPHC;
515 PACKETBUF_IPHC_BUF[2] = 0;
527 if(addr_context_lookup_by_prefix(&
UIP_IP_BUF->destipaddr) !=
NULL ||
530 PRINTF(
"IPHC: compressing dest or src ipaddr - setting CID\n");
531 iphc1 |= SICSLOWPAN_IPHC_CID;
544 tmp = ((tmp & 0x03) << 6) | (tmp >> 2);
549 iphc0 |= SICSLOWPAN_IPHC_FL_C;
553 iphc0 |= SICSLOWPAN_IPHC_TC_C;
564 iphc0 |= SICSLOWPAN_IPHC_TC_C;
565 *hc06_ptr = (tmp & 0xc0) |
581 #if UIP_CONF_UDP || UIP_CONF_ROUTER
583 iphc0 |= SICSLOWPAN_IPHC_NH_C;
586 #ifdef SICSLOWPAN_NH_COMPRESSOR
587 if(SICSLOWPAN_NH_COMPRESSOR.is_compressable(
UIP_IP_BUF->proto)) {
588 iphc0 |= SICSLOWPAN_IPHC_NH_C;
591 if ((iphc0 & SICSLOWPAN_IPHC_NH_C) == 0) {
605 iphc0 |= SICSLOWPAN_IPHC_TTL_1;
608 iphc0 |= SICSLOWPAN_IPHC_TTL_64;
611 iphc0 |= SICSLOWPAN_IPHC_TTL_255;
621 PRINTF(
"IPHC: compressing unspecified - setting SAC\n");
622 iphc1 |= SICSLOWPAN_IPHC_SAC;
623 iphc1 |= SICSLOWPAN_IPHC_SAM_00;
624 }
else if((context = addr_context_lookup_by_prefix(&
UIP_IP_BUF->srcipaddr))
627 PRINTF(
"IPHC: compressing src with context - setting CID & SAC ctx: %d\n",
629 iphc1 |= SICSLOWPAN_IPHC_CID | SICSLOWPAN_IPHC_SAC;
630 PACKETBUF_IPHC_BUF[2] |= context->number << 4;
633 iphc1 |= compress_addr_64(SICSLOWPAN_IPHC_SAM_BIT,
640 iphc1 |= compress_addr_64(SICSLOWPAN_IPHC_SAM_BIT,
644 iphc1 |= SICSLOWPAN_IPHC_SAM_00;
645 memcpy(hc06_ptr, &
UIP_IP_BUF->srcipaddr.u16[0], 16);
652 iphc1 |= SICSLOWPAN_IPHC_M;
653 if(sicslowpan_is_mcast_addr_compressable8(&
UIP_IP_BUF->destipaddr)) {
654 iphc1 |= SICSLOWPAN_IPHC_DAM_11;
658 }
else if(sicslowpan_is_mcast_addr_compressable32(&
UIP_IP_BUF->destipaddr)) {
659 iphc1 |= SICSLOWPAN_IPHC_DAM_10;
662 memcpy(hc06_ptr + 1, &
UIP_IP_BUF->destipaddr.u8[13], 3);
664 }
else if(sicslowpan_is_mcast_addr_compressable48(&
UIP_IP_BUF->destipaddr)) {
665 iphc1 |= SICSLOWPAN_IPHC_DAM_01;
668 memcpy(hc06_ptr + 1, &
UIP_IP_BUF->destipaddr.u8[11], 5);
671 iphc1 |= SICSLOWPAN_IPHC_DAM_00;
673 memcpy(hc06_ptr, &
UIP_IP_BUF->destipaddr.u8[0], 16);
678 if((context = addr_context_lookup_by_prefix(&
UIP_IP_BUF->destipaddr)) !=
NULL) {
680 iphc1 |= SICSLOWPAN_IPHC_DAC;
681 PACKETBUF_IPHC_BUF[2] |= context->number;
684 iphc1 |= compress_addr_64(SICSLOWPAN_IPHC_DAM_BIT,
691 iphc1 |= compress_addr_64(SICSLOWPAN_IPHC_DAM_BIT,
695 iphc1 |= SICSLOWPAN_IPHC_DAM_00;
696 memcpy(hc06_ptr, &
UIP_IP_BUF->destipaddr.u16[0], 16);
701 uncomp_hdr_len = UIP_IPH_LEN;
703 #if UIP_CONF_UDP || UIP_CONF_ROUTER
706 PRINTF(
"IPHC: Uncompressed UDP ports on send side: %x, %x\n",
709 if(((
UIP_HTONS(UIP_UDP_BUF->srcport) & 0xfff0) == SICSLOWPAN_UDP_4_BIT_PORT_MIN) &&
710 ((
UIP_HTONS(UIP_UDP_BUF->destport) & 0xfff0) == SICSLOWPAN_UDP_4_BIT_PORT_MIN)) {
712 *hc06_ptr = SICSLOWPAN_NHC_UDP_CS_P_11;
713 PRINTF(
"IPHC: remove 12 b of both source & dest with prefix 0xFOB\n");
715 (uint8_t)((
UIP_HTONS(UIP_UDP_BUF->srcport) -
716 SICSLOWPAN_UDP_4_BIT_PORT_MIN) << 4) +
717 (uint8_t)((
UIP_HTONS(UIP_UDP_BUF->destport) -
718 SICSLOWPAN_UDP_4_BIT_PORT_MIN));
720 }
else if((
UIP_HTONS(UIP_UDP_BUF->destport) & 0xff00) == SICSLOWPAN_UDP_8_BIT_PORT_MIN) {
722 *hc06_ptr = SICSLOWPAN_NHC_UDP_CS_P_01;
723 PRINTF(
"IPHC: leave source, remove 8 bits of dest with prefix 0xF0\n");
724 memcpy(hc06_ptr + 1, &UIP_UDP_BUF->srcport, 2);
726 (uint8_t)((
UIP_HTONS(UIP_UDP_BUF->destport) -
727 SICSLOWPAN_UDP_8_BIT_PORT_MIN));
729 }
else if((
UIP_HTONS(UIP_UDP_BUF->srcport) & 0xff00) == SICSLOWPAN_UDP_8_BIT_PORT_MIN) {
731 *hc06_ptr = SICSLOWPAN_NHC_UDP_CS_P_10;
732 PRINTF(
"IPHC: remove 8 bits of source with prefix 0xF0, leave dest. hch: %i\n", *hc06_ptr);
734 (uint8_t)((
UIP_HTONS(UIP_UDP_BUF->srcport) -
735 SICSLOWPAN_UDP_8_BIT_PORT_MIN));
736 memcpy(hc06_ptr + 2, &UIP_UDP_BUF->destport, 2);
740 *hc06_ptr = SICSLOWPAN_NHC_UDP_CS_P_00;
741 PRINTF(
"IPHC: cannot compress headers\n");
742 memcpy(hc06_ptr + 1, &UIP_UDP_BUF->srcport, 4);
747 memcpy(hc06_ptr, &UIP_UDP_BUF->udpchksum, 2);
750 uncomp_hdr_len += UIP_UDPH_LEN;
754 #ifdef SICSLOWPAN_NH_COMPRESSOR
756 hc06_ptr += SICSLOWPAN_NH_COMPRESSOR.compress(hc06_ptr, &uncomp_hdr_len);
760 PACKETBUF_IPHC_BUF[0] = iphc0;
761 PACKETBUF_IPHC_BUF[1] = iphc1;
763 packetbuf_hdr_len = hc06_ptr - packetbuf_ptr;
784 uncompress_hdr_hc06(uint16_t ip_len)
786 uint8_t tmp, iphc0, iphc1;
788 hc06_ptr = packetbuf_ptr + packetbuf_hdr_len + 2;
790 iphc0 = PACKETBUF_IPHC_BUF[0];
791 iphc1 = PACKETBUF_IPHC_BUF[1];
794 if(iphc1 & SICSLOWPAN_IPHC_CID) {
795 PRINTF(
"IPHC: CID flag set - increase header with one\n");
800 if((iphc0 & SICSLOWPAN_IPHC_FL_C) == 0) {
802 if((iphc0 & SICSLOWPAN_IPHC_TC_C) == 0) {
804 memcpy(&SICSLOWPAN_IP_BUF->tcflow, hc06_ptr + 1, 3);
809 SICSLOWPAN_IP_BUF->vtc = 0x60 | ((tmp >> 2) & 0x0f);
811 SICSLOWPAN_IP_BUF->tcflow = ((tmp >> 2) & 0x30) | (tmp << 6) |
812 (SICSLOWPAN_IP_BUF->tcflow & 0x0f);
815 SICSLOWPAN_IP_BUF->vtc = 0x60;
817 SICSLOWPAN_IP_BUF->tcflow = (*hc06_ptr & 0x0F) |
818 ((*hc06_ptr >> 2) & 0x30);
819 memcpy(&SICSLOWPAN_IP_BUF->flow, hc06_ptr + 1, 2);
825 if((iphc0 & SICSLOWPAN_IPHC_TC_C) == 0) {
827 SICSLOWPAN_IP_BUF->vtc = 0x60 | ((*hc06_ptr >> 2) & 0x0f);
828 SICSLOWPAN_IP_BUF->tcflow = ((*hc06_ptr << 6) & 0xC0) | ((*hc06_ptr >> 2) & 0x30);
829 SICSLOWPAN_IP_BUF->flow = 0;
833 SICSLOWPAN_IP_BUF->vtc = 0x60;
834 SICSLOWPAN_IP_BUF->tcflow = 0;
835 SICSLOWPAN_IP_BUF->flow = 0;
840 if((iphc0 & SICSLOWPAN_IPHC_NH_C) == 0) {
842 SICSLOWPAN_IP_BUF->proto = *hc06_ptr;
843 PRINTF(
"IPHC: next header inline: %d\n", SICSLOWPAN_IP_BUF->proto);
848 if((iphc0 & 0x03) != SICSLOWPAN_IPHC_TTL_I) {
849 SICSLOWPAN_IP_BUF->ttl = ttl_values[iphc0 & 0x03];
851 SICSLOWPAN_IP_BUF->ttl = *hc06_ptr;
856 tmp = ((iphc1 & SICSLOWPAN_IPHC_SAM_11) >> SICSLOWPAN_IPHC_SAM_BIT) & 0x03;
859 if(iphc1 & SICSLOWPAN_IPHC_SAC) {
860 uint8_t sci = (iphc1 & SICSLOWPAN_IPHC_CID) ?
861 PACKETBUF_IPHC_BUF[2] >> 4 : 0;
865 context = addr_context_lookup_by_number(sci);
866 if(context ==
NULL) {
867 PRINTF(
"sicslowpan uncompress_hdr: error context not found\n");
872 uncompress_addr(&SICSLOWPAN_IP_BUF->srcipaddr,
873 tmp != 0 ? context->prefix :
NULL, unc_ctxconf[tmp],
877 uncompress_addr(&SICSLOWPAN_IP_BUF->srcipaddr, llprefix, unc_llconf[tmp],
883 tmp = ((iphc1 & SICSLOWPAN_IPHC_DAM_11) >> SICSLOWPAN_IPHC_DAM_BIT) & 0x03;
886 if(iphc1 & SICSLOWPAN_IPHC_M) {
888 if(iphc1 & SICSLOWPAN_IPHC_DAC) {
896 uint8_t prefix[] = {0xff, 0x02};
897 if(tmp > 0 && tmp < 3) {
898 prefix[1] = *hc06_ptr;
902 uncompress_addr(&SICSLOWPAN_IP_BUF->destipaddr, prefix,
903 unc_mxconf[tmp],
NULL);
908 if(iphc1 & SICSLOWPAN_IPHC_DAC) {
909 uint8_t dci = (iphc1 & SICSLOWPAN_IPHC_CID) ?
910 PACKETBUF_IPHC_BUF[2] & 0x0f : 0;
911 context = addr_context_lookup_by_number(dci);
914 if(context ==
NULL) {
915 PRINTF(
"sicslowpan uncompress_hdr: error context not found\n");
918 uncompress_addr(&SICSLOWPAN_IP_BUF->destipaddr, context->prefix,
920 (
uip_lladdr_t *)packetbuf_addr(PACKETBUF_ADDR_RECEIVER));
923 uncompress_addr(&SICSLOWPAN_IP_BUF->destipaddr, llprefix,
925 (
uip_lladdr_t *)packetbuf_addr(PACKETBUF_ADDR_RECEIVER));
928 uncomp_hdr_len += UIP_IPH_LEN;
931 if((iphc0 & SICSLOWPAN_IPHC_NH_C)) {
933 if((*hc06_ptr & SICSLOWPAN_NHC_UDP_MASK) == SICSLOWPAN_NHC_UDP_ID) {
934 uint8_t checksum_compressed;
935 SICSLOWPAN_IP_BUF->proto = UIP_PROTO_UDP;
936 checksum_compressed = *hc06_ptr & SICSLOWPAN_NHC_UDP_CHECKSUMC;
937 PRINTF(
"IPHC: Incoming header value: %i\n", *hc06_ptr);
938 switch(*hc06_ptr & SICSLOWPAN_NHC_UDP_CS_P_11) {
939 case SICSLOWPAN_NHC_UDP_CS_P_00:
941 memcpy(&SICSLOWPAN_UDP_BUF->srcport, hc06_ptr + 1, 2);
942 memcpy(&SICSLOWPAN_UDP_BUF->destport, hc06_ptr + 3, 2);
943 PRINTF(
"IPHC: Uncompressed UDP ports (ptr+5): %x, %x\n",
948 case SICSLOWPAN_NHC_UDP_CS_P_01:
950 PRINTF(
"IPHC: Decompressing destination\n");
951 memcpy(&SICSLOWPAN_UDP_BUF->srcport, hc06_ptr + 1, 2);
952 SICSLOWPAN_UDP_BUF->destport =
UIP_HTONS(SICSLOWPAN_UDP_8_BIT_PORT_MIN + (*(hc06_ptr + 3)));
953 PRINTF(
"IPHC: Uncompressed UDP ports (ptr+4): %x, %x\n",
958 case SICSLOWPAN_NHC_UDP_CS_P_10:
960 PRINTF(
"IPHC: Decompressing source\n");
961 SICSLOWPAN_UDP_BUF->srcport =
UIP_HTONS(SICSLOWPAN_UDP_8_BIT_PORT_MIN +
963 memcpy(&SICSLOWPAN_UDP_BUF->destport, hc06_ptr + 2, 2);
964 PRINTF(
"IPHC: Uncompressed UDP ports (ptr+4): %x, %x\n",
969 case SICSLOWPAN_NHC_UDP_CS_P_11:
971 SICSLOWPAN_UDP_BUF->srcport =
UIP_HTONS(SICSLOWPAN_UDP_4_BIT_PORT_MIN +
972 (*(hc06_ptr + 1) >> 4));
973 SICSLOWPAN_UDP_BUF->destport =
UIP_HTONS(SICSLOWPAN_UDP_4_BIT_PORT_MIN +
974 ((*(hc06_ptr + 1)) & 0x0F));
975 PRINTF(
"IPHC: Uncompressed UDP ports (ptr+2): %x, %x\n",
981 PRINTF(
"sicslowpan uncompress_hdr: error unsupported UDP compression\n");
984 if(!checksum_compressed) {
985 memcpy(&SICSLOWPAN_UDP_BUF->udpchksum, hc06_ptr, 2);
987 PRINTF(
"IPHC: sicslowpan uncompress_hdr: checksum included\n");
989 PRINTF(
"IPHC: sicslowpan uncompress_hdr: checksum *NOT* included\n");
991 uncomp_hdr_len += UIP_UDPH_LEN;
993 #ifdef SICSLOWPAN_NH_COMPRESSOR
995 hc06_ptr += SICSLOWPAN_NH_COMPRESSOR.uncompress(hc06_ptr,
sicslowpan_buf, &uncomp_hdr_len);
1000 packetbuf_hdr_len = hc06_ptr - packetbuf_ptr;
1004 int len =
packetbuf_datalen() - packetbuf_hdr_len + uncomp_hdr_len - UIP_IPH_LEN;
1006 SICSLOWPAN_IP_BUF->len[0] = len >> 8;
1007 SICSLOWPAN_IP_BUF->len[1] = len & 0x00FF;
1010 SICSLOWPAN_IP_BUF->len[0] = (ip_len - UIP_IPH_LEN) >> 8;
1011 SICSLOWPAN_IP_BUF->len[1] = (ip_len - UIP_IPH_LEN) & 0x00FF;
1015 if(SICSLOWPAN_IP_BUF->proto == UIP_PROTO_UDP) {
1016 memcpy(&SICSLOWPAN_UDP_BUF->udplen, &SICSLOWPAN_IP_BUF->len[0], 2);
1025 #if SICSLOWPAN_COMPRESSION == SICSLOWPAN_COMPRESSION_HC1
1079 compress_hdr_hc1(linkaddr_t *link_destaddr)
1102 *packetbuf_ptr = SICSLOWPAN_DISPATCH_IPV6;
1103 packetbuf_hdr_len += SICSLOWPAN_IPV6_HDR_LEN;
1104 memcpy(packetbuf_ptr + packetbuf_hdr_len,
UIP_IP_BUF, UIP_IPH_LEN);
1105 packetbuf_hdr_len += UIP_IPH_LEN;
1106 uncomp_hdr_len += UIP_IPH_LEN;
1114 PACKETBUF_HC1_PTR[PACKETBUF_HC1_DISPATCH] = SICSLOWPAN_DISPATCH_HC1;
1115 uncomp_hdr_len += UIP_IPH_LEN;
1117 case UIP_PROTO_ICMP6:
1119 PACKETBUF_HC1_PTR[PACKETBUF_HC1_ENCODING] = 0xFC;
1120 PACKETBUF_HC1_PTR[PACKETBUF_HC1_TTL] =
UIP_IP_BUF->ttl;
1121 packetbuf_hdr_len += SICSLOWPAN_HC1_HDR_LEN;
1126 PACKETBUF_HC1_PTR[PACKETBUF_HC1_ENCODING] = 0xFE;
1127 PACKETBUF_HC1_PTR[PACKETBUF_HC1_TTL] =
UIP_IP_BUF->ttl;
1128 packetbuf_hdr_len += SICSLOWPAN_HC1_HDR_LEN;
1138 PRINTF(
"local/remote port %u/%u\n",UIP_UDP_BUF->srcport,UIP_UDP_BUF->destport);
1139 if(
UIP_HTONS(UIP_UDP_BUF->srcport) >= SICSLOWPAN_UDP_PORT_MIN &&
1140 UIP_HTONS(UIP_UDP_BUF->srcport) < SICSLOWPAN_UDP_PORT_MAX &&
1141 UIP_HTONS(UIP_UDP_BUF->destport) >= SICSLOWPAN_UDP_PORT_MIN &&
1142 UIP_HTONS(UIP_UDP_BUF->destport) < SICSLOWPAN_UDP_PORT_MAX) {
1144 PACKETBUF_HC1_HC_UDP_PTR[PACKETBUF_HC1_HC_UDP_HC1_ENCODING] = 0xFB;
1147 PACKETBUF_HC1_HC_UDP_PTR[PACKETBUF_HC1_HC_UDP_UDP_ENCODING] = 0xE0;
1148 PACKETBUF_HC1_HC_UDP_PTR[PACKETBUF_HC1_HC_UDP_TTL] =
UIP_IP_BUF->ttl;
1150 PACKETBUF_HC1_HC_UDP_PTR[PACKETBUF_HC1_HC_UDP_PORTS] =
1151 (uint8_t)((
UIP_HTONS(UIP_UDP_BUF->srcport) -
1152 SICSLOWPAN_UDP_PORT_MIN) << 4) +
1153 (uint8_t)((
UIP_HTONS(UIP_UDP_BUF->destport) - SICSLOWPAN_UDP_PORT_MIN));
1154 memcpy(&PACKETBUF_HC1_HC_UDP_PTR[PACKETBUF_HC1_HC_UDP_CHKSUM], &UIP_UDP_BUF->udpchksum, 2);
1155 packetbuf_hdr_len += SICSLOWPAN_HC1_HC_UDP_HDR_LEN;
1156 uncomp_hdr_len += UIP_UDPH_LEN;
1159 PACKETBUF_HC1_PTR[PACKETBUF_HC1_ENCODING] = 0xFA;
1160 PACKETBUF_HC1_PTR[PACKETBUF_HC1_TTL] =
UIP_IP_BUF->ttl;
1161 packetbuf_hdr_len += SICSLOWPAN_HC1_HDR_LEN;
1187 uncompress_hdr_hc1(uint16_t ip_len)
1190 SICSLOWPAN_IP_BUF->vtc = 0x60;
1191 SICSLOWPAN_IP_BUF->tcflow = 0;
1192 SICSLOWPAN_IP_BUF->flow = 0;
1195 uip_ip6addr(&SICSLOWPAN_IP_BUF->srcipaddr, 0xfe80, 0, 0, 0, 0, 0, 0, 0);
1197 (
uip_lladdr_t *)packetbuf_addr(PACKETBUF_ADDR_SENDER));
1198 uip_ip6addr(&SICSLOWPAN_IP_BUF->destipaddr, 0xfe80, 0, 0, 0, 0, 0, 0, 0);
1200 (
uip_lladdr_t *)packetbuf_addr(PACKETBUF_ADDR_RECEIVER));
1202 uncomp_hdr_len += UIP_IPH_LEN;
1205 switch(PACKETBUF_HC1_PTR[PACKETBUF_HC1_ENCODING] & 0x06) {
1206 case SICSLOWPAN_HC1_NH_ICMP6:
1207 SICSLOWPAN_IP_BUF->proto = UIP_PROTO_ICMP6;
1208 SICSLOWPAN_IP_BUF->ttl = PACKETBUF_HC1_PTR[PACKETBUF_HC1_TTL];
1209 packetbuf_hdr_len += SICSLOWPAN_HC1_HDR_LEN;
1212 case SICSLOWPAN_HC1_NH_TCP:
1213 SICSLOWPAN_IP_BUF->proto = UIP_PROTO_TCP;
1214 SICSLOWPAN_IP_BUF->ttl = PACKETBUF_HC1_PTR[PACKETBUF_HC1_TTL];
1215 packetbuf_hdr_len += SICSLOWPAN_HC1_HDR_LEN;
1219 case SICSLOWPAN_HC1_NH_UDP:
1220 SICSLOWPAN_IP_BUF->proto = UIP_PROTO_UDP;
1221 if(PACKETBUF_HC1_HC_UDP_PTR[PACKETBUF_HC1_HC_UDP_HC1_ENCODING] & 0x01) {
1223 if(PACKETBUF_HC1_HC_UDP_PTR[PACKETBUF_HC1_HC_UDP_UDP_ENCODING] !=
1224 SICSLOWPAN_HC_UDP_ALL_C) {
1225 PRINTF(
"sicslowpan (uncompress_hdr), packet not supported");
1229 SICSLOWPAN_IP_BUF->ttl = PACKETBUF_HC1_HC_UDP_PTR[PACKETBUF_HC1_HC_UDP_TTL];
1231 SICSLOWPAN_UDP_BUF->srcport =
1233 (PACKETBUF_HC1_HC_UDP_PTR[PACKETBUF_HC1_HC_UDP_PORTS] >> 4));
1234 SICSLOWPAN_UDP_BUF->destport =
1236 (PACKETBUF_HC1_HC_UDP_PTR[PACKETBUF_HC1_HC_UDP_PORTS] & 0x0F));
1237 memcpy(&SICSLOWPAN_UDP_BUF->udpchksum, &PACKETBUF_HC1_HC_UDP_PTR[PACKETBUF_HC1_HC_UDP_CHKSUM], 2);
1238 uncomp_hdr_len += UIP_UDPH_LEN;
1239 packetbuf_hdr_len += SICSLOWPAN_HC1_HC_UDP_HDR_LEN;
1241 packetbuf_hdr_len += SICSLOWPAN_HC1_HDR_LEN;
1252 int len =
packetbuf_datalen() - packetbuf_hdr_len + uncomp_hdr_len - UIP_IPH_LEN;
1254 SICSLOWPAN_IP_BUF->len[0] = len >> 8;
1255 SICSLOWPAN_IP_BUF->len[1] = len & 0x00FF;
1258 SICSLOWPAN_IP_BUF->len[0] = (ip_len - UIP_IPH_LEN) >> 8;
1259 SICSLOWPAN_IP_BUF->len[1] = (ip_len - UIP_IPH_LEN) & 0x00FF;
1262 if(SICSLOWPAN_IP_BUF->proto == UIP_PROTO_UDP) {
1263 memcpy(&SICSLOWPAN_UDP_BUF->udplen, &SICSLOWPAN_IP_BUF->len[0], 2);
1289 compress_hdr_ipv6(linkaddr_t *link_destaddr)
1291 *packetbuf_ptr = SICSLOWPAN_DISPATCH_IPV6;
1292 packetbuf_hdr_len += SICSLOWPAN_IPV6_HDR_LEN;
1293 memcpy(packetbuf_ptr + packetbuf_hdr_len,
UIP_IP_BUF, UIP_IPH_LEN);
1294 packetbuf_hdr_len += UIP_IPH_LEN;
1295 uncomp_hdr_len += UIP_IPH_LEN;
1308 packet_sent(
void *ptr,
int status,
int transmissions)
1312 if(callback !=
NULL) {
1313 callback->output_callback(status);
1315 last_tx_status = status;
1324 send_packet(linkaddr_t *dest)
1330 packetbuf_set_addr(PACKETBUF_ADDR_RECEIVER, dest);
1332 #if NETSTACK_CONF_BRIDGE_MODE
1334 packetbuf_set_addr(PACKETBUF_ADDR_SENDER,(
void*)&
uip_lladdr);
1338 #if SICSLOWPAN_CONF_ACK_ALL
1339 packetbuf_set_attr(PACKETBUF_ATTR_RELIABLE, 1);
1344 NETSTACK_MAC.send(&packet_sent,
NULL);
1369 uint16_t processed_ip_out_len;
1373 packetbuf_hdr_len = 0;
1379 packetbuf_set_attr(PACKETBUF_ATTR_MAX_MAC_TRANSMISSIONS,
1380 SICSLOWPAN_MAX_MAC_TRANSMISSIONS);
1388 #define TCP_FIN 0x01
1389 #define TCP_ACK 0x10
1390 #define TCP_CTL 0x3f
1393 (UIP_TCP_BUF->flags & TCP_FIN) == 0 &&
1394 (UIP_TCP_BUF->flags & TCP_CTL) != TCP_ACK) {
1395 packetbuf_set_attr(PACKETBUF_ATTR_PACKET_TYPE,
1396 PACKETBUF_ATTR_PACKET_TYPE_STREAM);
1397 }
else if(
UIP_IP_BUF->proto == UIP_PROTO_TCP &&
1398 (UIP_TCP_BUF->flags & TCP_FIN) == TCP_FIN) {
1399 packetbuf_set_attr(PACKETBUF_ATTR_PACKET_TYPE,
1400 PACKETBUF_ATTR_PACKET_TYPE_STREAM_END);
1408 if(localdest ==
NULL) {
1414 PRINTFO(
"sicslowpan output: sending packet len %d\n",
uip_len);
1418 #if SICSLOWPAN_COMPRESSION == SICSLOWPAN_COMPRESSION_HC1
1419 compress_hdr_hc1(&dest);
1421 #if SICSLOWPAN_COMPRESSION == SICSLOWPAN_COMPRESSION_IPV6
1422 compress_hdr_ipv6(&dest);
1424 #if SICSLOWPAN_COMPRESSION == SICSLOWPAN_COMPRESSION_HC06
1425 compress_hdr_hc06(&dest);
1428 compress_hdr_ipv6(&dest);
1430 PRINTFO(
"sicslowpan output: header of len %d\n", packetbuf_hdr_len);
1435 #define USE_FRAMER_HDRLEN 1
1436 #if USE_FRAMER_HDRLEN
1438 packetbuf_set_addr(PACKETBUF_ADDR_RECEIVER, &dest);
1439 framer_hdrlen = NETSTACK_FRAMER.create();
1440 if(framer_hdrlen < 0) {
1448 packetbuf_set_attr(PACKETBUF_ATTR_MAX_MAC_TRANSMISSIONS,
1449 SICSLOWPAN_MAX_MAC_TRANSMISSIONS);
1455 #if SICSLOWPAN_CONF_FRAG
1465 PRINTFO(
"Fragmentation sending packet len %d\n",
uip_len);
1468 PRINTFO(
"sicslowpan output: 1rst fragment ");
1471 memmove(packetbuf_ptr + SICSLOWPAN_FRAG1_HDR_LEN, packetbuf_ptr, packetbuf_hdr_len);
1479 SET16(PACKETBUF_FRAG_PTR, PACKETBUF_FRAG_DISPATCH_SIZE,
1480 ((SICSLOWPAN_DISPATCH_FRAG1 << 8) |
uip_len));
1482 SET16(PACKETBUF_FRAG_PTR, PACKETBUF_FRAG_TAG, my_tag);
1486 packetbuf_hdr_len += SICSLOWPAN_FRAG1_HDR_LEN;
1487 packetbuf_payload_len = (
MAC_MAX_PAYLOAD - framer_hdrlen - packetbuf_hdr_len) & 0xfffffff8;
1488 PRINTFO(
"(len %d, tag %d)\n", packetbuf_payload_len, my_tag);
1489 memcpy(packetbuf_ptr + packetbuf_hdr_len,
1490 (uint8_t *)
UIP_IP_BUF + uncomp_hdr_len, packetbuf_payload_len);
1492 q = queuebuf_new_from_packetbuf();
1494 PRINTFO(
"could not allocate queuebuf for first fragment, dropping packet\n");
1498 queuebuf_to_packetbuf(q);
1505 (last_tx_status == MAC_TX_ERR_FATAL)) {
1506 PRINTFO(
"error in fragment tx, dropping subsequent fragments.\n");
1511 processed_ip_out_len = packetbuf_payload_len + uncomp_hdr_len;
1518 packetbuf_hdr_len = SICSLOWPAN_FRAGN_HDR_LEN;
1521 SET16(PACKETBUF_FRAG_PTR, PACKETBUF_FRAG_DISPATCH_SIZE,
1522 ((SICSLOWPAN_DISPATCH_FRAGN << 8) |
uip_len));
1523 packetbuf_payload_len = (
MAC_MAX_PAYLOAD - framer_hdrlen - packetbuf_hdr_len) & 0xfffffff8;
1524 while(processed_ip_out_len <
uip_len) {
1525 PRINTFO(
"sicslowpan output: fragment ");
1526 PACKETBUF_FRAG_PTR[PACKETBUF_FRAG_OFFSET] = processed_ip_out_len >> 3;
1529 if(
uip_len - processed_ip_out_len < packetbuf_payload_len) {
1531 packetbuf_payload_len =
uip_len - processed_ip_out_len;
1533 PRINTFO(
"(offset %d, len %d, tag %d)\n",
1534 processed_ip_out_len >> 3, packetbuf_payload_len, my_tag);
1535 memcpy(packetbuf_ptr + packetbuf_hdr_len,
1536 (uint8_t *)
UIP_IP_BUF + processed_ip_out_len, packetbuf_payload_len);
1538 q = queuebuf_new_from_packetbuf();
1540 PRINTFO(
"could not allocate queuebuf, dropping fragment\n");
1544 queuebuf_to_packetbuf(q);
1547 processed_ip_out_len += packetbuf_payload_len;
1552 (last_tx_status == MAC_TX_ERR_FATAL)) {
1553 PRINTFO(
"error in fragment tx, dropping subsequent fragments.\n");
1558 PRINTFO(
"sicslowpan output: Packet too large to be sent without fragmentation support; dropping packet\n");
1567 memcpy(packetbuf_ptr + packetbuf_hdr_len, (uint8_t *)
UIP_IP_BUF + uncomp_hdr_len,
1592 uint16_t frag_size = 0;
1594 uint8_t frag_offset = 0;
1595 uint8_t is_fragment = 0;
1596 #if SICSLOWPAN_CONF_FRAG
1598 uint16_t frag_tag = 0;
1599 uint8_t first_fragment = 0, last_fragment = 0;
1602 PRINTFI(
"***Lowpan input\n");
1606 packetbuf_hdr_len = 0;
1613 last_rssi = (
signed short)packetbuf_attr(PACKETBUF_ATTR_RSSI);
1614 #if SICSLOWPAN_CONF_FRAG
1618 processed_ip_in_len = 0;
1624 switch((GET16(PACKETBUF_FRAG_PTR, PACKETBUF_FRAG_DISPATCH_SIZE) & 0xf800) >> 8) {
1625 case SICSLOWPAN_DISPATCH_FRAG1:
1629 frag_size = GET16(PACKETBUF_FRAG_PTR, PACKETBUF_FRAG_DISPATCH_SIZE) & 0x07ff;
1631 frag_tag = GET16(PACKETBUF_FRAG_PTR, PACKETBUF_FRAG_TAG);
1634 packetbuf_hdr_len += SICSLOWPAN_FRAG1_HDR_LEN;
1639 case SICSLOWPAN_DISPATCH_FRAGN:
1644 PRINTFI(
"sicslowpan input: FRAGN ");
1645 frag_offset = PACKETBUF_FRAG_PTR[PACKETBUF_FRAG_OFFSET];
1646 frag_tag = GET16(PACKETBUF_FRAG_PTR, PACKETBUF_FRAG_TAG);
1647 frag_size = GET16(PACKETBUF_FRAG_PTR, PACKETBUF_FRAG_DISPATCH_SIZE) & 0x07ff;
1650 packetbuf_hdr_len += SICSLOWPAN_FRAGN_HDR_LEN;
1654 PRINTFI(
"last_fragment?: processed_ip_in_len %d packetbuf_payload_len %d frag_size %d\n",
1657 if(processed_ip_in_len +
packetbuf_datalen() - packetbuf_hdr_len >= frag_size) {
1663 PRINTFI(
"***OTHER: %x\n", ((GET16(PACKETBUF_FRAG_PTR, PACKETBUF_FRAG_DISPATCH_SIZE) & 0xf800) >> 8));
1675 #define PRIORITIZE_NEW_PACKETS 1
1676 #if PRIORITIZE_NEW_PACKETS
1681 processed_ip_in_len = 0;
1682 }
else if(processed_ip_in_len > 0 && first_fragment
1683 && !
linkaddr_cmp(&frag_sender, packetbuf_addr(PACKETBUF_ADDR_SENDER))) {
1685 processed_ip_in_len = 0;
1689 if(processed_ip_in_len > 0) {
1692 if((frag_size > 0 &&
1693 (frag_size != sicslowpan_len ||
1694 reass_tag != frag_tag ||
1695 !
linkaddr_cmp(&frag_sender, packetbuf_addr(PACKETBUF_ADDR_SENDER)))) ||
1701 PRINTFI(
"sicslowpan input: Dropping 6lowpan packet that is not a fragment of the packet currently being reassembled\n");
1709 if((frag_size > 0) && (frag_size <=
UIP_BUFSIZE)) {
1712 if(is_fragment && !first_fragment) {
1716 sicslowpan_len = frag_size;
1717 reass_tag = frag_tag;
1719 PRINTFI(
"sicslowpan input: INIT FRAGMENTATION (len %d, tag %d)\n",
1720 sicslowpan_len, reass_tag);
1721 linkaddr_copy(&frag_sender, packetbuf_addr(PACKETBUF_ADDR_SENDER));
1725 if(packetbuf_hdr_len == SICSLOWPAN_FRAGN_HDR_LEN) {
1732 #if SICSLOWPAN_COMPRESSION == SICSLOWPAN_COMPRESSION_HC06
1733 if((PACKETBUF_HC1_PTR[PACKETBUF_HC1_DISPATCH] & 0xe0) == SICSLOWPAN_DISPATCH_IPHC) {
1734 PRINTFI(
"sicslowpan input: IPHC\n");
1735 uncompress_hdr_hc06(frag_size);
1738 switch(PACKETBUF_HC1_PTR[PACKETBUF_HC1_DISPATCH]) {
1739 #if SICSLOWPAN_COMPRESSION == SICSLOWPAN_COMPRESSION_HC1
1740 case SICSLOWPAN_DISPATCH_HC1:
1741 PRINTFI(
"sicslowpan input: HC1\n");
1742 uncompress_hdr_hc1(frag_size);
1745 case SICSLOWPAN_DISPATCH_IPV6:
1746 PRINTFI(
"sicslowpan input: IPV6\n");
1747 packetbuf_hdr_len += SICSLOWPAN_IPV6_HDR_LEN;
1750 memcpy(SICSLOWPAN_IP_BUF, packetbuf_ptr + packetbuf_hdr_len, UIP_IPH_LEN);
1753 packetbuf_hdr_len += UIP_IPH_LEN;
1754 uncomp_hdr_len += UIP_IPH_LEN;
1758 PRINTFI(
"sicslowpan input: unknown dispatch: %u\n",
1759 PACKETBUF_HC1_PTR[PACKETBUF_HC1_DISPATCH]);
1764 #if SICSLOWPAN_CONF_FRAG
1775 PRINTF(
"SICSLOWPAN: packet dropped due to header > total packet\n");
1782 int req_size =
UIP_LLH_LEN + uncomp_hdr_len + (uint16_t)(frag_offset << 3)
1783 + packetbuf_payload_len;
1786 "SICSLOWPAN: packet dropped, minimum required SICSLOWPAN_IP_BUF size: %d+%d+%d+%d=%d (current size: %d)\n",
1787 UIP_LLH_LEN, uncomp_hdr_len, (uint16_t)(frag_offset << 3),
1793 memcpy((uint8_t *)SICSLOWPAN_IP_BUF + uncomp_hdr_len + (uint16_t)(frag_offset << 3), packetbuf_ptr + packetbuf_hdr_len, packetbuf_payload_len);
1797 #if SICSLOWPAN_CONF_FRAG
1800 if(first_fragment != 0) {
1801 processed_ip_in_len += uncomp_hdr_len;
1805 if(last_fragment != 0) {
1806 processed_ip_in_len = frag_size;
1808 processed_ip_in_len += packetbuf_payload_len;
1810 PRINTF(
"processed_ip_in_len %d, packetbuf_payload_len %d\n", processed_ip_in_len, packetbuf_payload_len);
1814 sicslowpan_len = packetbuf_payload_len + uncomp_hdr_len;
1815 #if SICSLOWPAN_CONF_FRAG
1822 PRINTF(
"sicslowpan_init processed_ip_in_len %d, sicslowpan_len %d\n",
1823 processed_ip_in_len, sicslowpan_len);
1824 if(processed_ip_in_len == 0 || (processed_ip_in_len == sicslowpan_len)) {
1825 PRINTFI(
"sicslowpan input: IP packet ready (length %d)\n",
1827 memcpy((uint8_t *)
UIP_IP_BUF, (uint8_t *)SICSLOWPAN_IP_BUF, sicslowpan_len);
1830 processed_ip_in_len = 0;
1836 PRINTF(
"after decompression %u:", SICSLOWPAN_IP_BUF->len[1]);
1837 for (ndx = 0; ndx < SICSLOWPAN_IP_BUF->len[1] + 40; ndx++) {
1838 uint8_t data = ((uint8_t *) (SICSLOWPAN_IP_BUF))[ndx];
1839 PRINTF(
"%02x", data);
1848 callback->input_callback();
1852 #if SICSLOWPAN_CONF_FRAG
1862 sicslowpan_init(
void)
1868 tcpip_set_outputfunc(output);
1870 #if SICSLOWPAN_COMPRESSION == SICSLOWPAN_COMPRESSION_HC06
1876 #if SICSLOWPAN_CONF_MAX_ADDR_CONTEXTS > 0
1877 addr_contexts[0].used = 1;
1878 addr_contexts[0].number = 0;
1879 #ifdef SICSLOWPAN_CONF_ADDR_CONTEXT_0
1880 SICSLOWPAN_CONF_ADDR_CONTEXT_0;
1882 addr_contexts[0].prefix[0] = 0xaa;
1883 addr_contexts[0].prefix[1] = 0xaa;
1887 #if SICSLOWPAN_CONF_MAX_ADDR_CONTEXTS > 1
1891 #ifdef SICSLOWPAN_CONF_ADDR_CONTEXT_1
1893 addr_contexts[1].used = 1;
1894 addr_contexts[1].number = 1;
1895 SICSLOWPAN_CONF_ADDR_CONTEXT_1;
1896 #ifdef SICSLOWPAN_CONF_ADDR_CONTEXT_2
1898 addr_contexts[2].used = 1;
1899 addr_contexts[2].number = 2;
1900 SICSLOWPAN_CONF_ADDR_CONTEXT_2;
1903 addr_contexts[i].used = 0;
1906 addr_contexts[i].used = 0;
1917 sicslowpan_get_last_rssi(
void)