rpl-lite: tailor rpl_icmp6_dao_output to non-storing mode

This commit is contained in:
Simon Duquennoy 2017-06-19 11:50:44 +02:00
parent d4e08fafa6
commit 03d703f188

View File

@ -548,7 +548,6 @@ rpl_icmp6_dao_output(uint8_t lifetime)
unsigned char *buffer; unsigned char *buffer;
uint8_t prefixlen; uint8_t prefixlen;
int pos; int pos;
uip_ipaddr_t *dest_ipaddr = NULL;
const uip_ipaddr_t *prefix = rpl_get_global_address(); const uip_ipaddr_t *prefix = rpl_get_global_address();
uip_ipaddr_t *parent_ipaddr = rpl_neighbor_get_ipaddr(curr_instance.dag.preferred_parent); uip_ipaddr_t *parent_ipaddr = rpl_neighbor_get_ipaddr(curr_instance.dag.preferred_parent);
@ -556,9 +555,9 @@ rpl_icmp6_dao_output(uint8_t lifetime)
rpl_dag_update_state(); rpl_dag_update_state();
if(!curr_instance.used || curr_instance.dag.preferred_parent == NULL if(!curr_instance.used || curr_instance.dag.preferred_parent == NULL
|| prefix == NULL || parent_ipaddr == NULL) { || prefix == NULL || parent_ipaddr == NULL || curr_instance.mop == RPL_MOP_NO_DOWNWARD_ROUTES) {
PRINTF("RPL: rpl_icmp6_dao_output: node not ready to send a DAO (used %u, pref parent %p, prefix %p, parent_ipaddr %p)\n", PRINTF("RPL: rpl_icmp6_dao_output: node not ready to send a DAO (used %u, pref parent %p, prefix %p, parent_ipaddr %p, mop %u)\n",
curr_instance.used, curr_instance.dag.preferred_parent, prefix, parent_ipaddr); curr_instance.used, curr_instance.dag.preferred_parent, prefix, parent_ipaddr, curr_instance.mop);
return; return;
} }
@ -587,36 +586,30 @@ rpl_icmp6_dao_output(uint8_t lifetime)
/* Create a transit information sub-option. */ /* Create a transit information sub-option. */
buffer[pos++] = RPL_OPTION_TRANSIT; buffer[pos++] = RPL_OPTION_TRANSIT;
buffer[pos++] = (curr_instance.mop != RPL_MOP_NON_STORING) ? 4 : 20; buffer[pos++] = 20;
buffer[pos++] = 0; /* flags - ignored */ buffer[pos++] = 0; /* flags - ignored */
buffer[pos++] = 0; /* path control - ignored */ buffer[pos++] = 0; /* path control - ignored */
buffer[pos++] = 0; /* path seq - ignored */ buffer[pos++] = 0; /* path seq - ignored */
buffer[pos++] = lifetime; buffer[pos++] = lifetime;
if(curr_instance.mop != RPL_MOP_NON_STORING) { /* Include parent global IP address */
/* Send DAO to parent */ memcpy(buffer + pos, &curr_instance.dag.dag_id, 8); /* Prefix */
dest_ipaddr = parent_ipaddr; pos += 8;
} else { memcpy(buffer + pos, ((const unsigned char *)parent_ipaddr) + 8, 8); /* Interface identifier */
/* Include parent global IP address */ pos += 8;
memcpy(buffer + pos, &curr_instance.dag.dag_id, 8); /* Prefix */
pos += 8;
memcpy(buffer + pos, ((const unsigned char *)parent_ipaddr) + 8, 8); /* Interface identifier */
pos += 8;
/* Send DAO to root */
dest_ipaddr = &curr_instance.dag.dag_id;
}
PRINTF("RPL: sending a %sDAO seqno %u, tx count %u, lifetime %u, prefix ", PRINTF("RPL: sending a %sDAO seqno %u, tx count %u, lifetime %u, prefix ",
lifetime == 0 ? "No-path " : "", lifetime == 0 ? "No-path " : "",
curr_instance.dag.dao_curr_seqno, curr_instance.dag.dao_transmissions, lifetime); curr_instance.dag.dao_curr_seqno, curr_instance.dag.dao_transmissions, lifetime);
PRINT6ADDR(prefix); PRINT6ADDR(prefix);
PRINTF(" to "); PRINTF(" to ");
PRINT6ADDR(dest_ipaddr); PRINT6ADDR(&curr_instance.dag.dag_id);
PRINTF(" , parent "); PRINTF(" , parent ");
PRINT6ADDR(parent_ipaddr); PRINT6ADDR(parent_ipaddr);
PRINTF("\n"); PRINTF("\n");
uip_icmp6_send(dest_ipaddr, ICMP6_RPL, RPL_CODE_DAO, pos); /* Send DAO to root (IPv6 address is DAG ID) */
uip_icmp6_send(&curr_instance.dag.dag_id, ICMP6_RPL, RPL_CODE_DAO, pos);
} }
#if RPL_WITH_DAO_ACK #if RPL_WITH_DAO_ACK
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/