Merge pull request #11560 from benpicco/rpl/of-api-update
RPL: API update suggestions
This commit is contained in:
commit
e34a133428
@ -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;
|
||||
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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) {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user