From 29d37af23e2cbae30c3dd068b6e8068e4d0dfb51 Mon Sep 17 00:00:00 2001 From: mlenders Date: Sat, 18 Jun 2011 18:04:02 +0200 Subject: [PATCH] Context prefixes, Address generation after IETF Context prefixes now are in conformity to IPv6 prefixes [RFC3513] + Address generation by Context now after [draft-ietf-6lowpan-hc-15], section 3.1.1 + some minor errors fixed. --- sys/net/sixlowpan/sixlowpan.c | 35 +++++++++++++++++++++-------------- sys/net/sixlowpan/sixlowpan.h | 6 ++++-- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/sys/net/sixlowpan/sixlowpan.c b/sys/net/sixlowpan/sixlowpan.c index 5695f9eec8..9932056129 100644 --- a/sys/net/sixlowpan/sixlowpan.c +++ b/sys/net/sixlowpan/sixlowpan.c @@ -629,24 +629,27 @@ void lowpan_iphc_decoding(uint8_t *data, uint8_t length, switch(((lowpan_iphc[1] & LOWPAN_IPHC_SAM) >> 4) & 0x03){ case(0x01):{ /* 64-bits */ - memcpy(&(ipv6_buf->srcaddr.uint8[0]), con->prefix, 8); memcpy(&(ipv6_buf->srcaddr.uint8[8]), &ipv6_hdr_fields[hdr_pos], 8); + /* By draft-ietf-6lowpan-hc-15 3.1.1. Bits covered by context information are always used. */ + memcpy(&(ipv6_buf->srcaddr.uint8[0]), &con->prefix, con->length); hdr_pos += 8; break; } case(0x02):{ /* 16-bits */ - memcpy(&(ipv6_buf->srcaddr.uint8[0]), con->prefix, 8); memset(&(ipv6_buf->srcaddr.uint8[8]), 0, 6); memcpy(&(ipv6_buf->srcaddr.uint8[14]), &ipv6_hdr_fields[hdr_pos], 2); + /* By draft-ietf-6lowpan-hc-15 3.1.1. Bits covered by context information are always used. */ + memcpy(&(ipv6_buf->srcaddr.uint8[0]), &con->prefix, con->length); hdr_pos += 2; break; } case(0x03):{ /* 0-bits */ - memcpy(&(ipv6_buf->srcaddr.uint8[0]), con->prefix, 8); memset(&(ipv6_buf->srcaddr.uint8[8]), 0, 8); memcpy(&(ipv6_buf->srcaddr.uint8[8]), &s_laddr->uint8[0], 8); + /* By draft-ietf-6lowpan-hc-15 3.1.1. Bits covered by context information are always used. */ + memcpy(&(ipv6_buf->srcaddr.uint8[0]), &con->prefix, con->length); break; } default:{ @@ -771,22 +774,25 @@ void lowpan_iphc_decoding(uint8_t *data, uint8_t length, switch((lowpan_iphc[1] & LOWPAN_IPHC_DAM) & 0x03){ case(0x01):{ - memcpy(&(ipv6_buf->destaddr.uint8[0]), &con->prefix, 8); memcpy(&(ipv6_buf->destaddr.uint8[8]), &ipv6_hdr_fields[hdr_pos], 8); + /* By draft-ietf-6lowpan-hc-15 3.1.1. Bits covered by context information are always used. */ + memcpy(&(ipv6_buf->srcaddr.uint8[0]), &con->prefix, con->length); hdr_pos += 8; break; } case(0x02):{ - memcpy(&(ipv6_buf->destaddr.uint8[0]), &con->prefix, 8); memset(&(ipv6_buf->destaddr.uint8[8]), 0, 6); memcpy(&(ipv6_buf->destaddr.uint8[14]), &ipv6_hdr_fields[hdr_pos], 2); + /* By draft-ietf-6lowpan-hc-15 3.1.1. Bits covered by context information are always used. */ + memcpy(&(ipv6_buf->srcaddr.uint8[0]), &con->prefix, con->length); hdr_pos += 2; break; } case(0x03):{ - memcpy(&(ipv6_buf->destaddr.uint8[0]), &con->prefix, 8); memset(&(ipv6_buf->destaddr.uint8[0]), 0, 8); memcpy(&(ipv6_buf->destaddr.uint8[8]), &d_laddr->uint8[0], 8); + /* By draft-ietf-6lowpan-hc-15 3.1.1. Bits covered by context information are always used. */ + memcpy(&(ipv6_buf->srcaddr.uint8[0]), &con->prefix, con->length); break; } default: @@ -840,8 +846,7 @@ uint8_t lowpan_context_len(){ } void lowpan_context_remove(uint8_t num) { - int i; - int found = 0; + int i,j; for(i = 0; i < LOWPAN_CONTEXT_MAX; i++){ if(contexts[i].num == num){ context_len--; @@ -849,13 +854,13 @@ void lowpan_context_remove(uint8_t num) { } } - for(i; i < LOWPAN_CONTEXT_MAX; i++) { - contexts[i] = contexts[i+1]; + for(j = 0; j < LOWPAN_CONTEXT_MAX; j++) { + contexts[j] = contexts[j+1]; } } void lowpan_context_remove_cb(void* ptr) { - uint8_t num = (uint8_t)ptr; + uint8_t num = *((uint8_t*)ptr); lowpan_context_remove(num); } @@ -883,13 +888,15 @@ uint8_t lowpan_context_update(uint8_t num, uint8_t *prefix, } context->num = num; - strncpy((char*)context->prefix,(char*)prefix,8); + memset((void*)(&context->prefix),0,16); + // length in bits + memcpy((void*)(&context->prefix),(void*)prefix,length/8); context->length = length; context->comp = comp; vtimer_set_cb(&(context->lifetime), lt, lowpan_context_remove_cb, - (void*)num); + (void*)(&num)); return 0; } @@ -901,7 +908,7 @@ lowpan_context_t *lowpan_context_get() { lowpan_context_t * lowpan_context_lookup(ipv6_addr_t *addr){ int i; for(i = 0; i < LOWPAN_CONTEXT_MAX; i++){ - if(memcmp(&(addr->uint8[0]),&(contexts[i].prefix[0]),contexts[i].length) == 0){ + if(memcmp((void*)addr,&(contexts[i].prefix),contexts[i].length) == 0){ return &contexts[i]; } } diff --git a/sys/net/sixlowpan/sixlowpan.h b/sys/net/sixlowpan/sixlowpan.h index 3edef5165d..ab5c8ba54e 100644 --- a/sys/net/sixlowpan/sixlowpan.h +++ b/sys/net/sixlowpan/sixlowpan.h @@ -22,11 +22,12 @@ #define LOWPAN_CONTEXT_MAX 16 #include "transceiver.h" +#include "sixlowip.h" #include typedef struct lowpan_context_t { uint8_t num; - uint8_t prefix[8]; + ipv6_addr_t prefix; uint8_t length; uint8_t comp; vtimer_t lifetime; @@ -41,7 +42,8 @@ void lowpan_iphc_decoding(uint8_t *data, uint8_t length, ieee_802154_long_t *s_laddr, ieee_802154_long_t *d_laddr); uint8_t lowpan_context_len(); -uint8_t lowpan_context_update(uint8_t num, uint8_t *prefix, +lowpan_context_t * lowpan_context_update( + uint8_t num, const ipv6_addr_t *prefix, uint8_t length, uint8_t comp, uint16_t lifetime); lowpan_context_t * lowpan_context_get();