44 #include "net/rpl/rpl-private.h"
46 #define DEBUG DEBUG_NONE
49 static void reset(rpl_dag_t *);
50 static rpl_parent_t *best_parent(rpl_parent_t *, rpl_parent_t *);
51 static rpl_dag_t *best_dag(rpl_dag_t *, rpl_dag_t *);
52 static rpl_rank_t calculate_rank(rpl_parent_t *, rpl_rank_t);
53 static void update_metric_container(rpl_instance_t *);
61 update_metric_container,
65 #define DEFAULT_RANK_INCREMENT RPL_MIN_HOPRANKINC
67 #define MIN_DIFFERENCE (RPL_MIN_HOPRANKINC + RPL_MIN_HOPRANKINC / 2)
72 PRINTF(
"RPL: Resetting OF0\n");
76 calculate_rank(rpl_parent_t *p, rpl_rank_t base_rank)
86 increment = p !=
NULL ?
87 p->dag->instance->min_hoprankinc :
88 DEFAULT_RANK_INCREMENT;
90 if((rpl_rank_t)(base_rank + increment) < base_rank) {
91 PRINTF(
"RPL: OF0 rank %d incremented to infinite rank due to wrapping\n",
95 return base_rank + increment;
100 best_dag(rpl_dag_t *d1, rpl_dag_t *d2)
106 }
else if(d2->grounded) {
110 if(d1->preference < d2->preference) {
113 if(d1->preference > d2->preference) {
118 if(d2->rank < d1->rank) {
125 static rpl_parent_t *
126 best_parent(rpl_parent_t *p1, rpl_parent_t *p2)
131 PRINTF(
"RPL: Comparing parent ");
132 PRINT6ADDR(rpl_get_parent_ipaddr(p1));
133 PRINTF(
" (confidence %d, rank %d) with parent ",
134 p1->link_metric, p1->rank);
135 PRINT6ADDR(rpl_get_parent_ipaddr(p2));
136 PRINTF(
" (confidence %d, rank %d)\n",
137 p2->link_metric, p2->rank);
140 r1 = DAG_RANK(p1->rank, p1->dag->instance) * RPL_MIN_HOPRANKINC +
142 r2 = DAG_RANK(p2->rank, p1->dag->instance) * RPL_MIN_HOPRANKINC +
148 dag = (rpl_dag_t *)p1->dag;
149 if(r1 < r2 + MIN_DIFFERENCE &&
150 r1 > r2 - MIN_DIFFERENCE) {
151 return dag->preferred_parent;
160 update_metric_container(rpl_instance_t *instance)
162 instance->mc.type = RPL_DAG_MC_NONE;
#define NULL
The null pointer.
A set of debugging macros.