Skip to content

Commit 7ea9001

Browse files
author
Mika Tervonen
committed
Added support for multiple registrations in one message
Loop all registrations and fill one message with registrations Send BMLR req to backbone for every registration inside message Fixed dua response if error code sent in registration allow setting of timeout parameters before pbbr is started
1 parent 0b7f9fe commit 7ea9001

File tree

5 files changed

+54
-36
lines changed

5 files changed

+54
-36
lines changed

source/6LoWPAN/Thread/thread_address_registration_client.c

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -100,15 +100,7 @@ void thread_address_registration_timer(protocol_interface_info_entry_t *interfac
100100
mlr_timer -= seconds;
101101
} else {
102102
mlr_timer = mlr_timeout - randLIB_get_random_in_range(30,50);
103-
ns_list_foreach(if_group_entry_t, cur, &interface->ip_groups) {
104-
if (addr_ipv6_multicast_scope(cur->group) < IPV6_SCOPE_ADMIN_LOCAL) {
105-
continue;
106-
}
107-
if (addr_ipv6_equal(cur->group, ADDR_SITE_LOCAL_ALL_ROUTERS)) {
108-
continue;
109-
}
110-
thread_extension_mcast_subscrition_change(interface, cur, true);
111-
}
103+
thread_extension_mcast_subscrition_change(interface);
112104
}
113105
/* Update global scope addresses (children's as well) */
114106
if (addr_notificastion_timer > seconds) {

source/6LoWPAN/Thread/thread_extension.c

Lines changed: 41 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -328,22 +328,16 @@ void thread_extension_init(int8_t interface_id, int8_t coap_service_id)
328328
cur->thread_info->extension_info->coap_service_id = coap_service_id;
329329
}
330330

331-
static int thread_extension_mlr_req_send(protocol_interface_info_entry_t *cur, const uint8_t br_addr[16], const uint8_t address[16])
331+
static int thread_extension_mlr_req_send(protocol_interface_info_entry_t *cur, const uint8_t br_addr[16], const uint8_t *address, uint8_t address_len)
332332
{
333-
uint8_t payload[2 + 16 + 2 + 4 + 2 + 8];
334-
uint8_t *ptr;
335333

336-
if (!br_addr || !address) {
334+
if (!br_addr || !address ) {
337335
return -1;
338336
}
339-
340-
ptr = payload;
341-
ptr = thread_meshcop_tlv_data_write(ptr, TMFCOP_TLV_IPV6_ADDRESS, 16, address);
342-
343337
tr_debug("thread MLR.req send");
344338

345339
coap_service_request_send(thread_management_client_service_id_get(cur->id), COAP_REQUEST_OPTIONS_NONE, br_addr, THREAD_MANAGEMENT_PORT,
346-
COAP_MSG_TYPE_CONFIRMABLE, COAP_MSG_CODE_REQUEST_POST, THREAD_URI_BBR_MCAST_LISTENER_REPORT, COAP_CT_OCTET_STREAM, payload, ptr - payload, thread_comercial_mlr_cb);
340+
COAP_MSG_TYPE_CONFIRMABLE, COAP_MSG_CODE_REQUEST_POST, THREAD_URI_BBR_MCAST_LISTENER_REPORT, COAP_CT_OCTET_STREAM, address, address_len, thread_comercial_mlr_cb);
347341
return 0;
348342
}
349343

@@ -485,22 +479,54 @@ bool thread_extension_aloc_map(protocol_interface_info_entry_t *cur, uint16_t *a
485479
}
486480
return false;
487481
}
482+
// Amount of Addressess in MLR message 4 fits in one fragment
483+
#define ADDR_PER_MSG 4
488484

