64 #include "dev/watchdog.h"
76 #define DEBUG DEBUG_NONE
82 #define PRINTFI(...) PRINTF(__VA_ARGS__)
83 #define PRINTFO(...) PRINTF(__VA_ARGS__)
84 #define PRINTPACKETBUF() PRINTF("packetbuf buffer: "); for(p = 0; p < packetbuf_datalen(); p++){PRINTF("%.2X", *(packetbuf_ptr + p));} PRINTF("\n")
85 #define PRINTUIPBUF() PRINTF("UIP buffer: "); for(p = 0; p < uip_len; p++){PRINTF("%.2X", uip_buf[p]);}PRINTF("\n")
86 #define PRINTSICSLOWPANBUF() PRINTF("SICSLOWPAN buffer: "); for(p = 0; p < sicslowpan_len; p++){PRINTF("%.2X", sicslowpan_buf[p]);}PRINTF("\n")
90 #define PRINTPACKETBUF()
92 #define PRINTSICSLOWPANBUF()
98 #define UIP_LOG(m) uip_log(m)
103 #ifdef SICSLOWPAN_CONF_MAX_MAC_TRANSMISSIONS
104 #define SICSLOWPAN_MAX_MAC_TRANSMISSIONS SICSLOWPAN_CONF_MAX_MAC_TRANSMISSIONS
106 #define SICSLOWPAN_MAX_MAC_TRANSMISSIONS 4
109 #ifndef SICSLOWPAN_COMPRESSION
110 #ifdef SICSLOWPAN_CONF_COMPRESSION
111 #define SICSLOWPAN_COMPRESSION SICSLOWPAN_CONF_COMPRESSION
113 #define SICSLOWPAN_COMPRESSION SICSLOWPAN_COMPRESSION_IPV6
117 #define GET16(ptr,index) (((uint16_t)((ptr)[index] << 8)) | ((ptr)[(index) + 1]))
118 #define SET16(ptr,index,value) do { \
119 (ptr)[index] = ((value) >> 8) & 0xff; \
120 (ptr)[index + 1] = (value) & 0xff; \
126 #define PACKETBUF_FRAG_PTR (packetbuf_ptr)
127 #define PACKETBUF_FRAG_DISPATCH_SIZE 0
128 #define PACKETBUF_FRAG_TAG 2
129 #define PACKETBUF_FRAG_OFFSET 4
132 #define PACKETBUF_IPHC_BUF ((uint8_t *)(packetbuf_ptr + packetbuf_hdr_len))
134 #define PACKETBUF_HC1_PTR (packetbuf_ptr + packetbuf_hdr_len)
135 #define PACKETBUF_HC1_DISPATCH 0
136 #define PACKETBUF_HC1_ENCODING 1
137 #define PACKETBUF_HC1_TTL 2
139 #define PACKETBUF_HC1_HC_UDP_PTR (packetbuf_ptr + packetbuf_hdr_len)
140 #define PACKETBUF_HC1_HC_UDP_DISPATCH 0
141 #define PACKETBUF_HC1_HC_UDP_HC1_ENCODING 1
142 #define PACKETBUF_HC1_HC_UDP_UDP_ENCODING 2
143 #define PACKETBUF_HC1_HC_UDP_TTL 3
144 #define PACKETBUF_HC1_HC_UDP_PORTS 4
145 #define PACKETBUF_HC1_HC_UDP_CHKSUM 5
150 #define SICSLOWPAN_IP_BUF ((struct uip_ip_hdr *)&sicslowpan_buf[UIP_LLH_LEN])
151 #define SICSLOWPAN_UDP_BUF ((struct uip_udp_hdr *)&sicslowpan_buf[UIP_LLIPH_LEN])
153 #define UIP_IP_BUF ((struct uip_ip_hdr *)&uip_buf[UIP_LLH_LEN])
154 #define UIP_UDP_BUF ((struct uip_udp_hdr *)&uip_buf[UIP_LLIPH_LEN])
155 #define UIP_TCP_BUF ((struct uip_tcp_hdr *)&uip_buf[UIP_LLIPH_LEN])
156 #define UIP_ICMP_BUF ((struct uip_icmp_hdr *)&uip_buf[UIP_LLIPH_LEN])
163 #ifdef SICSLOWPAN_CONF_MAC_MAX_PAYLOAD
164 #define MAC_MAX_PAYLOAD SICSLOWPAN_CONF_MAC_MAX_PAYLOAD
166 #define MAC_MAX_PAYLOAD (127 - 2)
173 #ifdef SICSLOWPAN_CONF_COMPRESSION_THRESHOLD
174 #define COMPRESSION_THRESHOLD SICSLOWPAN_CONF_COMPRESSION_THRESHOLD
176 #define COMPRESSION_THRESHOLD 0
182 #ifdef SICSLOWPAN_NH_COMPRESSOR
192 static uint8_t *packetbuf_ptr;
199 static uint8_t packetbuf_hdr_len;
207 static int packetbuf_payload_len;
213 static uint8_t uncomp_hdr_len;
218 static int last_tx_status;
221 #if SICSLOWPAN_CONF_FRAG
226 static uint16_t sicslowpan_len;
234 #define sicslowpan_buf (sicslowpan_aligned_buf.u8)
242 static uint16_t processed_ip_in_len;
245 static uint16_t my_tag;
248 static uint16_t reass_tag;
251 linkaddr_t frag_sender;
254 static struct timer reass_timer;
260 #define sicslowpan_buf uip_buf
261 #define sicslowpan_len uip_len
264 static int last_rssi;
269 static struct rime_sniffer *callback =
NULL;
272 rime_sniffer_add(
struct rime_sniffer *s)
278 rime_sniffer_remove(
struct rime_sniffer *s)
288 packetbuf_set_attr(PACKETBUF_ATTR_NETWORK_ID,
UIP_IP_BUF->proto);
292 c = UIP_UDP_BUF->srcport;
293 if(UIP_UDP_BUF->destport < c) {
294 c = UIP_UDP_BUF->destport;
296 }
else if(
UIP_IP_BUF->proto == UIP_PROTO_TCP) {
297 c = UIP_TCP_BUF->srcport;
298 if(UIP_TCP_BUF->destport < c) {
299 c = UIP_TCP_BUF->destport;
301 }
else if(
UIP_IP_BUF->proto == UIP_PROTO_ICMP6) {
305 packetbuf_set_attr(PACKETBUF_ATTR_CHANNEL, c);
315 #if SICSLOWPAN_COMPRESSION == SICSLOWPAN_COMPRESSION_HC06
321 #if SICSLOWPAN_CONF_MAX_ADDR_CONTEXTS > 0
330 static uint8_t *hc06_ptr;
339 const uint8_t unc_llconf[] = {0x0f,0x28,0x22,0x20};
346 const uint8_t unc_ctxconf[] = {0x00,0x88,0x82,0x80};
353 const uint8_t unc_mxconf[] = {0x0f, 0x25, 0x23, 0x21};
356 const uint8_t llprefix[] = {0xfe, 0x80};
359 static const uint8_t ttl_values[] = {0, 1, 64, 255};
367 addr_context_lookup_by_prefix(uip_ipaddr_t *ipaddr)
370 #if SICSLOWPAN_CONF_MAX_ADDR_CONTEXTS > 0
373 if((addr_contexts[i].used == 1) &&
374 uip_ipaddr_prefixcmp(&addr_contexts[i].prefix, ipaddr, 64)) {
375 return &addr_contexts[i];
384 addr_context_lookup_by_number(uint8_t number)
387 #if SICSLOWPAN_CONF_MAX_ADDR_CONTEXTS > 0
390 if((addr_contexts[i].used == 1) &&
391 addr_contexts[i].number == number) {
392 return &addr_contexts[i];
400 compress_addr_64(uint8_t bitpos, uip_ipaddr_t *ipaddr,
uip_lladdr_t *lladdr)
406 memcpy(hc06_ptr, &ipaddr->u16[7], 2);
411 memcpy(hc06_ptr, &ipaddr->u16[4], 8);
425 uncompress_addr(uip_ipaddr_t *ipaddr, uint8_t
const prefix[],
428 uint8_t prefcount = pref_post_count >> 4;
429 uint8_t postcount = pref_post_count & 0x0f;
431 prefcount = prefcount == 15 ? 16 : prefcount;
432 postcount = postcount == 15 ? 16 : postcount;
434 PRINTF(
"Uncompressing %d + %d => ", prefcount, postcount);
437 memcpy(ipaddr, prefix, prefcount);
439 if(prefcount + postcount < 16) {
440 memset(&ipaddr->u8[prefcount], 0, 16 - (prefcount + postcount));
443 memcpy(&ipaddr->u8[16 - postcount], hc06_ptr, postcount);
444 if(postcount == 2 && prefcount < 11) {
446 ipaddr->u8[11] = 0xff;
447 ipaddr->u8[12] = 0xfe;
449 hc06_ptr += postcount;
450 }
else if (prefcount > 0) {
495 compress_hdr_hc06(linkaddr_t *link_destaddr)
497 uint8_t tmp, iphc0, iphc1;
500 PRINTF(
"before compression (%d): ",
UIP_IP_BUF->len[1]);
501 for(ndx = 0; ndx <
UIP_IP_BUF->len[1] + 40; ndx++) {
502 uint8_t data = ((uint8_t *) (
UIP_IP_BUF))[ndx];
503 PRINTF(
"%02x", data);
509 hc06_ptr = packetbuf_ptr + 2;
517 iphc0 = SICSLOWPAN_DISPATCH_IPHC;
519 PACKETBUF_IPHC_BUF[2] = 0;
531 if(addr_context_lookup_by_prefix(&
UIP_IP_BUF->destipaddr) !=
NULL ||
534 PRINTF(
"IPHC: compressing dest or src ipaddr - setting CID\n");
535 iphc1 |= SICSLOWPAN_IPHC_CID;
548 tmp = ((tmp & 0x03) << 6) | (tmp >> 2);
553 iphc0 |= SICSLOWPAN_IPHC_FL_C;
557 iphc0 |= SICSLOWPAN_IPHC_TC_C;
568 iphc0 |= SICSLOWPAN_IPHC_TC_C;
569 *hc06_ptr = (tmp & 0xc0) |
585 #if UIP_CONF_UDP || UIP_CONF_ROUTER
587 iphc0 |= SICSLOWPAN_IPHC_NH_C;
590 #ifdef SICSLOWPAN_NH_COMPRESSOR
591 if(SICSLOWPAN_NH_COMPRESSOR.is_compressable(
UIP_IP_BUF->proto)) {
592 iphc0 |= SICSLOWPAN_IPHC_NH_C;
595 if ((iphc0 & SICSLOWPAN_IPHC_NH_C) == 0) {
609 iphc0 |= SICSLOWPAN_IPHC_TTL_1;
612 iphc0 |= SICSLOWPAN_IPHC_TTL_64;
615 iphc0 |= SICSLOWPAN_IPHC_TTL_255;
625 PRINTF(
"IPHC: compressing unspecified - setting SAC\n");
626 iphc1 |= SICSLOWPAN_IPHC_SAC;
627 iphc1 |= SICSLOWPAN_IPHC_SAM_00;
628 }
else if((context = addr_context_lookup_by_prefix(&
UIP_IP_BUF->srcipaddr))
631 PRINTF(
"IPHC: compressing src with context - setting CID & SAC ctx: %d\n",
633 iphc1 |= SICSLOWPAN_IPHC_CID | SICSLOWPAN_IPHC_SAC;
634 PACKETBUF_IPHC_BUF[2] |= context->number << 4;
637 iphc1 |= compress_addr_64(SICSLOWPAN_IPHC_SAM_BIT,
644 iphc1 |= compress_addr_64(SICSLOWPAN_IPHC_SAM_BIT,
648 iphc1 |= SICSLOWPAN_IPHC_SAM_00;
649 memcpy(hc06_ptr, &
UIP_IP_BUF->srcipaddr.u16[0], 16);
656 iphc1 |= SICSLOWPAN_IPHC_M;
657 if(sicslowpan_is_mcast_addr_compressable8(&
UIP_IP_BUF->destipaddr)) {
658 iphc1 |= SICSLOWPAN_IPHC_DAM_11;
662 }
else if(sicslowpan_is_mcast_addr_compressable32(&
UIP_IP_BUF->destipaddr)) {
663 iphc1 |= SICSLOWPAN_IPHC_DAM_10;
666 memcpy(hc06_ptr + 1, &
UIP_IP_BUF->destipaddr.u8[13], 3);
668 }
else if(sicslowpan_is_mcast_addr_compressable48(&
UIP_IP_BUF->destipaddr)) {
669 iphc1 |= SICSLOWPAN_IPHC_DAM_01;
672 memcpy(hc06_ptr + 1, &
UIP_IP_BUF->destipaddr.u8[11], 5);
675 iphc1 |= SICSLOWPAN_IPHC_DAM_00;
677 memcpy(hc06_ptr, &
UIP_IP_BUF->destipaddr.u8[0], 16);
682 if((context = addr_context_lookup_by_prefix(&
UIP_IP_BUF->destipaddr)) !=
NULL) {
684 iphc1 |= SICSLOWPAN_IPHC_DAC;
685 PACKETBUF_IPHC_BUF[2] |= context->number;
688 iphc1 |= compress_addr_64(SICSLOWPAN_IPHC_DAM_BIT,
695 iphc1 |= compress_addr_64(SICSLOWPAN_IPHC_DAM_BIT,
699 iphc1 |= SICSLOWPAN_IPHC_DAM_00;
700 memcpy(hc06_ptr, &
UIP_IP_BUF->destipaddr.u16[0], 16);
705 uncomp_hdr_len = UIP_IPH_LEN;
707 #if UIP_CONF_UDP || UIP_CONF_ROUTER
710 PRINTF(
"IPHC: Uncompressed UDP ports on send side: %x, %x\n",
713 if(((
UIP_HTONS(UIP_UDP_BUF->srcport) & 0xfff0) == SICSLOWPAN_UDP_4_BIT_PORT_MIN) &&
714 ((
UIP_HTONS(UIP_UDP_BUF->destport) & 0xfff0) == SICSLOWPAN_UDP_4_BIT_PORT_MIN)) {
716 *hc06_ptr = SICSLOWPAN_NHC_UDP_CS_P_11;
717 PRINTF(
"IPHC: remove 12 b of both source & dest with prefix 0xFOB\n");
719 (uint8_t)((
UIP_HTONS(UIP_UDP_BUF->srcport) -
720 SICSLOWPAN_UDP_4_BIT_PORT_MIN) << 4) +
721 (uint8_t)((
UIP_HTONS(UIP_UDP_BUF->destport) -
722 SICSLOWPAN_UDP_4_BIT_PORT_MIN));
724 }
else if((
UIP_HTONS(UIP_UDP_BUF->destport) & 0xff00) == SICSLOWPAN_UDP_8_BIT_PORT_MIN) {
726 *hc06_ptr = SICSLOWPAN_NHC_UDP_CS_P_01;
727 PRINTF(
"IPHC: leave source, remove 8 bits of dest with prefix 0xF0\n");
728 memcpy(hc06_ptr + 1, &UIP_UDP_BUF->srcport, 2);
730 (uint8_t)((
UIP_HTONS(UIP_UDP_BUF->destport) -
731 SICSLOWPAN_UDP_8_BIT_PORT_MIN));
733 }
else if((
UIP_HTONS(UIP_UDP_BUF->srcport) & 0xff00) == SICSLOWPAN_UDP_8_BIT_PORT_MIN) {
735 *hc06_ptr = SICSLOWPAN_NHC_UDP_CS_P_10;
736 PRINTF(
"IPHC: remove 8 bits of source with prefix 0xF0, leave dest. hch: %i\n", *hc06_ptr);
738 (uint8_t)((
UIP_HTONS(UIP_UDP_BUF->srcport) -
739 SICSLOWPAN_UDP_8_BIT_PORT_MIN));
740 memcpy(hc06_ptr + 2, &UIP_UDP_BUF->destport, 2);
744 *hc06_ptr = SICSLOWPAN_NHC_UDP_CS_P_00;
745 PRINTF(
"IPHC: cannot compress headers\n");
746 memcpy(hc06_ptr + 1, &UIP_UDP_BUF->srcport, 4);
751 memcpy(hc06_ptr, &UIP_UDP_BUF->udpchksum, 2);
754 uncomp_hdr_len += UIP_UDPH_LEN;
758 #ifdef SICSLOWPAN_NH_COMPRESSOR
760 hc06_ptr += SICSLOWPAN_NH_COMPRESSOR.compress(hc06_ptr, &uncomp_hdr_len);
764 PACKETBUF_IPHC_BUF[0] = iphc0;
765 PACKETBUF_IPHC_BUF[1] = iphc1;
767 packetbuf_hdr_len = hc06_ptr - packetbuf_ptr;
788 uncompress_hdr_hc06(uint16_t ip_len)
790 uint8_t tmp, iphc0, iphc1;
792 hc06_ptr = packetbuf_ptr + packetbuf_hdr_len + 2;
794 iphc0 = PACKETBUF_IPHC_BUF[0];
795 iphc1 = PACKETBUF_IPHC_BUF[1];
798 if(iphc1 & SICSLOWPAN_IPHC_CID) {
799 PRINTF(
"IPHC: CID flag set - increase header with one\n");
804 if((iphc0 & SICSLOWPAN_IPHC_FL_C) == 0) {
806 if((iphc0 & SICSLOWPAN_IPHC_TC_C) == 0) {
808 memcpy(&SICSLOWPAN_IP_BUF->tcflow, hc06_ptr + 1, 3);
813 SICSLOWPAN_IP_BUF->vtc = 0x60 | ((tmp >> 2) & 0x0f);
815 SICSLOWPAN_IP_BUF->tcflow = ((tmp >> 2) & 0x30) | (tmp << 6) |
816 (SICSLOWPAN_IP_BUF->tcflow & 0x0f);
819 SICSLOWPAN_IP_BUF->vtc = 0x60;
821 SICSLOWPAN_IP_BUF->tcflow = (*hc06_ptr & 0x0F) |
822 ((*hc06_ptr >> 2) & 0x30);
823 memcpy(&SICSLOWPAN_IP_BUF->flow, hc06_ptr + 1, 2);
829 if((iphc0 & SICSLOWPAN_IPHC_TC_C) == 0) {
831 SICSLOWPAN_IP_BUF->vtc = 0x60 | ((*hc06_ptr >> 2) & 0x0f);
832 SICSLOWPAN_IP_BUF->tcflow = ((*hc06_ptr << 6) & 0xC0) | ((*hc06_ptr >> 2) & 0x30);
833 SICSLOWPAN_IP_BUF->flow = 0;
837 SICSLOWPAN_IP_BUF->vtc = 0x60;
838 SICSLOWPAN_IP_BUF->tcflow = 0;
839 SICSLOWPAN_IP_BUF->flow = 0;
844 if((iphc0 & SICSLOWPAN_IPHC_NH_C) == 0) {
846 SICSLOWPAN_IP_BUF->proto = *hc06_ptr;
847 PRINTF(
"IPHC: next header inline: %d\n", SICSLOWPAN_IP_BUF->proto);
852 if((iphc0 & 0x03) != SICSLOWPAN_IPHC_TTL_I) {
853 SICSLOWPAN_IP_BUF->ttl = ttl_values[iphc0 & 0x03];
855 SICSLOWPAN_IP_BUF->ttl = *hc06_ptr;
860 tmp = ((iphc1 & SICSLOWPAN_IPHC_SAM_11) >> SICSLOWPAN_IPHC_SAM_BIT) & 0x03;
863 if(iphc1 & SICSLOWPAN_IPHC_SAC) {
864 uint8_t sci = (iphc1 & SICSLOWPAN_IPHC_CID) ?
865 PACKETBUF_IPHC_BUF[2] >> 4 : 0;
869 context = addr_context_lookup_by_number(sci);
870 if(context ==
NULL) {
871 PRINTF(
"sicslowpan uncompress_hdr: error context not found\n");
876 uncompress_addr(&SICSLOWPAN_IP_BUF->srcipaddr,
877 tmp != 0 ? context->prefix :
NULL, unc_ctxconf[tmp],
881 uncompress_addr(&SICSLOWPAN_IP_BUF->srcipaddr, llprefix, unc_llconf[tmp],
887 tmp = ((iphc1 & SICSLOWPAN_IPHC_DAM_11) >> SICSLOWPAN_IPHC_DAM_BIT) & 0x03;
890 if(iphc1 & SICSLOWPAN_IPHC_M) {
892 if(iphc1 & SICSLOWPAN_IPHC_DAC) {
900 uint8_t prefix[] = {0xff, 0x02};
901 if(tmp > 0 && tmp < 3) {
902 prefix[1] = *hc06_ptr;
906 uncompress_addr(&SICSLOWPAN_IP_BUF->destipaddr, prefix,
907 unc_mxconf[tmp],
NULL);
912 if(iphc1 & SICSLOWPAN_IPHC_DAC) {
913 uint8_t dci = (iphc1 & SICSLOWPAN_IPHC_CID) ?
914 PACKETBUF_IPHC_BUF[2] & 0x0f : 0;
915 context = addr_context_lookup_by_number(dci);
918 if(context ==
NULL) {
919 PRINTF(
"sicslowpan uncompress_hdr: error context not found\n");
922 uncompress_addr(&SICSLOWPAN_IP_BUF->destipaddr, context->prefix,
924 (
uip_lladdr_t *)packetbuf_addr(PACKETBUF_ADDR_RECEIVER));
927 uncompress_addr(&SICSLOWPAN_IP_BUF->destipaddr, llprefix,
929 (
uip_lladdr_t *)packetbuf_addr(PACKETBUF_ADDR_RECEIVER));
932 uncomp_hdr_len += UIP_IPH_LEN;
935 if((iphc0 & SICSLOWPAN_IPHC_NH_C)) {
937 if((*hc06_ptr & SICSLOWPAN_NHC_UDP_MASK) == SICSLOWPAN_NHC_UDP_ID) {
938 uint8_t checksum_compressed;
939 SICSLOWPAN_IP_BUF->proto = UIP_PROTO_UDP;
940 checksum_compressed = *hc06_ptr & SICSLOWPAN_NHC_UDP_CHECKSUMC;
941 PRINTF(
"IPHC: Incoming header value: %i\n", *hc06_ptr);
942 switch(*hc06_ptr & SICSLOWPAN_NHC_UDP_CS_P_11) {
943 case SICSLOWPAN_NHC_UDP_CS_P_00:
945 memcpy(&SICSLOWPAN_UDP_BUF->srcport, hc06_ptr + 1, 2);
946 memcpy(&SICSLOWPAN_UDP_BUF->destport, hc06_ptr + 3, 2);
947 PRINTF(
"IPHC: Uncompressed UDP ports (ptr+5): %x, %x\n",
952 case SICSLOWPAN_NHC_UDP_CS_P_01:
954 PRINTF(
"IPHC: Decompressing destination\n");
955 memcpy(&SICSLOWPAN_UDP_BUF->srcport, hc06_ptr + 1, 2);
956 SICSLOWPAN_UDP_BUF->destport =
UIP_HTONS(SICSLOWPAN_UDP_8_BIT_PORT_MIN + (*(hc06_ptr + 3)));
957 PRINTF(
"IPHC: Uncompressed UDP ports (ptr+4): %x, %x\n",
962 case SICSLOWPAN_NHC_UDP_CS_P_10:
964 PRINTF(
"IPHC: Decompressing source\n");
965 SICSLOWPAN_UDP_BUF->srcport =
UIP_HTONS(SICSLOWPAN_UDP_8_BIT_PORT_MIN +
967 memcpy(&SICSLOWPAN_UDP_BUF->destport, hc06_ptr + 2, 2);
968 PRINTF(
"IPHC: Uncompressed UDP ports (ptr+4): %x, %x\n",
973 case SICSLOWPAN_NHC_UDP_CS_P_11:
975 SICSLOWPAN_UDP_BUF->srcport =
UIP_HTONS(SICSLOWPAN_UDP_4_BIT_PORT_MIN +
976 (*(hc06_ptr + 1) >> 4));
977 SICSLOWPAN_UDP_BUF->destport =
UIP_HTONS(SICSLOWPAN_UDP_4_BIT_PORT_MIN +
978 ((*(hc06_ptr + 1)) & 0x0F));
979 PRINTF(
"IPHC: Uncompressed UDP ports (ptr+2): %x, %x\n",
985 PRINTF(
"sicslowpan uncompress_hdr: error unsupported UDP compression\n");
988 if(!checksum_compressed) {
989 memcpy(&SICSLOWPAN_UDP_BUF->udpchksum, hc06_ptr, 2);
991 PRINTF(
"IPHC: sicslowpan uncompress_hdr: checksum included\n");
993 PRINTF(
"IPHC: sicslowpan uncompress_hdr: checksum *NOT* included\n");
995 uncomp_hdr_len += UIP_UDPH_LEN;
997 #ifdef SICSLOWPAN_NH_COMPRESSOR
999 hc06_ptr += SICSLOWPAN_NH_COMPRESSOR.uncompress(hc06_ptr,
sicslowpan_buf, &uncomp_hdr_len);
1004 packetbuf_hdr_len = hc06_ptr - packetbuf_ptr;
1008 int len =
packetbuf_datalen() - packetbuf_hdr_len + uncomp_hdr_len - UIP_IPH_LEN;
1010 SICSLOWPAN_IP_BUF->len[0] = len >> 8;
1011 SICSLOWPAN_IP_BUF->len[1] = len & 0x00FF;
1014 SICSLOWPAN_IP_BUF->len[0] = (ip_len - UIP_IPH_LEN) >> 8;
1015 SICSLOWPAN_IP_BUF->len[1] = (ip_len - UIP_IPH_LEN) & 0x00FF;
1019 if(SICSLOWPAN_IP_BUF->proto == UIP_PROTO_UDP) {
1020 memcpy(&SICSLOWPAN_UDP_BUF->udplen, &SICSLOWPAN_IP_BUF->len[0], 2);
1029 #if SICSLOWPAN_COMPRESSION == SICSLOWPAN_COMPRESSION_HC1
1083 compress_hdr_hc1(linkaddr_t *link_destaddr)
1106 *packetbuf_ptr = SICSLOWPAN_DISPATCH_IPV6;
1107 packetbuf_hdr_len += SICSLOWPAN_IPV6_HDR_LEN;
1108 memcpy(packetbuf_ptr + packetbuf_hdr_len,
UIP_IP_BUF, UIP_IPH_LEN);
1109 packetbuf_hdr_len += UIP_IPH_LEN;
1110 uncomp_hdr_len += UIP_IPH_LEN;
1118 PACKETBUF_HC1_PTR[PACKETBUF_HC1_DISPATCH] = SICSLOWPAN_DISPATCH_HC1;
1119 uncomp_hdr_len += UIP_IPH_LEN;
1121 case UIP_PROTO_ICMP6:
1123 PACKETBUF_HC1_PTR[PACKETBUF_HC1_ENCODING] = 0xFC;
1124 PACKETBUF_HC1_PTR[PACKETBUF_HC1_TTL] =
UIP_IP_BUF->ttl;
1125 packetbuf_hdr_len += SICSLOWPAN_HC1_HDR_LEN;
1130 PACKETBUF_HC1_PTR[PACKETBUF_HC1_ENCODING] = 0xFE;
1131 PACKETBUF_HC1_PTR[PACKETBUF_HC1_TTL] =
UIP_IP_BUF->ttl;
1132 packetbuf_hdr_len += SICSLOWPAN_HC1_HDR_LEN;
1142 PRINTF(
"local/remote port %u/%u\n",UIP_UDP_BUF->srcport,UIP_UDP_BUF->destport);
1143 if(
UIP_HTONS(UIP_UDP_BUF->srcport) >= SICSLOWPAN_UDP_PORT_MIN &&
1144 UIP_HTONS(UIP_UDP_BUF->srcport) < SICSLOWPAN_UDP_PORT_MAX &&
1145 UIP_HTONS(UIP_UDP_BUF->destport) >= SICSLOWPAN_UDP_PORT_MIN &&
1146 UIP_HTONS(UIP_UDP_BUF->destport) < SICSLOWPAN_UDP_PORT_MAX) {
1148 PACKETBUF_HC1_HC_UDP_PTR[PACKETBUF_HC1_HC_UDP_HC1_ENCODING] = 0xFB;
1151 PACKETBUF_HC1_HC_UDP_PTR[PACKETBUF_HC1_HC_UDP_UDP_ENCODING] = 0xE0;
1152 PACKETBUF_HC1_HC_UDP_PTR[PACKETBUF_HC1_HC_UDP_TTL] =
UIP_IP_BUF->ttl;
1154 PACKETBUF_HC1_HC_UDP_PTR[PACKETBUF_HC1_HC_UDP_PORTS] =
1155 (uint8_t)((
UIP_HTONS(UIP_UDP_BUF->srcport) -
1156 SICSLOWPAN_UDP_PORT_MIN) << 4) +
1157 (uint8_t)((
UIP_HTONS(UIP_UDP_BUF->destport) - SICSLOWPAN_UDP_PORT_MIN));
1158 memcpy(&PACKETBUF_HC1_HC_UDP_PTR[PACKETBUF_HC1_HC_UDP_CHKSUM], &UIP_UDP_BUF->udpchksum, 2);
1159 packetbuf_hdr_len += SICSLOWPAN_HC1_HC_UDP_HDR_LEN;
1160 uncomp_hdr_len += UIP_UDPH_LEN;
1163 PACKETBUF_HC1_PTR[PACKETBUF_HC1_ENCODING] = 0xFA;
1164 PACKETBUF_HC1_PTR[PACKETBUF_HC1_TTL] =
UIP_IP_BUF->ttl;
1165 packetbuf_hdr_len += SICSLOWPAN_HC1_HDR_LEN;
1191 uncompress_hdr_hc1(uint16_t ip_len)
1194 SICSLOWPAN_IP_BUF->vtc = 0x60;
1195 SICSLOWPAN_IP_BUF->tcflow = 0;
1196 SICSLOWPAN_IP_BUF->flow = 0;
1199 uip_ip6addr(&SICSLOWPAN_IP_BUF->srcipaddr, 0xfe80, 0, 0, 0, 0, 0, 0, 0);
1201 (
uip_lladdr_t *)packetbuf_addr(PACKETBUF_ADDR_SENDER));
1202 uip_ip6addr(&SICSLOWPAN_IP_BUF->destipaddr, 0xfe80, 0, 0, 0, 0, 0, 0, 0);
1204 (
uip_lladdr_t *)packetbuf_addr(PACKETBUF_ADDR_RECEIVER));
1206 uncomp_hdr_len += UIP_IPH_LEN;
1209 switch(PACKETBUF_HC1_PTR[PACKETBUF_HC1_ENCODING] & 0x06) {
1210 case SICSLOWPAN_HC1_NH_ICMP6:
1211 SICSLOWPAN_IP_BUF->proto = UIP_PROTO_ICMP6;
1212 SICSLOWPAN_IP_BUF->ttl = PACKETBUF_HC1_PTR[PACKETBUF_HC1_TTL];
1213 packetbuf_hdr_len += SICSLOWPAN_HC1_HDR_LEN;
1216 case SICSLOWPAN_HC1_NH_TCP:
1217 SICSLOWPAN_IP_BUF->proto = UIP_PROTO_TCP;
1218 SICSLOWPAN_IP_BUF->ttl = PACKETBUF_HC1_PTR[PACKETBUF_HC1_TTL];
1219 packetbuf_hdr_len += SICSLOWPAN_HC1_HDR_LEN;
1223 case SICSLOWPAN_HC1_NH_UDP:
1224 SICSLOWPAN_IP_BUF->proto = UIP_PROTO_UDP;
1225 if(PACKETBUF_HC1_HC_UDP_PTR[PACKETBUF_HC1_HC_UDP_HC1_ENCODING] & 0x01) {
1227 if(PACKETBUF_HC1_HC_UDP_PTR[PACKETBUF_HC1_HC_UDP_UDP_ENCODING] !=
1228 SICSLOWPAN_HC_UDP_ALL_C) {
1229 PRINTF(
"sicslowpan (uncompress_hdr), packet not supported");
1233 SICSLOWPAN_IP_BUF->ttl = PACKETBUF_HC1_HC_UDP_PTR[PACKETBUF_HC1_HC_UDP_TTL];
1235 SICSLOWPAN_UDP_BUF->srcport =
1237 (PACKETBUF_HC1_HC_UDP_PTR[PACKETBUF_HC1_HC_UDP_PORTS] >> 4));
1238 SICSLOWPAN_UDP_BUF->destport =
1240 (PACKETBUF_HC1_HC_UDP_PTR[PACKETBUF_HC1_HC_UDP_PORTS] & 0x0F));
1241 memcpy(&SICSLOWPAN_UDP_BUF->udpchksum, &PACKETBUF_HC1_HC_UDP_PTR[PACKETBUF_HC1_HC_UDP_CHKSUM], 2);
1242 uncomp_hdr_len += UIP_UDPH_LEN;
1243 packetbuf_hdr_len += SICSLOWPAN_HC1_HC_UDP_HDR_LEN;
1245 packetbuf_hdr_len += SICSLOWPAN_HC1_HDR_LEN;
1256 int len =
packetbuf_datalen() - packetbuf_hdr_len + uncomp_hdr_len - UIP_IPH_LEN;
1258 SICSLOWPAN_IP_BUF->len[0] = len >> 8;
1259 SICSLOWPAN_IP_BUF->len[1] = len & 0x00FF;
1262 SICSLOWPAN_IP_BUF->len[0] = (ip_len - UIP_IPH_LEN) >> 8;
1263 SICSLOWPAN_IP_BUF->len[1] = (ip_len - UIP_IPH_LEN) & 0x00FF;
1266 if(SICSLOWPAN_IP_BUF->proto == UIP_PROTO_UDP) {
1267 memcpy(&SICSLOWPAN_UDP_BUF->udplen, &SICSLOWPAN_IP_BUF->len[0], 2);
1293 compress_hdr_ipv6(linkaddr_t *link_destaddr)
1295 *packetbuf_ptr = SICSLOWPAN_DISPATCH_IPV6;
1296 packetbuf_hdr_len += SICSLOWPAN_IPV6_HDR_LEN;
1297 memcpy(packetbuf_ptr + packetbuf_hdr_len,
UIP_IP_BUF, UIP_IPH_LEN);
1298 packetbuf_hdr_len += UIP_IPH_LEN;
1299 uncomp_hdr_len += UIP_IPH_LEN;
1312 packet_sent(
void *ptr,
int status,
int transmissions)
1314 uip_ds6_link_neighbor_callback(status, transmissions);
1316 if(callback !=
NULL) {
1317 callback->output_callback(status);
1319 last_tx_status = status;
1328 send_packet(linkaddr_t *dest)
1334 packetbuf_set_addr(PACKETBUF_ADDR_RECEIVER, dest);
1336 #if NETSTACK_CONF_BRIDGE_MODE
1338 packetbuf_set_addr(PACKETBUF_ADDR_SENDER,(
void*)&
uip_lladdr);
1342 #if SICSLOWPAN_CONF_ACK_ALL
1343 packetbuf_set_attr(PACKETBUF_ATTR_RELIABLE, 1);
1348 NETSTACK_LLSEC.send(&packet_sent,
NULL);
1374 uint16_t processed_ip_out_len;
1378 packetbuf_hdr_len = 0;
1384 packetbuf_set_attr(PACKETBUF_ATTR_MAX_MAC_TRANSMISSIONS,
1385 SICSLOWPAN_MAX_MAC_TRANSMISSIONS);
1393 #define TCP_FIN 0x01
1394 #define TCP_ACK 0x10
1395 #define TCP_CTL 0x3f
1398 (UIP_TCP_BUF->flags & TCP_FIN) == 0 &&
1399 (UIP_TCP_BUF->flags & TCP_CTL) != TCP_ACK) {
1400 packetbuf_set_attr(PACKETBUF_ATTR_PACKET_TYPE,
1401 PACKETBUF_ATTR_PACKET_TYPE_STREAM);
1402 }
else if(
UIP_IP_BUF->proto == UIP_PROTO_TCP &&
1403 (UIP_TCP_BUF->flags & TCP_FIN) == TCP_FIN) {
1404 packetbuf_set_attr(PACKETBUF_ATTR_PACKET_TYPE,
1405 PACKETBUF_ATTR_PACKET_TYPE_STREAM_END);
1413 if(localdest ==
NULL) {
1419 PRINTFO(
"sicslowpan output: sending packet len %d\n",
uip_len);
1423 #if SICSLOWPAN_COMPRESSION == SICSLOWPAN_COMPRESSION_HC1
1424 compress_hdr_hc1(&dest);
1426 #if SICSLOWPAN_COMPRESSION == SICSLOWPAN_COMPRESSION_IPV6
1427 compress_hdr_ipv6(&dest);
1429 #if SICSLOWPAN_COMPRESSION == SICSLOWPAN_COMPRESSION_HC06
1430 compress_hdr_hc06(&dest);
1433 compress_hdr_ipv6(&dest);
1435 PRINTFO(
"sicslowpan output: header of len %d\n", packetbuf_hdr_len);
1440 #define USE_FRAMER_HDRLEN 1
1441 #if USE_FRAMER_HDRLEN
1442 packetbuf_set_addr(PACKETBUF_ADDR_RECEIVER, &dest);
1443 framer_hdrlen = NETSTACK_FRAMER.length();
1444 if(framer_hdrlen < 0) {
1451 max_payload =
MAC_MAX_PAYLOAD - framer_hdrlen - NETSTACK_LLSEC.get_overhead();
1453 if((
int)
uip_len - (
int)uncomp_hdr_len > max_payload - (
int)packetbuf_hdr_len) {
1454 #if SICSLOWPAN_CONF_FRAG
1464 int freebuf = queuebuf_numfree() - 1;
1465 PRINTFO(
"uip_len: %d, fragments: %d, free bufs: %d\n",
uip_len, estimated_fragments, freebuf);
1466 if(freebuf < estimated_fragments) {
1467 PRINTFO(
"Dropping packet, not enough free bufs\n");
1471 PRINTFO(
"Fragmentation sending packet len %d\n",
uip_len);
1474 PRINTFO(
"sicslowpan output: 1rst fragment ");
1477 memmove(packetbuf_ptr + SICSLOWPAN_FRAG1_HDR_LEN, packetbuf_ptr, packetbuf_hdr_len);
1485 SET16(PACKETBUF_FRAG_PTR, PACKETBUF_FRAG_DISPATCH_SIZE,
1486 ((SICSLOWPAN_DISPATCH_FRAG1 << 8) |
uip_len));
1488 SET16(PACKETBUF_FRAG_PTR, PACKETBUF_FRAG_TAG, my_tag);
1492 packetbuf_hdr_len += SICSLOWPAN_FRAG1_HDR_LEN;
1493 packetbuf_payload_len = (max_payload - packetbuf_hdr_len) & 0xfffffff8;
1494 PRINTFO(
"(len %d, tag %d)\n", packetbuf_payload_len, my_tag);
1495 memcpy(packetbuf_ptr + packetbuf_hdr_len,
1496 (uint8_t *)
UIP_IP_BUF + uncomp_hdr_len, packetbuf_payload_len);
1498 q = queuebuf_new_from_packetbuf();
1500 PRINTFO(
"could not allocate queuebuf for first fragment, dropping packet\n");
1504 queuebuf_to_packetbuf(q);
1511 (last_tx_status == MAC_TX_ERR_FATAL)) {
1512 PRINTFO(
"error in fragment tx, dropping subsequent fragments.\n");
1517 processed_ip_out_len = packetbuf_payload_len + uncomp_hdr_len;
1524 packetbuf_hdr_len = SICSLOWPAN_FRAGN_HDR_LEN;
1527 SET16(PACKETBUF_FRAG_PTR, PACKETBUF_FRAG_DISPATCH_SIZE,
1528 ((SICSLOWPAN_DISPATCH_FRAGN << 8) |
uip_len));
1529 packetbuf_payload_len = (max_payload - packetbuf_hdr_len) & 0xfffffff8;
1530 while(processed_ip_out_len <
uip_len) {
1531 PRINTFO(
"sicslowpan output: fragment ");
1532 PACKETBUF_FRAG_PTR[PACKETBUF_FRAG_OFFSET] = processed_ip_out_len >> 3;
1535 if(
uip_len - processed_ip_out_len < packetbuf_payload_len) {
1537 packetbuf_payload_len =
uip_len - processed_ip_out_len;
1539 PRINTFO(
"(offset %d, len %d, tag %d)\n",
1540 processed_ip_out_len >> 3, packetbuf_payload_len, my_tag);
1541 memcpy(packetbuf_ptr + packetbuf_hdr_len,
1542 (uint8_t *)
UIP_IP_BUF + processed_ip_out_len, packetbuf_payload_len);
1544 q = queuebuf_new_from_packetbuf();
1546 PRINTFO(
"could not allocate queuebuf, dropping fragment\n");
1550 queuebuf_to_packetbuf(q);
1553 processed_ip_out_len += packetbuf_payload_len;
1558 (last_tx_status == MAC_TX_ERR_FATAL)) {
1559 PRINTFO(
"error in fragment tx, dropping subsequent fragments.\n");
1564 PRINTFO(
"sicslowpan output: Packet too large to be sent without fragmentation support; dropping packet\n");
1573 memcpy(packetbuf_ptr + packetbuf_hdr_len, (uint8_t *)
UIP_IP_BUF + uncomp_hdr_len,
1598 uint16_t frag_size = 0;
1600 uint8_t frag_offset = 0;
1601 uint8_t is_fragment = 0;
1602 #if SICSLOWPAN_CONF_FRAG
1604 uint16_t frag_tag = 0;
1605 uint8_t first_fragment = 0, last_fragment = 0;
1610 packetbuf_hdr_len = 0;
1617 last_rssi = (
signed short)packetbuf_attr(PACKETBUF_ATTR_RSSI);
1618 #if SICSLOWPAN_CONF_FRAG
1622 processed_ip_in_len = 0;
1628 switch((GET16(PACKETBUF_FRAG_PTR, PACKETBUF_FRAG_DISPATCH_SIZE) & 0xf800) >> 8) {
1629 case SICSLOWPAN_DISPATCH_FRAG1:
1630 PRINTFI(
"sicslowpan input: FRAG1 ");
1633 frag_size = GET16(PACKETBUF_FRAG_PTR, PACKETBUF_FRAG_DISPATCH_SIZE) & 0x07ff;
1635 frag_tag = GET16(PACKETBUF_FRAG_PTR, PACKETBUF_FRAG_TAG);
1636 PRINTFI(
"size %d, tag %d, offset %d)\n",
1637 frag_size, frag_tag, frag_offset);
1638 packetbuf_hdr_len += SICSLOWPAN_FRAG1_HDR_LEN;
1643 case SICSLOWPAN_DISPATCH_FRAGN:
1648 PRINTFI(
"sicslowpan input: FRAGN ");
1649 frag_offset = PACKETBUF_FRAG_PTR[PACKETBUF_FRAG_OFFSET];
1650 frag_tag = GET16(PACKETBUF_FRAG_PTR, PACKETBUF_FRAG_TAG);
1651 frag_size = GET16(PACKETBUF_FRAG_PTR, PACKETBUF_FRAG_DISPATCH_SIZE) & 0x07ff;
1652 PRINTFI(
"size %d, tag %d, offset %d)\n",
1653 frag_size, frag_tag, frag_offset);
1654 packetbuf_hdr_len += SICSLOWPAN_FRAGN_HDR_LEN;
1658 PRINTFI(
"last_fragment?: processed_ip_in_len %d packetbuf_payload_len %d frag_size %d\n",
1661 if(processed_ip_in_len +
packetbuf_datalen() - packetbuf_hdr_len >= frag_size) {
1678 #define PRIORITIZE_NEW_PACKETS 1
1679 #if PRIORITIZE_NEW_PACKETS
1684 processed_ip_in_len = 0;
1685 }
else if(processed_ip_in_len > 0 && first_fragment
1686 && !
linkaddr_cmp(&frag_sender, packetbuf_addr(PACKETBUF_ADDR_SENDER))) {
1688 processed_ip_in_len = 0;
1692 if(processed_ip_in_len > 0) {
1695 if((frag_size > 0 &&
1696 (frag_size != sicslowpan_len ||
1697 reass_tag != frag_tag ||
1698 !
linkaddr_cmp(&frag_sender, packetbuf_addr(PACKETBUF_ADDR_SENDER)))) ||
1704 PRINTFI(
"sicslowpan input: Dropping 6lowpan packet that is not a fragment of the packet currently being reassembled\n");
1712 if((frag_size > 0) && (frag_size <=
UIP_BUFSIZE)) {
1715 if(is_fragment && !first_fragment) {
1719 sicslowpan_len = frag_size;
1720 reass_tag = frag_tag;
1722 PRINTFI(
"sicslowpan input: INIT FRAGMENTATION (len %d, tag %d)\n",
1723 sicslowpan_len, reass_tag);
1724 linkaddr_copy(&frag_sender, packetbuf_addr(PACKETBUF_ADDR_SENDER));
1728 if(packetbuf_hdr_len == SICSLOWPAN_FRAGN_HDR_LEN) {
1735 #if SICSLOWPAN_COMPRESSION == SICSLOWPAN_COMPRESSION_HC06
1736 if((PACKETBUF_HC1_PTR[PACKETBUF_HC1_DISPATCH] & 0xe0) == SICSLOWPAN_DISPATCH_IPHC) {
1737 PRINTFI(
"sicslowpan input: IPHC\n");
1738 uncompress_hdr_hc06(frag_size);
1741 switch(PACKETBUF_HC1_PTR[PACKETBUF_HC1_DISPATCH]) {
1742 #if SICSLOWPAN_COMPRESSION == SICSLOWPAN_COMPRESSION_HC1
1743 case SICSLOWPAN_DISPATCH_HC1:
1744 PRINTFI(
"sicslowpan input: HC1\n");
1745 uncompress_hdr_hc1(frag_size);
1748 case SICSLOWPAN_DISPATCH_IPV6:
1749 PRINTFI(
"sicslowpan input: IPV6\n");
1750 packetbuf_hdr_len += SICSLOWPAN_IPV6_HDR_LEN;
1753 memcpy(SICSLOWPAN_IP_BUF, packetbuf_ptr + packetbuf_hdr_len, UIP_IPH_LEN);
1756 packetbuf_hdr_len += UIP_IPH_LEN;
1757 uncomp_hdr_len += UIP_IPH_LEN;
1761 PRINTFI(
"sicslowpan input: unknown dispatch: %u\n",
1762 PACKETBUF_HC1_PTR[PACKETBUF_HC1_DISPATCH]);
1767 #if SICSLOWPAN_CONF_FRAG
1778 PRINTF(
"SICSLOWPAN: packet dropped due to header > total packet\n");
1785 int req_size =
UIP_LLH_LEN + uncomp_hdr_len + (uint16_t)(frag_offset << 3)
1786 + packetbuf_payload_len;
1789 "SICSLOWPAN: packet dropped, minimum required SICSLOWPAN_IP_BUF size: %d+%d+%d+%d=%d (current size: %d)\n",
1790 UIP_LLH_LEN, uncomp_hdr_len, (uint16_t)(frag_offset << 3),
1796 memcpy((uint8_t *)SICSLOWPAN_IP_BUF + uncomp_hdr_len + (uint16_t)(frag_offset << 3), packetbuf_ptr + packetbuf_hdr_len, packetbuf_payload_len);
1800 #if SICSLOWPAN_CONF_FRAG
1803 if(first_fragment != 0) {
1804 processed_ip_in_len += uncomp_hdr_len;
1808 if(last_fragment != 0) {
1809 processed_ip_in_len = frag_size;
1811 processed_ip_in_len += packetbuf_payload_len;
1813 PRINTF(
"processed_ip_in_len %d, packetbuf_payload_len %d\n", processed_ip_in_len, packetbuf_payload_len);
1817 sicslowpan_len = packetbuf_payload_len + uncomp_hdr_len;
1818 #if SICSLOWPAN_CONF_FRAG
1825 PRINTF(
"sicslowpan_init processed_ip_in_len %d, sicslowpan_len %d\n",
1826 processed_ip_in_len, sicslowpan_len);
1827 if(processed_ip_in_len == 0 || (processed_ip_in_len == sicslowpan_len)) {
1828 PRINTFI(
"sicslowpan input: IP packet ready (length %d)\n",
1830 memcpy((uint8_t *)
UIP_IP_BUF, (uint8_t *)SICSLOWPAN_IP_BUF, sicslowpan_len);
1833 processed_ip_in_len = 0;
1839 PRINTF(
"after decompression %u:", SICSLOWPAN_IP_BUF->len[1]);
1840 for (ndx = 0; ndx < SICSLOWPAN_IP_BUF->len[1] + 40; ndx++) {
1841 uint8_t data = ((uint8_t *) (SICSLOWPAN_IP_BUF))[ndx];
1842 PRINTF(
"%02x", data);
1851 callback->input_callback();
1855 #if SICSLOWPAN_CONF_FRAG
1865 sicslowpan_init(
void)
1871 tcpip_set_outputfunc(output);
1873 #if SICSLOWPAN_COMPRESSION == SICSLOWPAN_COMPRESSION_HC06
1879 #if SICSLOWPAN_CONF_MAX_ADDR_CONTEXTS > 0
1880 addr_contexts[0].used = 1;
1881 addr_contexts[0].number = 0;
1882 #ifdef SICSLOWPAN_CONF_ADDR_CONTEXT_0
1883 SICSLOWPAN_CONF_ADDR_CONTEXT_0;
1885 addr_contexts[0].prefix[0] = 0xaa;
1886 addr_contexts[0].prefix[1] = 0xaa;
1890 #if SICSLOWPAN_CONF_MAX_ADDR_CONTEXTS > 1
1894 #ifdef SICSLOWPAN_CONF_ADDR_CONTEXT_1
1896 addr_contexts[1].used = 1;
1897 addr_contexts[1].number = 1;
1898 SICSLOWPAN_CONF_ADDR_CONTEXT_1;
1899 #ifdef SICSLOWPAN_CONF_ADDR_CONTEXT_2
1901 addr_contexts[2].used = 1;
1902 addr_contexts[2].number = 2;
1903 SICSLOWPAN_CONF_ADDR_CONTEXT_2;
1906 addr_contexts[i].used = 0;
1909 addr_contexts[i].used = 0;
1920 sicslowpan_get_last_rssi(
void)
uip_len
The length of the packet in the uip_buf buffer.
#define uip_is_addr_mcast(a)
is address a multicast address, see RFC 3513 a is of type uip_ipaddr_t*
#define uip_is_addr_link_local(a)
is addr (a) a link local unicast address, see RFC3513 i.e.
CCIF uip_lladdr_t uip_lladdr
Host L2 address.
void tcpip_input(void)
Deliver an incoming packet to the TCP/IP stack.
Header file for the uIP TCP/IP stack.
const linkaddr_t linkaddr_null
The null Rime address.
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
Header for the Contiki/uIP interface.
Network interface and stateless autoconfiguration (RFC 4862)
void timer_set(struct timer *t, clock_time_t interval)
Set a timer.
The header for fragments.
#define NULL
The null pointer.
The MAC layer transmission could not be performed because of a fatal error.
void uip_log(char *msg)
Print out a uIP log message.
The structure of a network driver in Contiki.
#define UIP_BUFSIZE
The size of the uIP packet buffer.
#define sicslowpan_is_iid_16_bit_compressable(a)
check whether we can compress the IID in address 'a' to 16 bits.
#define UIP_HTONS(n)
Convert 16-bit quantity from host byte order to network byte order.
void packetbuf_set_datalen(uint16_t len)
Set the length of the data in the packetbuf.
Header file for the Rime stack
uint16_t packetbuf_datalen(void)
Get the length of the data in the packetbuf.
void linkaddr_copy(linkaddr_t *dest, const linkaddr_t *src)
Copy a Rime address.
#define UIP_IP_BUF
Pointer to IP header.
void(* input)(void)
Callback for getting notified of incoming packet.
#define UIP_LLH_LEN
The link level header length.
Header file for the 6lowpan implementation (RFC4944 and draft-hui-6lowpan-hc-01) ...
#define uip_is_addr_unspecified(a)
Is IPv6 address a the unspecified address a is of type uip_ipaddr_t.
void watchdog_periodic(void)
Writes the WDT clear sequence.
#define MAC_MAX_PAYLOAD
Maximum available size for frame headers, link layer security-related overhead, as well as 6LoWPAN pa...
#define SICSLOWPAN_CONF_MAX_ADDR_CONTEXTS
If we use IPHC compression, how many address contexts do we support.
#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 ...
#define COMPRESSION_THRESHOLD
Some MAC layers need a minimum payload, which is configurable through the SICSLOWPAN_CONF_MIN_MAC_PAY...
#define UIP_ICMP_BUF
Pointer to ICMP header.
void packetbuf_clear(void)
Clear and reset the packetbuf.
int linkaddr_cmp(const linkaddr_t *addr1, const linkaddr_t *addr2)
Compare two Rime addresses.
The MAC layer did not get an acknowledgement for the packet.
A set of debugging macros.
void * packetbuf_dataptr(void)
Get a pointer to the data in the packetbuf.
The structure of a next header compressor.
int timer_expired(struct timer *t)
Check if a timer has expired.
#define uip_ip6addr(addr, addr0, addr1, addr2, addr3, addr4, addr5, addr6, addr7)
Construct an IPv6 address from eight 16-bit words.
#define sicslowpan_buf
The buffer used for the 6lowpan processing is uip_buf.
Include file for the Contiki low-layer network stack (NETSTACK)
#define SICSLOWPAN_REASS_MAXAGE
Timeout for packet reassembly at the 6lowpan layer (should be < 60s)
#define CLOCK_SECOND
A second, measured in system clock time.