[sys/net/sixlowpan/sixlownd.c]

* centralized some variables
This commit is contained in:
mlenders 2011-06-24 02:40:25 +02:00
parent e1309891ea
commit 258ba1a756

View File

@ -57,6 +57,11 @@ def_rtr_lst_t *def_rtr_entry;
/* elements */
//ipv6_addr_t tmpaddr;
uint8_t recvd_contexts[LOWPAN_CONTEXT_MAX];
uint8_t recvd_con_len = 0;
plist_t *recvd_prefixes[OPT_PI_LIST_LEN];
uint8_t recvd_pref_len = 0;
static abr_cache_t* abr_get_most_current();
static abr_cache_t* abr_get_oldest();
@ -219,6 +224,8 @@ void get_opt_6co_flags(uint8_t *compression_flag, uint8_t *cid, uint8_t flags) {
void init_rtr_adv(ipv6_addr_t *addr, uint8_t sllao, uint8_t mtu, uint8_t pi,
uint8_t sixco, uint8_t abro){
lowpan_context_t *contexts = NULL;
abr_cache_t *msg_abr = NULL;
ipv6_buf = get_ipv6_buf();
icmp_buf = get_icmpv6_buf(ipv6_ext_hdr_len);
@ -289,7 +296,6 @@ void init_rtr_adv(ipv6_addr_t *addr, uint8_t sllao, uint8_t mtu, uint8_t pi,
if(sixco == OPT_6CO){
/* set 6lowpan context option */
lowpan_context_t *contexts = NULL;
int contexts_len = 0;
mutex_lock(&lowpan_context_mutex);
if (msg_abr == NULL) {
@ -320,18 +326,18 @@ void init_rtr_adv(ipv6_addr_t *addr, uint8_t sllao, uint8_t mtu, uint8_t pi,
// attach prefixes
opt_6co_prefix_buf = get_opt_6co_prefix_buf(ipv6_ext_hdr_len, opt_hdr_len);
uint8_t target_size;
if (opt_6co_hdr_buf->c_length > 64) {
target_size = 16;
memset((void*)opt_6co_prefix_buf,0,16);
memcpy((void*)opt_6co_prefix_buf, (void*)&(contexts[i].prefix.uint8[0]), opt_6co_hdr_buf->c_length / 8);
opt_hdr_len += 16;
packet_length += 16;
} else {
target_size = 8;
memset((void*)opt_6co_prefix_buf,0,8);
memcpy((void*)opt_6co_prefix_buf, (void*)&(contexts[i].prefix.uint8[0]), opt_6co_hdr_buf->c_length / 8);
opt_hdr_len += 8;
packet_length += 8;
}
memset((void*)opt_6co_prefix_buf,0,target_size);
memcpy((void*)opt_6co_prefix_buf, (void*)&(contexts[i].prefix.uint8[0]), opt_6co_hdr_buf->c_length / 8);
opt_hdr_len += target_size;
packet_length += target_size;
}
if (msg_abr != NULL && contexts != NULL) {
@ -385,20 +391,16 @@ void init_rtr_adv(ipv6_addr_t *addr, uint8_t sllao, uint8_t mtu, uint8_t pi,
}
void recv_rtr_adv(void){
ipv6_buf = get_ipv6_buf();
opt_hdr_len = RTR_ADV_LEN;
rtr_adv_buf = get_rtr_adv_buf(ipv6_ext_hdr_len);
ipv6_addr_t newaddr;
int8_t trigger_ns = -1;
int8_t abro_found = 0;
int16_t abro_version = 0; // later replaced, just to supress warnings
ipv6_addr_t abro_addr;
uint8_t found_contexts[LOWPAN_CONTEXT_MAX];
uint8_t found_con_len = 0;
plist_t *found_prefixes[OPT_PI_LIST_LEN];
uint8_t found_pref_len = 0;
ipv6_buf = get_ipv6_buf();
opt_hdr_len = RTR_ADV_LEN;
rtr_adv_buf = get_rtr_adv_buf(ipv6_ext_hdr_len);
ipv6_addr_t newaddr;
recvd_con_len = 0;
/* update interface reachable time and retrans timer */
if(rtr_adv_buf->reachable_time != 0){
@ -517,8 +519,8 @@ void recv_rtr_adv(void){
comp,
HTONS(opt_6co_hdr_buf->val_ltime)
);
found_contexts[found_con_len] = num;
found_con_len = (found_con_len + 1)%LOWPAN_CONTEXT_MAX; // better solution here, i.e. some kind of stack
recvd_contexts[recvd_con_len] = num;
recvd_con_len = (recvd_con_len + 1)%LOWPAN_CONTEXT_MAX; // better solution here, i.e. some kind of stack
break;
}
case(OPT_ABRO_TYPE):{
@ -536,7 +538,7 @@ void recv_rtr_adv(void){
}
if (abro_found) {
abr_update_cache(abro_version,&abro_addr,found_contexts,found_con_len,found_prefixes,found_pref_len);
abr_update_cache(abro_version,&abro_addr,recvd_contexts,recvd_con_len,recvd_prefixes,recvd_pref_len);
}
mutex_unlock(&lowpan_context_mutex,0);