From bec721d313be63ed7cbc49fdb93a2681a1b056f5 Mon Sep 17 00:00:00 2001 From: Adam Dunkels Date: Sat, 16 Nov 2013 14:22:48 +0100 Subject: [PATCH 1/2] Allow payload len to be larger than 256 bytes --- core/net/mac/frame802154.c | 2 +- core/net/mac/frame802154.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/net/mac/frame802154.c b/core/net/mac/frame802154.c index 7807c4392..3ed2ebcc6 100644 --- a/core/net/mac/frame802154.c +++ b/core/net/mac/frame802154.c @@ -345,7 +345,7 @@ frame802154_parse(uint8_t *data, int len, frame802154_t *pf) /* header length */ c = p - data; /* payload length */ - pf->payload_len = (uint8_t)(0xff & (len - c)); + pf->payload_len = (len - c); /* payload */ pf->payload = p; diff --git a/core/net/mac/frame802154.h b/core/net/mac/frame802154.h index 4d72ea15f..1103027d0 100644 --- a/core/net/mac/frame802154.h +++ b/core/net/mac/frame802154.h @@ -155,7 +155,7 @@ typedef struct { uint8_t src_addr[8]; /**< Source address */ frame802154_aux_hdr_t aux_hdr; /**< Aux security header */ uint8_t *payload; /**< Pointer to 802.15.4 frame payload */ - uint8_t payload_len; /**< Length of payload field */ + int payload_len; /**< Length of payload field */ } frame802154_t; /* Prototypes */ From f26e35cffa1f3b22abe8971be5737ecebccd77d7 Mon Sep 17 00:00:00 2001 From: Adam Dunkels Date: Sat, 16 Nov 2013 14:44:14 +0100 Subject: [PATCH 2/2] Allow the 6lowpan code to handle packets larger than 256 bytes --- core/net/sicslowpan.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/core/net/sicslowpan.c b/core/net/sicslowpan.c index cdbe33fc8..4f5d023a3 100644 --- a/core/net/sicslowpan.c +++ b/core/net/sicslowpan.c @@ -200,7 +200,7 @@ static uint8_t rime_hdr_len; * headers (can be the IP payload if the IP header only is compressed * or the UDP payload if the UDP header is also compressed) */ -static uint8_t rime_payload_len; +static int rime_payload_len; /** * uncomp_hdr_len is the length of the headers before compression (if HC2 @@ -999,9 +999,10 @@ uncompress_hdr_hc06(uint16_t ip_len) /* IP length field. */ if(ip_len == 0) { + int len = packetbuf_datalen() - rime_hdr_len + uncomp_hdr_len - UIP_IPH_LEN; /* This is not a fragmented packet */ - SICSLOWPAN_IP_BUF->len[0] = 0; - SICSLOWPAN_IP_BUF->len[1] = packetbuf_datalen() - rime_hdr_len + uncomp_hdr_len - UIP_IPH_LEN; + SICSLOWPAN_IP_BUF->len[0] = len >> 8; + SICSLOWPAN_IP_BUF->len[1] = len & 0x00FF; } else { /* This is a 1st fragment */ SICSLOWPAN_IP_BUF->len[0] = (ip_len - UIP_IPH_LEN) >> 8; @@ -1246,9 +1247,10 @@ uncompress_hdr_hc1(uint16_t ip_len) /* IP length field. */ if(ip_len == 0) { + int len = packetbuf_datalen() - rime_hdr_len + uncomp_hdr_len - UIP_IPH_LEN; /* This is not a fragmented packet */ - SICSLOWPAN_IP_BUF->len[0] = 0; - SICSLOWPAN_IP_BUF->len[1] = packetbuf_datalen() - rime_hdr_len + uncomp_hdr_len - UIP_IPH_LEN; + SICSLOWPAN_IP_BUF->len[0] = len >> 8; + SICSLOWPAN_IP_BUF->len[1] = len & 0x00FF; } else { /* This is a 1st fragment */ SICSLOWPAN_IP_BUF->len[0] = (ip_len - UIP_IPH_LEN) >> 8; @@ -1480,7 +1482,7 @@ output(uip_lladdr_t *localdest) /* Copy payload and send */ rime_hdr_len += SICSLOWPAN_FRAG1_HDR_LEN; - rime_payload_len = (MAC_MAX_PAYLOAD - framer_hdrlen - rime_hdr_len) & 0xf8; + rime_payload_len = (MAC_MAX_PAYLOAD - framer_hdrlen - rime_hdr_len) & 0xfffffff8; PRINTFO("(len %d, tag %d)\n", rime_payload_len, my_tag); memcpy(rime_ptr + rime_hdr_len, (uint8_t *)UIP_IP_BUF + uncomp_hdr_len, rime_payload_len); @@ -1516,7 +1518,7 @@ output(uip_lladdr_t *localdest) /* uip_htons((SICSLOWPAN_DISPATCH_FRAGN << 8) | uip_len); */ SET16(RIME_FRAG_PTR, RIME_FRAG_DISPATCH_SIZE, ((SICSLOWPAN_DISPATCH_FRAGN << 8) | uip_len)); - rime_payload_len = (MAC_MAX_PAYLOAD - framer_hdrlen - rime_hdr_len) & 0xf8; + rime_payload_len = (MAC_MAX_PAYLOAD - framer_hdrlen - rime_hdr_len) & 0xfffffff8; while(processed_ip_out_len < uip_len) { PRINTFO("sicslowpan output: fragment "); RIME_FRAG_PTR[RIME_FRAG_OFFSET] = processed_ip_out_len >> 3;