From cf0f0e1747263404f77badca2b2a28bc8da2c1f3 Mon Sep 17 00:00:00 2001 From: mlenders Date: Tue, 14 Jun 2011 22:28:56 +0200 Subject: [PATCH] Context-Management implementiert --- sys/net/sixlowpan/sixlowpan.c | 64 +++++++++++++++++++++++++++++++++-- sys/net/sixlowpan/sixlowpan.h | 8 +++++ 2 files changed, 70 insertions(+), 2 deletions(-) diff --git a/sys/net/sixlowpan/sixlowpan.c b/sys/net/sixlowpan/sixlowpan.c index 434aca196f..cce4be43d5 100644 --- a/sys/net/sixlowpan/sixlowpan.c +++ b/sys/net/sixlowpan/sixlowpan.c @@ -43,6 +43,7 @@ mutex_t buf_mutex; char ip_process_buf[IP_PROCESS_STACKSIZE]; char nc_buf[NC_STACKSIZE]; lowpan_context_t contexts[LOWPAN_CONTEXT_MAX]; +uint8_t context_len = 0; /* deliver packet to mac*/ void lowpan_init(ieee_802154_long_t *addr, uint8_t *data){ @@ -834,11 +835,70 @@ void lowpan_iphc_decoding(uint8_t *data, uint8_t length, packet_length = IPV6_HDR_LEN + ipv6_buf->length; } +uint8_t lowpan_context_len(){ + return context_len; +} + +void lowpan_context_remove(uint8_t num) { + int i; + int found = 0; + for(i = 0; i < LOWPAN_CONTEXT_MAX; i++){ + if(contexts[i].num == num){ + context_len--; +// vtimer_remove(&(contexts[i].lifetime)); Not implemented yet? + } + } + + for(i; i < LOWPAN_CONTEXT_MAX; i++) { + contexts[i] = contexts[i+1]; + } +} + +void lowpan_context_remove_cb(void* ptr) { + uint8_t num = (uint8_t)ptr; + lowpan_context_remove(num); +} + +uint8_t lowpan_context_update(uint8_t num, uint8_t *prefix, + uint8_t length, uint8_t comp, + uint16_t lifetime){ + lowpan_context_t *context; + + timex_t lt; + + lt.nanoseconds = lifetime * 60 * 1000000; + + if (lifetime == 0){ + lowpan_context_remove(num); + return 0; + } + + if (context_len == LOWPAN_CONTEXT_MAX) + return 2; + + context = lowpan_context_num_lookup(num); + + if (context == NULL) { + context = &(contexts[context_len++]); + } + + context->num = num; + strncpy((char*)context->prefix,(char*)prefix,8); + context->length = length; + context->comp = comp; + vtimer_set_cb(&(context->lifetime), + lt, + lowpan_context_remove_cb, + (void*)num); + + return 0; +} + 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]),8) == 0){ - return &contexts[i]; + if(memcmp(&(addr->uint8[0]),&(contexts[i].prefix[0]),contexts[i].length) == 0){ + return &contexts[i]; } } return NULL; diff --git a/sys/net/sixlowpan/sixlowpan.h b/sys/net/sixlowpan/sixlowpan.h index aaa0f62489..b8fb80cfb5 100644 --- a/sys/net/sixlowpan/sixlowpan.h +++ b/sys/net/sixlowpan/sixlowpan.h @@ -22,10 +22,14 @@ #define LOWPAN_CONTEXT_MAX 16 #include "transceiver.h" +#include typedef struct lowpan_context_t { uint8_t num; uint8_t prefix[8]; + uint8_t length; + uint8_t comp; + vtimer_t lifetime; } lowpan_context_t; void sixlowpan_init(transceiver_type_t trans, uint8_t r_addr); @@ -36,6 +40,10 @@ void lowpan_iphc_encoding(ieee_802154_long_t *dest); 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, + uint8_t length, uint8_t comp, + uint16_t lifetime); lowpan_context_t * lowpan_context_lookup(ipv6_addr_t *addr); lowpan_context_t * lowpan_context_num_lookup(uint8_t num); void lowpan_ipv6_set_dispatch(uint8_t *data);