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 {
|
typedef struct {
|
||||||
uint16_t ocp; /**< objective code point */
|
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.
|
* @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);
|
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 */
|
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 (*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) */
|
void (*process_dio)(void); /**< DIO processing callback (acc. to OF0 spec, chpt 5) */
|
||||||
} gnrc_rpl_of_t;
|
} 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)
|
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) {
|
LL_FOREACH_SAFE(dodag->parents, elt, tmp) {
|
||||||
gnrc_rpl_parent_remove(elt);
|
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 *old_best = dodag->parents;
|
||||||
gnrc_rpl_parent_t *new_best = old_best;
|
gnrc_rpl_parent_t *new_best = old_best;
|
||||||
uint16_t old_rank = dodag->my_rank;
|
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) {
|
if (dodag->parents == NULL) {
|
||||||
return 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) {
|
if (dodag->my_rank != old_rank) {
|
||||||
trickle_reset_timer(&dodag->trickle);
|
trickle_reset_timer(&dodag->trickle);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -23,22 +23,20 @@
|
|||||||
#include "net/gnrc/rpl.h"
|
#include "net/gnrc/rpl.h"
|
||||||
#include "net/gnrc/rpl/structs.h"
|
#include "net/gnrc/rpl/structs.h"
|
||||||
|
|
||||||
static uint16_t calc_rank(gnrc_rpl_parent_t *, uint16_t);
|
static uint16_t calc_rank(gnrc_rpl_dodag_t *, uint16_t);
|
||||||
static gnrc_rpl_parent_t *which_parent(gnrc_rpl_parent_t *, gnrc_rpl_parent_t *);
|
|
||||||
static int parent_cmp(gnrc_rpl_parent_t *, gnrc_rpl_parent_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 gnrc_rpl_dodag_t *which_dodag(gnrc_rpl_dodag_t *, gnrc_rpl_dodag_t *);
|
||||||
static void reset(gnrc_rpl_dodag_t *);
|
static void reset(gnrc_rpl_dodag_t *);
|
||||||
|
|
||||||
static gnrc_rpl_of_t gnrc_rpl_of0 = {
|
static gnrc_rpl_of_t gnrc_rpl_of0 = {
|
||||||
0x0,
|
.ocp = 0x0,
|
||||||
calc_rank,
|
.calc_rank = calc_rank,
|
||||||
which_parent,
|
.parent_cmp = parent_cmp,
|
||||||
parent_cmp,
|
.which_dodag = which_dodag,
|
||||||
which_dodag,
|
.reset = reset,
|
||||||
reset,
|
.parent_state_callback = NULL,
|
||||||
NULL,
|
.init = NULL,
|
||||||
NULL,
|
.process_dio = NULL
|
||||||
NULL
|
|
||||||
};
|
};
|
||||||
|
|
||||||
gnrc_rpl_of_t *gnrc_rpl_get_of0(void)
|
gnrc_rpl_of_t *gnrc_rpl_get_of0(void)
|
||||||
@ -52,20 +50,20 @@ void reset(gnrc_rpl_dodag_t *dodag)
|
|||||||
(void) 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 (base_rank == 0) {
|
||||||
if (parent == NULL) {
|
if (dodag->parents == NULL) {
|
||||||
return GNRC_RPL_INFINITE_RANK;
|
return GNRC_RPL_INFINITE_RANK;
|
||||||
}
|
}
|
||||||
|
|
||||||
base_rank = parent->rank;
|
base_rank = dodag->parents->rank;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t add;
|
uint16_t add;
|
||||||
|
|
||||||
if (parent != NULL) {
|
if (dodag->parents != NULL) {
|
||||||
add = parent->dodag->instance->min_hop_rank_inc;
|
add = dodag->instance->min_hop_rank_inc;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
add = GNRC_RPL_DEFAULT_MIN_HOP_RANK_INCREASE;
|
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;
|
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)
|
int parent_cmp(gnrc_rpl_parent_t *parent1, gnrc_rpl_parent_t *parent2)
|
||||||
{
|
{
|
||||||
if (parent1->rank < parent2->rank) {
|
if (parent1->rank < parent2->rank) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user