cleanup of the code, removing dead core + adding local vars to save some space.
This commit is contained in:
parent
0d3c7edd6c
commit
16c212798f
1 changed files with 73 additions and 104 deletions
|
@ -32,7 +32,7 @@
|
|||
*
|
||||
* This file is part of the Contiki operating system.
|
||||
*
|
||||
* $Id: sicslowpan.c,v 1.40 2010/05/24 10:07:34 joxe Exp $
|
||||
* $Id: sicslowpan.c,v 1.41 2010/05/24 14:28:56 joxe Exp $
|
||||
*/
|
||||
/**
|
||||
* \file
|
||||
|
@ -123,7 +123,6 @@ void uip_log(char *msg);
|
|||
/** \name Pointers in the rime buffer
|
||||
* @{
|
||||
*/
|
||||
/* #define RIME_FRAG_BUF ((struct sicslowpan_frag_hdr *)rime_ptr) */
|
||||
#define RIME_FRAG_PTR (rime_ptr)
|
||||
#define RIME_FRAG_DISPATCH_SIZE 0 /* 16 bit */
|
||||
#define RIME_FRAG_TAG 2 /* 16 bit */
|
||||
|
@ -132,13 +131,11 @@ void uip_log(char *msg);
|
|||
/* define the buffer as a byte array */
|
||||
#define RIME_IPHC_BUF ((uint8_t *)(rime_ptr + rime_hdr_len))
|
||||
|
||||
/* #define RIME_HC1_BUF ((struct sicslowpan_hc1_hdr *)(rime_ptr + rime_hdr_len)) */
|
||||
#define RIME_HC1_PTR (rime_ptr + rime_hdr_len)
|
||||
#define RIME_HC1_DISPATCH 0 /* 8 bit */
|
||||
#define RIME_HC1_ENCODING 1 /* 8 bit */
|
||||
#define RIME_HC1_TTL 2 /* 8 bit */
|
||||
|
||||
/* #define RIME_HC1_HC_UDP_BUF ((struct sicslowpan_hc1_hc_udp_hdr *)(rime_ptr + rime_hdr_len)) */
|
||||
#define RIME_HC1_HC_UDP_PTR (rime_ptr + rime_hdr_len)
|
||||
#define RIME_HC1_HC_UDP_DISPATCH 0 /* 8 bit */
|
||||
#define RIME_HC1_HC_UDP_HC1_ENCODING 1 /* 8 bit */
|
||||
|
@ -147,18 +144,11 @@ void uip_log(char *msg);
|
|||
#define RIME_HC1_HC_UDP_PORTS 4 /* 8 bit */
|
||||
#define RIME_HC1_HC_UDP_CHKSUM 5 /* 16 bit */
|
||||
|
||||
/* #define RIME_IPHC_DISPATCH 0 /\* 8 bit *\/ */
|
||||
/* #define RIME_IPHC_ENCODING1 1 /\* 8 bit *\/ */
|
||||
/* #define RIME_IPHC_ENCODING2 2 /\* 8 bit *\/ */
|
||||
|
||||
/* #define RIME_IP_BUF ((struct uip_ip_hdr *)(rime_ptr + rime_hdr_len)) */
|
||||
/** @} */
|
||||
|
||||
/** \name Pointers in the sicslowpan and uip buffer
|
||||
* @{
|
||||
*/
|
||||
#define SICSLOWPAN_IP_BUF ((struct uip_ip_hdr *)&sicslowpan_buf.u8[UIP_LLH_LEN])
|
||||
#define SICSLOWPAN_UDP_BUF ((struct uip_udp_hdr *)&sicslowpan_buf.u8[UIP_LLIPH_LEN])
|
||||
#define SICSLOWPAN_IP_BUF ((struct uip_ip_hdr *)&sicslowpan_buf[UIP_LLH_LEN])
|
||||
#define SICSLOWPAN_UDP_BUF ((struct uip_udp_hdr *)&sicslowpan_buf[UIP_LLIPH_LEN])
|
||||
|
||||
#define UIP_IP_BUF ((struct uip_ip_hdr *)&uip_buf[UIP_LLH_LEN])
|
||||
#define UIP_UDP_BUF ((struct uip_udp_hdr *)&uip_buf[UIP_LLIPH_LEN])
|
||||
|
@ -215,13 +205,14 @@ static u8_t uncomp_hdr_len;
|
|||
*/
|
||||
|
||||
static u16_t sicslowpan_len;
|
||||
|
||||
/**
|
||||
* The buffer used for the 6lowpan reassembly.
|
||||
* This buffer contains only the IPv6 packet (no MAC header, 6lowpan, etc).
|
||||
* It has a fix size as we do not use dynamic memory allocation.
|
||||
*/
|
||||
|
||||
static uip_buf_t sicslowpan_buf;
|
||||
static uip_buf_t sicslowpan_aligned_buf;
|
||||
#define sicslowpan_buf (sicslowpan_aligned_buf.u8)
|
||||
|
||||
/** The total length of the IPv6 packet in the sicslowpan_buf. */
|
||||
|
||||
|
@ -269,7 +260,6 @@ static struct sicslowpan_addr_context *context;
|
|||
/** pointer to the byte where to write next inline field. */
|
||||
static uint8_t *hc06_ptr;
|
||||
|
||||
|
||||
/*--------------------------------------------------------------------*/
|
||||
/** \name HC06 related functions
|
||||
* @{ */
|
||||
|
@ -306,24 +296,25 @@ addr_context_lookup_by_number(u8_t number) {
|
|||
return NULL;
|
||||
}
|
||||
/*--------------------------------------------------------------------*/
|
||||
static void
|
||||
static uint8_t
|
||||
compress_addr_64(uint8_t bitpos, uip_ipaddr_t *ipaddr, uip_lladdr_t *lladdr) {
|
||||
if(uip_is_addr_mac_addr_based(ipaddr, lladdr)){
|
||||
RIME_IPHC_BUF[1] |= 3 << bitpos; /* 0-bits */
|
||||
return 3 << bitpos; /* 0-bits */
|
||||
} else if(sicslowpan_is_iid_16_bit_compressable(ipaddr)){
|
||||
/* compress IID to 16 bits xxxx::XXXX */
|
||||
RIME_IPHC_BUF[1] |= 2 << bitpos; /* 16-bits */
|
||||
memcpy(hc06_ptr, &ipaddr->u16[7], 2);
|
||||
hc06_ptr += 2;
|
||||
return 2 << bitpos; /* 16-bits */
|
||||
} else {
|
||||
/* do not compress IID => xxxx::IID */
|
||||
RIME_IPHC_BUF[1] |= 1 << bitpos; /* 64-bits */
|
||||
memcpy(hc06_ptr, &ipaddr->u16[4], 8);
|
||||
hc06_ptr += 8;
|
||||
return 1 << bitpos; /* 64-bits */
|
||||
}
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------------*/
|
||||
|
||||
static void
|
||||
uncompress_lladdr(uint8_t mode, uip_ipaddr_t *ipaddr, uip_lladdr_t *lladdr) {
|
||||
switch(mode) {
|
||||
|
@ -399,7 +390,7 @@ uncompress_lladdr(uint8_t mode, uip_ipaddr_t *ipaddr, uip_lladdr_t *lladdr) {
|
|||
static void
|
||||
compress_hdr_hc06(rimeaddr_t *rime_destaddr)
|
||||
{
|
||||
uint8_t tmp;
|
||||
uint8_t tmp, iphc0, iphc1;
|
||||
#if DEBUG
|
||||
PRINTF("before compression: ");
|
||||
for (tmp = 0; tmp < UIP_IP_BUF->len[1] + 40; tmp++) {
|
||||
|
@ -417,8 +408,8 @@ compress_hdr_hc06(rimeaddr_t *rime_destaddr)
|
|||
* this does not work. We therefore reset the IPHC encoding here
|
||||
*/
|
||||
|
||||
RIME_IPHC_BUF[0] = SICSLOWPAN_DISPATCH_IPHC;
|
||||
RIME_IPHC_BUF[1] = 0;
|
||||
iphc0 = SICSLOWPAN_DISPATCH_IPHC;
|
||||
iphc1 = 0;
|
||||
RIME_IPHC_BUF[2] = 0; /* might not be used - but needs to be cleared */
|
||||
|
||||
/*
|
||||
|
@ -435,7 +426,7 @@ compress_hdr_hc06(rimeaddr_t *rime_destaddr)
|
|||
addr_context_lookup_by_prefix(&UIP_IP_BUF->srcipaddr) != NULL) {
|
||||
/* set context flag and increase hc06_ptr */
|
||||
PRINTF("IPHC: compressing dest or src ipaddr - setting CID\n");
|
||||
RIME_IPHC_BUF[1] |= SICSLOWPAN_IPHC_CID;
|
||||
iphc1 |= SICSLOWPAN_IPHC_CID;
|
||||
hc06_ptr++;
|
||||
}
|
||||
|
||||
|
@ -453,11 +444,11 @@ compress_hdr_hc06(rimeaddr_t *rime_destaddr)
|
|||
if(((UIP_IP_BUF->tcflow & 0x0F) == 0) &&
|
||||
(UIP_IP_BUF->flow == 0)) {
|
||||
/* flow label can be compressed */
|
||||
RIME_IPHC_BUF[0] |= SICSLOWPAN_IPHC_FL_C;
|
||||
iphc0 |= SICSLOWPAN_IPHC_FL_C;
|
||||
if(((UIP_IP_BUF->vtc & 0x0F) == 0) &&
|
||||
((UIP_IP_BUF->tcflow & 0xF0) == 0)) {
|
||||
/* compress (elide) all */
|
||||
RIME_IPHC_BUF[0] |= SICSLOWPAN_IPHC_TC_C;
|
||||
iphc0 |= SICSLOWPAN_IPHC_TC_C;
|
||||
} else {
|
||||
/* compress only the flow label */
|
||||
*hc06_ptr = tmp;
|
||||
|
@ -468,7 +459,7 @@ compress_hdr_hc06(rimeaddr_t *rime_destaddr)
|
|||
if(((UIP_IP_BUF->vtc & 0x0F) == 0) &&
|
||||
((UIP_IP_BUF->tcflow & 0xF0) == 0)) {
|
||||
/* compress only traffic class */
|
||||
RIME_IPHC_BUF[0] |= SICSLOWPAN_IPHC_TC_C;
|
||||
iphc0 |= SICSLOWPAN_IPHC_TC_C;
|
||||
*hc06_ptr = (tmp & 0xc0) |
|
||||
(UIP_IP_BUF->tcflow & 0x0F);
|
||||
memcpy(hc06_ptr + 1, &UIP_IP_BUF->flow, 2);
|
||||
|
@ -487,15 +478,15 @@ compress_hdr_hc06(rimeaddr_t *rime_destaddr)
|
|||
/* Next header. We compress it if UDP */
|
||||
#if UIP_CONF_UDP
|
||||
if(UIP_IP_BUF->proto == UIP_PROTO_UDP) {
|
||||
RIME_IPHC_BUF[0] |= SICSLOWPAN_IPHC_NH_C;
|
||||
iphc0 |= SICSLOWPAN_IPHC_NH_C;
|
||||
}
|
||||
#endif /*UIP_CONF_UDP*/
|
||||
#ifdef SICSLOWPAN_NH_COMPRESSOR
|
||||
if(SICSLOWPAN_NH_COMPRESSOR.is_compressable(UIP_IP_BUF->proto)) {
|
||||
RIME_IPHC_BUF[0] |= SICSLOWPAN_IPHC_NH_C;
|
||||
iphc0 |= SICSLOWPAN_IPHC_NH_C;
|
||||
}
|
||||
#endif
|
||||
if ((RIME_IPHC_BUF[0] & SICSLOWPAN_IPHC_NH_C) == 0) {
|
||||
if ((iphc0 & SICSLOWPAN_IPHC_NH_C) == 0) {
|
||||
*hc06_ptr = UIP_IP_BUF->proto;
|
||||
hc06_ptr += 1;
|
||||
}
|
||||
|
@ -509,13 +500,13 @@ compress_hdr_hc06(rimeaddr_t *rime_destaddr)
|
|||
*/
|
||||
switch(UIP_IP_BUF->ttl) {
|
||||
case 1:
|
||||
RIME_IPHC_BUF[0] |= SICSLOWPAN_IPHC_TTL_1;
|
||||
iphc0 |= SICSLOWPAN_IPHC_TTL_1;
|
||||
break;
|
||||
case 64:
|
||||
RIME_IPHC_BUF[0] |= SICSLOWPAN_IPHC_TTL_64;
|
||||
iphc0 |= SICSLOWPAN_IPHC_TTL_64;
|
||||
break;
|
||||
case 255:
|
||||
RIME_IPHC_BUF[0] |= SICSLOWPAN_IPHC_TTL_255;
|
||||
iphc0 |= SICSLOWPAN_IPHC_TTL_255;
|
||||
break;
|
||||
default:
|
||||
*hc06_ptr = UIP_IP_BUF->ttl;
|
||||
|
@ -526,26 +517,26 @@ compress_hdr_hc06(rimeaddr_t *rime_destaddr)
|
|||
/* source address - cannot be multicast */
|
||||
if(uip_is_addr_unspecified(&UIP_IP_BUF->srcipaddr)) {
|
||||
PRINTF("IPHC: compressing unspecified - setting SAC\n");
|
||||
RIME_IPHC_BUF[1] |= SICSLOWPAN_IPHC_SAC;
|
||||
RIME_IPHC_BUF[1] |= SICSLOWPAN_IPHC_SAM_00;
|
||||
iphc1 |= SICSLOWPAN_IPHC_SAC;
|
||||
iphc1 |= SICSLOWPAN_IPHC_SAM_00;
|
||||
} else if((context = addr_context_lookup_by_prefix(&UIP_IP_BUF->srcipaddr))
|
||||
!= NULL) {
|
||||
/* elide the prefix - indicate by CID and set context + SAC */
|
||||
PRINTF("IPHC: compressing src with context - setting CID & SAC ctx: %d\n",
|
||||
context->number);
|
||||
RIME_IPHC_BUF[1] |= SICSLOWPAN_IPHC_CID | SICSLOWPAN_IPHC_SAC;
|
||||
iphc1 |= SICSLOWPAN_IPHC_CID | SICSLOWPAN_IPHC_SAC;
|
||||
RIME_IPHC_BUF[2] |= context->number << 4;
|
||||
/* compession compare with this nodes address (source) */
|
||||
|
||||
compress_addr_64(SICSLOWPAN_IPHC_SAM_BIT,
|
||||
&UIP_IP_BUF->srcipaddr, &uip_lladdr);
|
||||
iphc1 |= compress_addr_64(SICSLOWPAN_IPHC_SAM_BIT,
|
||||
&UIP_IP_BUF->srcipaddr, &uip_lladdr);
|
||||
/* No context found for this address */
|
||||
} else if(uip_is_addr_link_local(&UIP_IP_BUF->srcipaddr)) {
|
||||
compress_addr_64(SICSLOWPAN_IPHC_SAM_BIT,
|
||||
&UIP_IP_BUF->srcipaddr, &uip_lladdr);
|
||||
iphc1 |= compress_addr_64(SICSLOWPAN_IPHC_SAM_BIT,
|
||||
&UIP_IP_BUF->srcipaddr, &uip_lladdr);
|
||||
} else {
|
||||
/* send the full address => SAC = 0, SAM = 00 */
|
||||
RIME_IPHC_BUF[1] |= SICSLOWPAN_IPHC_SAM_00; /* 128-bits */
|
||||
iphc1 |= SICSLOWPAN_IPHC_SAM_00; /* 128-bits */
|
||||
memcpy(hc06_ptr, &UIP_IP_BUF->srcipaddr.u16[0], 16);
|
||||
hc06_ptr += 16;
|
||||
}
|
||||
|
@ -553,26 +544,26 @@ compress_hdr_hc06(rimeaddr_t *rime_destaddr)
|
|||
/* dest address*/
|
||||
if(uip_is_addr_mcast(&UIP_IP_BUF->destipaddr)) {
|
||||
/* Address is multicast, try to compress */
|
||||
RIME_IPHC_BUF[1] |= SICSLOWPAN_IPHC_M;
|
||||
iphc1 |= SICSLOWPAN_IPHC_M;
|
||||
if(sicslowpan_is_mcast_addr_compressable8(&UIP_IP_BUF->destipaddr)) {
|
||||
RIME_IPHC_BUF[1] |= SICSLOWPAN_IPHC_DAM_11;
|
||||
iphc1 |= SICSLOWPAN_IPHC_DAM_11;
|
||||
/* use last byte */
|
||||
*hc06_ptr = UIP_IP_BUF->destipaddr.u8[15];
|
||||
hc06_ptr += 1;
|
||||
} else if(sicslowpan_is_mcast_addr_compressable32(&UIP_IP_BUF->destipaddr)){
|
||||
RIME_IPHC_BUF[1] |= SICSLOWPAN_IPHC_DAM_10;
|
||||
iphc1 |= SICSLOWPAN_IPHC_DAM_10;
|
||||
/* second byte + the last three */
|
||||
*hc06_ptr = UIP_IP_BUF->destipaddr.u8[1];
|
||||
memcpy(hc06_ptr + 1, &UIP_IP_BUF->destipaddr.u8[13], 3);
|
||||
hc06_ptr += 4;
|
||||
} else if(sicslowpan_is_mcast_addr_compressable48(&UIP_IP_BUF->destipaddr)){
|
||||
RIME_IPHC_BUF[1] |= SICSLOWPAN_IPHC_DAM_01;
|
||||
iphc1 |= SICSLOWPAN_IPHC_DAM_01;
|
||||
/* second byte + the last five */
|
||||
*hc06_ptr = UIP_IP_BUF->destipaddr.u8[1];
|
||||
memcpy(hc06_ptr + 1, &UIP_IP_BUF->destipaddr.u8[11], 5);
|
||||
hc06_ptr += 6;
|
||||
} else {
|
||||
RIME_IPHC_BUF[1] |= SICSLOWPAN_IPHC_DAM_00;
|
||||
iphc1 |= SICSLOWPAN_IPHC_DAM_00;
|
||||
/* full address */
|
||||
memcpy(hc06_ptr, &UIP_IP_BUF->destipaddr.u8[0], 16);
|
||||
hc06_ptr += 16;
|
||||
|
@ -581,19 +572,19 @@ compress_hdr_hc06(rimeaddr_t *rime_destaddr)
|
|||
/* Address is unicast, try to compress */
|
||||
if((context = addr_context_lookup_by_prefix(&UIP_IP_BUF->destipaddr)) != NULL) {
|
||||
/* elide the prefix */
|
||||
RIME_IPHC_BUF[1] |= SICSLOWPAN_IPHC_DAC;
|
||||
iphc1 |= SICSLOWPAN_IPHC_DAC;
|
||||
RIME_IPHC_BUF[2] |= context->number;
|
||||
/* compession compare with link adress (destination) */
|
||||
|
||||
compress_addr_64(SICSLOWPAN_IPHC_DAM_BIT,
|
||||
&UIP_IP_BUF->destipaddr, (uip_lladdr_t *)rime_destaddr);
|
||||
iphc1 |= compress_addr_64(SICSLOWPAN_IPHC_DAM_BIT,
|
||||
&UIP_IP_BUF->destipaddr, (uip_lladdr_t *)rime_destaddr);
|
||||
/* No context found for this address */
|
||||
} else if(uip_is_addr_link_local(&UIP_IP_BUF->destipaddr)) {
|
||||
compress_addr_64(SICSLOWPAN_IPHC_DAM_BIT,
|
||||
&UIP_IP_BUF->destipaddr, (uip_lladdr_t *)rime_destaddr);
|
||||
iphc1 |= compress_addr_64(SICSLOWPAN_IPHC_DAM_BIT,
|
||||
&UIP_IP_BUF->destipaddr, (uip_lladdr_t *)rime_destaddr);
|
||||
} else {
|
||||
/* send the full address */
|
||||
RIME_IPHC_BUF[1] |= SICSLOWPAN_IPHC_DAM_00; /* 128-bits */
|
||||
iphc1 |= SICSLOWPAN_IPHC_DAM_00; /* 128-bits */
|
||||
memcpy(hc06_ptr, &UIP_IP_BUF->destipaddr.u16[0], 16);
|
||||
hc06_ptr += 16;
|
||||
}
|
||||
|
@ -651,10 +642,16 @@ compress_hdr_hc06(rimeaddr_t *rime_destaddr)
|
|||
uncomp_hdr_len += UIP_UDPH_LEN;
|
||||
}
|
||||
#endif /*UIP_CONF_UDP*/
|
||||
|
||||
#ifdef SICSLOWPAN_NH_COMPRESSOR
|
||||
/* if nothing to compress just return zero */
|
||||
hc06_ptr += SICSLOWPAN_NH_COMPRESSOR.compress(hc06_ptr, &uncomp_hdr_len);
|
||||
#endif
|
||||
|
||||
/* before the rime_hdr_len operation */
|
||||
RIME_IPHC_BUF[0] = iphc0;
|
||||
RIME_IPHC_BUF[1] = iphc1;
|
||||
|
||||
rime_hdr_len = hc06_ptr - rime_ptr;
|
||||
return;
|
||||
}
|
||||
|
@ -678,20 +675,23 @@ compress_hdr_hc06(rimeaddr_t *rime_destaddr)
|
|||
|
||||
static void
|
||||
uncompress_hdr_hc06(u16_t ip_len) {
|
||||
uint8_t tmp;
|
||||
uint8_t tmp, iphc0, iphc1;
|
||||
/* at least two byte will be used for the encoding */
|
||||
hc06_ptr = rime_ptr + rime_hdr_len + 2;
|
||||
|
||||
iphc0 = RIME_IPHC_BUF[0];
|
||||
iphc1 = RIME_IPHC_BUF[1];
|
||||
|
||||
/* another if the CID flag is set */
|
||||
if(RIME_IPHC_BUF[1] & SICSLOWPAN_IPHC_CID) {
|
||||
if(iphc1 & SICSLOWPAN_IPHC_CID) {
|
||||
PRINTF("IPHC: CID flag set - increase header with one\n");
|
||||
hc06_ptr++;
|
||||
}
|
||||
|
||||
/* Traffic class and flow label */
|
||||
if((RIME_IPHC_BUF[0] & SICSLOWPAN_IPHC_FL_C) == 0) {
|
||||
if((iphc0 & SICSLOWPAN_IPHC_FL_C) == 0) {
|
||||
/* Flow label are carried inline */
|
||||
if((RIME_IPHC_BUF[0] & SICSLOWPAN_IPHC_TC_C) == 0) {
|
||||
if((iphc0 & SICSLOWPAN_IPHC_TC_C) == 0) {
|
||||
/* Traffic class is carried inline */
|
||||
memcpy(&SICSLOWPAN_IP_BUF->tcflow, hc06_ptr + 1, 3);
|
||||
tmp = *hc06_ptr;
|
||||
|
@ -714,7 +714,7 @@ uncompress_hdr_hc06(u16_t ip_len) {
|
|||
} else {
|
||||
/* Version is always 6! */
|
||||
/* Version and flow label are compressed */
|
||||
if((RIME_IPHC_BUF[0] & SICSLOWPAN_IPHC_TC_C) == 0) {
|
||||
if((iphc0 & SICSLOWPAN_IPHC_TC_C) == 0) {
|
||||
/* Traffic class is inline */
|
||||
SICSLOWPAN_IP_BUF->vtc = 0x60 | ((*hc06_ptr >> 2) & 0x0f);
|
||||
SICSLOWPAN_IP_BUF->tcflow = ((*hc06_ptr << 6) & 0xC0) | ((*hc06_ptr >> 2) & 0x30);
|
||||
|
@ -729,7 +729,7 @@ uncompress_hdr_hc06(u16_t ip_len) {
|
|||
}
|
||||
|
||||
/* Next Header */
|
||||
if((RIME_IPHC_BUF[0] & SICSLOWPAN_IPHC_NH_C) == 0) {
|
||||
if((iphc0 & SICSLOWPAN_IPHC_NH_C) == 0) {
|
||||
/* Next header is carried inline */
|
||||
SICSLOWPAN_IP_BUF->proto = *hc06_ptr;
|
||||
PRINTF("IPHC: next header inline: %d\n", SICSLOWPAN_IP_BUF->proto);
|
||||
|
@ -737,7 +737,7 @@ uncompress_hdr_hc06(u16_t ip_len) {
|
|||
}
|
||||
|
||||
/* Hop limit */
|
||||
switch(RIME_IPHC_BUF[0] & 0x03) {
|
||||
switch(iphc0 & 0x03) {
|
||||
case SICSLOWPAN_IPHC_TTL_1:
|
||||
SICSLOWPAN_IP_BUF->ttl = 1;
|
||||
break;
|
||||
|
@ -754,12 +754,12 @@ uncompress_hdr_hc06(u16_t ip_len) {
|
|||
}
|
||||
|
||||
/* context based compression */
|
||||
if(RIME_IPHC_BUF[1] & SICSLOWPAN_IPHC_SAC) {
|
||||
uint8_t sci = (RIME_IPHC_BUF[1] & SICSLOWPAN_IPHC_CID) ?
|
||||
if(iphc1 & SICSLOWPAN_IPHC_SAC) {
|
||||
uint8_t sci = (iphc1 & SICSLOWPAN_IPHC_CID) ?
|
||||
RIME_IPHC_BUF[2] >> 4 : 0;
|
||||
|
||||
/* Source address */
|
||||
if((RIME_IPHC_BUF[1] & SICSLOWPAN_IPHC_SAM_11) != SICSLOWPAN_IPHC_SAM_00) {
|
||||
if((iphc1 & SICSLOWPAN_IPHC_SAM_11) != SICSLOWPAN_IPHC_SAM_00) {
|
||||
context =
|
||||
addr_context_lookup_by_number(sci);
|
||||
if(context == NULL) {
|
||||
|
@ -770,7 +770,7 @@ uncompress_hdr_hc06(u16_t ip_len) {
|
|||
}
|
||||
}
|
||||
|
||||
switch(RIME_IPHC_BUF[1] & SICSLOWPAN_IPHC_SAM_11) {
|
||||
switch(iphc1 & SICSLOWPAN_IPHC_SAM_11) {
|
||||
case SICSLOWPAN_IPHC_SAM_00:
|
||||
/* copy the unspecificed address */
|
||||
PRINTF("IPHC: unspecified address\n");
|
||||
|
@ -802,20 +802,20 @@ uncompress_hdr_hc06(u16_t ip_len) {
|
|||
/* end context based compression */
|
||||
} else {
|
||||
/* no compression and link local */
|
||||
uncompress_lladdr((RIME_IPHC_BUF[1] & SICSLOWPAN_IPHC_SAM_11) >> SICSLOWPAN_IPHC_SAM_BIT,
|
||||
uncompress_lladdr((iphc1 & SICSLOWPAN_IPHC_SAM_11) >> SICSLOWPAN_IPHC_SAM_BIT,
|
||||
&SICSLOWPAN_IP_BUF->srcipaddr, (uip_lladdr_t *)packetbuf_addr(PACKETBUF_ADDR_SENDER));
|
||||
}
|
||||
|
||||
/* Destination address */
|
||||
|
||||
/* multicast compression */
|
||||
if(RIME_IPHC_BUF[1] & SICSLOWPAN_IPHC_M) {
|
||||
if(iphc1 & SICSLOWPAN_IPHC_M) {
|
||||
/* context based multicast compression */
|
||||
if(RIME_IPHC_BUF[1] & SICSLOWPAN_IPHC_DAC) {
|
||||
if(iphc1 & SICSLOWPAN_IPHC_DAC) {
|
||||
/* TODO: implement this */
|
||||
} else {
|
||||
/* non-context based multicast compression */
|
||||
switch (RIME_IPHC_BUF[1] & SICSLOWPAN_IPHC_DAM_11) {
|
||||
switch (iphc1 & SICSLOWPAN_IPHC_DAM_11) {
|
||||
case SICSLOWPAN_IPHC_DAM_00: /* 128 bits */
|
||||
/* copy whole address from packet */
|
||||
memcpy(&SICSLOWPAN_IP_BUF->destipaddr.u8[0], hc06_ptr, 16);
|
||||
|
@ -847,8 +847,8 @@ uncompress_hdr_hc06(u16_t ip_len) {
|
|||
} else {
|
||||
/* no multicast */
|
||||
/* Context based */
|
||||
if(RIME_IPHC_BUF[1] & SICSLOWPAN_IPHC_DAC) {
|
||||
uint8_t dci = (RIME_IPHC_BUF[1] & SICSLOWPAN_IPHC_CID) ?
|
||||
if(iphc1 & SICSLOWPAN_IPHC_DAC) {
|
||||
uint8_t dci = (iphc1 & SICSLOWPAN_IPHC_CID) ?
|
||||
RIME_IPHC_BUF[2] & 0x0f : 0;
|
||||
context = addr_context_lookup_by_number(dci);
|
||||
|
||||
|
@ -858,7 +858,7 @@ uncompress_hdr_hc06(u16_t ip_len) {
|
|||
return;
|
||||
}
|
||||
|
||||
switch (RIME_IPHC_BUF[1] & SICSLOWPAN_IPHC_DAM_11) {
|
||||
switch (iphc1 & SICSLOWPAN_IPHC_DAM_11) {
|
||||
case SICSLOWPAN_IPHC_DAM_01: /* 64 bits */
|
||||
/* copy prefix from context - rest from packet */
|
||||
memcpy(&SICSLOWPAN_IP_BUF->destipaddr, context->prefix, 8);
|
||||
|
@ -882,14 +882,14 @@ uncompress_hdr_hc06(u16_t ip_len) {
|
|||
}
|
||||
} else {
|
||||
/* not context based => link local M = 0, DAC = 0 - same as SAC */
|
||||
uncompress_lladdr((RIME_IPHC_BUF[1] & SICSLOWPAN_IPHC_DAM_11) >> SICSLOWPAN_IPHC_DAM_BIT,
|
||||
uncompress_lladdr((iphc1 & SICSLOWPAN_IPHC_DAM_11) >> SICSLOWPAN_IPHC_DAM_BIT,
|
||||
&SICSLOWPAN_IP_BUF->destipaddr, (uip_lladdr_t *)packetbuf_addr(PACKETBUF_ADDR_RECEIVER));
|
||||
}
|
||||
}
|
||||
uncomp_hdr_len += UIP_IPH_LEN;
|
||||
|
||||
/* Next header processing - continued */
|
||||
if((RIME_IPHC_BUF[0] & SICSLOWPAN_IPHC_NH_C)) {
|
||||
if((iphc0 & SICSLOWPAN_IPHC_NH_C)) {
|
||||
/* The next header is compressed, NHC is following */
|
||||
if((*hc06_ptr & SICSLOWPAN_NHC_UDP_MASK) == SICSLOWPAN_NHC_UDP_ID) {
|
||||
uint8_t checksum_compressed;
|
||||
|
@ -1071,24 +1071,19 @@ compress_hdr_hc1(rimeaddr_t *rime_destaddr)
|
|||
* All fields in the IP header but Hop Limit are elided
|
||||
* If next header is UDP, we compress UDP header using HC2
|
||||
*/
|
||||
/* RIME_HC1_BUF->dispatch = SICSLOWPAN_DISPATCH_HC1; */
|
||||
RIME_HC1_PTR[RIME_HC1_DISPATCH] = SICSLOWPAN_DISPATCH_HC1;
|
||||
uncomp_hdr_len += UIP_IPH_LEN;
|
||||
switch(UIP_IP_BUF->proto) {
|
||||
case UIP_PROTO_ICMP6:
|
||||
/* HC1 encoding and ttl */
|
||||
/* RIME_HC1_BUF->encoding = 0xFC; */
|
||||
RIME_HC1_PTR[RIME_HC1_ENCODING] = 0xFC;
|
||||
/* RIME_HC1_BUF->ttl = UIP_IP_BUF->ttl; */
|
||||
RIME_HC1_PTR[RIME_HC1_TTL] = UIP_IP_BUF->ttl;
|
||||
rime_hdr_len += SICSLOWPAN_HC1_HDR_LEN;
|
||||
break;
|
||||
#if UIP_CONF_TCP
|
||||
case UIP_PROTO_TCP:
|
||||
/* HC1 encoding and ttl */
|
||||
/* RIME_HC1_BUF->encoding = 0xFE; */
|
||||
RIME_HC1_PTR[RIME_HC1_ENCODING] = 0xFE;
|
||||
/* RIME_HC1_BUF->ttl = UIP_IP_BUF->ttl; */
|
||||
RIME_HC1_PTR[RIME_HC1_TTL] = UIP_IP_BUF->ttl;
|
||||
rime_hdr_len += SICSLOWPAN_HC1_HDR_LEN;
|
||||
break;
|
||||
|
@ -1106,30 +1101,22 @@ compress_hdr_hc1(rimeaddr_t *rime_destaddr)
|
|||
HTONS(UIP_UDP_BUF->destport) >= SICSLOWPAN_UDP_PORT_MIN &&
|
||||
HTONS(UIP_UDP_BUF->destport) < SICSLOWPAN_UDP_PORT_MAX) {
|
||||
/* HC1 encoding */
|
||||
/* RIME_HC1_HC_UDP_BUF->hc1_encoding = 0xFB; */
|
||||
RIME_HC1_HC_UDP_PTR[RIME_HC1_HC_UDP_HC1_ENCODING] = 0xFB;
|
||||
|
||||
/* HC_UDP encoding, ttl, src and dest ports, checksum */
|
||||
/* RIME_HC1_HC_UDP_BUF->hc_udp_encoding = 0xE0; */
|
||||
RIME_HC1_HC_UDP_PTR[RIME_HC1_HC_UDP_UDP_ENCODING] = 0xE0;
|
||||
/* RIME_HC1_HC_UDP_BUF->ttl = UIP_IP_BUF->ttl; */
|
||||
RIME_HC1_HC_UDP_PTR[RIME_HC1_HC_UDP_TTL] = UIP_IP_BUF->ttl;
|
||||
/* RIME_HC1_HC_UDP_BUF->ports = (u8_t)((HTONS(UIP_UDP_BUF->srcport) - */
|
||||
/* SICSLOWPAN_UDP_PORT_MIN) << 4) + */
|
||||
/* (u8_t)((HTONS(UIP_UDP_BUF->destport) - SICSLOWPAN_UDP_PORT_MIN)); */
|
||||
|
||||
RIME_HC1_HC_UDP_PTR[RIME_HC1_HC_UDP_PORTS] =
|
||||
(u8_t)((HTONS(UIP_UDP_BUF->srcport) -
|
||||
SICSLOWPAN_UDP_PORT_MIN) << 4) +
|
||||
(u8_t)((HTONS(UIP_UDP_BUF->destport) - SICSLOWPAN_UDP_PORT_MIN));
|
||||
/* RIME_HC1_HC_UDP_BUF->udpchksum = UIP_UDP_BUF->udpchksum; */
|
||||
memcpy(&RIME_HC1_HC_UDP_PTR[RIME_HC1_HC_UDP_CHKSUM], &UIP_UDP_BUF->udpchksum, 2);
|
||||
rime_hdr_len += SICSLOWPAN_HC1_HC_UDP_HDR_LEN;
|
||||
uncomp_hdr_len += UIP_UDPH_LEN;
|
||||
} else {
|
||||
/* HC1 encoding and ttl */
|
||||
/* RIME_HC1_BUF->encoding = 0xFA; */
|
||||
RIME_HC1_PTR[RIME_HC1_ENCODING] = 0xFA;
|
||||
/* RIME_HC1_BUF->ttl = UIP_IP_BUF->ttl; */
|
||||
RIME_HC1_PTR[RIME_HC1_TTL] = UIP_IP_BUF->ttl;
|
||||
rime_hdr_len += SICSLOWPAN_HC1_HDR_LEN;
|
||||
}
|
||||
|
@ -1174,18 +1161,15 @@ uncompress_hdr_hc1(u16_t ip_len) {
|
|||
uncomp_hdr_len += UIP_IPH_LEN;
|
||||
|
||||
/* Next header field */
|
||||
/* switch(RIME_HC1_BUF->encoding & 0x06) { */
|
||||
switch(RIME_HC1_PTR[RIME_HC1_ENCODING] & 0x06) {
|
||||
case SICSLOWPAN_HC1_NH_ICMP6:
|
||||
SICSLOWPAN_IP_BUF->proto = UIP_PROTO_ICMP6;
|
||||
/* SICSLOWPAN_IP_BUF->ttl = RIME_HC1_BUF->ttl; */
|
||||
SICSLOWPAN_IP_BUF->ttl = RIME_HC1_PTR[RIME_HC1_TTL];
|
||||
rime_hdr_len += SICSLOWPAN_HC1_HDR_LEN;
|
||||
break;
|
||||
#if UIP_CONF_TCP
|
||||
case SICSLOWPAN_HC1_NH_TCP:
|
||||
SICSLOWPAN_IP_BUF->proto = UIP_PROTO_TCP;
|
||||
/* SICSLOWPAN_IP_BUF->ttl = RIME_HC1_BUF->ttl; */
|
||||
SICSLOWPAN_IP_BUF->ttl = RIME_HC1_PTR[RIME_HC1_TTL];
|
||||
rime_hdr_len += SICSLOWPAN_HC1_HDR_LEN;
|
||||
break;
|
||||
|
@ -1193,30 +1177,22 @@ uncompress_hdr_hc1(u16_t ip_len) {
|
|||
#if UIP_CONF_UDP
|
||||
case SICSLOWPAN_HC1_NH_UDP:
|
||||
SICSLOWPAN_IP_BUF->proto = UIP_PROTO_UDP;
|
||||
/* if(RIME_HC1_HC_UDP_BUF->hc1_encoding & 0x01) { */
|
||||
if(RIME_HC1_HC_UDP_PTR[RIME_HC1_HC_UDP_HC1_ENCODING] & 0x01) {
|
||||
/* UDP header is compressed with HC_UDP */
|
||||
/* if(RIME_HC1_HC_UDP_BUF->hc_udp_encoding != */
|
||||
if(RIME_HC1_HC_UDP_PTR[RIME_HC1_HC_UDP_UDP_ENCODING] !=
|
||||
SICSLOWPAN_HC_UDP_ALL_C) {
|
||||
PRINTF("sicslowpan (uncompress_hdr), packet not supported");
|
||||
return;
|
||||
}
|
||||
/* IP TTL */
|
||||
/* SICSLOWPAN_IP_BUF->ttl = RIME_HC1_HC_UDP_BUF->ttl; */
|
||||
SICSLOWPAN_IP_BUF->ttl = RIME_HC1_HC_UDP_PTR[RIME_HC1_HC_UDP_TTL];
|
||||
/* UDP ports, len, checksum */
|
||||
/* SICSLOWPAN_UDP_BUF->srcport = HTONS(SICSLOWPAN_UDP_PORT_MIN + */
|
||||
/* (RIME_HC1_HC_UDP_BUF->ports >> 4)); */
|
||||
SICSLOWPAN_UDP_BUF->srcport =
|
||||
HTONS(SICSLOWPAN_UDP_PORT_MIN +
|
||||
(RIME_HC1_HC_UDP_PTR[RIME_HC1_HC_UDP_PORTS] >> 4));
|
||||
/* SICSLOWPAN_UDP_BUF->destport = HTONS(SICSLOWPAN_UDP_PORT_MIN + */
|
||||
/* (RIME_HC1_HC_UDP_BUF->ports & 0x0F)); */
|
||||
SICSLOWPAN_UDP_BUF->destport =
|
||||
HTONS(SICSLOWPAN_UDP_PORT_MIN +
|
||||
(RIME_HC1_HC_UDP_PTR[RIME_HC1_HC_UDP_PORTS] & 0x0F));
|
||||
/* SICSLOWPAN_UDP_BUF->udpchksum = RIME_HC1_HC_UDP_BUF->udpchksum; */
|
||||
memcpy(&SICSLOWPAN_UDP_BUF->udpchksum, &RIME_HC1_HC_UDP_PTR[RIME_HC1_HC_UDP_CHKSUM], 2);
|
||||
uncomp_hdr_len += UIP_UDPH_LEN;
|
||||
rime_hdr_len += SICSLOWPAN_HC1_HC_UDP_HDR_LEN;
|
||||
|
@ -1440,7 +1416,6 @@ output(uip_lladdr_t *localdest)
|
|||
rime_payload_len = (MAC_MAX_PAYLOAD - rime_hdr_len) & 0xf8;
|
||||
while(processed_ip_len < uip_len){
|
||||
PRINTFO("sicslowpan output: fragment ");
|
||||
/* RIME_FRAG_BUF->offset = processed_ip_len >> 3; */
|
||||
RIME_FRAG_PTR[RIME_FRAG_OFFSET] = processed_ip_len >> 3;
|
||||
|
||||
/* Copy payload and send */
|
||||
|
@ -1527,7 +1502,6 @@ input(void)
|
|||
* Since we don't support the mesh and broadcast header, the first header
|
||||
* we look for is the fragmentation header
|
||||
*/
|
||||
/* switch((ntohs(RIME_FRAG_BUF->dispatch_size) & 0xf800) >> 8) { */
|
||||
switch((GET16(RIME_FRAG_PTR, RIME_FRAG_DISPATCH_SIZE) & 0xf800) >> 8) {
|
||||
case SICSLOWPAN_DISPATCH_FRAG1:
|
||||
PRINTFI("sicslowpan input: FRAG1 ");
|
||||
|
@ -1547,11 +1521,8 @@ input(void)
|
|||
* Offset is in units of 8 bytes
|
||||
*/
|
||||
PRINTFI("sicslowpan input: FRAGN ");
|
||||
/* frag_offset = RIME_FRAG_BUF->offset; */
|
||||
frag_offset = RIME_FRAG_PTR[RIME_FRAG_OFFSET];
|
||||
/* frag_tag = ntohs(RIME_FRAG_BUF->tag); */
|
||||
frag_tag = GET16(RIME_FRAG_PTR, RIME_FRAG_TAG);
|
||||
/* frag_size = (ntohs(RIME_FRAG_BUF->dispatch_size) & 0x07ff); */
|
||||
frag_size = GET16(RIME_FRAG_PTR, RIME_FRAG_DISPATCH_SIZE) & 0x07ff;
|
||||
PRINTFI("size %d, tag %d, offset %d)\n",
|
||||
frag_size, frag_tag, frag_offset);
|
||||
|
@ -1598,7 +1569,6 @@ input(void)
|
|||
#endif /* SICSLOWPAN_CONF_FRAG */
|
||||
|
||||
/* Process next dispatch and headers */
|
||||
/* switch(RIME_HC1_BUF->dispatch) { */
|
||||
#if SICSLOWPAN_COMPRESSION == SICSLOWPAN_COMPRESSION_HC06
|
||||
if((RIME_HC1_PTR[RIME_HC1_DISPATCH] & 0xe0) == SICSLOWPAN_DISPATCH_IPHC) {
|
||||
PRINTFI("sicslowpan input: IPHC\n");
|
||||
|
@ -1625,7 +1595,6 @@ input(void)
|
|||
break;
|
||||
default:
|
||||
/* unknown header */
|
||||
/* PRINTF("sicslowpan input: unknown dispatch\n"); */
|
||||
PRINTFI("sicslowpan input: unknown dispatch: %u\n",
|
||||
RIME_HC1_PTR[RIME_HC1_DISPATCH]);
|
||||
return;
|
||||
|
|
Loading…
Reference in a new issue