Skip to content

Commit cbac0bb

Browse files
author
Juha Heiskanen
committed
DIO init send block for node
Node must have a selected parent and no pending dao process.
1 parent fed5d1c commit cbac0bb

File tree

3 files changed

+21
-9
lines changed

3 files changed

+21
-9
lines changed

source/RPL/rpl_downward.c

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ static void rpl_downward_target_refresh(rpl_dao_target_t *target)
178178
target->info.non_root.path_lifetime = 0;
179179
}
180180

181-
static bool rpl_instance_parent_selection_ready(rpl_instance_t *instance)
181+
bool rpl_instance_parent_selection_ready(rpl_instance_t *instance)
182182
{
183183
rpl_neighbour_t *neighbour = ns_list_get_first(&instance->candidate_neighbours);
184184
if (neighbour && neighbour->dodag_parent && neighbour->dao_path_control) {
@@ -407,7 +407,7 @@ void rpl_instance_dao_trigger(rpl_instance_t *instance, uint16_t delay)
407407
}
408408
if (instance->delay_dao_timer == 0 || instance->delay_dao_timer > delay) {
409409
instance->delay_dao_timer = delay;
410-
//tr_debug("DAO trigger %" PRIu16, delay);
410+
tr_debug("DAO trigger %" PRIu16, delay);
411411
}
412412
}
413413

@@ -723,7 +723,11 @@ void rpl_instance_send_dao_update(rpl_instance_t *instance)
723723
instance->dao_in_transit = false;
724724
instance->dao_attempt = 0;
725725
instance->dao_retry_timer = 0;
726-
instance->delay_dao_timer = 0;
726+
// Primary parent deletion will trigger parent selection
727+
// While waiting, leave dao_timer "running" to indicate DAO incomplete
728+
// This is checked in rpl_upward_dio_timer to delay initial DIO sending
729+
// If we stopped the timer, that code might think DAO registration was complete
730+
instance->delay_dao_timer = 0xffff;
727731
return;
728732
}
729733

@@ -1863,9 +1867,6 @@ static void rpl_instance_address_registration_cancel(rpl_instance_t *instance)
18631867

18641868
instance->wait_response = NULL;
18651869
instance->pending_neighbour_confirmation = false;
1866-
instance->delay_dao_timer = 0;
1867-
instance->dao_in_transit = false;
1868-
instance->dao_retry_timer = 0;
18691870
}
18701871

18711872
static void rpl_instance_address_registration_retry(rpl_dao_target_t *dao_target)
@@ -1881,8 +1882,15 @@ void rpl_instance_parent_address_reg_timer_update(rpl_instance_t *instance, uint
18811882
return; //No need validate any confirmation
18821883
}
18831884

1885+
if (rpl_instance_am_root(instance)) {
1886+
tr_debug("Root shuold not handle this");
1887+
rpl_instance_address_registration_cancel(instance);
1888+
return;
1889+
}
1890+
18841891
//Verify that we have selected parent and it have a dao path control
18851892
if (!rpl_instance_parent_selection_ready(instance)) {
1893+
tr_debug("Parent select not ready");
18861894
rpl_instance_address_registration_cancel(instance);
18871895
return;
18881896
}
@@ -1925,6 +1933,7 @@ void rpl_instance_parent_address_reg_timer_update(rpl_instance_t *instance, uint
19251933

19261934
if_address_entry_t *address = rpl_interface_addr_get(interface, dao_target->prefix);
19271935
if (!address) {
1936+
tr_debug("No address for req");
19281937
rpl_instance_address_registration_cancel(instance);
19291938
return;
19301939
}

source/RPL/rpl_downward.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ void rpl_instance_parent_address_reg_timer_update(struct rpl_instance *instance,
4646
void rpl_instance_send_address_registration(rpl_instance_t *instance, const uint8_t addr[16]);
4747
bool rpl_instance_address_registration_done(protocol_interface_info_entry_t *interface, rpl_instance_t *instance, rpl_neighbour_t *neighbour, uint8_t status);
4848
struct rpl_dao_target *rpl_instance_get_active_target_confirmation(struct rpl_instance *instance);
49+
bool rpl_instance_parent_selection_ready(struct rpl_instance *instance);
4950

5051
#ifdef HAVE_RPL_DAO_HANDLING
5152
bool rpl_instance_dao_received(struct rpl_instance *instance, const uint8_t src[16], int8_t interface_id, bool multicast, const uint8_t *opts, uint16_t opts_len, uint8_t *status_out);

source/RPL/rpl_upward.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1836,11 +1836,12 @@ void rpl_upward_dio_timer(rpl_instance_t *instance, uint16_t ticks)
18361836
if (rpl_dodag_am_leaf(dodag) && !instance->poison_count) {
18371837
return;
18381838
}
1839+
18391840
/* Delay sending first DIO if we are still potentially gathering info */
18401841
/* Important to always send DIOs if we ever have sent any, so we can indicate problems to others */
1841-
if (!instance->last_advertised_dodag_version && rpl_policy_parent_confirmation_requested()) {
1842-
// We dont have any valid address in interface
1843-
if (ns_list_count(&instance->dao_targets) == 0) {
1842+
if (!rpl_instance_am_root(instance) && !instance->last_advertised_dodag_version && rpl_policy_parent_confirmation_requested()) {
1843+
// We dont have any valid parent selected
1844+
if (!rpl_instance_parent_selection_ready(instance)) {
18441845
return;
18451846
}
18461847
/* Address registrations for parent ongoing*/
@@ -1852,6 +1853,7 @@ void rpl_upward_dio_timer(rpl_instance_t *instance, uint16_t ticks)
18521853
return;
18531854
}
18541855
}
1856+
18551857
if (trickle_timer(&instance->dio_timer, &dodag->dio_timer_params, ticks)) {
18561858
instance->dio_not_consistent = false;
18571859
rpl_instance_dio_trigger(instance, NULL, NULL);

0 commit comments

Comments
 (0)