fixed so that DAO NACK now is either for the path or for RPL root - if from root then do not try to switch parent since that will not help
This commit is contained in:
parent
dae21fcb76
commit
8afe3fb9b7
3 changed files with 12 additions and 4 deletions
|
@ -663,6 +663,7 @@ dao_input(void)
|
||||||
int learned_from;
|
int learned_from;
|
||||||
rpl_parent_t *parent;
|
rpl_parent_t *parent;
|
||||||
uip_ds6_nbr_t *nbr;
|
uip_ds6_nbr_t *nbr;
|
||||||
|
int is_root;
|
||||||
|
|
||||||
prefixlen = 0;
|
prefixlen = 0;
|
||||||
parent = NULL;
|
parent = NULL;
|
||||||
|
@ -695,6 +696,8 @@ dao_input(void)
|
||||||
sequence = buffer[pos++];
|
sequence = buffer[pos++];
|
||||||
|
|
||||||
dag = instance->current_dag;
|
dag = instance->current_dag;
|
||||||
|
is_root = (dag->rank == ROOT_RANK(instance));
|
||||||
|
|
||||||
/* Is the DAG ID present? */
|
/* Is the DAG ID present? */
|
||||||
if(flags & RPL_DAO_D_FLAG) {
|
if(flags & RPL_DAO_D_FLAG) {
|
||||||
if(memcmp(&dag->dag_id, &buffer[pos], sizeof(dag->dag_id))) {
|
if(memcmp(&dag->dag_id, &buffer[pos], sizeof(dag->dag_id))) {
|
||||||
|
@ -829,6 +832,7 @@ dao_input(void)
|
||||||
if(flags & RPL_DAO_K_FLAG) {
|
if(flags & RPL_DAO_K_FLAG) {
|
||||||
/* signal the failure to add the node */
|
/* signal the failure to add the node */
|
||||||
dao_ack_output(instance, &dao_sender_addr, sequence,
|
dao_ack_output(instance, &dao_sender_addr, sequence,
|
||||||
|
is_root ? RPL_DAO_ACK_UNABLE_TO_ACCEPT_ROOT :
|
||||||
RPL_DAO_ACK_UNABLE_TO_ACCEPT);
|
RPL_DAO_ACK_UNABLE_TO_ACCEPT);
|
||||||
}
|
}
|
||||||
goto discard;
|
goto discard;
|
||||||
|
@ -838,10 +842,10 @@ dao_input(void)
|
||||||
if(rep == NULL) {
|
if(rep == NULL) {
|
||||||
RPL_STAT(rpl_stats.mem_overflows++);
|
RPL_STAT(rpl_stats.mem_overflows++);
|
||||||
PRINTF("RPL: Could not add a route after receiving a DAO\n");
|
PRINTF("RPL: Could not add a route after receiving a DAO\n");
|
||||||
|
|
||||||
if(flags & RPL_DAO_K_FLAG) {
|
if(flags & RPL_DAO_K_FLAG) {
|
||||||
/* signal the failure to add the node */
|
/* signal the failure to add the node */
|
||||||
dao_ack_output(instance, &dao_sender_addr, sequence,
|
dao_ack_output(instance, &dao_sender_addr, sequence,
|
||||||
|
is_root ? RPL_DAO_ACK_UNABLE_TO_ACCEPT_ROOT :
|
||||||
RPL_DAO_ACK_UNABLE_TO_ACCEPT);
|
RPL_DAO_ACK_UNABLE_TO_ACCEPT);
|
||||||
}
|
}
|
||||||
goto discard;
|
goto discard;
|
||||||
|
|
|
@ -122,8 +122,11 @@ reset(rpl_dag_t *dag)
|
||||||
static void
|
static void
|
||||||
dao_ack_callback(rpl_parent_t *p, int status)
|
dao_ack_callback(rpl_parent_t *p, int status)
|
||||||
{
|
{
|
||||||
|
if(status == RPL_DAO_ACK_UNABLE_TO_ACCEPT_ROOT) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
/* here we need to handle failed DAO's and other stuff */
|
/* here we need to handle failed DAO's and other stuff */
|
||||||
PRINTF("RPL: MRHOF - DAO ACK received with status: %d", status);
|
PRINTF("RPL: MRHOF - DAO ACK received with status: %d\n", status);
|
||||||
if(status >= RPL_DAO_ACK_UNABLE_TO_ACCEPT) {
|
if(status >= RPL_DAO_ACK_UNABLE_TO_ACCEPT) {
|
||||||
/* punish the ETX as if this was 10 packets lost */
|
/* punish the ETX as if this was 10 packets lost */
|
||||||
neighbor_link_callback(p, MAC_TX_OK, 10);
|
neighbor_link_callback(p, MAC_TX_OK, 10);
|
||||||
|
|
|
@ -94,6 +94,7 @@
|
||||||
#define RPL_DAO_ACK_UNCONDITIONAL_ACCEPT 0
|
#define RPL_DAO_ACK_UNCONDITIONAL_ACCEPT 0
|
||||||
#define RPL_DAO_ACK_ACCEPT 1 /* 1 - 127 is OK but not good */
|
#define RPL_DAO_ACK_ACCEPT 1 /* 1 - 127 is OK but not good */
|
||||||
#define RPL_DAO_ACK_UNABLE_TO_ACCEPT 128 /* >127 is fail */
|
#define RPL_DAO_ACK_UNABLE_TO_ACCEPT 128 /* >127 is fail */
|
||||||
|
#define RPL_DAO_ACK_UNABLE_TO_ACCEPT_ROOT 255 /* root can not accept */
|
||||||
|
|
||||||
#define RPL_DAO_ACK_TIMEOUT -1
|
#define RPL_DAO_ACK_TIMEOUT -1
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue