void gnrc_rpl_recv_DIS(gnrc_rpl_dis_t *dis, ipv6_addr_t *src, ipv6_addr_t *dst, uint16_t len) { /* TODO handle Solicited Information Option */ (void) dis; (void) len; if (!_gnrc_rpl_check_DIS_validity(dis, len)) { return; } if (ipv6_addr_is_multicast(dst)) { for (uint8_t i = 0; i < GNRC_RPL_INSTANCES_NUMOF; ++i) { if ((gnrc_rpl_instances[i].state != 0) /* a leaf node should only react to unicast DIS */ && (gnrc_rpl_instances[i].dodag.node_status != GNRC_RPL_LEAF_NODE)) { trickle_reset_timer(&(gnrc_rpl_instances[i].dodag.trickle)); } } } else { for (uint8_t i = 0; i < GNRC_RPL_INSTANCES_NUMOF; ++i) { if (gnrc_rpl_instances[i].state != 0) { gnrc_rpl_instances[i].dodag.dodag_conf_requested = true; gnrc_rpl_instances[i].dodag.prefix_info_requested = true; gnrc_rpl_send_DIO(&gnrc_rpl_instances[i], src); } } } }
void gnrc_rpl_recv_DIS(gnrc_rpl_dis_t *dis, ipv6_addr_t *src, ipv6_addr_t *dst, uint16_t len) { /* TODO handle Solicited Information Option */ (void) dis; (void) len; if (!_gnrc_rpl_check_DIS_validity(dis, len)) { return; } if (ipv6_addr_is_multicast(dst)) { for (uint8_t i = 0; i < GNRC_RPL_DODAGS_NUMOF; ++i) { if (gnrc_rpl_dodags[i].state != 0) { trickle_reset_timer(&gnrc_rpl_dodags[i].trickle); } } } else { for (uint8_t i = 0; i < GNRC_RPL_DODAGS_NUMOF; ++i) { if (gnrc_rpl_dodags[i].state != 0) { gnrc_rpl_dodags[i].dodag_conf_counter = 0; gnrc_rpl_send_DIO(&gnrc_rpl_dodags[i], src); } } } }
void gnrc_rpl_recv_DIS(gnrc_rpl_dis_t *dis, kernel_pid_t iface, ipv6_addr_t *src, ipv6_addr_t *dst, uint16_t len) { /* TODO handle Solicited Information Option */ (void)iface; if (!_gnrc_rpl_check_DIS_validity(dis, len)) { return; } if (ipv6_addr_is_multicast(dst)) { for (uint8_t i = 0; i < GNRC_RPL_INSTANCES_NUMOF; ++i) { if ((gnrc_rpl_instances[i].state != 0) /* a leaf node should only react to unicast DIS */ && (gnrc_rpl_instances[i].dodag.node_status != GNRC_RPL_LEAF_NODE)) { #ifdef MODULE_GNRC_RPL_P2P if (gnrc_rpl_instances[i].mop == GNRC_RPL_P2P_MOP) { DEBUG("RPL: Not responding to DIS for P2P-RPL DODAG\n"); continue; } #endif trickle_reset_timer(&(gnrc_rpl_instances[i].dodag.trickle)); } } } else { for (uint8_t i = 0; i < GNRC_RPL_INSTANCES_NUMOF; ++i) { if (gnrc_rpl_instances[i].state != 0) { gnrc_rpl_instances[i].dodag.dio_opts |= GNRC_RPL_REQ_DIO_OPT_DODAG_CONF; gnrc_rpl_send_DIO(&gnrc_rpl_instances[i], src); } } } }