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.

This commit is contained in:
mlenders 2011-06-18 18:04:02 +02:00
parent 8eba66a82f
commit 29d37af23e
2 changed files with 25 additions and 16 deletions

View File

@ -629,24 +629,27 @@ void lowpan_iphc_decoding(uint8_t *data, uint8_t length,
switch(((lowpan_iphc[1] & LOWPAN_IPHC_SAM) >> 4) & 0x03){ switch(((lowpan_iphc[1] & LOWPAN_IPHC_SAM) >> 4) & 0x03){
case(0x01):{ case(0x01):{
/* 64-bits */ /* 64-bits */
memcpy(&(ipv6_buf->srcaddr.uint8[0]), con->prefix, 8);
memcpy(&(ipv6_buf->srcaddr.uint8[8]), &ipv6_hdr_fields[hdr_pos], 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; hdr_pos += 8;
break; break;
} }
case(0x02):{ case(0x02):{
/* 16-bits */ /* 16-bits */
memcpy(&(ipv6_buf->srcaddr.uint8[0]), con->prefix, 8);
memset(&(ipv6_buf->srcaddr.uint8[8]), 0, 6); memset(&(ipv6_buf->srcaddr.uint8[8]), 0, 6);
memcpy(&(ipv6_buf->srcaddr.uint8[14]), &ipv6_hdr_fields[hdr_pos], 2); 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; hdr_pos += 2;
break; break;
} }
case(0x03):{ case(0x03):{
/* 0-bits */ /* 0-bits */
memcpy(&(ipv6_buf->srcaddr.uint8[0]), con->prefix, 8);
memset(&(ipv6_buf->srcaddr.uint8[8]), 0, 8); memset(&(ipv6_buf->srcaddr.uint8[8]), 0, 8);
memcpy(&(ipv6_buf->srcaddr.uint8[8]), &s_laddr->uint8[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; break;
} }
default:{ default:{
@ -771,22 +774,25 @@ void lowpan_iphc_decoding(uint8_t *data, uint8_t length,
switch((lowpan_iphc[1] & LOWPAN_IPHC_DAM) & 0x03){ switch((lowpan_iphc[1] & LOWPAN_IPHC_DAM) & 0x03){
case(0x01):{ case(0x01):{
memcpy(&(ipv6_buf->destaddr.uint8[0]), &con->prefix, 8);
memcpy(&(ipv6_buf->destaddr.uint8[8]), &ipv6_hdr_fields[hdr_pos], 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; hdr_pos += 8;
break; break;
} }
case(0x02):{ case(0x02):{
memcpy(&(ipv6_buf->destaddr.uint8[0]), &con->prefix, 8);
memset(&(ipv6_buf->destaddr.uint8[8]), 0, 6); memset(&(ipv6_buf->destaddr.uint8[8]), 0, 6);
memcpy(&(ipv6_buf->destaddr.uint8[14]), &ipv6_hdr_fields[hdr_pos], 2); 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; hdr_pos += 2;
break; break;
} }
case(0x03):{ case(0x03):{
memcpy(&(ipv6_buf->destaddr.uint8[0]), &con->prefix, 8);
memset(&(ipv6_buf->destaddr.uint8[0]), 0, 8); memset(&(ipv6_buf->destaddr.uint8[0]), 0, 8);
memcpy(&(ipv6_buf->destaddr.uint8[8]), &d_laddr->uint8[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; break;
} }
default: default:
@ -840,8 +846,7 @@ uint8_t lowpan_context_len(){
} }
void lowpan_context_remove(uint8_t num) { void lowpan_context_remove(uint8_t num) {
int i; int i,j;
int found = 0;
for(i = 0; i < LOWPAN_CONTEXT_MAX; i++){ for(i = 0; i < LOWPAN_CONTEXT_MAX; i++){
if(contexts[i].num == num){ if(contexts[i].num == num){
context_len--; context_len--;
@ -849,13 +854,13 @@ void lowpan_context_remove(uint8_t num) {
} }
} }
for(i; i < LOWPAN_CONTEXT_MAX; i++) { for(j = 0; j < LOWPAN_CONTEXT_MAX; j++) {
contexts[i] = contexts[i+1]; contexts[j] = contexts[j+1];
} }
} }
void lowpan_context_remove_cb(void* ptr) { void lowpan_context_remove_cb(void* ptr) {
uint8_t num = (uint8_t)ptr; uint8_t num = *((uint8_t*)ptr);
lowpan_context_remove(num); lowpan_context_remove(num);
} }
@ -883,13 +888,15 @@ uint8_t lowpan_context_update(uint8_t num, uint8_t *prefix,
} }
context->num = num; 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->length = length;
context->comp = comp; context->comp = comp;
vtimer_set_cb(&(context->lifetime), vtimer_set_cb(&(context->lifetime),
lt, lt,
lowpan_context_remove_cb, lowpan_context_remove_cb,
(void*)num); (void*)(&num));
return 0; return 0;
} }
@ -901,7 +908,7 @@ lowpan_context_t *lowpan_context_get() {
lowpan_context_t * lowpan_context_lookup(ipv6_addr_t *addr){ lowpan_context_t * lowpan_context_lookup(ipv6_addr_t *addr){
int i; int i;
for(i = 0; i < LOWPAN_CONTEXT_MAX; 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]; return &contexts[i];
} }
} }

View File

@ -22,11 +22,12 @@
#define LOWPAN_CONTEXT_MAX 16 #define LOWPAN_CONTEXT_MAX 16
#include "transceiver.h" #include "transceiver.h"
#include "sixlowip.h"
#include <vtimer.h> #include <vtimer.h>
typedef struct lowpan_context_t { typedef struct lowpan_context_t {
uint8_t num; uint8_t num;
uint8_t prefix[8]; ipv6_addr_t prefix;
uint8_t length; uint8_t length;
uint8_t comp; uint8_t comp;
vtimer_t lifetime; 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 *s_laddr,
ieee_802154_long_t *d_laddr); ieee_802154_long_t *d_laddr);
uint8_t lowpan_context_len(); 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, uint8_t length, uint8_t comp,
uint16_t lifetime); uint16_t lifetime);
lowpan_context_t * lowpan_context_get(); lowpan_context_t * lowpan_context_get();