refactoring of hc06 code

This commit is contained in:
joxe 2010-03-16 10:21:04 +00:00
parent 0299aab5e4
commit 453cf7f2e6
2 changed files with 79 additions and 125 deletions

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.28 2010/03/15 16:41:24 joxe Exp $ * $Id: sicslowpan.c,v 1.29 2010/03/16 10:21:04 joxe Exp $
*/ */
/** /**
* \file * \file
@ -255,10 +255,10 @@ addr_contexts[SICSLOWPAN_CONF_MAX_ADDR_CONTEXTS];
static struct sicslowpan_addr_context *context; static struct sicslowpan_addr_context *context;
/** pointer to the byte where to write next inline field. */ /** pointer to the byte where to write next inline field. */
static u8_t *hc06_ptr; static uint8_t *hc06_ptr;
/** Index for loops. */ /** Index for loops. */
static u8_t i; static uint8_t i;
/** @} */ /** @} */
@ -300,6 +300,63 @@ packet_sent(void *ptr, int status, int transmissions)
neighbor_info_packet_sent(status, transmissions); neighbor_info_packet_sent(status, transmissions);
#endif /* SICSLOWPAN_CONF_NEIGHBOR_INFO */ #endif /* SICSLOWPAN_CONF_NEIGHBOR_INFO */
} }
/*--------------------------------------------------------------------*/
static void
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 */
} 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;
} 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;
}
}
/*--------------------------------------------------------------------*/
static void
uncompress_lladdr(uint8_t mode, uip_ipaddr_t *ipaddr, uip_lladdr_t *lladdr) {
switch(mode) {
case 0: /* 00 -> 128 bits */
/* copy whole address from packet */
memcpy(ipaddr, hc06_ptr, 16);
hc06_ptr += 16;
break;
case 1: /* 01 -> 64 bits */
ipaddr->u8[0] = 0xfe;
ipaddr->u8[1] = 0x80;
/* copy 6 NULL bytes then 2 last bytes of IID */
memset(&ipaddr->u8[2], 0, 6);
/* copy IID from packet */
memcpy(&ipaddr->u8[8], hc06_ptr, 8);
hc06_ptr += 8;
break;
case 2: /* 10 -> 16 bits */
ipaddr->u8[0] = 0xfe;
ipaddr->u8[1] = 0x80;
/* copy 12 NULL bytes then 2 last bytes of IID */
memset(&ipaddr->u8[2], 0, 12);
memcpy(&ipaddr->u8[14], hc06_ptr, 2);
hc06_ptr += 2;
break;
case 3: /* 11 -> 0 bits */
/* setup link-local address */
ipaddr->u8[0] = 0xfe;
ipaddr->u8[1] = 0x80;
/* copy 12 NULL bytes then 8 last bytes from L2 */
memset(&ipaddr->u8[2], 0, 6);
/* infer IID from L2 address */
uip_ds6_set_addr_iid(ipaddr, lladdr);
break;
}
}
/*--------------------------------------------------------------------*/ /*--------------------------------------------------------------------*/
/** /**
* \brief Compress IP/UDP header * \brief Compress IP/UDP header
@ -471,38 +528,13 @@ compress_hdr_hc06(rimeaddr_t *rime_destaddr)
RIME_IPHC_BUF[1] |= SICSLOWPAN_IPHC_CID | SICSLOWPAN_IPHC_SAC; RIME_IPHC_BUF[1] |= SICSLOWPAN_IPHC_CID | SICSLOWPAN_IPHC_SAC;
RIME_IPHC_BUF[2] |= context->number << 4; RIME_IPHC_BUF[2] |= context->number << 4;
/* compession compare with this nodes address (source) */ /* compession compare with this nodes address (source) */
if(uip_is_addr_mac_addr_based(&UIP_IP_BUF->srcipaddr, &uip_lladdr)){
/* elide the IID */ compress_addr_64(SICSLOWPAN_IPHC_SAM_BIT,
RIME_IPHC_BUF[1] |= SICSLOWPAN_IPHC_SAM_11; /* 0-bits */ &UIP_IP_BUF->srcipaddr, &uip_lladdr);
} else {
if(sicslowpan_is_iid_16_bit_compressable(&UIP_IP_BUF->srcipaddr)){
/* compress IID to 16 bits */
RIME_IPHC_BUF[1] |= SICSLOWPAN_IPHC_SAM_10; /* 16-bits */
memcpy(hc06_ptr, &UIP_IP_BUF->srcipaddr.u16[7], 2);
hc06_ptr += 2;
} else {
/* do not compress IID */
RIME_IPHC_BUF[1] |= SICSLOWPAN_IPHC_SAM_01; /* 64-bits */
memcpy(hc06_ptr, &UIP_IP_BUF->srcipaddr.u16[4], 8);
hc06_ptr += 8;
}
}
/* No context found for this address */ /* No context found for this address */
} else if(uip_is_addr_link_local(&UIP_IP_BUF->srcipaddr)) { } else if(uip_is_addr_link_local(&UIP_IP_BUF->srcipaddr)) {
// TODO: make a function of this: compress_ll_hc06(&UIP_IP_BUF->srcipaddr); compress_addr_64(SICSLOWPAN_IPHC_SAM_BIT,
if(uip_is_addr_mac_addr_based(&UIP_IP_BUF->srcipaddr, &uip_lladdr)){ &UIP_IP_BUF->srcipaddr, &uip_lladdr);
RIME_IPHC_BUF[1] |= SICSLOWPAN_IPHC_SAM_11; /* 0-bits */
} else if(sicslowpan_is_iid_16_bit_compressable(&UIP_IP_BUF->srcipaddr)){
/* compress IID to 16 bits fe80::XXXX */
RIME_IPHC_BUF[1] |= SICSLOWPAN_IPHC_SAM_10; /* 16-bits */
memcpy(hc06_ptr, &UIP_IP_BUF->srcipaddr.u16[7], 2);
hc06_ptr += 2;
} else {
/* do not compress IID => fe80::IID */
RIME_IPHC_BUF[1] |= SICSLOWPAN_IPHC_SAM_01; /* 64-bits */
memcpy(hc06_ptr, &UIP_IP_BUF->srcipaddr.u16[4], 8);
hc06_ptr += 8;
}
} else { } else {
/* send the full address => SAC = 0, SAM = 00 */ /* send the full address => SAC = 0, SAM = 00 */
RIME_IPHC_BUF[1] |= SICSLOWPAN_IPHC_SAM_00; /* 128-bits */ RIME_IPHC_BUF[1] |= SICSLOWPAN_IPHC_SAM_00; /* 128-bits */
@ -544,38 +576,13 @@ compress_hdr_hc06(rimeaddr_t *rime_destaddr)
RIME_IPHC_BUF[1] |= SICSLOWPAN_IPHC_DAC; RIME_IPHC_BUF[1] |= SICSLOWPAN_IPHC_DAC;
RIME_IPHC_BUF[2] |= context->number; RIME_IPHC_BUF[2] |= context->number;
/* compession compare with link adress (destination) */ /* compession compare with link adress (destination) */
if(uip_is_addr_mac_addr_based(&UIP_IP_BUF->destipaddr, (uip_lladdr_t *)rime_destaddr)) {
/* elide the IID */ compress_addr_64(SICSLOWPAN_IPHC_DAM_BIT,
RIME_IPHC_BUF[1] |= SICSLOWPAN_IPHC_DAM_11; /* 0-bits */ &UIP_IP_BUF->destipaddr, (uip_lladdr_t *)rime_destaddr);
} else {
if(sicslowpan_is_iid_16_bit_compressable(&UIP_IP_BUF->destipaddr)) {
/* compress IID to 16 bits */
RIME_IPHC_BUF[1] |= SICSLOWPAN_IPHC_DAM_10; /* 16-bits */
memcpy(hc06_ptr, &UIP_IP_BUF->destipaddr.u16[7], 2);
hc06_ptr += 2;
} else {
/* do not compress IID */
RIME_IPHC_BUF[1] |= SICSLOWPAN_IPHC_DAM_01; /* 64-bits */
memcpy(hc06_ptr, &UIP_IP_BUF->destipaddr.u16[4], 8);
hc06_ptr += 8;
}
}
/* No context found for this address */ /* No context found for this address */
} else if(uip_is_addr_link_local(&UIP_IP_BUF->destipaddr)) { } else if(uip_is_addr_link_local(&UIP_IP_BUF->destipaddr)) {
// TODO: make a function of this: compress_ll_hc06(&UIP_IP_BUF->destipaddr); compress_addr_64(SICSLOWPAN_IPHC_DAM_BIT,
if(uip_is_addr_mac_addr_based(&UIP_IP_BUF->destipaddr, (uip_lladdr_t *)rime_destaddr)) { &UIP_IP_BUF->destipaddr, (uip_lladdr_t *)rime_destaddr);
RIME_IPHC_BUF[1] |= SICSLOWPAN_IPHC_DAM_11; /* 0-bits */
} else if(sicslowpan_is_iid_16_bit_compressable(&UIP_IP_BUF->destipaddr)){
/* compress IID to 16 bits fe80::XXXX */
RIME_IPHC_BUF[1] |= SICSLOWPAN_IPHC_DAM_10; /* 16-bits */
memcpy(hc06_ptr, &UIP_IP_BUF->destipaddr.u16[7], 2);
hc06_ptr += 2;
} else {
/* do not compress IID => fe80::IID */
RIME_IPHC_BUF[1] |= SICSLOWPAN_IPHC_DAM_01; /* 64-bits */
memcpy(hc06_ptr, &UIP_IP_BUF->destipaddr.u16[4], 8);
hc06_ptr += 8;
}
} else { } else {
/* send the full address */ /* send the full address */
RIME_IPHC_BUF[1] |= SICSLOWPAN_IPHC_DAM_00; /* 128-bits */ RIME_IPHC_BUF[1] |= SICSLOWPAN_IPHC_DAM_00; /* 128-bits */
@ -760,40 +767,8 @@ uncompress_hdr_hc06(u16_t ip_len) {
/* end context based compression */ /* end context based compression */
} else { } else {
/* no compression and link local */ /* no compression and link local */
switch(RIME_IPHC_BUF[1] & SICSLOWPAN_IPHC_SAM_11) { uncompress_lladdr((RIME_IPHC_BUF[1] & SICSLOWPAN_IPHC_SAM_11) >> SICSLOWPAN_IPHC_SAM_BIT,
case SICSLOWPAN_IPHC_SAM_00: /* 128 bits */ &SICSLOWPAN_IP_BUF->srcipaddr, (uip_lladdr_t *)packetbuf_addr(PACKETBUF_ADDR_SENDER));
/* copy whole address from packet */
memcpy(&SICSLOWPAN_IP_BUF->srcipaddr.u8[0], hc06_ptr, 16);
hc06_ptr += 16;
break;
case SICSLOWPAN_IPHC_SAM_01: /* 64 bits */
SICSLOWPAN_IP_BUF->srcipaddr.u8[0] = 0xfe;
SICSLOWPAN_IP_BUF->srcipaddr.u8[1] = 0x80;
/* copy 6 NULL bytes then 2 last bytes of IID */
memset(&SICSLOWPAN_IP_BUF->srcipaddr.u8[2], 0, 6);
/* copy IID from packet */
memcpy(&SICSLOWPAN_IP_BUF->srcipaddr.u8[8], hc06_ptr, 8);
hc06_ptr += 8;
break;
case SICSLOWPAN_IPHC_SAM_10: /* 16 bits */
SICSLOWPAN_IP_BUF->srcipaddr.u8[0] = 0xfe;
SICSLOWPAN_IP_BUF->srcipaddr.u8[1] = 0x80;
/* copy 12 NULL bytes then 2 last bytes of IID */
memset(&SICSLOWPAN_IP_BUF->srcipaddr.u8[2], 0, 12);
memcpy(&SICSLOWPAN_IP_BUF->srcipaddr.u8[14], hc06_ptr, 2);
hc06_ptr += 2;
break;
case SICSLOWPAN_IPHC_SAM_11: /* 0 bits */
/* setup link-local address */
SICSLOWPAN_IP_BUF->srcipaddr.u8[0] = 0xfe;
SICSLOWPAN_IP_BUF->srcipaddr.u8[1] = 0x80;
/* copy 12 NULL bytes then 8 last bytes from L2 */
memset(&SICSLOWPAN_IP_BUF->srcipaddr.u8[2], 0, 6);
/* infer IID from L2 address */
uip_ds6_set_addr_iid(&SICSLOWPAN_IP_BUF->srcipaddr,
(uip_lladdr_t *)packetbuf_addr(PACKETBUF_ADDR_SENDER));
break;
}
} }
/* Destination address */ /* Destination address */
@ -872,33 +847,8 @@ uncompress_hdr_hc06(u16_t ip_len) {
} }
} else { } else {
/* not context based => link local M = 0, DAC = 0 - same as SAC */ /* not context based => link local M = 0, DAC = 0 - same as SAC */
switch (RIME_IPHC_BUF[1] & SICSLOWPAN_IPHC_DAM_11) { uncompress_lladdr((RIME_IPHC_BUF[1] & SICSLOWPAN_IPHC_DAM_11) >> SICSLOWPAN_IPHC_DAM_BIT,
case SICSLOWPAN_IPHC_DAM_00: /* 128 bits */ &SICSLOWPAN_IP_BUF->destipaddr, (uip_lladdr_t *)packetbuf_addr(PACKETBUF_ADDR_RECEIVER));
memcpy(&SICSLOWPAN_IP_BUF->destipaddr.u8[0], hc06_ptr, 16);
hc06_ptr += 16;
break;
case SICSLOWPAN_IPHC_DAM_01: /* 64 bits */
SICSLOWPAN_IP_BUF->destipaddr.u8[0] = 0xfe;
SICSLOWPAN_IP_BUF->destipaddr.u8[1] = 0x80;
memset(&SICSLOWPAN_IP_BUF->destipaddr.u8[2], 0, 6);
memcpy(&SICSLOWPAN_IP_BUF->destipaddr.u8[8], hc06_ptr, 8);
hc06_ptr += 8;
break;
case SICSLOWPAN_IPHC_DAM_10: /* 16 bits */
SICSLOWPAN_IP_BUF->destipaddr.u8[0] = 0xfe;
SICSLOWPAN_IP_BUF->destipaddr.u8[1] = 0x80;
memset(&SICSLOWPAN_IP_BUF->destipaddr.u8[2], 0, 12);
memcpy(&SICSLOWPAN_IP_BUF->destipaddr.u8[14], hc06_ptr, 2);
hc06_ptr += 2;
break;
case SICSLOWPAN_IPHC_DAM_11: /* 0 bits */
SICSLOWPAN_IP_BUF->destipaddr.u8[0] = 0xfe;
SICSLOWPAN_IP_BUF->destipaddr.u8[1] = 0x80;
memset(&SICSLOWPAN_IP_BUF->destipaddr.u8[2], 0, 6);
uip_ds6_set_addr_iid(&SICSLOWPAN_IP_BUF->destipaddr,
(uip_lladdr_t *)packetbuf_addr(PACKETBUF_ADDR_RECEIVER));
break;
}
} }
} }
uncomp_hdr_len += UIP_IPH_LEN; uncomp_hdr_len += UIP_IPH_LEN;

