Skip to content

Commit 85b33e1

Browse files
author
Arto Kinnunen
authored
Update BBR prefix assignment (ARMmbed#1972)
-Do not assign prefix for BBR by default. API should be used to set the prefix. -Add jitter to Thread maintenance timer to avoid burst of messages when all timers elapses at the same time. -Check address availability before generating new domain address to avoid regeneration of new address -Fix misleading traces -Do not use infinite timeout for domain prefix
1 parent a83472e commit 85b33e1

File tree

6 files changed

+53
-54
lines changed

6 files changed

+53
-54
lines changed

source/6LoWPAN/Thread/thread_bootstrap.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2728,7 +2728,7 @@ int thread_bootstrap_network_data_activate(protocol_interface_info_entry_t *cur)
27282728
thread_border_router_network_data_update_notify(cur);
27292729
thread_bbr_network_data_update_notify(cur);
27302730

2731-
thread_maintenance_timer_set(cur, THREAD_MAINTENANCE_TIMER_INTERVAL);
2731+
thread_maintenance_timer_set(cur);
27322732

27332733
return 0;
27342734
}
@@ -2858,8 +2858,8 @@ void thread_bootstrap_network_prefixes_process(protocol_interface_info_entry_t *
28582858
if ((cur->bootsrap_mode == ARM_NWK_BOOTSRAP_MODE_6LoWPAN_HOST ||
28592859
cur->bootsrap_mode == ARM_NWK_BOOTSRAP_MODE_6LoWPAN_SLEEPY_HOST) &&
28602860
cur->thread_info->requestFullNetworkData == false) {
2861+
tr_debug("Invalidate router ID: %04x", curBorderRouter->routerID);
28612862
curBorderRouter->routerID = 0xfffe;
2862-
tr_debug("Invalidated router ID: %04x", curBorderRouter->routerID);
28632863
}
28642864
}
28652865

@@ -2870,7 +2870,9 @@ void thread_bootstrap_network_prefixes_process(protocol_interface_info_entry_t *
28702870
}
28712871
// generate address based on res1 bit
28722872
if (curBorderRouter->P_res1) {
2873-
thread_extension_dua_address_generate(cur, curPrefix->servicesPrefix, 64);
2873+
if (!thread_dhcpv6_address_entry_available(curPrefix->servicesPrefix, &cur->ip_addresses)) {
2874+
thread_extension_dua_address_generate(cur, curPrefix->servicesPrefix, 64);
2875+
}
28742876
}
28752877

28762878
} // for each borderRouterList

source/6LoWPAN/Thread/thread_common.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -486,6 +486,7 @@ int thread_info_allocate_and_init(protocol_interface_info_entry_t *cur)
486486
cur->thread_info->childUpdateReqTimer = -1;
487487
cur->thread_info->parent_priority = CONNECTIVITY_PP_INVALID; // default invalid - calculated using child count
488488

489+
thread_maintenance_timer_set(cur);
489490
thread_routing_init(&cur->thread_info->routing);
490491
thread_network_local_server_data_base_init(&cur->thread_info->localServerDataBase);
491492
memset(&cur->thread_info->registered_commissioner, 0, sizeof(thread_commissioner_t));
@@ -962,7 +963,9 @@ static void thread_maintenance_timer(protocol_interface_info_entry_t *cur, uint3
962963
}
963964
}
964965

965-
thread_info(cur)->thread_maintenance_timer = THREAD_MAINTENANCE_TIMER_INTERVAL ;
966+
thread_maintenance_timer_set(cur);
967+
968+
tr_debug("NWK data maintenance scan");
966969

967970
thread_bootstrap_network_data_activate(cur);
968971
}
@@ -2158,9 +2161,9 @@ void thread_neighbor_communication_update(protocol_interface_info_entry_t *cur,
21582161
thread_neighbor_last_communication_time_update(&cur->thread_info->neighbor_class, neighbor_attribute_index);
21592162
}
21602163