489-
void thread_extension_mcast_subscrition_change(protocol_interface_info_entry_t *interface, if_group_entry_t *group, bool added)
485+
void thread_extension_mcast_subscrition_change(protocol_interface_info_entry_t *interface)
490486
{
491-
(void) added;
487+
uint8_t *addr;
488+
uint8_t *ptr;
489+
uint8_t addr_len;
492490
uint8_t br_ml_addr[16];
493491
uint32_t mlr_timer;
494492

495-
if (addr_ipv6_multicast_scope(group->group) < IPV6_SCOPE_ADMIN_LOCAL) {
493+
if (0 != thread_extension_primary_bbr_get(interface, br_ml_addr, NULL, &mlr_timer, NULL )) {
496494
return;
497495
}
498-
499-
if (0 != thread_extension_primary_bbr_get(interface, br_ml_addr, NULL, &mlr_timer, NULL )) {
496+
addr = ns_dyn_mem_temporary_alloc(16*ADDR_PER_MSG + 2);
497+
if (!addr) {
500498
return;
501499
}
502500
// MLR is sent only for primary BBR for now, but this might change
503-
thread_extension_mlr_req_send(interface, br_ml_addr, group->group);
501+
ptr = addr;
502+
addr_len = 0;
503+
*ptr++ = TMFCOP_TLV_IPV6_ADDRESS;
504+
*ptr++ = 0; // Length will be updated later
505+
ns_list_foreach(if_group_entry_t, cur, &interface->ip_groups) {
506+
if (addr_ipv6_multicast_scope(cur->group) < IPV6_SCOPE_ADMIN_LOCAL) {
507+
continue;
508+
}
509+
if (addr_ipv6_equal(cur->group, ADDR_SITE_LOCAL_ALL_ROUTERS)) {
510+
continue;
511+
}
512+
memcpy(ptr, cur->group,16);
513+
ptr +=16;
514+
addr_len = ptr - addr;
515+
addr[1] = addr_len - 2;// Fill in the length
516+
if (addr_len > 16*ADDR_PER_MSG) {
517+
// Send first patch
518+
thread_extension_mlr_req_send(interface, br_ml_addr, addr, addr_len);
519+
// Reset the packet to start
520+
ptr = addr;
521+
ptr += 2;
522+
addr_len = 0;
523+
}
524+
}
525+
if (addr_len != 0) {
526+
// Send rest
527+
thread_extension_mlr_req_send(interface, br_ml_addr, addr, addr_len);
528+
}
529+
ns_dyn_mem_free(addr);
504530

505531
#if 0
506532
ns_list_foreach(thread_network_data_prefix_cache_entry_t, cur, &interface->thread_info->networkDataStorage.localPrefixList) {

source/6LoWPAN/Thread/thread_extension.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ void thread_extension_address_registration(struct protocol_interface_info_entry
5252
void thread_extension_address_generate(protocol_interface_info_entry_t *cur);
5353
void thread_extension_aloc_generate(struct protocol_interface_info_entry *cur);
5454
bool thread_extension_aloc_map(protocol_interface_info_entry_t *cur, uint16_t *addr16);
55-
void thread_extension_mcast_subscrition_change(protocol_interface_info_entry_t *interface, if_group_entry_t *group, bool added);
55+
void thread_extension_mcast_subscrition_change(protocol_interface_info_entry_t *interface);
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);
@@ -84,7 +84,7 @@ uint8_t *thread_extension_discover_response_write(protocol_interface_info_entry_
8484
#define thread_extension_address_generate(cur)
8585
#define thread_extension_aloc_generate(cur)
8686
#define thread_extension_aloc_map(cur, addr16) false
87-
#define thread_extension_mcast_subscrition_change(interface, group, added)
87+
#define thread_extension_mcast_subscrition_change(interface)
8888
#define thread_extension_route_set(cur)
8989
#define thread_extension_activate(cur)
9090
#define thread_extension_enabled(cur) (false)

source/6LoWPAN/Thread/thread_extension_bbr.c

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -721,18 +721,18 @@ static int thread_extension_bbr_mlr_cb(int8_t service_id, uint8_t source_address
721721
while (remaining > 0) {
722722
//Go through all addresses
723723
if (timeout_value == 0) {
724-
tr_debug("Multicast address: %s delete", trace_ipv6(addr_ptr));
724+
//tr_debug("Multicast address: %s delete", trace_ipv6(addr_ptr));
725725
addr_multicast_fwd_remove(cur, addr_ptr);
726726
} else {
727-
tr_debug("Multicast address: %s Timeout value: %"PRIu32, trace_ipv6(addr_ptr),timeout_value);
727+
//tr_debug("Multicast address: %s Timeout value: %"PRIu32, trace_ipv6(addr_ptr),timeout_value);
728728
multicast_fwd_add(this->interface_id, addr_ptr, timeout_value);
729+
// send BMLR.ntf message to backend
730+
thread_extension_bbr_bmlr_req_send(this->br_bb_service_id, this->pbbr_multicast_address, addr_data_ptr, 16, timeout_value);
729731
}
730732
addr_ptr += 16;
731733
remaining -= 16;
732734
}
733735

734-
// send BMLR.ntf message to backend
735-
thread_extension_bbr_bmlr_req_send(this->br_bb_service_id, this->pbbr_multicast_address, addr_data_ptr, addr_len, timeout_value);
736736

737737
send_response:
738738

@@ -760,7 +760,7 @@ static int thread_extension_bbr_dua_cb(int8_t service_id, uint8_t source_address
760760
{
761761
(void)source_port;
762762
uint16_t addr_len, ml_eid_len;
763-
uint8_t *addr_data_ptr;
763+
uint8_t *addr_data_ptr = NULL;
764764
uint8_t *ml_eid_ptr;
765765
uint8_t payload[2 + 16 + 2 + 2 + 1 + 8];
766766
uint8_t domain_prefix[8];
@@ -872,7 +872,9 @@ static int thread_extension_bbr_dua_cb(int8_t service_id, uint8_t source_address
872872

873873
ptr = payload;
874874
ptr = thread_tmfcop_tlv_data_write_uint8(ptr, TMFCOP_TLV_STATUS, bbr_status);
875-
ptr = thread_meshcop_tlv_data_write(ptr, TMFCOP_TLV_TARGET_EID, 16, addr_data_ptr);
875+
if (addr_data_ptr) {
876+
ptr = thread_meshcop_tlv_data_write(ptr, TMFCOP_TLV_TARGET_EID, 16, addr_data_ptr);
877+
}
876878
coap_service_response_send(this->coap_service_id, COAP_REQUEST_OPTIONS_NONE, request_ptr, response_code, COAP_CT_OCTET_STREAM, payload, ptr - payload);
877879
return 0;
878880
}
@@ -1255,7 +1257,7 @@ int thread_extension_bbr_timeout_set(int8_t interface_id, uint32_t timeout_a, ui
12551257
if(delay) {
12561258
this->delay_timer = delay;
12571259
}
1258-
if(this->backbone_interface_id < 0) {
1260+
if(this->backbone_interface_id < 0 || !this->pbbr_started) {
12591261
// it is ok to change default values before the start of pbbr
12601262
return 0;
12611263
}

test/nanostack/unittest/stub/thread_extension_stub.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -115,11 +115,9 @@ void thread_extension_address_registration(struct protocol_interface_info_entry
115115
(void)addr;
116116
(void)child_mac64;
117117
}
118-
void thread_extension_mcast_subscrition_change(protocol_interface_info_entry_t *interface, if_group_entry_t *group, bool added)
118+
void thread_extension_mcast_subscrition_change(protocol_interface_info_entry_t *interface)
119119
{
120120
(void)interface;
121-
(void)group;
122-
(void)added;
123121
}
124122
void thread_extension_address_generate(protocol_interface_info_entry_t *cur)
125123
{

0 commit comments

Comments
 (0)