View file

@ -33,7 +33,7 @@
* *
* This file is part of the Contiki operating system. * This file is part of the Contiki operating system.
* *
* $Id: sicslowpan.h,v 1.9 2010/03/09 15:18:03 c_oflynn Exp $ * $Id: sicslowpan.h,v 1.10 2010/03/16 10:21:04 joxe Exp $
*/ */
/** /**
* \file * \file
@ -120,6 +120,8 @@
#define SICSLOWPAN_IPHC_SAM_10 0x20 #define SICSLOWPAN_IPHC_SAM_10 0x20
#define SICSLOWPAN_IPHC_SAM_11 0x30 #define SICSLOWPAN_IPHC_SAM_11 0x30
#define SICSLOWPAN_IPHC_SAM_BIT 4
#define SICSLOWPAN_IPHC_M 0x08 #define SICSLOWPAN_IPHC_M 0x08
#define SICSLOWPAN_IPHC_DAC 0x04 #define SICSLOWPAN_IPHC_DAC 0x04
#define SICSLOWPAN_IPHC_DAM_00 0x00 #define SICSLOWPAN_IPHC_DAM_00 0x00
@ -127,6 +129,8 @@
#define SICSLOWPAN_IPHC_DAM_10 0x02 #define SICSLOWPAN_IPHC_DAM_10 0x02
#define SICSLOWPAN_IPHC_DAM_11 0x03 #define SICSLOWPAN_IPHC_DAM_11 0x03
#define SICSLOWPAN_IPHC_DAM_BIT 0
/* Link local context number */ /* Link local context number */
#define SICSLOWPAN_IPHC_ADDR_CONTEXT_LL 0 #define SICSLOWPAN_IPHC_ADDR_CONTEXT_LL 0
/* 16-bit multicast addresses compression */ /* 16-bit multicast addresses compression */