mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2025-12-25 14:33:52 +01:00
Context-Management implementiert
This commit is contained in:
parent
12ab511f29
commit
cf0f0e1747
@ -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;
|
||||
|
||||
@ -22,10 +22,14 @@
|
||||
#define LOWPAN_CONTEXT_MAX 16
|
||||
|
||||
#include "transceiver.h"
|
||||
#include <vtimer.h>
|
||||
|
||||
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);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user