RPL: if the best parent is not fresh, use the best fresh instead and utilize urgent probing to update link estimates
This commit is contained in:
parent
b42b12d7c8
commit
43b01b3236
|
@ -832,7 +832,7 @@ rpl_select_dag(rpl_instance_t *instance, rpl_parent_t *p)
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
static rpl_parent_t *
|
static rpl_parent_t *
|
||||||
best_parent(rpl_dag_t *dag)
|
best_parent(rpl_dag_t *dag, int fresh_only)
|
||||||
{
|
{
|
||||||
rpl_parent_t *p;
|
rpl_parent_t *p;
|
||||||
rpl_of_t *of;
|
rpl_of_t *of;
|
||||||
|
@ -851,6 +851,11 @@ best_parent(rpl_dag_t *dag)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(fresh_only && !rpl_parent_is_fresh(p)) {
|
||||||
|
/* Filter out non-fresh parents if fresh_only is set */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef UIP_CONF_ND6_SEND_NA
|
#ifndef UIP_CONF_ND6_SEND_NA
|
||||||
{
|
{
|
||||||
uip_ds6_nbr_t *nbr = rpl_get_nbr(p);
|
uip_ds6_nbr_t *nbr = rpl_get_nbr(p);
|
||||||
|
@ -871,13 +876,23 @@ best_parent(rpl_dag_t *dag)
|
||||||
rpl_parent_t *
|
rpl_parent_t *
|
||||||
rpl_select_parent(rpl_dag_t *dag)
|
rpl_select_parent(rpl_dag_t *dag)
|
||||||
{
|
{
|
||||||
rpl_parent_t *best = best_parent(dag);
|
/* Look for best parent (regardless of freshness) */
|
||||||
|
rpl_parent_t *best = best_parent(dag, 0);
|
||||||
|
|
||||||
if(best != NULL) {
|
if(best != NULL) {
|
||||||
if(rpl_parent_is_fresh(best)) {
|
if(rpl_parent_is_fresh(best)) {
|
||||||
rpl_set_preferred_parent(dag, best);
|
rpl_set_preferred_parent(dag, best);
|
||||||
dag->rank = rpl_rank_via_parent(dag->preferred_parent);
|
dag->rank = rpl_rank_via_parent(dag->preferred_parent);
|
||||||
} else {
|
} else {
|
||||||
|
/* The best is not fresh. Look for the best fresh now. */
|
||||||
|
rpl_parent_t *best_fresh = best_parent(dag, 1);
|
||||||
|
if(best_fresh == NULL) {
|
||||||
|
/* No fresh parent around, use best (non-fresh) */
|
||||||
|
rpl_set_preferred_parent(dag, best);
|
||||||
|
} else {
|
||||||
|
/* Use best fresh */
|
||||||
|
rpl_set_preferred_parent(dag, best_fresh);
|
||||||
|
}
|
||||||
#if RPL_WITH_PROBING
|
#if RPL_WITH_PROBING
|
||||||
/* Probe the new best parent shortly in order to get a fresh estimate */
|
/* Probe the new best parent shortly in order to get a fresh estimate */
|
||||||
dag->instance->urgent_probing_target = best;
|
dag->instance->urgent_probing_target = best;
|
||||||
|
|
Loading…
Reference in a new issue