Skip to content

Commit 96f962a

Browse files
author
Juha Heiskanen
committed
Reduce wi-sun NS Probe
Do NS Probe only to RPL parent candidate Ondemand NS probe for RX NS(ARO) Change-Id: I2a36d85b666c094cce8b648063fb1ff95bdb92dc
1 parent 0a1beb2 commit 96f962a

File tree

7 files changed

+59
-22
lines changed

7 files changed

+59
-22
lines changed

source/6LoWPAN/ws/ws_bootstrap.c

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -664,7 +664,7 @@ uint16_t ws_etx_read(protocol_interface_info_entry_t *interface, addrtype_t addr
664664
if (!ws_neighbour || !etx_entry || etx_entry->etx_samples < 1 /*||
665665
!ws_neighbour->candidate_parent*/) {
666666
// if RSL value is not good enough candidate parent flag is removed and device not accepted as parent
667-
tr_debug("ws_etx_read not valid params");
667+
//tr_debug("ws_etx_read not valid params");
668668
return 0xffff;
669669
}
670670

@@ -998,7 +998,7 @@ static void ws_bootstrap_pan_advertisement_analyse(struct protocol_interface_inf
998998
uint8_t ll_address[16];
999999
ws_bootsrap_create_ll_address(ll_address, neighbor_info.neighbor->mac64);
10001000

1001-
if (rpl_control_is_dodag_parent(cur, ll_address, true)) {
1001+
if (rpl_control_is_dodag_parent(cur, ll_address)) {
10021002
cur->ws_info->pan_information.pan_size = pan_information.pan_size;
10031003
cur->ws_info->pan_information.routing_cost = pan_information.routing_cost;
10041004
cur->ws_info->pan_information.rpl_routing_method = pan_information.rpl_routing_method;
@@ -1363,7 +1363,7 @@ static void ws_bootstrap_neighbor_table_clean(struct protocol_interface_info_ent
13631363
memcpy(ll_target + 8, cur->mac64, 8);
13641364
ll_target[8] ^= 2;
13651365

1366-
if (rpl_control_is_dodag_parent(interface, ll_target, true)) {
1366+
if (rpl_control_is_dodag_parent(interface, ll_target)) {
13671367
// Possible parent is limited to 3 by default?
13681368
continue;
13691369
}
@@ -1519,17 +1519,12 @@ static bool ws_neighbor_entry_nud_notify(mac_neighbor_table_entry_t *entry_ptr,
15191519
activate_nud = true;
15201520
} else {
15211521
if (cur->bootsrap_mode == ARM_NWK_BOOTSRAP_MODE_6LoWPAN_BORDER_ROUTER) {
1522-
if (etx_entry->etx_samples || !ws_neighbor->unicast_data_rx) {
1523-
//Border router just need 1 sample for ETX
1524-
return false;
1525-
}
1522+
return false; // Border router never probe automatically
15261523
} else {
15271524
uint8_t ll_address[16];
15281525
ws_bootsrap_create_ll_address(ll_address, entry_ptr->mac64);
1529-
if (!rpl_control_is_dodag_parent(cur, ll_address, false)) {
1530-
if (etx_entry->etx_samples || !ws_neighbor->unicast_data_rx) {
1531-
return 0;
1532-
}
1526+
if (!rpl_control_is_dodag_parent_candidate(cur, ll_address, WS_NEIGHBOUR_MAX_CANDIDATE_PROBE)) {
1527+
return false;
15331528
}
15341529
}
15351530

source/6LoWPAN/ws/ws_common_defines.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,7 @@ typedef struct ws_bs_ie {
191191
#define WS_NEIGHBOR_NUD_TIMEOUT WS_NEIGHBOR_LINK_TIMEOUT / 2
192192

193193
#define WS_NEIGBOR_ETX_SAMPLE_MAX 3
194+
#define WS_NEIGHBOUR_MAX_CANDIDATE_PROBE 5
194195

195196
#define WS_PROBE_INIT_BASE_SECONDS 8
196197

source/RPL/rpl_control.c

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -204,20 +204,35 @@ void rpl_control_address_register_done(protocol_interface_info_entry_t *interfac
204204
}
205205
}
206206

207-
bool rpl_control_is_dodag_parent(protocol_interface_info_entry_t *interface, const uint8_t ll_addr[16], bool selected)
207+
bool rpl_control_is_dodag_parent(protocol_interface_info_entry_t *interface, const uint8_t ll_addr[16])
208208
{
209209
if (!interface->rpl_domain) {
210210
return false;
211211
}
212212
// go through instances and parents and check if they match the address.
213213
ns_list_foreach(struct rpl_instance, instance, &interface->rpl_domain->instances) {
214-
if (rpl_instance_address_is_parent(instance, ll_addr, selected)) {
214+
if (rpl_instance_address_is_parent(instance, ll_addr)) {
215215
return true;
216216
}
217217
}
218218
return false;
219219
}
220220

221+
bool rpl_control_is_dodag_parent_candidate(protocol_interface_info_entry_t *interface, const uint8_t ll_addr[16], uint16_t candidate_cmp_limiter)
222+
{
223+
if (!interface->rpl_domain) {
224+
return false;
225+
}
226+
// go through instances and parents and check if they match the address.
227+
ns_list_foreach(struct rpl_instance, instance, &interface->rpl_domain->instances) {
228+
if (rpl_instance_address_is_candidate(instance, ll_addr, candidate_cmp_limiter)) {
229+
return true;
230+
}
231+
}
232+
return false;
233+
}
234+
235+
221236
uint16_t rpl_control_parent_candidate_list_size(protocol_interface_info_entry_t *interface, bool parent_list)
222237
{
223238
if (!interface->rpl_domain) {

source/RPL/rpl_control.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,8 @@ void rpl_control_set_callback(rpl_domain_t *domain, rpl_domain_callback_t callba
147147
/* Target publishing */
148148
void rpl_control_publish_host_address(rpl_domain_t *domain, const uint8_t addr[16], uint32_t lifetime);
149149
void rpl_control_unpublish_address(rpl_domain_t *domain, const uint8_t addr[16]);
150-
bool rpl_control_is_dodag_parent(struct protocol_interface_info_entry *interface, const uint8_t ll_addr[16], bool selected);
150+
bool rpl_control_is_dodag_parent(struct protocol_interface_info_entry *interface, const uint8_t ll_addr[16]);
151+
bool rpl_control_is_dodag_parent_candidate(struct protocol_interface_info_entry *interface, const uint8_t ll_addr[16], uint16_t candidate_cmp_limiter);
151152
uint16_t rpl_control_parent_candidate_list_size(struct protocol_interface_info_entry *interface, bool parent_list);
152153
void rpl_control_neighbor_delete(struct protocol_interface_info_entry *interface, const uint8_t ll_addr[16]);
153154
/* Parent link confirmation API extension */

source/RPL/rpl_upward.c

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1617,23 +1617,41 @@ uint16_t rpl_instance_current_rank(const rpl_instance_t *instance)
16171617
return instance->current_rank;
16181618
}
16191619

1620-
bool rpl_instance_address_is_parent(rpl_instance_t *instance, const uint8_t *ipv6_addr, bool selected)
1620+
bool rpl_instance_address_is_parent(rpl_instance_t *instance, const uint8_t *ipv6_addr)
16211621
{
16221622
ns_list_foreach(rpl_neighbour_t, neighbour, &instance->candidate_neighbours) {
1623-
if (selected && !neighbour->dodag_parent) {
1623+
if (!neighbour->dodag_parent) {
16241624
// list is ordered so first encounter of false means no more parents in list
16251625
return false;
16261626
}
16271627

16281628
if (addr_ipv6_equal(neighbour->ll_address, ipv6_addr)) {
1629-
if (!selected) {
1629+
return true;
1630+
}
1631+
}
1632+
return false;
1633+
}
1634+
1635+
bool rpl_instance_address_is_candidate(rpl_instance_t *instance, const uint8_t *ipv6_addr, uint16_t candidate_amount)
1636+
{
1637+
uint16_t list_compared = 0;
1638+
1639+
ns_list_foreach(rpl_neighbour_t, neighbour, &instance->candidate_neighbours) {
1640+
if (addr_ipv6_equal(neighbour->ll_address, ipv6_addr)) {
1641+
1642+
if (!instance->current_dodag_version) {
16301643
return true;
16311644
}
1632-
if (!neighbour->dodag_parent) {
1633-
return false;
1645+
1646+
if (rpl_rank_compare(instance->current_dodag_version->dodag, neighbour->rank, instance->current_rank) & RPL_CMP_LESS) {
1647+
return true;
16341648
}
16351649

1636-
return true;
1650+
return false;
1651+
}
1652+
list_compared++;
1653+
if (candidate_amount && list_compared >= candidate_amount) {
1654+
return false;
16371655
}
16381656

16391657
}

source/RPL/rpl_upward.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,8 @@ void rpl_instance_dio_trigger(rpl_instance_t *instance, struct protocol_interfac
8383
void rpl_instance_set_local_repair(rpl_instance_t *instance, bool repair);
8484
bool rpl_instance_local_repair(const rpl_instance_t *instance);
8585
uint16_t rpl_instance_current_rank(const rpl_instance_t *instance);
86-
bool rpl_instance_address_is_parent(rpl_instance_t *instance, const uint8_t *ipv6_addr, bool selected);
86+
bool rpl_instance_address_is_parent(rpl_instance_t *instance, const uint8_t *ipv6_addr);
87+
bool rpl_instance_address_is_candidate(rpl_instance_t *instance, const uint8_t *ipv6_addr, uint16_t candidate_amount);
8788
uint16_t rpl_instance_address_candidate_count(rpl_instance_t *instance, bool selected_parents);
8889
void rpl_instance_neighbor_delete(rpl_instance_t *instance, const uint8_t *ipv6_addr);
8990
void rpl_instance_slow_timer(rpl_instance_t *instance, uint16_t seconds);

test/nanostack/unittest/stub/rpl_upward_stub.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -418,10 +418,16 @@ uint16_t rpl_instance_current_rank(const rpl_instance_t *instance)
418418
return 0;
419419
}
420420

421-
bool rpl_instance_address_is_parent(rpl_instance_t *instance, const uint8_t *ipv6_addr, bool selected)
421+
bool rpl_instance_address_is_parent(rpl_instance_t *instance, const uint8_t *ipv6_addr)
422422
{
423423
return false;
424424
}
425+
426+
bool rpl_instance_address_is_candidate(rpl_instance_t *instance, const uint8_t *ipv6_addr, uint16_t candidate_amount)
427+
{
428+
return false;
429+
}
430+
425431
void rpl_instance_neighbor_delete(rpl_instance_t *instance, const uint8_t *ipv6_addr)
426432
{
427433
}

0 commit comments

Comments
 (0)