Skip to content

Commit 9b14b83

Browse files
additional thread prefixes in network data (ARMmbed#1833)
prefix distribution moved from active dataset to network data.
1 parent fb07086 commit 9b14b83

File tree

10 files changed

+83
-177
lines changed

10 files changed

+83
-177
lines changed

nanostack/thread_bbr_api.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ int thread_bbr_start(int8_t interface_id, int8_t backbone_interface_id);
7575
*
7676
*/
7777
int thread_bbr_timeout_set(int8_t interface_id, uint32_t timeout_a, uint32_t timeout_b, uint32_t delay);
78+
7879
/**
7980
* Set prefix to be used as combining multiple thread networks on backbone.
8081
*

source/6LoWPAN/Thread/thread_bootstrap.c

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -675,9 +675,6 @@ static void thread_bootstrap_ml_address_update(protocol_interface_info_entry_t *
675675
// Generate new ML64 address
676676
thread_generate_ml64_address(cur);
677677

678-
// Generate new domain address
679-
thread_extension_address_generate(cur);
680-
681678
// Register multicast addresses
682679
thread_bootstrap_all_nodes_multicast_register(cur);
683680

@@ -697,8 +694,6 @@ int thread_configuration_thread_activate(protocol_interface_info_entry_t *cur, l
697694
//Define Default Contexts
698695
lowpan_context_update(&cur->lowpan_contexts, LOWPAN_CONTEXT_C, 0xFFFF, linkConfiguration->mesh_local_ula_prefix, 64, true);
699696

700-
thread_extension_activate(cur);
701-
702697
thread_extension_bbr_route_update(cur);
703698

704699
blacklist_clear();
@@ -1634,7 +1629,6 @@ void thread_bootstrap_routing_activate(protocol_interface_info_entry_t *cur)
16341629
if (cur->thread_info->thread_device_mode == THREAD_DEVICE_MODE_FULL_END_DEVICE ||
16351630
cur->thread_info->thread_device_mode == THREAD_DEVICE_MODE_ROUTER) {
16361631
thread_meshlocal_route_set(cur);
1637-
thread_extension_route_set(cur);
16381632
// FEDs and routers (REEDs) perform their own address resolution
16391633
thread_nd_service_activate(cur->id);
16401634
} else {
@@ -1666,8 +1660,6 @@ void thread_bootstrap_attached_finish(protocol_interface_info_entry_t *cur)
16661660
thread_generate_ml16_address(cur);
16671661
//GENERATE ML-EID64
16681662
thread_generate_ml64_address(cur);
1669-
// Generate new domain address
1670-
thread_extension_address_generate(cur);
16711663
thread_bootstrap_routing_activate(cur);
16721664
thread_bootstrap_network_data_update(cur);
16731665
// After successful attach if there is announcement info present, send announcement back to previous channel
@@ -2381,6 +2373,7 @@ static int thread_nd_prefix_context_allocate(protocol_interface_info_entry_t *cu
23812373
if (cid == 16) {
23822374
return -1;
23832375
}
2376+
23842377
context.cid = cid;
23852378
context.compression = true;
23862379
context.stableData = stableData;
@@ -2821,6 +2814,8 @@ void thread_bootstrap_network_prefixes_process(protocol_interface_info_entry_t *
28212814
if (curBorderRouter->P_dhcp && weHostService && nd_proxy_enabled_for_upstream(cur->id) && nd_proxy_upstream_route_onlink(cur->id,curPrefix->servicesPrefix)) {
28222815
// don't add
28232816
tr_debug("Suppressing onlink %s for proxy", trace_ipv6_prefix(curPrefix->servicesPrefix, curPrefix->servicesPrefixLen));
2817+
} else if (curBorderRouter->P_res1) {
2818+
ipv6_route_add(curPrefix->servicesPrefix, curPrefix->servicesPrefixLen, cur->id, NULL, ROUTE_THREAD, 0xffffffff, 0);
28242819
} else {
28252820
//add
28262821
tr_debug("Adding onlink %s", trace_ipv6_prefix(curPrefix->servicesPrefix, curPrefix->servicesPrefixLen));
@@ -2866,6 +2861,10 @@ void thread_bootstrap_network_prefixes_process(protocol_interface_info_entry_t *
28662861
icmpv6_slaac_address_add(cur, curPrefix->servicesPrefix, curPrefix->servicesPrefixLen, 0xffffffff, 0xffffffff, true, SLAAC_IID_DEFAULT);
28672862
}
28682863
}
2864+
// generate address based on res1 bit
2865+
if (curBorderRouter->P_res1) {
2866+
thread_extension_dua_address_generate(cur,curPrefix->servicesPrefix,64);
2867+
}
28692868

28702869
} // for each borderRouterList
28712870

source/6LoWPAN/Thread/thread_extension.c

Lines changed: 35 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,10 @@ typedef struct thread_extension_info {
8686

8787
#ifdef HAVE_THREAD_ROUTER
8888
static int thread_extension_joiner_router_init(protocol_interface_info_entry_t *cur);
89+
static bool thread_extension_is_domain_prefix(protocol_interface_info_entry_t *interface, const uint8_t *addr);
8990
#else
9091
#define thread_extension_joiner_router_init(cur)
92+
#define thread_extension_is_domain_prefix(interface, addr) false
9193
#endif
9294

9395
static int thread_extension_dua_registration_cb(int8_t service_id, uint8_t source_address[static 16], uint16_t source_port, sn_coap_hdr_s *response_ptr)
@@ -131,7 +133,7 @@ static int thread_extension_dua_registration_cb(int8_t service_id, uint8_t sourc
131133
if_address_entry_t *addr_entry = addr_get_entry(cur, addr_data_ptr);
132134
if (addr_entry) {
133135
cur->dad_failures++;
134-
thread_extension_address_generate(cur);
136+
thread_extension_dua_address_generate(cur,addr_data_ptr, 64);
135137
return 0;
136138
}
137139

@@ -192,7 +194,7 @@ static int thread_extension_mtd_dua_ntf_cb(int8_t service_id, uint8_t source_add
192194
}
193195
// generate new dua address
194196
cur->dad_failures++;
195-
thread_extension_address_generate(cur);
197+
thread_extension_dua_address_generate(cur, addr_data_ptr, 64);
196198

197199
return 0;
198200
}
@@ -322,15 +324,12 @@ void thread_extension_addr_ntf_send(struct protocol_interface_info_entry *cur, u
322324
{
323325
uint8_t payload[16 + 1]; // Target eid + Status
324326
uint8_t *ptr;
325-
uint8_t domain_prefix[16];
326-
uint8_t domain_prefix_len;
327327
uint8_t br_ml_addr[16];
328328
uint8_t seq;
329329
uint32_t delay_timer;
330330

331-
if (0 != thread_extension_network_prefix_get(cur->id, NULL, domain_prefix, &domain_prefix_len) ||
332-
!bitsequal(addr_data_ptr, domain_prefix, domain_prefix_len)) {
333-
//Not in commercial Mode
331+
332+
if (!thread_extension_is_domain_prefix(cur, addr_data_ptr)) {
334333
return;
335334
}
336335

@@ -351,38 +350,6 @@ void thread_extension_addr_ntf_send(struct protocol_interface_info_entry *cur, u
351350
return;
352351
}
353352

354-
int thread_extension_network_prefix_get(int8_t interface_id, uint8_t *options_ptr, uint8_t *domain_prefix_ptr, uint8_t *domain_prefix_len)
355-
{
356-
uint8_t *ptr;
357-
uint16_t tlv_len;
358-
uint8_t *configuration_ptr;
359-
uint16_t configuration_len;
360-
configuration_ptr = thread_joiner_application_active_config_params_get(interface_id, &configuration_len);
361-
if (!configuration_ptr || !configuration_len) {
362-
return -1;
363-
}
364-
tlv_len = thread_meshcop_tlv_find(configuration_ptr,configuration_len, MESHCOP_TLV_DOMAIN_PREFIX, &ptr);
365-
if (tlv_len == 0) {
366-
return -2;
367-
}
368-
if (tlv_len < 9) {
369-
tr_error("domain prefix corrupted len:%d", tlv_len);
370-
return -3;
371-
}
372-
373-
if (domain_prefix_len) {
374-
*domain_prefix_len = 64;
375-
}
376-
if (options_ptr) {
377-
*options_ptr = ptr[0];
378-
}
379-
if (domain_prefix_ptr) {
380-
bitcopy(domain_prefix_ptr, &ptr[1], 64);
381-
}
382-
383-
return 0;
384-
}
385-
386353
static void thread_extension_primary_bbr_update_done(struct protocol_interface_info_entry *cur)
387354
{
388355
// Check if network data changed or bbr info and send proactive an if needed
@@ -407,8 +374,6 @@ void thread_extension_network_data_process(struct protocol_interface_info_entry
407374
{
408375
// Check if network data changed or bbr info and send proactive an if needed
409376
uint8_t addr[16];
410-
uint8_t domain_prefix[16];
411-
uint8_t domain_prefix_len;
412377
uint8_t sequence_number;
413378
uint32_t delay_timer;
414379
uint32_t mlr_timeout;
@@ -420,17 +385,8 @@ void thread_extension_network_data_process(struct protocol_interface_info_entry
420385
if (1 == thread_extension_primary_bbr_update_needed(cur,common_read_16_bit(&addr[14]), sequence_number)) {
421386
thread_address_registration_timer_set(cur, 1 + randLIB_get_random_in_range(0, delay_timer/1000), randLIB_get_random_in_range(1,5));
422387
}
423-
// Check if we are the BBR if we are make default route to backend
424-
if (0 == thread_extension_network_prefix_get(cur->id, NULL, domain_prefix, &domain_prefix_len)) {
425-
// Routers and FEDs create on-mesh prefix for domain prefix
426-
if (cur->thread_info->thread_device_mode == THREAD_DEVICE_MODE_ROUTER ||
427-
cur->thread_info->thread_device_mode == THREAD_DEVICE_MODE_FULL_END_DEVICE){
428-
if (ipv6_route_add(domain_prefix, domain_prefix_len, cur->id, NULL, ROUTE_THREAD, 0xffffffff, 0) == NULL) {
429-
tr_error("fail to add domain prefix route");
430-
}
431-
}
432-
}
433388
}
389+
434390
static uint8_t *thread_server_tlv_list_get(uint8_t *service_tlv_ptr, uint16_t service_tlv_len , uint16_t *server_tlv_list_len)
435391
{
436392
uint16_t tlv_length = 0;
@@ -576,19 +532,14 @@ static int thread_extension_mlr_req_send(protocol_interface_info_entry_t *cur, c
576532
return 0;
577533
}
578534

579-
580535
void thread_extension_address_registration(struct protocol_interface_info_entry *interface, const uint8_t *addr, const uint8_t *child_mac64, bool refresh_child_entry, bool duplicate_child_detected)
581536
{
582537
uint8_t *ml_eid;
583538
uint8_t br_ml_addr[16];
584539
uint8_t seq;
585540
uint32_t delay_timer;
586-
uint8_t domain_prefix[16];
587-
uint8_t domain_prefix_len;
588541

589-
if (0 != thread_extension_network_prefix_get(interface->id, NULL, domain_prefix, &domain_prefix_len) ||
590-
!bitsequal(addr, domain_prefix, domain_prefix_len)) {
591-
//Not in commercial Mode
542+
if (!thread_extension_is_domain_prefix(interface, addr)) {
592543
return;
593544
}
594545
tr_debug("domain prefix address");
@@ -671,22 +622,13 @@ void thread_extension_address_registration(struct protocol_interface_info_entry
671622
}
672623
#endif
673624
}
674-
void thread_extension_address_generate(protocol_interface_info_entry_t *cur)
625+
626+
void thread_extension_dua_address_generate(protocol_interface_info_entry_t *cur, uint8_t *domain_prefix, uint8_t domain_prefix_len)
675627
{
676628
if_address_entry_t *def_address = NULL;
677-
uint8_t options;
678-
uint8_t domain_prefix_len;
679-
uint8_t domain_address[16];
680629
addr_delete_matching(cur, NULL, 0, ADDR_SOURCE_THREAD_DOMAIN);
681-
682-
if (thread_extension_network_prefix_get(cur->id, &options, domain_address, &domain_prefix_len)) {
683-
return;
684-
}
685-
if (!(options & 0x80)) {
686-
tr_debug("domain prefix does not allow SLAAC address, prefix %s options:%u",trace_ipv6_prefix(domain_address,domain_prefix_len),options);
687-
return;
688-
}
689-
630+
uint8_t domain_address[16];
631+
memcpy(domain_address, domain_prefix, 8);
690632
def_address = icmpv6_slaac_address_add(cur, domain_address, domain_prefix_len, 0xffffffff, 0xffffffff, true, SLAAC_IID_DEFAULT);
691633
if (def_address) {
692634
tr_info("Generated domain address 64: %s", trace_ipv6(def_address->address));
@@ -814,43 +756,6 @@ void thread_extension_address_registration_trigger(protocol_interface_info_entry
814756
}
815757
}
816758

817-
void thread_extension_route_set(protocol_interface_info_entry_t *cur)
818-
{
819-
uint8_t domain_prefix[16];
820-
uint8_t domain_prefix_len;
821-
if (0 == thread_extension_network_prefix_get(cur->id, NULL, domain_prefix, &domain_prefix_len)) {
822-
tr_info("domain prefix route handling");
823-
// If we are Primary BBR we dont do this, but we dont know when we become it so We must remove this if selected as pBBR
824-
if (ipv6_route_add(domain_prefix, domain_prefix_len, cur->id, NULL, ROUTE_THREAD, 0xffffffff, 0) == NULL) {
825-
tr_error("fail to add domain prefix route");
826-
}
827-
}
828-
}
829-
void thread_extension_activate(protocol_interface_info_entry_t *cur)
830-
{
831-
uint8_t domain_prefix[16];
832-
uint8_t domain_prefix_len;
833-
if (0 == thread_extension_network_prefix_get(cur->id, NULL, domain_prefix, &domain_prefix_len)) {
834-
// Domain prefix available create DUA address.
835-
// Domain prefix is allways context id 1
836-
tr_info("domain prefix Context created");
837-
lowpan_context_update(&cur->lowpan_contexts, LOWPAN_CONTEXT_C | 1, 0xFFFF, domain_prefix, domain_prefix_len, true);
838-
839-
}
840-
}
841-
842-
bool thread_extension_context_can_delete(int8_t id, uint8_t servicesPrefix[16], uint8_t context_prefix_length)
843-
{
844-
uint8_t domain_prefix[16];
845-
uint8_t domain_prefix_len;
846-
if (0 == thread_extension_network_prefix_get(id, NULL,domain_prefix, &domain_prefix_len)) {
847-
if (context_prefix_length == domain_prefix_len && memcmp(domain_prefix, servicesPrefix, context_prefix_length/8) == 0) {
848-
return false;
849-
}
850-
}
851-
return true;
852-
}
853-
854759
bool thread_extension_enabled(protocol_interface_info_entry_t *cur)
855760
{
856761
if (thread_info(cur)->version <= THREAD_PROTOCOL_VERSION) {
@@ -966,6 +871,29 @@ static int thread_extension_relay_tx_cb(int8_t service_id, uint8_t source_addres
966871
return -1; // OK no response sent
967872
}
968873

874+
static bool thread_extension_is_domain_prefix(protocol_interface_info_entry_t *interface, const uint8_t *addr)
875+
{
876+
uint8_t address[16];
877+
memcpy(address, addr, 16);
878+
thread_prefix_tlv_t prefixTlv;
879+
prefixTlv.domainId = 0;
880+
prefixTlv.Prefix = address;
881+
prefixTlv.PrefixLen = 64;
882+
thread_network_data_prefix_cache_entry_t *prefix_entry = NULL;
883+
thread_network_data_cache_entry_t *networkDataCache = &interface->thread_info->networkDataStorage;
884+
prefix_entry = thread_prefix_entry_find(&networkDataCache->localPrefixList, &prefixTlv);
885+
if (!prefix_entry) {
886+
return false;
887+
}
888+
ns_list_foreach(thread_network_server_data_entry_t, brEntry, &prefix_entry->borderRouterList) {
889+
if (brEntry->P_res1) {
890+
return true;
891+
}
892+
}
893+
return false;
894+
895+
}
896+
969897
static void thread_extension_relay_socket_cb(void *cb_res)
970898
{
971899
socket_callback_t *sckt_data = 0;

source/6LoWPAN/Thread/thread_extension.h

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -46,19 +46,15 @@ void thread_extension_allocate(protocol_interface_info_entry_t *cur);
4646
void thread_extension_free(protocol_interface_info_entry_t *cur);
4747
void thread_extension_init(int8_t interface_id, int8_t coap_service_id);
4848
void thread_extension_mtd_service_register(protocol_interface_info_entry_t *cur);
49-
int thread_extension_network_prefix_get(int8_t interface_id, uint8_t *options_ptr, uint8_t *prefix_ptr, uint8_t *prefix_len);
5049
void thread_extension_network_data_process(struct protocol_interface_info_entry *cur);
5150
int thread_extension_primary_bbr_get(struct protocol_interface_info_entry *cur, uint8_t *addr_ptr, uint8_t *seq_ptr, uint32_t *timer1_ptr, uint32_t *timer2_ptr);
5251
void thread_extension_address_registration(struct protocol_interface_info_entry *interface, const uint8_t *addr, const uint8_t *child_mac64, bool refresh_child_entry, bool duplicate_child_detected);
53-
void thread_extension_address_generate(protocol_interface_info_entry_t *cur);
52+
void thread_extension_dua_address_generate(protocol_interface_info_entry_t *cur, uint8_t *domain_prefix, uint8_t domain_prefix_len);
5453
void thread_extension_aloc_generate(struct protocol_interface_info_entry *cur);
5554
bool thread_extension_aloc_map(protocol_interface_info_entry_t *cur, uint16_t *addr16);
5655
void thread_extension_mcast_subscrition_change(protocol_interface_info_entry_t *interface);
5756
void thread_extension_address_registration_trigger(protocol_interface_info_entry_t *interface);
58-
void thread_extension_route_set(protocol_interface_info_entry_t *cur);
59-
void thread_extension_activate(protocol_interface_info_entry_t *cur);
6057
bool thread_extension_enabled(protocol_interface_info_entry_t *cur);
61-
bool thread_extension_context_can_delete(int8_t id, uint8_t servicesPrefix[16], uint8_t context_prefix_length);
6258
bool thread_extension_version_check(uint8_t version);
6359
void thread_extension_discover_response_read(struct discovery_response_list *nwk_info, uint16_t discover_response_tlv, uint8_t *data_ptr, uint16_t data_len);
6460
void thread_extension_discover_response_tlv_write(uint16_t *data, uint8_t version, uint16_t securityPolicy);
@@ -79,16 +75,12 @@ uint8_t *thread_extension_discover_response_write(protocol_interface_info_entry_
7975
#define thread_extension_allocate(cur)
8076
#define thread_extension_free(cur)
8177
#define thread_extension_init(interface_id,coap_service_id)
82-
#define thread_extension_network_prefix_get(interface_id,options_ptr,prefix_ptr,prefix_len) (-1)
8378
#define thread_extension_network_data_process(cur)
8479
#define thread_extension_primary_bbr_get(cur,addr_ptr,seq_ptr,timer1_ptr, timer2_ptr) (-1)
8580
#define thread_extension_address_registration(interface,addr,child_mac64,refresh_child_entry,duplicate_child_detected)
86-
#define thread_extension_address_generate(cur)
8781
#define thread_extension_aloc_generate(cur)
8882
#define thread_extension_aloc_map(cur, addr16) false
8983
#define thread_extension_mcast_subscrition_change(interface)
90-
#define thread_extension_route_set(cur)
91-
#define thread_extension_activate(cur)
9284
#define thread_extension_enabled(cur) (false)
9385
#define thread_extension_version_check(version) (false)
9486
#define thread_extension_discover_response_read(nwk_info, discover_response_tlv, data_ptr, data_len)
@@ -98,7 +90,7 @@ uint8_t *thread_extension_discover_response_write(protocol_interface_info_entry_
9890
#define thread_extension_discover_response_len(cur) 0
9991
#define thread_extension_discover_response_write(cur, ptr) (ptr)
10092
#define thread_extension_addr_ntf_send(cur,destination_address,addr_data_ptr,bbr_status)
101-
#define thread_extension_context_can_delete(id, servicesPrefix, context_prefix_length) false
93+
#define thread_extension_dua_address_generate(cur, domain_prefix, domain_prefix_len)
10294
#endif
10395

10496
#ifdef __cplusplus

0 commit comments

Comments
 (0)