Merge pull request #11560 from benpicco/rpl/of-api-update

RPL: API update suggestions
This commit is contained in:
Cenk Gündoğan 2019-05-29 15:44:39 +02:00 committed by GitHub
commit e34a133428
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 44 additions and 32 deletions

View File

@ -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;

View File

@ -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);
} }

View File

@ -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) {