2161-
void thread_maintenance_timer_set(protocol_interface_info_entry_t *cur, uint16_t delay)
2164+
void thread_maintenance_timer_set(protocol_interface_info_entry_t *cur)
21622165
{
2163-
thread_info(cur)->thread_maintenance_timer = delay;
2166+
thread_info(cur)->thread_maintenance_timer = THREAD_MAINTENANCE_TIMER_INTERVAL + randLIB_get_random_in_range(0, THREAD_MAINTENANCE_TIMER_INTERVAL / 10);
21642167
}
21652168

21662169
#endif

source/6LoWPAN/Thread/thread_common.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -450,7 +450,7 @@ bool thread_partition_match(protocol_interface_info_entry_t *cur, thread_leader_
450450
void thread_partition_info_update(protocol_interface_info_entry_t *cur, thread_leader_data_t *leaderData);
451451
void thread_neighbor_communication_update(protocol_interface_info_entry_t *cur, uint8_t neighbor_attribute_index);
452452
bool thread_stable_context_check(protocol_interface_info_entry_t *cur, buffer_t *buf);
453-
void thread_maintenance_timer_set(protocol_interface_info_entry_t *cur, uint16_t delay);
453+
void thread_maintenance_timer_set(protocol_interface_info_entry_t *cur);
454454
#else // HAVE_THREAD
455455

456456
NS_DUMMY_DEFINITIONS_OK

source/6LoWPAN/Thread/thread_extension_bbr.c

Lines changed: 30 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -950,7 +950,7 @@ static int thread_extension_bbr_dua_cb(int8_t service_id, uint8_t source_address
950950
((thread_pbbr_dua_info_t *)route->info.info)->last_contact_time = protocol_core_monotonic_time;
951951
entry_keep_alive = true;
952952
}
953-
if (thread_bbr_dua_entry_add(this->interface_id, addr_data_ptr, 0xFFFFFFFF, ml_eid_ptr) != 0) {
953+
if (thread_bbr_dua_entry_add(this->interface_id, addr_data_ptr, this->dua_timeout * 2, ml_eid_ptr) != 0) {
954954
bbr_status = THREAD_BBR_STATUS_RESOURCE_SHORTAGE;
955955
goto send_response;
956956
}
@@ -1086,13 +1086,16 @@ static int thread_border_router_pbbr_nw_data_register(thread_pbbr_t *this)
10861086
tr_error("Adding service data failed!");
10871087
return -1;
10881088
}
1089-
thread_border_router_info_t br_info = {0};
1090-
br_info.P_on_mesh = true;
1091-
br_info.stableData = true;
1092-
br_info.P_res1 = true;
1093-
if (thread_border_router_prefix_add(this->interface_id, this->domain_prefix, 64, &br_info)) {
1094-
tr_error("Adding domain prefix failed!");
1095-
return -1;
1089+
1090+
if (!addr_is_ipv6_unspecified(this->domain_prefix)) {
1091+
thread_border_router_info_t br_info = {0};
1092+
br_info.P_on_mesh = true;
1093+
br_info.stableData = true;
1094+
br_info.P_res1 = true;
1095+
if (thread_border_router_prefix_add(this->interface_id, this->domain_prefix, 64, &br_info)) {
1096+
tr_error("Adding domain prefix failed!");
1097+
return -1;
1098+
}
10961099
}
10971100
return 0;
10981101
}
@@ -1230,14 +1233,7 @@ int8_t thread_extension_bbr_init(int8_t interface_id, int8_t backbone_interface_
12301233
this->joiner_router_rloc = 0xffff;
12311234
this->coap_nmkp_virtual_service_id = -1;
12321235
this->br_bb_service_id = -1;
1233-
this->domain_prefix[0] = 0xfd;
1234-
this->domain_prefix[1] = 0x00;
1235-
this->domain_prefix[2] = 0x7d;
1236-
this->domain_prefix[3] = 0x03;
1237-
this->domain_prefix[4] = 0x7d;
1238-
this->domain_prefix[5] = 0x03;
1239-
this->domain_prefix[6] = 0x7d;
1240-
this->domain_prefix[7] = 0x03;
1236+
memset(this->domain_prefix, 0, sizeof(this->domain_prefix));
12411237
this->coap_service_id = coap_service_initialize(this->interface_id, THREAD_MANAGEMENT_PORT, COAP_SERVICE_OPTIONS_NONE, NULL, NULL);
12421238
if (this->coap_service_id < 0) {
12431239
tr_warn("Thread border router coap init failed");
@@ -1279,7 +1275,6 @@ bool thread_extension_bbr_nd_query_process(protocol_interface_info_entry_t *cur,
12791275
// if we do not have DUA addressing enabled
12801276
if (!bitsequal(this->domain_prefix, target_addr, 64)) {
12811277
return false;
1282-
12831278
}
12841279

12851280
// SEND BB_QRY
@@ -1336,18 +1331,18 @@ void thread_extension_bbr_route_update(protocol_interface_info_entry_t *cur)
13361331
if (!this) {
13371332
return;
13381333
}
1339-
// remove with info and add all valid doman prefixes again to back bone interface
1334+
1335+
// remove with info and add valid domain prefix again to back bone interface
13401336
ipv6_route_table_remove_info(this->backbone_interface_id, ROUTE_THREAD_BBR, NULL);
1341-
// Check if domain prefix is in settings and verify that configuration is made to backbone -> prefix on-link
1342-
// domain prefix in settings add dua route to backbone, delete dua on-mesh route
1343-
tr_debug("adding dua on link");
1344-
ipv6_route_add_with_info(this->domain_prefix, 64, this->backbone_interface_id, NULL, ROUTE_THREAD_BBR, NULL, 0, 0xffffffff, 0);
1345-
tr_info("Hosting pBBR for DUA prefix");
1346-
ipv6_route_delete(this->domain_prefix, 64, cur->id, NULL, ROUTE_THREAD);
13471337

1338+
if (!addr_is_ipv6_unspecified(this->domain_prefix)) {
1339+
// add dua route to backbone, delete dua from on-mesh route
1340+
ipv6_route_add_with_info(this->domain_prefix, 64, this->backbone_interface_id, NULL, ROUTE_THREAD_BBR, NULL, 0, 0xffffffff, 0);
1341+
tr_info("Hosting pBBR for DUA prefix");
1342+
ipv6_route_delete(this->domain_prefix, 64, cur->id, NULL, ROUTE_THREAD);
1343+
}
13481344
}
13491345

1350-
13511346
void thread_extension_bbr_seconds_timer(int8_t interface_id, uint32_t seconds)
13521347
{
13531348
thread_pbbr_t *this = thread_bbr_find_by_interface(interface_id);
@@ -1448,14 +1443,17 @@ int thread_extension_bbr_prefix_set(int8_t interface_id, uint8_t *prefix)
14481443
return 0;
14491444
}
14501445

1451-
thread_border_router_info_t br_info = {0};
1452-
br_info.P_on_mesh = true;
1453-
br_info.stableData = true;
1454-
br_info.P_res1 = true;
1455-
if (thread_border_router_prefix_add(this->interface_id, this->domain_prefix, 64, &br_info)) {
1456-
tr_error("Adding domain prefix failed!");
1457-
return -1;
1446+
if (!addr_is_ipv6_unspecified(this->domain_prefix)) {
1447+
thread_border_router_info_t br_info = {0};
1448+
br_info.P_on_mesh = true;
1449+
br_info.stableData = true;
1450+
br_info.P_res1 = true;
1451+
if (thread_border_router_prefix_add(this->interface_id, this->domain_prefix, 64, &br_info)) {
1452+
tr_error("Adding domain prefix failed!");
1453+
return -1;
1454+
}
14581455
}
1456+
14591457
thread_border_router_publish(this->interface_id);
14601458

14611459
return 0;

source/6LoWPAN/Thread/thread_network_data_storage.c

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1565,14 +1565,12 @@ int thread_nd_local_list_add_service(thread_network_data_cache_entry_t *networkD
15651565
*/
15661566
int thread_nd_local_list_add_on_mesh_prefix(thread_network_data_cache_entry_t *networkDataList, thread_prefix_tlv_t *prefixTlv, thread_border_router_tlv_entry_t *service)
15671567
{
1568-
bool trigDataPropagate = false;
15691568
thread_network_data_prefix_cache_entry_t *prefix_entry;
15701569
thread_network_server_data_entry_t *server_entry;
1571-
if (service->P_dhcp) {
1572-
tr_debug("Add DHCPv6 prefix:%s server: %04x", trace_ipv6_prefix(prefixTlv->Prefix, prefixTlv->PrefixLen), service->routerID);
1573-
} else {
1574-
tr_debug("Add SLAAC prefix:%s server: %04x", trace_ipv6_prefix(prefixTlv->Prefix, prefixTlv->PrefixLen), service->routerID);
1575-
}
1570+
bool trigDataPropagate = false;
1571+
1572+
tr_debug("Add %s%s%s prefix:%s server: %04x", service->P_dhcp ? "DHCPv6" : "", service->P_slaac ? "SLAAC " : "", service->P_res1 ? "P_res1 " : "",
1573+
trace_ipv6_prefix(prefixTlv->Prefix, prefixTlv->PrefixLen), service->routerID);
15761574

15771575
if (!networkDataList) {
15781576
return -1;
@@ -1634,6 +1632,10 @@ int thread_nd_local_list_add_on_mesh_prefix(thread_network_data_cache_entry_t *n
16341632
trigDataPropagate = true;
16351633
}
16361634

1635+
if (server_entry->P_res1 != service->P_res1) {
1636+
server_entry->P_res1 = service->P_res1;
1637+
trigDataPropagate = true;
1638+
}
16371639
}
16381640

16391641
if (trigDataPropagate) {
@@ -1647,7 +1649,6 @@ int thread_nd_local_list_add_on_mesh_prefix(thread_network_data_cache_entry_t *n
16471649
return 0;
16481650
}
16491651

1650-
16511652
/**
16521653
* Del DHCPv6 Server information to route List
16531654
*
@@ -1671,13 +1672,8 @@ int thread_nd_local_list_del_on_mesh_server(thread_network_data_cache_entry_t *n
16711672
return -1;
16721673
}
16731674

1674-
if (service->P_dhcp) {
1675-
tr_debug("Del DHCPv6 server: %s",
1676-
trace_array(prefixTlv->Prefix, prefixBits_to_bytes(prefixTlv->PrefixLen)));
1677-
} else {
1678-
tr_debug("Del SLAAC server: %s",
1679-
trace_array(prefixTlv->Prefix, prefixBits_to_bytes(prefixTlv->PrefixLen)));
1680-
}
1675+
tr_debug("Del %s%s%s prefix: %s", service->P_dhcp ? "DHCPv6" : "", service->P_slaac ? "SLAAC " : "", service->P_res1 ? "P_res1 " : "",
1676+
trace_array(prefixTlv->Prefix, prefixBits_to_bytes(prefixTlv->PrefixLen)));
16811677

16821678
main_list = thread_prefix_entry_get(&networkDataList->localPrefixList, prefixTlv);
16831679
if (!main_list) {

test/nanostack/unittest/stub/thread_common_stub.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -413,7 +413,7 @@ bool thread_stable_context_check(protocol_interface_info_entry_t *cur, buffer_t
413413
}
414414

415415

416-
void thread_maintenance_timer_set(protocol_interface_info_entry_t *cur, uint16_t delay)
416+
void thread_maintenance_timer_set(protocol_interface_info_entry_t *cur)
417417
{
418418

419419
}

0 commit comments

Comments
 (0)