Added a safeguard to fragmentation reassembly: if there are additional bytes in the final fragment, we shave them off in the spirit of being 'liberal in what we accept'
This commit is contained in:
parent
bfc314a037
commit
f7a3a8476f
1 changed files with 21 additions and 2 deletions
|
@ -1486,7 +1486,7 @@ input(void)
|
||||||
#if SICSLOWPAN_CONF_FRAG
|
#if SICSLOWPAN_CONF_FRAG
|
||||||
/* tag of the fragment */
|
/* tag of the fragment */
|
||||||
uint16_t frag_tag = 0;
|
uint16_t frag_tag = 0;
|
||||||
uint8_t first_fragment = 0;
|
uint8_t first_fragment = 0, last_fragment = 0;
|
||||||
#endif /*SICSLOWPAN_CONF_FRAG*/
|
#endif /*SICSLOWPAN_CONF_FRAG*/
|
||||||
|
|
||||||
/* init */
|
/* init */
|
||||||
|
@ -1532,6 +1532,15 @@ input(void)
|
||||||
PRINTFI("size %d, tag %d, offset %d)\n",
|
PRINTFI("size %d, tag %d, offset %d)\n",
|
||||||
frag_size, frag_tag, frag_offset);
|
frag_size, frag_tag, frag_offset);
|
||||||
rime_hdr_len += SICSLOWPAN_FRAGN_HDR_LEN;
|
rime_hdr_len += SICSLOWPAN_FRAGN_HDR_LEN;
|
||||||
|
|
||||||
|
/* If this is the last fragment, we may shave off any extrenous
|
||||||
|
bytes at the end. We must be liberal in what we accept. */
|
||||||
|
PRINTFI("last_fragment?: processed_ip_len %d rime_payload_len %d frag_size %d\n",
|
||||||
|
processed_ip_len, packetbuf_datalen() - rime_hdr_len, frag_size);
|
||||||
|
|
||||||
|
if(processed_ip_len + packetbuf_datalen() - rime_hdr_len >= frag_size) {
|
||||||
|
last_fragment = 1;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -1631,7 +1640,15 @@ input(void)
|
||||||
if(first_fragment != 0) {
|
if(first_fragment != 0) {
|
||||||
processed_ip_len += uncomp_hdr_len;
|
processed_ip_len += uncomp_hdr_len;
|
||||||
}
|
}
|
||||||
|
/* For the last fragment, we are OK if there is extrenous bytes at
|
||||||
|
the end of the packet. */
|
||||||
|
if(last_fragment != 0) {
|
||||||
|
processed_ip_len = frag_size;
|
||||||
|
} else {
|
||||||
processed_ip_len += rime_payload_len;
|
processed_ip_len += rime_payload_len;
|
||||||
|
}
|
||||||
|
PRINTF("processed_ip_len %d, rime_payload_len %d\n", processed_ip_len, rime_payload_len);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
#endif /* SICSLOWPAN_CONF_FRAG */
|
#endif /* SICSLOWPAN_CONF_FRAG */
|
||||||
sicslowpan_len = rime_payload_len + uncomp_hdr_len;
|
sicslowpan_len = rime_payload_len + uncomp_hdr_len;
|
||||||
|
@ -1642,6 +1659,8 @@ input(void)
|
||||||
* If we have a full IP packet in sicslowpan_buf, deliver it to
|
* If we have a full IP packet in sicslowpan_buf, deliver it to
|
||||||
* the IP stack
|
* the IP stack
|
||||||
*/
|
*/
|
||||||
|
PRINTF("sicslowpan_init processed_ip_len %d, sicslowpan_len %d\n",
|
||||||
|
processed_ip_len, sicslowpan_len);
|
||||||
if(processed_ip_len == 0 || (processed_ip_len == sicslowpan_len)) {
|
if(processed_ip_len == 0 || (processed_ip_len == sicslowpan_len)) {
|
||||||
PRINTFI("sicslowpan input: IP packet ready (length %d)\n",
|
PRINTFI("sicslowpan input: IP packet ready (length %d)\n",
|
||||||
sicslowpan_len);
|
sicslowpan_len);
|
||||||
|
|
Loading…
Reference in a new issue