diff --git a/sys/include/net/gnrc/rpl/structs.h b/sys/include/net/gnrc/rpl/structs.h index bb56a80f6b..98011b3fa8 100644 --- a/sys/include/net/gnrc/rpl/structs.h +++ b/sys/include/net/gnrc/rpl/structs.h @@ -259,8 +259,17 @@ struct gnrc_rpl_parent { */ typedef struct { uint16_t ocp; /**< objective code point */ - uint16_t (*calc_rank)(gnrc_rpl_parent_t *parent, uint16_t base_rank); /**< calculate the rank */ - gnrc_rpl_parent_t *(*which_parent)(gnrc_rpl_parent_t *, gnrc_rpl_parent_t *); /**< retrieve the better parent */ + + /** + * @brief Calculate the rank of this node. + * + * @param[in] dodag RPL DODAG to calculate rank from. + * @param[in] base_rank BASE_RANK parameter as in rfc6550 + * + * @return RPL Rank of this node. + * @return GNRC_RPL_INFINITE_RANK, if no rank calculation is possible. + */ + uint16_t (*calc_rank)(gnrc_rpl_dodag_t *dodag, uint16_t base_rank); /** * @brief Compare two @ref gnrc_rpl_parent_t. @@ -279,9 +288,21 @@ typedef struct { */ int (*parent_cmp)(gnrc_rpl_parent_t *parent1, gnrc_rpl_parent_t *parent2); gnrc_rpl_dodag_t *(*which_dodag)(gnrc_rpl_dodag_t *, gnrc_rpl_dodag_t *); /**< compare for dodags */ - void (*reset)(gnrc_rpl_dodag_t *); /**< resets the OF */ + + /** + * @brief Reset the state of the objective function. + * + * @param[in] dodag RPL dodag object. + */ + void (*reset)(gnrc_rpl_dodag_t *dodag); void (*parent_state_callback)(gnrc_rpl_parent_t *, int, int); /**< retrieves the state of a parent*/ - void (*init)(void); /**< OF specific init function */ + + /** + * @brief Initialize the objective function. + * + * @param[in] dodag RPL dodag object. + */ + void (*init)(gnrc_rpl_dodag_t *dodag); void (*process_dio)(void); /**< DIO processing callback (acc. to OF0 spec, chpt 5) */ } gnrc_rpl_of_t; diff --git a/sys/net/gnrc/routing/rpl/gnrc_rpl_dodag.c b/sys/net/gnrc/routing/rpl/gnrc_rpl_dodag.c index c32074155a..893f70428d 100644 --- a/sys/net/gnrc/routing/rpl/gnrc_rpl_dodag.c +++ b/sys/net/gnrc/routing/rpl/gnrc_rpl_dodag.c @@ -176,7 +176,8 @@ bool gnrc_rpl_dodag_init(gnrc_rpl_instance_t *instance, ipv6_addr_t *dodag_id, k void gnrc_rpl_dodag_remove_all_parents(gnrc_rpl_dodag_t *dodag) { - gnrc_rpl_parent_t *elt, *tmp; + gnrc_rpl_parent_t *elt = NULL; + gnrc_rpl_parent_t *tmp = NULL; LL_FOREACH_SAFE(dodag->parents, elt, tmp) { gnrc_rpl_parent_remove(elt); } @@ -306,7 +307,8 @@ static gnrc_rpl_parent_t *_gnrc_rpl_find_preferred_parent(gnrc_rpl_dodag_t *doda gnrc_rpl_parent_t *old_best = dodag->parents; gnrc_rpl_parent_t *new_best = old_best; uint16_t old_rank = dodag->my_rank; - gnrc_rpl_parent_t *elt, *tmp; + gnrc_rpl_parent_t *elt = NULL; + gnrc_rpl_parent_t *tmp = NULL; if (dodag->parents == NULL) { return NULL; @@ -339,7 +341,7 @@ static gnrc_rpl_parent_t *_gnrc_rpl_find_preferred_parent(gnrc_rpl_dodag_t *doda } - dodag->my_rank = dodag->instance->of->calc_rank(dodag->parents, 0); + dodag->my_rank = dodag->instance->of->calc_rank(dodag, 0); if (dodag->my_rank != old_rank) { trickle_reset_timer(&dodag->trickle); } diff --git a/sys/net/gnrc/routing/rpl/of0.c b/sys/net/gnrc/routing/rpl/of0.c index 0fb5e5ddb2..b31018afc2 100644 --- a/sys/net/gnrc/routing/rpl/of0.c +++ b/sys/net/gnrc/routing/rpl/of0.c @@ -23,22 +23,20 @@ #include "net/gnrc/rpl.h" #include "net/gnrc/rpl/structs.h" -static uint16_t calc_rank(gnrc_rpl_parent_t *, uint16_t); -static gnrc_rpl_parent_t *which_parent(gnrc_rpl_parent_t *, gnrc_rpl_parent_t *); +static uint16_t calc_rank(gnrc_rpl_dodag_t *, uint16_t); static int parent_cmp(gnrc_rpl_parent_t *, gnrc_rpl_parent_t *); static gnrc_rpl_dodag_t *which_dodag(gnrc_rpl_dodag_t *, gnrc_rpl_dodag_t *); static void reset(gnrc_rpl_dodag_t *); static gnrc_rpl_of_t gnrc_rpl_of0 = { - 0x0, - calc_rank, - which_parent, - parent_cmp, - which_dodag, - reset, - NULL, - NULL, - NULL + .ocp = 0x0, + .calc_rank = calc_rank, + .parent_cmp = parent_cmp, + .which_dodag = which_dodag, + .reset = reset, + .parent_state_callback = NULL, + .init = NULL, + .process_dio = NULL }; gnrc_rpl_of_t *gnrc_rpl_get_of0(void) @@ -52,20 +50,20 @@ void reset(gnrc_rpl_dodag_t *dodag) (void) dodag; } -uint16_t calc_rank(gnrc_rpl_parent_t *parent, uint16_t base_rank) +uint16_t calc_rank(gnrc_rpl_dodag_t *dodag, uint16_t base_rank) { if (base_rank == 0) { - if (parent == NULL) { + if (dodag->parents == NULL) { return GNRC_RPL_INFINITE_RANK; } - base_rank = parent->rank; + base_rank = dodag->parents->rank; } uint16_t add; - if (parent != NULL) { - add = parent->dodag->instance->min_hop_rank_inc; + if (dodag->parents != NULL) { + add = dodag->instance->min_hop_rank_inc; } else { add = GNRC_RPL_DEFAULT_MIN_HOP_RANK_INCREASE; @@ -78,15 +76,6 @@ uint16_t calc_rank(gnrc_rpl_parent_t *parent, uint16_t base_rank) return base_rank + add; } -/* We simply return the Parent with lower rank */ -gnrc_rpl_parent_t *which_parent(gnrc_rpl_parent_t *p1, gnrc_rpl_parent_t *p2) -{ - if (parent_cmp(p1, p2) > 0) { - return p2; - } - return p1; -} - int parent_cmp(gnrc_rpl_parent_t *parent1, gnrc_rpl_parent_t *parent2) { if (parent1->rank < parent2->rank) {