Skip to content

Commit b62b120

Browse files
author
Mika Tervonen
committed
Added robustness on DAO-ACK handling
inform routing core if DAO ACK is missing that will result in changing of immediate route to secondary. Added limit of DAO retries before the RPL neighbour information is reset
1 parent dfcebef commit b62b120

File tree

9 files changed

+91
-1
lines changed

9 files changed

+91
-1
lines changed

source/6LoWPAN/ws/ws_bootstrap.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2055,6 +2055,8 @@ static void ws_bootstrap_rpl_activate(protocol_interface_info_entry_t *cur)
20552055
// If i am router I Do this
20562056
rpl_control_force_leaf(protocol_6lowpan_rpl_domain, leaf);
20572057
rpl_control_request_parent_link_confirmation(true);
2058+
rpl_control_set_dao_retry_count(WS_MAX_DAO_RETRIES);
2059+
rpl_control_set_initial_dao_ack_wait(WS_MAX_DAO_INITIAL_TIMEOUT);
20582060

20592061
cur->ws_info->rpl_state = 0xff; // Set invalid state and learn from event
20602062
}

source/6LoWPAN/ws/ws_config.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,4 +133,11 @@ extern uint8_t DEVICE_MIN_SENS;
133133
#define FRAME_COUNTER_INCREMENT 1000 // How much frame counter is incremented on start up
134134
#define FRAME_COUNTER_STORE_THRESHOLD 800 // How much frame counter must increment before it is stored
135135

136+
137+
/*
138+
* RPL Configuration parameters
139+
*/
140+
#define WS_MAX_DAO_RETRIES 3 // With 40s, 80s, 160s, 320s, 640s
141+
#define WS_MAX_DAO_INITIAL_TIMEOUT 400 // With 40s initial value exponentially increasing
142+
136143
#endif /* WS_CONFIG_H_ */

source/RPL/rpl_control.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,16 @@ void rpl_control_request_parent_link_confirmation(bool requested)
176176
rpl_policy_set_parent_confirmation_request(requested);
177177
}
178178

179+
void rpl_control_set_dao_retry_count(uint8_t count)
180+
{
181+
rpl_policy_set_dao_retry_count(count);
182+
}
183+
184+
void rpl_control_set_initial_dao_ack_wait(uint16_t timeout_in_ms)
185+
{
186+
rpl_policy_set_initial_dao_ack_wait(timeout_in_ms);
187+
}
188+
179189
/* Send address registration to either specified address, or to non-registered address */
180190
void rpl_control_register_address(protocol_interface_info_entry_t *interface, const uint8_t addr[16])
181191
{

source/RPL/rpl_control.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,8 @@ uint16_t rpl_control_parent_candidate_list_size(struct protocol_interface_info_e
156156
void rpl_control_neighbor_delete(struct protocol_interface_info_entry *interface, const uint8_t ll_addr[16]);
157157
/* Parent link confirmation API extension */
158158
void rpl_control_request_parent_link_confirmation(bool requested);
159+
void rpl_control_set_dao_retry_count(uint8_t count);
160+
void rpl_control_set_initial_dao_ack_wait(uint16_t timeout_in_ms);
159161
void rpl_control_register_address(struct protocol_interface_info_entry *interface, const uint8_t addr[16]);
160162
void rpl_control_address_register_done(struct protocol_interface_info_entry *interface, const uint8_t ll_addr[16], uint8_t status);
161163

source/RPL/rpl_downward.c

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -712,6 +712,21 @@ void rpl_instance_send_dao_update(rpl_instance_t *instance)
712712
return;
713713
}
714714

715+
if (rpl_policy_dao_retry_count() > 0 && instance->dao_attempt >= rpl_policy_dao_retry_count()) {
716+
// Check if recovery logic is started
717+
// after half the retries are done we remove the primary parent
718+
tr_info("DAO remove primary parent");
719+
rpl_neighbour_t *neighbour = ns_list_get_first(&instance->candidate_neighbours);
720+
if (neighbour) {
721+
rpl_delete_neighbour(instance, neighbour);
722+
}
723+
// Set parameters to restart
724+
instance->dao_in_transit = false;
725+
instance->dao_attempt = 0;
726+
instance->dao_retry_timer = 0;
727+
instance->delay_dao_timer = 0;
728+
return;
729+
}
715730

716731
/* Which parent this DAO will be for if storing */
717732
rpl_neighbour_t *parent = NULL;
@@ -847,6 +862,15 @@ void rpl_instance_send_dao_update(rpl_instance_t *instance)
847862
cur = NULL;
848863
}
849864

