Fix TC/FL errors in hc-06. Need to verify further

This commit is contained in:
c_oflynn 2010-03-09 16:19:44 +00:00
parent 48a9bff889
commit dc3e6c1877

View File

@ -32,7 +32,7 @@
* *
* This file is part of the Contiki operating system. * This file is part of the Contiki operating system.
* *
* $Id: sicslowpan.c,v 1.22 2010/03/09 15:18:03 c_oflynn Exp $ * $Id: sicslowpan.c,v 1.23 2010/03/09 16:19:44 c_oflynn Exp $
*/ */
/** /**
* \file * \file
@ -51,8 +51,7 @@
* -Add compression options to UDP, currently only supports * -Add compression options to UDP, currently only supports
* both ports compressed or both ports elided * both ports compressed or both ports elided
* *
* -Fix traffic class/flow/ECN/DCSP processing, doesn't work * -Verify TC/FL compression works
* per hc-06
* *
* -Add stateless multicast option * -Add stateless multicast option
*/ */
@ -640,15 +639,15 @@ uncompress_hdr_hc06(u16_t ip_len) {
/* Flow label are carried inline */ /* Flow label are carried inline */
if((RIME_IPHC_BUF[0] & SICSLOWPAN_IPHC_TC_C) == 0) { if((RIME_IPHC_BUF[0] & SICSLOWPAN_IPHC_TC_C) == 0) {
/* Traffic class is carried inline */ /* Traffic class is carried inline */
memcpy(&SICSLOWPAN_IP_BUF->vtc, hc06_ptr + 1, 3); memcpy(&SICSLOWPAN_IP_BUF->tcflow, hc06_ptr + 1, 3);
tmp = *hc06_ptr; tmp = *hc06_ptr;
hc06_ptr += 4; hc06_ptr += 4;
/* hc06 format of tc is ECN | DSCP , original is DSCP | ECN */ /* hc06 format of tc is ECN | DSCP , original is DSCP | ECN */
/* set version, pick highest DSCP bits and set in vtc */ /* set version, pick highest DSCP bits and set in vtc */
UIP_IP_BUF->vtc = 0x60 | ((tmp >> 2) & 0x0f); SICSLOWPAN_IP_BUF->vtc = 0x60 | ((tmp >> 2) & 0x0f);
/* ECN rolled down two steps + lowest DSCP bits at top two bits */ /* ECN rolled down two steps + lowest DSCP bits at top two bits */
UIP_IP_BUF->tcflow = ((tmp >> 2) & 0x30) | (tmp << 6) | SICSLOWPAN_IP_BUF->tcflow = ((tmp >> 2) & 0x30) | (tmp << 6) |
(UIP_IP_BUF->tcflow & 0x0f); (SICSLOWPAN_IP_BUF->tcflow & 0x0f);
} else { } else {
/* Traffic class is compressed (set version and no TC)*/ /* Traffic class is compressed (set version and no TC)*/
SICSLOWPAN_IP_BUF->vtc = 0x60; SICSLOWPAN_IP_BUF->vtc = 0x60;
@ -664,15 +663,16 @@ uncompress_hdr_hc06(u16_t ip_len) {
if((RIME_IPHC_BUF[0] & SICSLOWPAN_IPHC_TC_C) == 0) { if((RIME_IPHC_BUF[0] & SICSLOWPAN_IPHC_TC_C) == 0) {
/* Traffic class is inline */ /* Traffic class is inline */
SICSLOWPAN_IP_BUF->vtc = 0x60 | ((*hc06_ptr >> 2) & 0x0f); SICSLOWPAN_IP_BUF->vtc = 0x60 | ((*hc06_ptr >> 2) & 0x0f);
SICSLOWPAN_IP_BUF->tcflow = ((*hc06_ptr >> 2) | (*hc06_ptr << 6)) & 0xf0; SICSLOWPAN_IP_BUF->tcflow = ((*hc06_ptr << 6) & 0xC0) | ((*hc06_ptr >> 2) & 0x30);
hc06_ptr += 1; SICSLOWPAN_IP_BUF->flow = 0;
hc06_ptr += 3;
} else { } else {
/* Traffic class is compressed */ /* Traffic class is compressed */
SICSLOWPAN_IP_BUF->vtc = 0x60; SICSLOWPAN_IP_BUF->vtc = 0x60;
SICSLOWPAN_IP_BUF->tcflow = 0; SICSLOWPAN_IP_BUF->tcflow = 0;
}
SICSLOWPAN_IP_BUF->flow = 0; SICSLOWPAN_IP_BUF->flow = 0;
} }
}
/* Next Header */ /* Next Header */
if((RIME_IPHC_BUF[0] & SICSLOWPAN_IPHC_NH_C) == 0) { if((RIME_IPHC_BUF[0] & SICSLOWPAN_IPHC_NH_C) == 0) {