sicslowpan: Fixed too aggresive fragmentation

This commit is contained in:
kkrentz 2014-02-09 06:02:55 -08:00
parent 2cf7d98cad
commit 677c078302
5 changed files with 35 additions and 13 deletions

View file

@ -220,13 +220,12 @@
#define SICSLOWPAN_CONF_FRAG 1 #define SICSLOWPAN_CONF_FRAG 1
#endif /* SICSLOWPAN_CONF_FRAG */ #endif /* SICSLOWPAN_CONF_FRAG */
/* SICSLOWPAN_CONF_MAC_MAX_PAYLOAD specifies the maximum size of /* SICSLOWPAN_CONF_MAC_MAX_PAYLOAD is the maximum available size for
packets before they get fragmented. The default is 127 bytes (the frame headers, link layer security-related overhead, as well as
maximum size of a 802.15.4 frame) - 25 bytes (for the 802.15.4 MAC 6LoWPAN payload. By default, SICSLOWPAN_CONF_MAC_MAX_PAYLOAD is
layer header). This can be increased for systems with larger packet 127 bytes (MTU of 802.15.4) - 2 bytes (Footer of 802.15.4). */
sizes. */
#ifndef SICSLOWPAN_CONF_MAC_MAX_PAYLOAD #ifndef SICSLOWPAN_CONF_MAC_MAX_PAYLOAD
#define SICSLOWPAN_CONF_MAC_MAX_PAYLOAD (127 - 25) #define SICSLOWPAN_CONF_MAC_MAX_PAYLOAD (127 - 2)
#endif /* SICSLOWPAN_CONF_MAC_MAX_PAYLOAD */ #endif /* SICSLOWPAN_CONF_MAC_MAX_PAYLOAD */
/* SICSLOWPAN_CONF_COMPRESSION_THRESHOLD sets a lower threshold for /* SICSLOWPAN_CONF_COMPRESSION_THRESHOLD sets a lower threshold for

View file

@ -155,11 +155,13 @@ void uip_log(char *msg);
/** @} */ /** @} */
/** \brief Size of the 802.15.4 payload (127byte - 25 for MAC header) */ /** \brief Maximum available size for frame headers,
link layer security-related overhead, as well as
6LoWPAN payload. */
#ifdef SICSLOWPAN_CONF_MAC_MAX_PAYLOAD #ifdef SICSLOWPAN_CONF_MAC_MAX_PAYLOAD
#define MAC_MAX_PAYLOAD SICSLOWPAN_CONF_MAC_MAX_PAYLOAD #define MAC_MAX_PAYLOAD SICSLOWPAN_CONF_MAC_MAX_PAYLOAD
#else /* SICSLOWPAN_CONF_MAC_MAX_PAYLOAD */ #else /* SICSLOWPAN_CONF_MAC_MAX_PAYLOAD */
#define MAC_MAX_PAYLOAD 102 #define MAC_MAX_PAYLOAD (127 - 2)
#endif /* SICSLOWPAN_CONF_MAC_MAX_PAYLOAD */ #endif /* SICSLOWPAN_CONF_MAC_MAX_PAYLOAD */
@ -1361,6 +1363,7 @@ static uint8_t
output(const uip_lladdr_t *localdest) output(const uip_lladdr_t *localdest)
{ {
int framer_hdrlen; int framer_hdrlen;
int max_payload;
/* The MAC address of the destination of the packet */ /* The MAC address of the destination of the packet */
linkaddr_t dest; linkaddr_t dest;
@ -1443,8 +1446,9 @@ output(const uip_lladdr_t *localdest)
#else /* USE_FRAMER_HDRLEN */ #else /* USE_FRAMER_HDRLEN */
framer_hdrlen = 21; framer_hdrlen = 21;
#endif /* USE_FRAMER_HDRLEN */ #endif /* USE_FRAMER_HDRLEN */
max_payload = MAC_MAX_PAYLOAD - framer_hdrlen - NETSTACK_LLSEC.get_overhead();
if((int)uip_len - (int)uncomp_hdr_len > (int)MAC_MAX_PAYLOAD - framer_hdrlen - (int)packetbuf_hdr_len) { if((int)uip_len - (int)uncomp_hdr_len > max_payload - (int)packetbuf_hdr_len) {
#if SICSLOWPAN_CONF_FRAG #if SICSLOWPAN_CONF_FRAG
struct queuebuf *q; struct queuebuf *q;
/* /*
@ -1477,7 +1481,7 @@ output(const uip_lladdr_t *localdest)
/* Copy payload and send */ /* Copy payload and send */
packetbuf_hdr_len += SICSLOWPAN_FRAG1_HDR_LEN; packetbuf_hdr_len += SICSLOWPAN_FRAG1_HDR_LEN;
packetbuf_payload_len = (MAC_MAX_PAYLOAD - framer_hdrlen - packetbuf_hdr_len) & 0xfffffff8; packetbuf_payload_len = (max_payload - packetbuf_hdr_len) & 0xfffffff8;
PRINTFO("(len %d, tag %d)\n", packetbuf_payload_len, my_tag); PRINTFO("(len %d, tag %d)\n", packetbuf_payload_len, my_tag);
memcpy(packetbuf_ptr + packetbuf_hdr_len, memcpy(packetbuf_ptr + packetbuf_hdr_len,
(uint8_t *)UIP_IP_BUF + uncomp_hdr_len, packetbuf_payload_len); (uint8_t *)UIP_IP_BUF + uncomp_hdr_len, packetbuf_payload_len);
@ -1513,7 +1517,7 @@ output(const uip_lladdr_t *localdest)
/* uip_htons((SICSLOWPAN_DISPATCH_FRAGN << 8) | uip_len); */ /* uip_htons((SICSLOWPAN_DISPATCH_FRAGN << 8) | uip_len); */
SET16(PACKETBUF_FRAG_PTR, PACKETBUF_FRAG_DISPATCH_SIZE, SET16(PACKETBUF_FRAG_PTR, PACKETBUF_FRAG_DISPATCH_SIZE,
((SICSLOWPAN_DISPATCH_FRAGN << 8) | uip_len)); ((SICSLOWPAN_DISPATCH_FRAGN << 8) | uip_len));
packetbuf_payload_len = (MAC_MAX_PAYLOAD - framer_hdrlen - packetbuf_hdr_len) & 0xfffffff8; packetbuf_payload_len = (max_payload - packetbuf_hdr_len) & 0xfffffff8;
while(processed_ip_out_len < uip_len) { while(processed_ip_out_len < uip_len) {
PRINTFO("sicslowpan output: fragment "); PRINTFO("sicslowpan output: fragment ");
PACKETBUF_FRAG_PTR[PACKETBUF_FRAG_OFFSET] = processed_ip_out_len >> 3; PACKETBUF_FRAG_PTR[PACKETBUF_FRAG_OFFSET] = processed_ip_out_len >> 3;

View file

@ -85,6 +85,9 @@ struct llsec_driver {
* filters out injected or replayed frames. * filters out injected or replayed frames.
*/ */
void (* input)(void); void (* input)(void);
/** Returns the security-related overhead per frame in bytes */
uint8_t (* get_overhead)(void);
}; };
#endif /* LLSEC_H_ */ #endif /* LLSEC_H_ */

View file

@ -65,6 +65,8 @@
0x0C , 0x0D , 0x0E , 0x0F } 0x0C , 0x0D , 0x0E , 0x0F }
#endif /* NONCORESEC_CONF_KEY */ #endif /* NONCORESEC_CONF_KEY */
#define SECURITY_HEADER_LENGTH 5
#define DEBUG 0 #define DEBUG 0
#if DEBUG #if DEBUG
#include <stdio.h> #include <stdio.h>
@ -192,6 +194,12 @@ input(void)
NETSTACK_NETWORK.input(); NETSTACK_NETWORK.input();
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
static uint8_t
get_overhead(void)
{
return SECURITY_HEADER_LENGTH + LLSEC802154_MIC_LENGTH;
}
/*---------------------------------------------------------------------------*/
static void static void
bootstrap(llsec_on_bootstrapped_t on_bootstrapped) bootstrap(llsec_on_bootstrapped_t on_bootstrapped)
{ {
@ -205,7 +213,8 @@ const struct llsec_driver noncoresec_driver = {
bootstrap, bootstrap,
send, send,
on_frame_created, on_frame_created,
input input,
get_overhead
}; };
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/

View file

@ -73,12 +73,19 @@ input(void)
NETSTACK_NETWORK.input(); NETSTACK_NETWORK.input();
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
static uint8_t
get_overhead(void)
{
return 0;
}
/*---------------------------------------------------------------------------*/
const struct llsec_driver nullsec_driver = { const struct llsec_driver nullsec_driver = {
"nullsec", "nullsec",
bootstrap, bootstrap,
send, send,
on_frame_created, on_frame_created,
input input,
get_overhead
}; };
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/