diff --git a/core/net/neighbor-info.c b/core/net/neighbor-info.c index 16312e06d..aa9424978 100644 --- a/core/net/neighbor-info.c +++ b/core/net/neighbor-info.c @@ -46,9 +46,7 @@ #define ETX_LIMIT 15 #define ETX_SCALE 100 #define ETX_ALPHA 90 -#define ETX_FIRST_GUESS 5 - -#define NOACK_PACKET_ETX 8 +#define ETX_NOACK_PENALTY ETX_LIMIT /*---------------------------------------------------------------------------*/ NEIGHBOR_ATTRIBUTE(uint8_t, etx, NULL); @@ -61,16 +59,17 @@ update_etx(const rimeaddr_t *dest, int packet_etx) uint8_t recorded_etx, new_etx; etxp = (uint8_t *)neighbor_attr_get_data(&etx, dest); + packet_etx = NEIGHBOR_INFO_ETX2FIX(packet_etx); if(etxp == NULL || *etxp == 0) { - recorded_etx = NEIGHBOR_INFO_ETX2FIX(ETX_FIRST_GUESS); + recorded_etx = NEIGHBOR_INFO_ETX2FIX(ETX_LIMIT); + new_etx = packet_etx; } else { recorded_etx = *etxp; + /* Update the EWMA of the ETX for the neighbor. */ + new_etx = ((uint16_t)recorded_etx * ETX_ALPHA + + (uint16_t)packet_etx * (ETX_SCALE - ETX_ALPHA)) / ETX_SCALE; } - /* Update the EWMA of the ETX for the neighbor. */ - packet_etx = NEIGHBOR_INFO_ETX2FIX(packet_etx); - new_etx = ((uint16_t)recorded_etx * ETX_ALPHA + - (uint16_t)packet_etx * (ETX_SCALE - ETX_ALPHA)) / ETX_SCALE; PRINTF("neighbor-info: ETX changed from %d to %d (packet ETX = %d) %d\n", NEIGHBOR_INFO_FIX2ETX(recorded_etx), NEIGHBOR_INFO_FIX2ETX(new_etx), @@ -96,9 +95,6 @@ add_neighbor(const rimeaddr_t *addr) PRINTF("neighbor-info: The neighbor is already known\n"); break; default: - if(subscriber_callback != NULL) { - subscriber_callback(addr, 1, NEIGHBOR_INFO_ETX2FIX(ETX_FIRST_GUESS)); - } break; } } @@ -127,18 +123,15 @@ neighbor_info_packet_sent(int status, int numtx) packet_etx = numtx; break; case MAC_TX_NOACK: - packet_etx = NOACK_PACKET_ETX; - /* error and collissions will not cause high hits ??? */ + packet_etx = ETX_NOACK_PENALTY; break; - case MAC_TX_ERR: default: - packet_etx = 0; - break; + /* Do not penalize the ETX when collisions or transmission + errors occur. */ + return; } - if(packet_etx > 0) { - update_etx(dest, packet_etx); - } + update_etx(dest, packet_etx); } /*---------------------------------------------------------------------------*/ void @@ -175,6 +168,6 @@ neighbor_info_get_etx(const rimeaddr_t *addr) uint8_t *etxp; etxp = (uint8_t *)neighbor_attr_get_data(&etx, addr); - return etxp == NULL ? 0 : *etxp; + return etxp == NULL ? ETX_LIMIT : *etxp; } /*---------------------------------------------------------------------------*/ diff --git a/core/net/rpl/rpl-dag.c b/core/net/rpl/rpl-dag.c index 1aec5be77..64201ca50 100644 --- a/core/net/rpl/rpl-dag.c +++ b/core/net/rpl/rpl-dag.c @@ -94,8 +94,6 @@ static rpl_of_t * const objective_functions[] = {&RPL_OF}; #define RPL_DIO_INTERVAL_DOUBLINGS RPL_CONF_DIO_INTERVAL_DOUBLINGS #endif /* !RPL_CONF_DIO_INTERVAL_DOUBLINGS */ -#define INITIAL_ETX NEIGHBOR_INFO_ETX_DIVISOR * 5 - /************************************************************************/ /* Allocate parents from the same static MEMB chunk to reduce memory waste. */ MEMB(parent_memb, struct rpl_parent, RPL_MAX_PARENTS); @@ -309,7 +307,7 @@ rpl_add_parent(rpl_dag_t *dag, rpl_dio_t *dio, uip_ipaddr_t *addr) memcpy(&p->addr, addr, sizeof(p->addr)); p->dag = dag; p->rank = dio->rank; - p->etx = INITIAL_ETX; + p->link_metric = INITIAL_LINK_METRIC; p->dtsn = 0; memcpy(&p->mc, &dio->mc, sizeof(p->mc)); @@ -358,6 +356,7 @@ rpl_select_parent(rpl_dag_t *dag) rpl_reset_dio_timer(dag, 1); PRINTF("RPL: New preferred parent, rank changed from %u to %u\n", (unsigned)dag->rank, dag->of->calculate_rank(best, 0)); + RPL_STAT(rpl_stats.parent_switch++); } /* Update the DAG rank, since link-layer information may have changed @@ -458,8 +457,6 @@ join_dag(uip_ipaddr_t *from, rpl_dio_t *dio) } PRINTF("succeeded\n"); - p->etx = INITIAL_ETX; /* The lowest confidence for new parents. */ - /* Determine the objective function by using the objective code point of the DIO. */ of = rpl_find_of(dio->ocp); @@ -732,7 +729,7 @@ rpl_process_dio(uip_ipaddr_t *from, rpl_dio_t *dio) PRINTF(")\n"); return; } - + PRINTF("RPL: New candidate parent with rank %u: ", (unsigned)p->rank); PRINT6ADDR(from); PRINTF("\n"); @@ -742,7 +739,8 @@ rpl_process_dio(uip_ipaddr_t *from, rpl_dio_t *dio) } /* We have allocated a candidate parent; process the DIO further. */ - + + memcpy(&p->mc, &dio->mc, sizeof(p->mc)); p->rank = dio->rank; if(rpl_process_parent_event(dag, p) == 0) { /* The candidate parent no longer exists. */ diff --git a/core/net/rpl/rpl-icmp6.c b/core/net/rpl/rpl-icmp6.c index 1bc70dd0f..2b76f919f 100644 --- a/core/net/rpl/rpl-icmp6.c +++ b/core/net/rpl/rpl-icmp6.c @@ -579,7 +579,7 @@ dao_input(void) rep = rpl_add_route(dag, &prefix, prefixlen, &dao_sender_addr); if(rep == NULL) { - RPL_STAT(rpl_stats.memory_overflows++); + RPL_STAT(rpl_stats.mem_overflows++); PRINTF("RPL: Could not add a route after receiving a DAO\n"); return; } else { diff --git a/core/net/rpl/rpl-of-etx.c b/core/net/rpl/rpl-of-etx.c index 0b6265311..9d3748174 100644 --- a/core/net/rpl/rpl-of-etx.c +++ b/core/net/rpl/rpl-of-etx.c @@ -66,7 +66,7 @@ rpl_of_t rpl_of_etx = { #define NI_ETX_TO_RPL_ETX(etx) \ ((etx) * (RPL_DAG_MC_ETX_DIVISOR / NEIGHBOR_INFO_ETX_DIVISOR)) -#define rpl_path_metric_tO_NI_ETX(etx) \ +#define RPL_ETX_TO_NI_ETX(etx) \ ((etx) / (RPL_DAG_MC_ETX_DIVISOR / NEIGHBOR_INFO_ETX_DIVISOR)) /* Reject parents that have a higher link metric than the following. */ @@ -75,9 +75,6 @@ rpl_of_t rpl_of_etx = { /* Reject parents that have a higher path cost than the following. */ #define MAX_PATH_COST 100 -/* An initial guess of the link metric. */ -#define INITIAL_LINK_METRIC 3 - /* * The rank must differ more than 1/PARENT_SWITCH_THRESHOLD_DIV in order * to switch preferred parent. @@ -89,7 +86,10 @@ typedef uint16_t rpl_path_metric_t; static uint16_t calculate_path_metric(rpl_parent_t *p) { - return p->mc.obj.etx + NI_ETX_TO_RPL_ETX(p->etx); + if(p->mc.obj.etx == 0 && p->rank > ROOT_RANK(p->dag)) { + return MAX_PATH_COST * RPL_DAG_MC_ETX_DIVISOR; + } + return p->mc.obj.etx + NI_ETX_TO_RPL_ETX(p->link_metric); } static void @@ -112,12 +112,9 @@ calculate_rank(rpl_parent_t *p, rpl_rank_t base_rank) if(base_rank == 0) { return INFINITE_RANK; } - rank_increase = INITIAL_LINK_METRIC * DEFAULT_MIN_HOPRANKINC; + rank_increase = NEIGHBOR_INFO_FIX2ETX(INITIAL_LINK_METRIC) * DEFAULT_MIN_HOPRANKINC; } else { - if(p->etx == 0) { - p->etx = INITIAL_LINK_METRIC * NEIGHBOR_INFO_ETX_DIVISOR; - } - rank_increase = (p->etx * p->dag->min_hoprankinc) / NEIGHBOR_INFO_ETX_DIVISOR; + rank_increase = NEIGHBOR_INFO_FIX2ETX(p->link_metric) * p->dag->min_hoprankinc; if(base_rank == 0) { base_rank = p->rank; } @@ -180,6 +177,10 @@ update_metric_container(rpl_dag_t *dag) } else { dag->mc.obj.etx = calculate_path_metric(dag->preferred_parent); } + + PRINTF("RPL: My path ETX to the root is %u.%u\n", + dag->mc.obj.etx / RPL_DAG_MC_ETX_DIVISOR, + (dag->mc.obj.etx % RPL_DAG_MC_ETX_DIVISOR * 100) / RPL_DAG_MC_ETX_DIVISOR); #elif RPL_DAG_MC == RPL_DAG_MC_ENERGY dag->mc.type = RPL_DAG_MC_ENERGY; dag->mc.flags = RPL_DAG_MC_FLAG_P; @@ -195,8 +196,4 @@ update_metric_container(rpl_dag_t *dag) #else #error "Unsupported RPL_DAG_MC configured. See rpl.h." #endif /* RPL_DAG_MC */ - - PRINTF("RPL: My path ETX to the root is %u.%u\n", - dag->mc.obj.etx / RPL_DAG_MC_ETX_DIVISOR, - (dag->mc.obj.etx % RPL_DAG_MC_ETX_DIVISOR * 100) / RPL_DAG_MC_ETX_DIVISOR); } diff --git a/core/net/rpl/rpl-private.h b/core/net/rpl/rpl-private.h index 2f5643058..764ed940a 100644 --- a/core/net/rpl/rpl-private.h +++ b/core/net/rpl/rpl-private.h @@ -127,6 +127,8 @@ #define INFINITE_RANK 0xffff +#define INITIAL_LINK_METRIC NEIGHBOR_INFO_ETX2FIX(5) + /* Represents 2^n ms. */ /* Default value according to the specification is 3 which means 8 milliseconds, but that is an unreasonable value if @@ -218,6 +220,7 @@ struct rpl_stats { uint16_t global_repairs; uint16_t malformed_msgs; uint16_t resets; + uint16_t parent_switch; }; typedef struct rpl_stats rpl_stats_t; diff --git a/core/net/rpl/rpl.c b/core/net/rpl/rpl.c index fa7ad7be6..b41fbeea7 100644 --- a/core/net/rpl/rpl.c +++ b/core/net/rpl/rpl.c @@ -148,11 +148,10 @@ rpl_link_neighbor_callback(const rimeaddr_t *addr, int known, int etx) return; } - if(etx != parent->etx) { - /* Trigger DAG rank recalculation. */ - parent->updated = 1; - } - parent->etx = etx; + /* Trigger DAG rank recalculation. */ + parent->updated = 1; + + parent->link_metric = etx; if(dag->of->parent_state_callback != NULL) { dag->of->parent_state_callback(parent, known, etx); @@ -163,7 +162,6 @@ rpl_link_neighbor_callback(const rimeaddr_t *addr, int known, int etx) PRINT6ADDR(&parent->addr); PRINTF(" because of bad connectivity (ETX %d)\n", etx); parent->rank = INFINITE_RANK; - parent->updated = 1; } } /************************************************************************/ diff --git a/core/net/rpl/rpl.h b/core/net/rpl/rpl.h index 5676ccd31..c55ee6cd0 100644 --- a/core/net/rpl/rpl.h +++ b/core/net/rpl/rpl.h @@ -147,7 +147,7 @@ struct rpl_parent { rpl_metric_container_t mc; uip_ipaddr_t addr; rpl_rank_t rank; - uint8_t etx; + uint8_t link_metric; uint8_t dtsn; uint8_t updated; }; diff --git a/core/net/uip-ds6.c b/core/net/uip-ds6.c index 66f7c0d1f..7e3cf1882 100644 --- a/core/net/uip-ds6.c +++ b/core/net/uip-ds6.c @@ -174,60 +174,60 @@ uip_ds6_periodic(void) #if !UIP_CONF_ROUTER /* Periodic processing on prefixes */ for(locprefix = uip_ds6_prefix_list; - locprefix < uip_ds6_prefix_list + UIP_DS6_PREFIX_NB; locprefix++) { - if((locprefix->isused) && (!locprefix->isinfinite) - && (stimer_expired(&(locprefix->vlifetime)))) { + locprefix < uip_ds6_prefix_list + UIP_DS6_PREFIX_NB; + locprefix++) { + if(locprefix->isused && !locprefix->isinfinite + && stimer_expired(&(locprefix->vlifetime))) { uip_ds6_prefix_rm(locprefix); } } #endif /* !UIP_CONF_ROUTER */ /* Periodic processing on neighbors */ - for(locnbr = uip_ds6_nbr_cache; locnbr < uip_ds6_nbr_cache + UIP_DS6_NBR_NB; + for(locnbr = uip_ds6_nbr_cache; + locnbr < uip_ds6_nbr_cache + UIP_DS6_NBR_NB; locnbr++) { if(locnbr->isused) { - switch (locnbr->state) { + switch(locnbr->state) { case NBR_INCOMPLETE: if(locnbr->nscount >= UIP_ND6_MAX_MULTICAST_SOLICIT) { uip_ds6_nbr_rm(locnbr); - } else if(stimer_expired(&(locnbr->sendns))) { + } else if(stimer_expired(&locnbr->sendns)) { locnbr->nscount++; PRINTF("NBR_INCOMPLETE: NS %u\n", locnbr->nscount); uip_nd6_ns_output(NULL, NULL, &locnbr->ipaddr); - stimer_set(&(locnbr->sendns), uip_ds6_if.retrans_timer / 1000); + stimer_set(&locnbr->sendns, uip_ds6_if.retrans_timer / 1000); } break; case NBR_REACHABLE: - if(stimer_expired(&(locnbr->reachable))) { + if(stimer_expired(&locnbr->reachable)) { PRINTF("REACHABLE: moving to STALE ("); PRINT6ADDR(&locnbr->ipaddr); PRINTF(")\n"); locnbr->state = NBR_STALE; - /* NEIGHBOR_STATE_CHANGED(locnbr); */ } break; case NBR_DELAY: - if(stimer_expired(&(locnbr->reachable))) { + if(stimer_expired(&locnbr->reachable)) { locnbr->state = NBR_PROBE; locnbr->nscount = 1; - /* NEIGHBOR_STATE_CHANGED(locnbr); */ PRINTF("DELAY: moving to PROBE + NS %u\n", locnbr->nscount); uip_nd6_ns_output(NULL, &locnbr->ipaddr, &locnbr->ipaddr); - stimer_set(&(locnbr->sendns), uip_ds6_if.retrans_timer / 1000); + stimer_set(&locnbr->sendns, uip_ds6_if.retrans_timer / 1000); } break; case NBR_PROBE: if(locnbr->nscount >= UIP_ND6_MAX_UNICAST_SOLICIT) { - PRINTF("PROBE END \n"); + PRINTF("PROBE END\n"); if((locdefrt = uip_ds6_defrt_lookup(&locnbr->ipaddr)) != NULL) { uip_ds6_defrt_rm(locdefrt); } uip_ds6_nbr_rm(locnbr); - } else if(stimer_expired(&(locnbr->sendns))) { + } else if(stimer_expired(&locnbr->sendns)) { locnbr->nscount++; PRINTF("PROBE: NS %u\n", locnbr->nscount); uip_nd6_ns_output(NULL, &locnbr->ipaddr, &locnbr->ipaddr); - stimer_set(&(locnbr->sendns), uip_ds6_if.retrans_timer / 1000); + stimer_set(&locnbr->sendns, uip_ds6_if.retrans_timer / 1000); } break; default: @@ -248,9 +248,9 @@ uip_ds6_periodic(void) /*---------------------------------------------------------------------------*/ uint8_t -uip_ds6_list_loop(uip_ds6_element_t * list, uint8_t size, - uint16_t elementsize, uip_ipaddr_t * ipaddr, - uint8_t ipaddrlen, uip_ds6_element_t ** out_element) +uip_ds6_list_loop(uip_ds6_element_t *list, uint8_t size, + uint16_t elementsize, uip_ipaddr_t *ipaddr, + uint8_t ipaddrlen, uip_ds6_element_t **out_element) { uip_ds6_element_t *element; @@ -258,11 +258,10 @@ uip_ds6_list_loop(uip_ds6_element_t * list, uint8_t size, for(element = list; element < - (uip_ds6_element_t *) ((uint8_t *) list + (size * elementsize)); - element = (uip_ds6_element_t *) ((uint8_t *) element + elementsize)) { - // printf("+ %p %d\n", &element->isused, element->isused); + (uip_ds6_element_t *)((uint8_t *)list + (size * elementsize)); + element = (uip_ds6_element_t *)((uint8_t *)element + elementsize)) { if(element->isused) { - if(uip_ipaddr_prefixcmp(&(element->ipaddr), ipaddr, ipaddrlen)) { + if(uip_ipaddr_prefixcmp(&element->ipaddr, ipaddr, ipaddrlen)) { *out_element = element; return FOUND; } @@ -271,33 +270,28 @@ uip_ds6_list_loop(uip_ds6_element_t * list, uint8_t size, } } - if(*out_element != NULL) { - return FREESPACE; - } else { - return NOSPACE; - } + return *out_element != NULL ? FREESPACE : NOSPACE; } /*---------------------------------------------------------------------------*/ uip_ds6_nbr_t * -uip_ds6_nbr_add(uip_ipaddr_t * ipaddr, uip_lladdr_t * lladdr, +uip_ds6_nbr_add(uip_ipaddr_t *ipaddr, uip_lladdr_t * lladdr, uint8_t isrouter, uint8_t state) { int r; r = uip_ds6_list_loop - ((uip_ds6_element_t *) uip_ds6_nbr_cache, UIP_DS6_NBR_NB, + ((uip_ds6_element_t *)uip_ds6_nbr_cache, UIP_DS6_NBR_NB, sizeof(uip_ds6_nbr_t), ipaddr, 128, - (uip_ds6_element_t **) &locnbr); - // printf("r %d\n", r); + (uip_ds6_element_t **)&locnbr); if(r == FREESPACE) { locnbr->isused = 1; - uip_ipaddr_copy(&(locnbr->ipaddr), ipaddr); + uip_ipaddr_copy(&locnbr->ipaddr, ipaddr); if(lladdr != NULL) { - memcpy(&(locnbr->lladdr), lladdr, UIP_LLADDR_LEN); + memcpy(&locnbr->lladdr, lladdr, UIP_LLADDR_LEN); } else { - memset(&(locnbr->lladdr), 0, UIP_LLADDR_LEN); + memset(&locnbr->lladdr, 0, UIP_LLADDR_LEN); } locnbr->isrouter = isrouter; locnbr->state = state; @@ -305,18 +299,17 @@ uip_ds6_nbr_add(uip_ipaddr_t * ipaddr, uip_lladdr_t * lladdr, uip_packetqueue_new(&locnbr->packethandle); #endif /* UIP_CONF_IPV6_QUEUE_PKT */ /* timers are set separately, for now we put them in expired state */ - stimer_set(&(locnbr->reachable), 0); - stimer_set(&(locnbr->sendns), 0); + stimer_set(&locnbr->reachable, 0); + stimer_set(&locnbr->sendns, 0); locnbr->nscount = 0; - PRINTF("Adding neighbor with ip addr"); + PRINTF("Adding neighbor with ip addr "); PRINT6ADDR(ipaddr); - PRINTF("link addr"); + PRINTF("link addr "); PRINTLLADDR((&(locnbr->lladdr))); PRINTF("state %u\n", state); NEIGHBOR_STATE_CHANGED(locnbr); locnbr->last_lookup = clock_time(); - // printf("add %p\n", locnbr); return locnbr; } else if(r == NOSPACE) { /* We did not find any empty slot on the neighbor list, so we need @@ -338,7 +331,6 @@ uip_ds6_nbr_add(uip_ipaddr_t * ipaddr, uip_lladdr_t * lladdr, } } if(oldest != NULL) { - // printf("rm3\n"); uip_ds6_nbr_rm(oldest); return uip_ds6_nbr_add(ipaddr, lladdr, isrouter, state); } @@ -354,7 +346,6 @@ uip_ds6_nbr_rm(uip_ds6_nbr_t *nbr) if(nbr != NULL) { nbr->isused = 0; #if UIP_CONF_IPV6_QUEUE_PKT - // printf("rm %p\n", &nbr->isused); uip_packetqueue_free(&nbr->packethandle); #endif /* UIP_CONF_IPV6_QUEUE_PKT */ NEIGHBOR_STATE_CHANGED(nbr); @@ -367,9 +358,9 @@ uip_ds6_nbr_t * uip_ds6_nbr_lookup(uip_ipaddr_t *ipaddr) { if(uip_ds6_list_loop - ((uip_ds6_element_t *) uip_ds6_nbr_cache, UIP_DS6_NBR_NB, + ((uip_ds6_element_t *)uip_ds6_nbr_cache, UIP_DS6_NBR_NB, sizeof(uip_ds6_nbr_t), ipaddr, 128, - (uip_ds6_element_t **) & locnbr) == FOUND) { + (uip_ds6_element_t **)&locnbr) == FOUND) { return locnbr; } return NULL; @@ -380,19 +371,19 @@ uip_ds6_defrt_t * uip_ds6_defrt_add(uip_ipaddr_t *ipaddr, unsigned long interval) { if(uip_ds6_list_loop - ((uip_ds6_element_t *) uip_ds6_defrt_list, UIP_DS6_DEFRT_NB, + ((uip_ds6_element_t *)uip_ds6_defrt_list, UIP_DS6_DEFRT_NB, sizeof(uip_ds6_defrt_t), ipaddr, 128, - (uip_ds6_element_t **) & locdefrt) == FREESPACE) { + (uip_ds6_element_t **)&locdefrt) == FREESPACE) { locdefrt->isused = 1; - uip_ipaddr_copy(&(locdefrt->ipaddr), ipaddr); + uip_ipaddr_copy(&locdefrt->ipaddr, ipaddr); if(interval != 0) { - stimer_set(&(locdefrt->lifetime), interval); + stimer_set(&locdefrt->lifetime, interval); locdefrt->isinfinite = 0; } else { locdefrt->isinfinite = 1; } - PRINTF("Adding defrouter with ip addr"); + PRINTF("Adding defrouter with ip addr "); PRINT6ADDR(&locdefrt->ipaddr); PRINTF("\n"); @@ -405,7 +396,7 @@ uip_ds6_defrt_add(uip_ipaddr_t *ipaddr, unsigned long interval) /*---------------------------------------------------------------------------*/ void -uip_ds6_defrt_rm(uip_ds6_defrt_t * defrt) +uip_ds6_defrt_rm(uip_ds6_defrt_t *defrt) { if(defrt != NULL) { defrt->isused = 0; @@ -416,11 +407,11 @@ uip_ds6_defrt_rm(uip_ds6_defrt_t * defrt) /*---------------------------------------------------------------------------*/ uip_ds6_defrt_t * -uip_ds6_defrt_lookup(uip_ipaddr_t * ipaddr) +uip_ds6_defrt_lookup(uip_ipaddr_t *ipaddr) { - if(uip_ds6_list_loop((uip_ds6_element_t *) uip_ds6_defrt_list, + if(uip_ds6_list_loop((uip_ds6_element_t *)uip_ds6_defrt_list, UIP_DS6_DEFRT_NB, sizeof(uip_ds6_defrt_t), ipaddr, 128, - (uip_ds6_element_t **) & locdefrt) == FOUND) { + (uip_ds6_element_t **)&locdefrt) == FOUND) { return locdefrt; } return NULL; @@ -440,7 +431,7 @@ uip_ds6_defrt_choose(void) PRINT6ADDR(&locdefrt->ipaddr); PRINTF("\n"); bestnbr = uip_ds6_nbr_lookup(&locdefrt->ipaddr); - if((bestnbr != NULL) && (bestnbr->state != NBR_INCOMPLETE)) { + if(bestnbr != NULL && bestnbr->state != NBR_INCOMPLETE) { PRINTF("Defrt found, IP address "); PRINT6ADDR(&locdefrt->ipaddr); PRINTF("\n"); @@ -459,16 +450,16 @@ uip_ds6_defrt_choose(void) #if UIP_CONF_ROUTER /*---------------------------------------------------------------------------*/ uip_ds6_prefix_t * -uip_ds6_prefix_add(uip_ipaddr_t * ipaddr, uint8_t ipaddrlen, +uip_ds6_prefix_add(uip_ipaddr_t *ipaddr, uint8_t ipaddrlen, uint8_t advertise, uint8_t flags, unsigned long vtime, unsigned long ptime) { if(uip_ds6_list_loop - ((uip_ds6_element_t *) uip_ds6_prefix_list, UIP_DS6_PREFIX_NB, + ((uip_ds6_element_t *)uip_ds6_prefix_list, UIP_DS6_PREFIX_NB, sizeof(uip_ds6_prefix_t), ipaddr, ipaddrlen, - (uip_ds6_element_t **) & locprefix) == FREESPACE) { + (uip_ds6_element_t **)&locprefix) == FREESPACE) { locprefix->isused = 1; - uip_ipaddr_copy(&(locprefix->ipaddr), ipaddr); + uip_ipaddr_copy(&locprefix->ipaddr, ipaddr); locprefix->length = ipaddrlen; locprefix->advertise = advertise; locprefix->l_a_reserved = flags; @@ -488,15 +479,15 @@ uip_ds6_prefix_add(uip_ipaddr_t * ipaddr, uint8_t ipaddrlen, #else /* UIP_CONF_ROUTER */ uip_ds6_prefix_t * -uip_ds6_prefix_add(uip_ipaddr_t * ipaddr, uint8_t ipaddrlen, +uip_ds6_prefix_add(uip_ipaddr_t *ipaddr, uint8_t ipaddrlen, unsigned long interval) { if(uip_ds6_list_loop - ((uip_ds6_element_t *) uip_ds6_prefix_list, UIP_DS6_PREFIX_NB, + ((uip_ds6_element_t *)uip_ds6_prefix_list, UIP_DS6_PREFIX_NB, sizeof(uip_ds6_prefix_t), ipaddr, ipaddrlen, - (uip_ds6_element_t **) & locprefix) == FREESPACE) { + (uip_ds6_element_t **)&locprefix) == FREESPACE) { locprefix->isused = 1; - uip_ipaddr_copy(&(locprefix->ipaddr), ipaddr); + uip_ipaddr_copy(&locprefix->ipaddr, ipaddr); locprefix->length = ipaddrlen; if(interval != 0) { stimer_set(&(locprefix->vlifetime), interval); @@ -523,7 +514,7 @@ uip_ds6_prefix_rm(uip_ds6_prefix_t * prefix) } /*---------------------------------------------------------------------------*/ uip_ds6_prefix_t * -uip_ds6_prefix_lookup(uip_ipaddr_t * ipaddr, uint8_t ipaddrlen) +uip_ds6_prefix_lookup(uip_ipaddr_t *ipaddr, uint8_t ipaddrlen) { if(uip_ds6_list_loop((uip_ds6_element_t *)uip_ds6_prefix_list, UIP_DS6_PREFIX_NB, sizeof(uip_ds6_prefix_t), @@ -536,7 +527,7 @@ uip_ds6_prefix_lookup(uip_ipaddr_t * ipaddr, uint8_t ipaddrlen) /*---------------------------------------------------------------------------*/ uint8_t -uip_ds6_is_addr_onlink(uip_ipaddr_t * ipaddr) +uip_ds6_is_addr_onlink(uip_ipaddr_t *ipaddr) { for(locprefix = uip_ds6_prefix_list; locprefix < uip_ds6_prefix_list + UIP_DS6_PREFIX_NB; locprefix++) { @@ -550,12 +541,12 @@ uip_ds6_is_addr_onlink(uip_ipaddr_t * ipaddr) /*---------------------------------------------------------------------------*/ uip_ds6_addr_t * -uip_ds6_addr_add(uip_ipaddr_t * ipaddr, unsigned long vlifetime, uint8_t type) +uip_ds6_addr_add(uip_ipaddr_t *ipaddr, unsigned long vlifetime, uint8_t type) { if(uip_ds6_list_loop - ((uip_ds6_element_t *) uip_ds6_if.addr_list, UIP_DS6_ADDR_NB, + ((uip_ds6_element_t *)uip_ds6_if.addr_list, UIP_DS6_ADDR_NB, sizeof(uip_ds6_addr_t), ipaddr, 128, - (uip_ds6_element_t **) & locaddr) == FREESPACE) { + (uip_ds6_element_t **)&locaddr) == FREESPACE) { locaddr->isused = 1; uip_ipaddr_copy(&locaddr->ipaddr, ipaddr); locaddr->state = ADDR_TENTATIVE; @@ -579,7 +570,7 @@ uip_ds6_addr_add(uip_ipaddr_t * ipaddr, unsigned long vlifetime, uint8_t type) /*---------------------------------------------------------------------------*/ void -uip_ds6_addr_rm(uip_ds6_addr_t * addr) +uip_ds6_addr_rm(uip_ds6_addr_t *addr) { if(addr != NULL) { uip_create_solicited_node(&addr->ipaddr, &loc_fipaddr); @@ -593,12 +584,12 @@ uip_ds6_addr_rm(uip_ds6_addr_t * addr) /*---------------------------------------------------------------------------*/ uip_ds6_addr_t * -uip_ds6_addr_lookup(uip_ipaddr_t * ipaddr) +uip_ds6_addr_lookup(uip_ipaddr_t *ipaddr) { if(uip_ds6_list_loop - ((uip_ds6_element_t *) uip_ds6_if.addr_list, UIP_DS6_ADDR_NB, + ((uip_ds6_element_t *)uip_ds6_if.addr_list, UIP_DS6_ADDR_NB, sizeof(uip_ds6_addr_t), ipaddr, 128, - (uip_ds6_element_t **) & locaddr) == FOUND) { + (uip_ds6_element_t **)&locaddr) == FOUND) { return locaddr; } return NULL; @@ -615,7 +606,7 @@ uip_ds6_get_link_local(int8_t state) { for(locaddr = uip_ds6_if.addr_list; locaddr < uip_ds6_if.addr_list + UIP_DS6_ADDR_NB; locaddr++) { - if((locaddr->isused) && (state == -1 || locaddr->state == state) + if(locaddr->isused && (state == -1 || locaddr->state == state) && (uip_is_addr_link_local(&locaddr->ipaddr))) { return locaddr; } @@ -634,7 +625,7 @@ uip_ds6_get_global(int8_t state) { for(locaddr = uip_ds6_if.addr_list; locaddr < uip_ds6_if.addr_list + UIP_DS6_ADDR_NB; locaddr++) { - if((locaddr->isused) && (state == -1 || locaddr->state == state) + if(locaddr->isused && (state == -1 || locaddr->state == state) && !(uip_is_addr_link_local(&locaddr->ipaddr))) { return locaddr; } @@ -644,12 +635,12 @@ uip_ds6_get_global(int8_t state) /*---------------------------------------------------------------------------*/ uip_ds6_maddr_t * -uip_ds6_maddr_add(uip_ipaddr_t * ipaddr) +uip_ds6_maddr_add(uip_ipaddr_t *ipaddr) { if(uip_ds6_list_loop - ((uip_ds6_element_t *) uip_ds6_if.maddr_list, UIP_DS6_MADDR_NB, + ((uip_ds6_element_t *)uip_ds6_if.maddr_list, UIP_DS6_MADDR_NB, sizeof(uip_ds6_maddr_t), ipaddr, 128, - (uip_ds6_element_t **) & locmaddr) == FREESPACE) { + (uip_ds6_element_t **)&locmaddr) == FREESPACE) { locmaddr->isused = 1; uip_ipaddr_copy(&locmaddr->ipaddr, ipaddr); return locmaddr; @@ -669,12 +660,12 @@ uip_ds6_maddr_rm(uip_ds6_maddr_t * maddr) /*---------------------------------------------------------------------------*/ uip_ds6_maddr_t * -uip_ds6_maddr_lookup(uip_ipaddr_t * ipaddr) +uip_ds6_maddr_lookup(uip_ipaddr_t *ipaddr) { if(uip_ds6_list_loop - ((uip_ds6_element_t *) uip_ds6_if.maddr_list, UIP_DS6_MADDR_NB, + ((uip_ds6_element_t *)uip_ds6_if.maddr_list, UIP_DS6_MADDR_NB, sizeof(uip_ds6_maddr_t), ipaddr, 128, - (uip_ds6_element_t **) & locmaddr) == FOUND) { + (uip_ds6_element_t **)&locmaddr) == FOUND) { return locmaddr; } return NULL; @@ -683,12 +674,12 @@ uip_ds6_maddr_lookup(uip_ipaddr_t * ipaddr) /*---------------------------------------------------------------------------*/ uip_ds6_aaddr_t * -uip_ds6_aaddr_add(uip_ipaddr_t * ipaddr) +uip_ds6_aaddr_add(uip_ipaddr_t *ipaddr) { if(uip_ds6_list_loop - ((uip_ds6_element_t *) uip_ds6_if.aaddr_list, UIP_DS6_AADDR_NB, + ((uip_ds6_element_t *)uip_ds6_if.aaddr_list, UIP_DS6_AADDR_NB, sizeof(uip_ds6_aaddr_t), ipaddr, 128, - (uip_ds6_element_t **) & locaaddr) == FREESPACE) { + (uip_ds6_element_t **)&locaaddr) == FREESPACE) { locaaddr->isused = 1; uip_ipaddr_copy(&locaaddr->ipaddr, ipaddr); return locaaddr; @@ -708,9 +699,9 @@ uip_ds6_aaddr_rm(uip_ds6_aaddr_t * aaddr) /*---------------------------------------------------------------------------*/ uip_ds6_aaddr_t * -uip_ds6_aaddr_lookup(uip_ipaddr_t * ipaddr) +uip_ds6_aaddr_lookup(uip_ipaddr_t *ipaddr) { - if(uip_ds6_list_loop((uip_ds6_element_t *) uip_ds6_if.aaddr_list, + if(uip_ds6_list_loop((uip_ds6_element_t *)uip_ds6_if.aaddr_list, UIP_DS6_AADDR_NB, sizeof(uip_ds6_aaddr_t), ipaddr, 128, (uip_ds6_element_t **)&locaaddr) == FOUND) { return locaaddr; @@ -720,12 +711,12 @@ uip_ds6_aaddr_lookup(uip_ipaddr_t * ipaddr) /*---------------------------------------------------------------------------*/ uip_ds6_route_t * -uip_ds6_route_lookup(uip_ipaddr_t * destipaddr) +uip_ds6_route_lookup(uip_ipaddr_t *destipaddr) { uip_ds6_route_t *locrt = NULL; uint8_t longestmatch = 0; - PRINTF("DS6: Looking up route for"); + PRINTF("DS6: Looking up route for "); PRINT6ADDR(destipaddr); PRINTF("\n"); @@ -747,7 +738,7 @@ uip_ds6_route_lookup(uip_ipaddr_t * destipaddr) PRINT6ADDR(&locrt->nexthop); PRINTF("\n"); } else { - PRINTF("DS6: No route found ...\n"); + PRINTF("DS6: No route found\n"); } return locrt; @@ -755,27 +746,25 @@ uip_ds6_route_lookup(uip_ipaddr_t * destipaddr) /*---------------------------------------------------------------------------*/ uip_ds6_route_t * -uip_ds6_route_add(uip_ipaddr_t * ipaddr, u8_t length, uip_ipaddr_t * nexthop, - u8_t metric) +uip_ds6_route_add(uip_ipaddr_t *ipaddr, uint8_t length, uip_ipaddr_t *nexthop, + uint8_t metric) { - if(uip_ds6_list_loop - ((uip_ds6_element_t *) uip_ds6_routing_table, UIP_DS6_ROUTE_NB, + ((uip_ds6_element_t *)uip_ds6_routing_table, UIP_DS6_ROUTE_NB, sizeof(uip_ds6_route_t), ipaddr, length, - (uip_ds6_element_t **) & locroute) == FREESPACE) { + (uip_ds6_element_t **)&locroute) == FREESPACE) { locroute->isused = 1; uip_ipaddr_copy(&(locroute->ipaddr), ipaddr); locroute->length = length; uip_ipaddr_copy(&(locroute->nexthop), nexthop); locroute->metric = metric; - PRINTF("DS6: adding route:"); + PRINTF("DS6: adding route: "); PRINT6ADDR(ipaddr); PRINTF(" via "); PRINT6ADDR(nexthop); PRINTF("\n"); - ANNOTATE("#L %u 1;blue\n",nexthop->u8[sizeof(uip_ipaddr_t) - 1]); - + ANNOTATE("#L %u 1;blue\n", nexthop->u8[sizeof(uip_ipaddr_t) - 1]); } return locroute; @@ -790,9 +779,10 @@ uip_ds6_route_rm(uip_ds6_route_t *route) /* we need to check if this was the last route towards "nexthop" */ /* if so - remove that link (annotation) */ for(locroute = uip_ds6_routing_table; - locroute < uip_ds6_routing_table + UIP_DS6_ROUTE_NB; locroute++) { - if((locroute->isused) && uip_ipaddr_cmp(&locroute->nexthop, &route->nexthop)) { - /* we did find another link using the specific nexthop, so keep the #L */ + locroute < uip_ds6_routing_table + UIP_DS6_ROUTE_NB; + locroute++) { + if(locroute->isused && uip_ipaddr_cmp(&locroute->nexthop, &route->nexthop)) { + /* we found another link using the specific nexthop, so keep the #L */ return; } } @@ -804,8 +794,9 @@ void uip_ds6_route_rm_by_nexthop(uip_ipaddr_t *nexthop) { for(locroute = uip_ds6_routing_table; - locroute < uip_ds6_routing_table + UIP_DS6_ROUTE_NB; locroute++) { - if((locroute->isused) && uip_ipaddr_cmp(&locroute->nexthop, nexthop)) { + locroute < uip_ds6_routing_table + UIP_DS6_ROUTE_NB; + locroute++) { + if(locroute->isused && uip_ipaddr_cmp(&locroute->nexthop, nexthop)) { locroute->isused = 0; } } @@ -825,9 +816,9 @@ uip_ds6_select_src(uip_ipaddr_t *src, uip_ipaddr_t *dst) for(locaddr = uip_ds6_if.addr_list; locaddr < uip_ds6_if.addr_list + UIP_DS6_ADDR_NB; locaddr++) { /* Only preferred global (not link-local) addresses */ - if((locaddr->isused) && (locaddr->state == ADDR_PREFERRED) && - (!uip_is_addr_link_local(&locaddr->ipaddr))) { - n = get_match_length(dst, &(locaddr->ipaddr)); + if(locaddr->isused && locaddr->state == ADDR_PREFERRED && + !uip_is_addr_link_local(&locaddr->ipaddr)) { + n = get_match_length(dst, &locaddr->ipaddr); if(n >= best) { best = n; matchaddr = locaddr; @@ -848,7 +839,7 @@ uip_ds6_select_src(uip_ipaddr_t *src, uip_ipaddr_t *dst) /*---------------------------------------------------------------------------*/ void -uip_ds6_set_addr_iid(uip_ipaddr_t * ipaddr, uip_lladdr_t * lladdr) +uip_ds6_set_addr_iid(uip_ipaddr_t *ipaddr, uip_lladdr_t * lladdr) { /* We consider only links with IEEE EUI-64 identifier or * IEEE 48-bit MAC addresses */ @@ -859,7 +850,7 @@ uip_ds6_set_addr_iid(uip_ipaddr_t * ipaddr, uip_lladdr_t * lladdr) memcpy(ipaddr->u8 + 8, lladdr, 3); ipaddr->u8[11] = 0xff; ipaddr->u8[12] = 0xfe; - memcpy(ipaddr->u8 + 13, (uint8_t *) lladdr + 3, 3); + memcpy(ipaddr->u8 + 13, (uint8_t *)lladdr + 3, 3); ipaddr->u8[8] ^= 0x02; #else #error uip-ds6.c cannot build interface address when UIP_LLADDR_LEN is not 6 or 8 @@ -868,7 +859,7 @@ uip_ds6_set_addr_iid(uip_ipaddr_t * ipaddr, uip_lladdr_t * lladdr) /*---------------------------------------------------------------------------*/ uint8_t -get_match_length(uip_ipaddr_t * src, uip_ipaddr_t * dst) +get_match_length(uip_ipaddr_t *src, uip_ipaddr_t *dst) { uint8_t j, k, x_or; uint8_t len = 0; @@ -894,7 +885,7 @@ get_match_length(uip_ipaddr_t * src, uip_ipaddr_t * dst) /*---------------------------------------------------------------------------*/ void -uip_ds6_dad(uip_ds6_addr_t * addr) +uip_ds6_dad(uip_ds6_addr_t *addr) { /* send maxdadns NS for DAD */ if(addr->dadnscount < uip_ds6_if.maxdadns) { diff --git a/core/net/uip-ds6.h b/core/net/uip-ds6.h index 7b9f4cf71..064587ac2 100644 --- a/core/net/uip-ds6.h +++ b/core/net/uip-ds6.h @@ -373,7 +373,7 @@ uip_ds6_aaddr_t *uip_ds6_aaddr_lookup(uip_ipaddr_t *ipaddr); /** @{ */ uip_ds6_route_t *uip_ds6_route_lookup(uip_ipaddr_t *destipaddr); uip_ds6_route_t *uip_ds6_route_add(uip_ipaddr_t *ipaddr, uint8_t length, - uip_ipaddr_t *next_hop, u8_t metric); + uip_ipaddr_t *next_hop, uint8_t metric); void uip_ds6_route_rm(uip_ds6_route_t *route); void uip_ds6_route_rm_by_nexthop(uip_ipaddr_t *nexthop); diff --git a/platform/z1/Makefile.z1 b/platform/z1/Makefile.z1 index a470e2516..c18c67a3e 100644 --- a/platform/z1/Makefile.z1 +++ b/platform/z1/Makefile.z1 @@ -7,7 +7,7 @@ ARCH=msp430.c leds.c watchdog.c xmem.c \ spix.c cc2420.c cc2420-aes.c cc2420-arch.c cc2420-arch-sfd.c\ node-id.c sensors.c button-sensor.c cfs-coffee.c \ radio-sensor.c uart0x.c uart0-putchar.c uip-ipchksum.c \ - checkpoint-arch.c slip.c slip_uart0.c z1-phidgets.c + checkpoint-arch.c slip.c slip_uart0.c z1-phidgets.c adxl345.c i2cmaster.c CONTIKI_TARGET_DIRS = . dev apps net ifndef CONTIKI_TARGET_MAIN diff --git a/platform/z1/contiki-z1-main.c b/platform/z1/contiki-z1-main.c index 2ddfa4985..3206f6b12 100644 --- a/platform/z1/contiki-z1-main.c +++ b/platform/z1/contiki-z1-main.c @@ -69,6 +69,7 @@ SENSORS(&button_sensor); + #if DCOSYNCH_CONF_ENABLED static struct timer mgt_timer; #endif @@ -258,6 +259,8 @@ main(int argc, char **argv) set_rime_addr(); cc2420_init(); + accm_init(); + { uint8_t longaddr[8]; uint16_t shortaddr; diff --git a/platform/z1/dev/adxl345.c b/platform/z1/dev/adxl345.c index 14f6ec7b7..efa502e89 100644 --- a/platform/z1/dev/adxl345.c +++ b/platform/z1/dev/adxl345.c @@ -43,7 +43,7 @@ #include #include "contiki.h" #include "adxl345.h" -#include "cc2420-arch.c" +#include "cc2420.h" #include "i2cmaster.h" /* Callback pointers when interrupt occurs */ @@ -400,6 +400,7 @@ interrupt(PORT1_VECTOR) port1_isr (void) { } ENERGEST_OFF(ENERGEST_TYPE_IRQ); } + /*---------------------------------------------------------------------------*/ diff --git a/tools/stm32w/wpcapslip6/wpcapslip6.c b/tools/stm32w/wpcapslip6/wpcapslip6.c index 72eb0c5c6..4cb27a610 100644 --- a/tools/stm32w/wpcapslip6/wpcapslip6.c +++ b/tools/stm32w/wpcapslip6/wpcapslip6.c @@ -116,6 +116,8 @@ static bool clean_route = false; static bool clean_neighb = false; static struct uip_eth_addr adapter_eth_addr; static char * if_name; +static char * if_mac; + OSVERSIONINFO osVersionInfo; /* Fictitious Ethernet address of the attached device (used in tun mode). */ @@ -357,7 +359,7 @@ read_more: } addLoWPANRoute(if_name, br_prefix, rem_ipaddr); - addNeighbor(if_name, rem_ipaddr, DEV_MAC_ADDR); + addNeighbor(if_name, rem_ipaddr, if_mac);//DEV_MAC_ADDR); } } @@ -1058,13 +1060,12 @@ main(int argc, char **argv) (int *)&adapter_eth_addr.addr[2],(int *)&adapter_eth_addr.addr[3], (int *)&adapter_eth_addr.addr[4],(int *)&adapter_eth_addr.addr[5]); if_name = wpcap_start(&adapter_eth_addr, verbose); - + if_mac = argv[1]; if(local_ipaddr!=NULL){ addAddress(if_name, local_ipaddr); } - switch(baudrate) { case -2: break; /* Use default. */