865+
if (instance->dao_attempt > 0) {
866+
// Start informing problem in routing. This will cause us to select secondary routes when sending the DAO
867+
tr_info("DAO reachability problem");
868+
protocol_interface_info_entry_t *interface = protocol_stack_interface_info_get_by_rpl_domain(instance->domain, -1);
869+
if (interface) {
870+
ipv6_neighbour_reachability_problem(dst, interface->id);
871+
}
872+
}
873+
850874
bool need_ack = rpl_control_transmit_dao(instance->domain, cur, instance, instance->id, instance->dao_sequence, dodag->id, opts, ptr - opts, dst);
851875
ns_dyn_mem_free(opts);
852876

source/RPL/rpl_policy.c

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@
3535
#define TRACE_GROUP "RPLy"
3636

3737
static bool rpl_policy_parent_confirmation_req = false;
38+
static int8_t rpl_policy_dao_retry_count_conf = 0;
39+
static int16_t rpl_policy_dao_initial_timeout_conf = 20; // Default is 2 seconds 100ms ticks
3840

3941
/* TODO - application API to control when to join new instances / DODAGs
4042
*
@@ -105,6 +107,11 @@ bool rpl_policy_request_dao_acks(const rpl_domain_t *domain, uint8_t mop)
105107
return true;
106108
}
107109

110+
void rpl_policy_set_initial_dao_ack_wait(uint16_t timeout_in_ms)
111+
{
112+
rpl_policy_dao_initial_timeout_conf = timeout_in_ms;
113+
}
114+
108115
uint16_t rpl_policy_initial_dao_ack_wait(const rpl_domain_t *domain, uint8_t mop)
109116
{
110117
(void)mop;
@@ -120,7 +127,18 @@ uint16_t rpl_policy_initial_dao_ack_wait(const rpl_domain_t *domain, uint8_t mop
120127
}
121128
}
122129

123-
return 20; /* *100ms ticks = 2s */
130+
return rpl_policy_dao_initial_timeout_conf;
131+
}
132+
133+
134+
void rpl_policy_set_dao_retry_count(uint8_t count)
135+
{
136+
rpl_policy_dao_retry_count_conf = count;
137+
}
138+
139+
int8_t rpl_policy_dao_retry_count()
140+
{
141+
return rpl_policy_dao_retry_count_conf;
124142
}
125143

126144
/* Given the next-hop address from a source routing header, which interface,

source/RPL/rpl_policy.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@ bool rpl_policy_join_config(rpl_domain_t *domain, const rpl_dodag_conf_t *conf,
2727

2828
bool rpl_policy_request_dao_acks(const rpl_domain_t *domain, uint8_t mop);
2929
uint16_t rpl_policy_initial_dao_ack_wait(const rpl_domain_t *domain, uint8_t mop);
30+
void rpl_policy_set_initial_dao_ack_wait(uint16_t timeout_in_ms);
31+
32+
void rpl_policy_set_dao_retry_count(uint8_t count);
33+
int8_t rpl_policy_dao_retry_count();
34+
3035
int8_t rpl_policy_srh_next_hop_interface(rpl_domain_t *domain, int8_t if_id, const uint8_t *next_hop);
3136
uint16_t rpl_policy_modify_downward_cost_to_root_neighbour(rpl_domain_t *domain, int8_t if_id, const uint8_t *next_hop, uint16_t cost);
3237

test/nanostack/unittest/stub/rpl_control_stub.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,3 +243,13 @@ void rpl_control_request_parent_link_confirmation(bool requested)
243243
{
244244

245245
}
246+
247+
void rpl_control_set_dao_retry_count(uint8_t count)
248+
{
249+
250+
}
251+
252+
void rpl_control_set_initial_dao_ack_wait(uint16_t timeout_in_ms)
253+
{
254+
255+
}

test/nanostack/unittest/stub/rpl_policy_stub.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@ bool rpl_policy_request_dao_acks(const rpl_domain_t *domain, uint8_t mop)
5454
{
5555
return false;
5656
}
57+
void rpl_policy_set_initial_dao_ack_wait(uint16_t timeout_in_ms)
58+
{
59+
}
5760

5861
uint16_t rpl_policy_initial_dao_ack_wait(const rpl_domain_t *domain, uint8_t mop)
5962
{
@@ -174,5 +177,14 @@ void rpl_policy_set_parent_confirmation_request(bool confirmation_requested)
174177
{
175178

176179
}
180+
void rpl_policy_set_dao_retry_count(uint8_t count)
181+
{
182+
183+
}
184+
185+
int8_t rpl_policy_dao_retry_count()
186+
{
187+
return 0;
188+
}
177189

178190
#endif /* HAVE_RPL */

0 commit comments

Comments
 (0)