42 #include "net/rpl/rpl-private.h"
44 #define DEBUG DEBUG_NONE
48 static rpl_parent_t *best_parent(rpl_parent_t *, rpl_parent_t *);
50 static rpl_rank_t calculate_rank(rpl_parent_t *, rpl_rank_t);
59 update_metric_container,
63 #define DEFAULT_RANK_INCREMENT RPL_MIN_HOPRANKINC
65 #define MIN_DIFFERENCE (RPL_MIN_HOPRANKINC + RPL_MIN_HOPRANKINC / 2)
70 PRINTF(
"RPL: Resetting OF0\n");
74 calculate_rank(rpl_parent_t *p, rpl_rank_t base_rank)
84 increment = p !=
NULL ?
85 p->dag->instance->min_hoprankinc :
86 DEFAULT_RANK_INCREMENT;
88 if((rpl_rank_t)(base_rank + increment) < base_rank) {
89 PRINTF(
"RPL: OF0 rank %d incremented to infinite rank due to wrapping\n",
93 return base_rank + increment;
104 }
else if(d2->grounded) {
108 if(d1->preference < d2->preference) {
111 if(d1->preference > d2->preference) {
116 if(d2->rank < d1->rank) {
123 static rpl_parent_t *
124 best_parent(rpl_parent_t *p1, rpl_parent_t *p2)
129 PRINTF(
"RPL: Comparing parent ");
130 PRINT6ADDR(rpl_get_parent_ipaddr(p1));
131 PRINTF(
" (confidence %d, rank %d) with parent ",
132 p1->link_metric, p1->rank);
133 PRINT6ADDR(rpl_get_parent_ipaddr(p2));
134 PRINTF(
" (confidence %d, rank %d)\n",
135 p2->link_metric, p2->rank);
138 r1 = DAG_RANK(p1->rank, p1->dag->instance) * RPL_MIN_HOPRANKINC +
140 r2 = DAG_RANK(p2->rank, p1->dag->instance) * RPL_MIN_HOPRANKINC +
147 if(r1 < r2 + MIN_DIFFERENCE &&
148 r1 > r2 - MIN_DIFFERENCE) {
149 return dag->preferred_parent;
160 instance->mc.type = RPL_DAG_MC_NONE;