Skip to content

Commit c288227

Browse files
author
Mika Tervonen
authored
Add extension check for partition weight drop in parent selection (ARMmbed#1521)
Only drop partitions if security policy demands
1 parent d8dea28 commit c288227

File tree

9 files changed

+51
-10
lines changed

9 files changed

+51
-10
lines changed

source/6LoWPAN/Thread/thread_bootstrap.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -489,6 +489,14 @@ int thread_bootstrap_partition_process(protocol_interface_info_entry_t *cur, uin
489489
tr_debug("Heard a REED and I am a singleton - merge");
490490
return 2;
491491
}
492+
/*Rule 0: If we are going to form Higher partition than heard we dont try to attach to lower ones
493+
*/
494+
if (thread_extension_enabled(cur) &&
495+
thread_info(cur)->thread_device_mode == THREAD_DEVICE_MODE_ROUTER &&
496+
heard_partition_leader_data->weighting < thread_info(cur)->partition_weighting) {
497+
return -2;
498+
}
499+
492500
//Rule 1: A non-singleton Thread Network Partition always has higher priority than a singleton Thread Network Partition
493501
if (heard_partition_routers > 1 && active_routers == 1) {
494502
tr_debug("Heard a nonsingleton and i am a singleton");

source/6LoWPAN/Thread/thread_discovery.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -559,7 +559,7 @@ static int thread_discovery_response_send(thread_discovery_class_t *class, threa
559559
*ptr++ = message_length;
560560
uint16_t discover_response_tlv = thread_discover_tlv_get(class->version, (linkConfiguration->securityPolicy & SECURITY_POLICY_NATIVE_COMMISSIONING_ALLOWED));
561561

562-
discover_response_tlv = thread_extension_discover_response_tlv_write(discover_response_tlv, class->version, thread_extension_security_policy_enabled(linkConfiguration->securityPolicy));
562+
thread_extension_discover_response_tlv_write(&discover_response_tlv, class->version, linkConfiguration->securityPolicy);
563563

564564
ptr = thread_meshcop_tlv_data_write_uint16(ptr, MESHCOP_TLV_DISCOVERY_RESPONSE, discover_response_tlv);
565565
ptr = thread_meshcop_tlv_data_write(ptr, MESHCOP_TLV_XPANID, 8, linkConfiguration->extented_pan_id);

source/6LoWPAN/Thread/thread_extension.c

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -568,8 +568,14 @@ void thread_extension_activate(protocol_interface_info_entry_t *cur)
568568
}
569569
}
570570

571-
bool thread_extension_security_policy_enabled(uint8_t securityPolicy)
571+
bool thread_extension_enabled(protocol_interface_info_entry_t *cur)
572572
{
573+
if (thread_info(cur)->version <= THREAD_PROTOCOL_VERSION) {
574+
// Thread 1.1 version devices dont check the extension
575+
return false;
576+
}
577+
uint16_t securityPolicy = thread_joiner_application_security_policy_get(cur->id);
578+
573579
if (securityPolicy & SECURITY_POLICY_CCM_ENABLED) {
574580
return true;
575581
}
@@ -607,12 +613,13 @@ void thread_extension_discover_response_read(discovery_response_list_t *nwk_info
607613
discovery_add_info->ccm_supported = (discover_response_tlv >> 10) & 1;
608614
}
609615

610-
uint16_t thread_extension_discover_response_tlv_write(uint16_t data, uint8_t version, bool extension_bit)
616+
void thread_extension_discover_response_tlv_write(uint16_t *data, uint8_t version, uint16_t securityPolicy)
611617
{
612-
if (version == 3 && extension_bit) {
613-
data |= (uint16_t) (1 << 10);
618+
619+
if (version == 3 && securityPolicy & SECURITY_POLICY_CCM_ENABLED) {
620+
*data |= (uint16_t) (1 << 10);
614621
}
615-
return data;
622+
return;
616623
}
617624

618625
#ifdef HAVE_THREAD_ROUTER

source/6LoWPAN/Thread/thread_extension.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,10 @@ void thread_extension_mcast_subscrition_change(protocol_interface_info_entry_t *
5656
void thread_extension_address_registration_trigger(protocol_interface_info_entry_t *interface);
5757
void thread_extension_route_set(protocol_interface_info_entry_t *cur);
5858
void thread_extension_activate(protocol_interface_info_entry_t *cur);
59-
bool thread_extension_security_policy_enabled(uint8_t securityPolicy);
59+
bool thread_extension_enabled(protocol_interface_info_entry_t *cur);
6060
bool thread_extension_version_check(uint8_t version);
6161
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);
62-
uint16_t thread_extension_discover_response_tlv_write(uint16_t data, uint8_t version, bool extension_bit);
62+
void thread_extension_discover_response_tlv_write(uint16_t *data, uint8_t version, uint16_t securityPolicy);
6363
#ifdef HAVE_THREAD_ROUTER
6464
int thread_extension_joiner_router_init(int8_t interface_id);
6565
bool thread_extension_joining_enabled(int8_t interface_id);
@@ -87,7 +87,7 @@ uint8_t *thread_extension_discover_response_write(protocol_interface_info_entry_
8787
#define thread_extension_mcast_subscrition_change(interface, group, added)
8888
#define thread_extension_route_set(cur)
8989
#define thread_extension_activate(cur)
90-
#define thread_extension_security_policy_enabled(securityPolicy) (false)
90+
#define thread_extension_enabled(cur) (false)
9191
#define thread_extension_version_check(version) (false)
9292
#define thread_extension_discover_response_read(nwk_info, discover_response_tlv, data_ptr, data_len)
9393
#define thread_extension_discover_response_tlv_write(data, version, extension_bit) (data)

source/6LoWPAN/Thread/thread_host_bootstrap.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -588,7 +588,10 @@ void thread_mle_parent_discover_receive_cb(int8_t interface_id, mle_message_t *m
588588
}
589589
}
590590

591-
if (leaderData.weighting < thread_info(cur)->partition_weighting) {
591+
if (thread_extension_enabled(cur) &&
592+
thread_info(cur)->thread_device_mode == THREAD_DEVICE_MODE_ROUTER &&
593+
leaderData.weighting < thread_info(cur)->partition_weighting) {
594+
// Only applies to extensions and only routers that can form new partitions can ignore lower weight
592595
tr_debug("Drop parent due weighting %d<%d", leaderData.weighting, thread_info(cur)->partition_weighting);
593596
return;
594597
}
@@ -612,6 +615,7 @@ void thread_mle_parent_discover_receive_cb(int8_t interface_id, mle_message_t *m
612615
(leaderData.weighting != currentWeighting)) {
613616
int retVal = thread_bootstrap_partition_process(cur, connectivityTlv.activeRouters, &leaderData,NULL);
614617
if (retVal > 0) {
618+
// New partition is Higher
615619
scan_result = thread_info(cur)->thread_attach_scanned_parent;
616620
}
617621
}

source/6LoWPAN/Thread/thread_joiner_application.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1031,6 +1031,16 @@ uint64_t thread_joiner_application_active_timestamp_get(int8_t interface_id)
10311031
return this->configuration_ptr->timestamp;
10321032
}
10331033

1034+
uint8_t thread_joiner_application_security_policy_get(int8_t interface_id)
1035+
{
1036+
thread_joiner_t *this = thread_joiner_find(interface_id);
1037+
if (!this) {
1038+
return 0;
1039+
}
1040+
1041+
return this->configuration_ptr->securityPolicy;
1042+
}
1043+
10341044
uint8_t *thread_joiner_application_random_mac_get(int8_t interface_id)
10351045
{
10361046
thread_joiner_t *this = thread_joiner_find(interface_id);

source/6LoWPAN/Thread/thread_joiner_application.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ void thread_joiner_application_deinit(int8_t interface_id);
6767
struct link_configuration *thread_joiner_application_get_config(int8_t interface_id);
6868

6969
uint64_t thread_joiner_application_active_timestamp_get(int8_t interface_id);
70+
uint8_t thread_joiner_application_security_policy_get(int8_t interface_id);
7071
void thread_joiner_application_active_timestamp_set(int8_t interface_id, uint64_t timestamp);
7172
uint8_t *thread_joiner_application_active_config_tlv_list_get(uint8_t interface_id, uint16_t *length);
7273

test/nanostack/unittest/stub/thread_extension_stub.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,12 @@ void thread_extension_activate(protocol_interface_info_entry_t *cur)
124124
{
125125
(void)cur;
126126
}
127+
bool thread_extension_enabled(protocol_interface_info_entry_t *cur)
128+
{
129+
(void)cur;
130+
return false;
131+
}
132+
127133
void thread_extension_route_set(protocol_interface_info_entry_t *cur)
128134
{
129135
(void)cur;

test/nanostack/unittest/stub/thread_joiner_application_stub.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,11 @@ uint64_t thread_joiner_application_active_timestamp_get(int8_t interface_id)
134134
{
135135
return 0;
136136
}
137+
uint8_t thread_joiner_application_security_policy_get(int8_t interface_id)
138+
{
139+
return 0;
140+
}
141+
137142
int thread_joiner_application_domain_prefix_get(int8_t interface_id, uint8_t *options_ptr, uint8_t *domain_prefix_ptr, uint8_t *domain_prefix_len)
138143
{
139144
return 0;

0 commit comments

Comments
 (0)