Skip to content

Commit c593e2b

Browse files
DUA.ntf to MTD child implemented (ARMmbed#1735)
1 parent 3f5c6c1 commit c593e2b

File tree

8 files changed

+124
-12
lines changed

8 files changed

+124
-12
lines changed

source/6LoWPAN/Thread/thread_bootstrap.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2697,7 +2697,7 @@ int thread_bootstrap_network_data_activate(protocol_interface_info_entry_t *cur)
26972697
thread_router_bootstrap_anycast_address_register(cur);
26982698
// Update joiner router status
26992699
thread_management_server_joiner_router_init(cur->id);
2700-
thread_extension_joiner_router_init(cur->id);
2700+
thread_extension_service_init(cur);
27012701

27022702
// Update border router relay
27032703
thread_bbr_commissioner_proxy_service_update(cur->id);

source/6LoWPAN/Thread/thread_extension.c

Lines changed: 95 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -82,20 +82,77 @@ typedef struct thread_extension_info {
8282
bool update_needed:1;
8383
} thread_extension_info_t;
8484

85+
#ifdef HAVE_THREAD_ROUTER
86+
static int thread_extension_joiner_router_init(protocol_interface_info_entry_t *cur);
87+
#else
88+
#define thread_extension_joiner_router_init(cur)
89+
#endif
8590

8691
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)
8792
{
88-
(void) service_id;
8993
(void) source_address;
9094
(void) source_port;
91-
(void) response_ptr;
95+
96+
uint16_t addr_len;
97+
uint8_t *bbr_status;
98+
uint8_t *addr_data_ptr = NULL;
99+
100+
protocol_interface_info_entry_t *cur = protocol_stack_interface_info_get_by_id(thread_management_client_get_interface_id_by_service_id(service_id));
101+
102+
if (!cur) {
103+
return -1;
104+
}
92105

93106
if (!response_ptr ) {
94107
tr_warn("DUA.resp failed");
108+
return -2;
109+
}
110+
111+
if (1 > thread_meshcop_tlv_find(response_ptr->payload_ptr, response_ptr->payload_len, TMFCOP_TLV_STATUS, &bbr_status)) {
112+
return -3;
113+
}
114+
115+
if (*bbr_status == 0) {
116+
// registration successful
117+
return 0;
118+
}
119+
120+
addr_len = thread_meshcop_tlv_find(response_ptr->payload_ptr, response_ptr->payload_len, TMFCOP_TLV_TARGET_EID, &addr_data_ptr);
121+
122+
if (addr_len < 16) {
123+
tr_warn("Invalid target eid in DUA.rsp cb message");
124+
return -4;
125+
}
126+
127+
// registration unsuccessful
128+
ipv6_neighbour_t *neighbour_entry;
129+
uint16_t nce_short_addr;
130+
uint8_t payload[16 + 1]; // Target eid + Status
131+
uint8_t *ptr;
132+
uint8_t destination_address[16] = {0};
133+
134+
neighbour_entry = ipv6_neighbour_lookup(&cur->ipv6_neighbour_cache, addr_data_ptr);
135+
if (!neighbour_entry) {
95136
return 0;
96137
}
97-
// TODO update registration information of BBR
98-
// TODO in case of failure Retry the registrations after a certain period;
138+
139+
nce_short_addr = common_read_16_bit(neighbour_entry->ll_address + 2);
140+
if (!thread_addr_is_child(cur->thread_info->routerShortAddress,nce_short_addr)) {
141+
return 0;
142+
}
143+
thread_addr_write_mesh_local_16(destination_address, nce_short_addr, cur->thread_info);
144+
145+
ptr = payload;
146+
ptr = thread_tmfcop_tlv_data_write(ptr, TMFCOP_TLV_TARGET_EID, 16, addr_data_ptr);
147+
ptr = thread_tmfcop_tlv_data_write_uint8(ptr, TMFCOP_TLV_STATUS, *bbr_status);
148+
149+
coap_service_request_send(service_id, COAP_REQUEST_OPTIONS_ADDRESS_SHORT,
150+
destination_address, THREAD_MANAGEMENT_PORT,
151+
COAP_MSG_TYPE_NON_CONFIRMABLE, COAP_MSG_CODE_REQUEST_POST,
152+
THREAD_URI_BBR_DOMAIN_ADDRESS_NOTIFICATION, COAP_CT_OCTET_STREAM,
153+
payload, ptr - payload, NULL);
154+
155+
ipv6_neighbour_entry_remove(&cur->ipv6_neighbour_cache, neighbour_entry);
99156

100157
return 0;
101158
}
@@ -111,6 +168,17 @@ static int thread_comercial_mlr_cb(int8_t service_id, uint8_t source_address[sta
111168
return 0;
112169
}
113170

171+
static int thread_extension_mtd_dua_ntf_cb(int8_t service_id, uint8_t source_address[static 16], uint16_t source_port, sn_coap_hdr_s *response_ptr)
172+
{
173+
(void) service_id;
174+
(void) source_address;
175+
(void) source_port;
176+
(void) response_ptr;
177+
178+
tr_debug("Thread MTD n/dn callback");
179+
180+
return 0;
181+
}
114182

115183
static int thread_extension_primary_bbr_update_needed(struct protocol_interface_info_entry *cur, uint16_t rloc, uint8_t seq)
116184
{
@@ -330,6 +398,11 @@ void thread_extension_init(int8_t interface_id, int8_t coap_service_id)
330398
cur->thread_info->extension_info->coap_service_id = coap_service_id;
331399
}
332400

401+
void thread_extension_mtd_service_register(protocol_interface_info_entry_t *cur)
402+
{
403+
coap_service_register_uri(thread_management_client_service_id_get(cur->id), THREAD_URI_BBR_DOMAIN_ADDRESS_NOTIFICATION, COAP_SERVICE_ACCESS_POST_ALLOWED, thread_extension_mtd_dua_ntf_cb);
404+
}
405+
333406
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)
334407
{
335408

@@ -647,6 +720,22 @@ void thread_extension_discover_response_tlv_write(uint16_t *data, uint8_t versio
647720
}
648721
}
649722

723+
int thread_extension_service_init(protocol_interface_info_entry_t *cur)
724+
{
725+
if (!cur->thread_info->extension_info || !cur->thread_info->extension_info->coap_service_id) {
726+
return -1;
727+
}
728+
729+
if (cur->thread_info->thread_device_mode == THREAD_DEVICE_MODE_END_DEVICE ||
730+
cur->thread_info->thread_device_mode == THREAD_DEVICE_MODE_SLEEPY_END_DEVICE) {
731+
thread_extension_mtd_service_register(cur);
732+
} else if (cur->thread_info->thread_device_mode == THREAD_DEVICE_MODE_ROUTER) {
733+
thread_extension_joiner_router_init(cur);
734+
}
735+
736+
return 0;
737+
}
738+
650739
#ifdef HAVE_THREAD_ROUTER
651740
static int thread_extension_relay_tx_cb(int8_t service_id, uint8_t source_address[16], uint16_t source_port, sn_coap_hdr_s *request_ptr)
652741
{
@@ -772,12 +861,11 @@ static void thread_extension_joiner_router_deinit(protocol_interface_info_entry_
772861
return;
773862
}
774863

775-
int thread_extension_joiner_router_init(int8_t interface_id)
864+
static int thread_extension_joiner_router_init(protocol_interface_info_entry_t *cur)
776865
{
777-
protocol_interface_info_entry_t *cur = protocol_stack_interface_info_get_by_id(interface_id);
778866
int8_t securityLinkLayer = 0;
779867

780-
if (!cur || !cur->thread_info->extension_info) {
868+
if (!cur->thread_info->extension_info) {
781869
return -1;
782870
}
783871

source/6LoWPAN/Thread/thread_extension.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ struct discovery_response_list;
4545
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);
48+
void thread_extension_mtd_service_register(protocol_interface_info_entry_t *cur);
4849
int thread_extension_network_prefix_get(int8_t interface_id, uint8_t *options_ptr, uint8_t *prefix_ptr, uint8_t *prefix_len);
4950
void thread_extension_network_data_process(struct protocol_interface_info_entry *cur);
5051
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);
@@ -60,14 +61,13 @@ bool thread_extension_enabled(protocol_interface_info_entry_t *cur);
6061
bool thread_extension_version_check(uint8_t version);
6162
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);
6263
void thread_extension_discover_response_tlv_write(uint16_t *data, uint8_t version, uint16_t securityPolicy);
64+
int thread_extension_service_init(protocol_interface_info_entry_t *cur);
6365
#ifdef HAVE_THREAD_ROUTER
64-
int thread_extension_joiner_router_init(int8_t interface_id);
6566
bool thread_extension_joining_enabled(int8_t interface_id);
6667
uint8_t thread_extension_discover_response_len(protocol_interface_info_entry_t *cur);
6768
uint8_t *thread_extension_discover_response_write(protocol_interface_info_entry_t *cur, uint8_t *ptr);
6869

6970
#else
70-
#define thread_extension_joiner_router_init(interface_id)
7171
#define thread_extension_joining_enabled(interface_id) false
7272
#define thread_extension_discover_response_len(cur) 0
7373
#define thread_extension_discover_response_write(cur, ptr) (ptr)
@@ -91,7 +91,7 @@ uint8_t *thread_extension_discover_response_write(protocol_interface_info_entry_
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)
94-
#define thread_extension_joiner_router_init(interface_id)
94+
#define thread_extension_service_init(cur) 0
9595
#define thread_extension_joining_enabled(interface_id) false
9696
#define thread_extension_discover_response_len(cur) 0
9797
#define thread_extension_discover_response_write(cur, ptr) (ptr)

source/6LoWPAN/Thread/thread_extension_constants.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ typedef struct discovery_additional_info {
5656
#define THREAD_URI_BBR_MCAST_LISTENER_REPORT "n/mr" //<* 1.2 feature
5757
#define THREAD_URI_BBR_BMLR_NTF "n/bmr" //<* 1.2 feature
5858
#define THREAD_URI_BBR_DOMAIN_ADDRESS_REGISTRATION "n/dr" //<* 1.2 feature
59+
#define THREAD_URI_BBR_DOMAIN_ADDRESS_NOTIFICATION "n/dn" //<* 1.2 feature
5960
#define THREAD_URI_BBR_TRI_RX_NTF "c/rxr" //<* Backbone border router
6061
#define THREAD_URI_BBR_NMK_RX_NTF "c/rxb" //<* Backbone border router
6162
#define THREAD_URI_BBR_TRI_TX_NTF "c/txr" //<* Backbone border router

source/6LoWPAN/Thread/thread_management_client.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,15 @@ static int thread_management_client_neighbor_discovery_data_cb(int8_t service_id
333333
return 0;
334334
}
335335

336+
int thread_management_client_get_interface_id_by_service_id(int8_t service_id)
337+
{
338+
thread_management_t *this = thread_management_find_by_service(service_id);
339+
if (!this) {
340+
return -1;
341+
}
342+
return this->interface_id;
343+
}
344+
336345
int thread_management_client_neighbor_discovery_data_request(int8_t interface_id, const uint8_t destination[16], const uint8_t *options, uint8_t options_len, thread_management_client_network_data_set_cb *set_cb)
337346
{
338347
thread_management_t *this = thread_management_find(interface_id);

source/6LoWPAN/Thread/thread_management_client.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,15 @@ int thread_management_client_network_data_unregister(int8_t interface_id, uint16
148148
*/
149149
int thread_management_client_neighbor_discovery_data_request(int8_t interface_id, const uint8_t destination[16], const uint8_t *options, uint8_t options_len, thread_management_client_network_data_set_cb *set_cb);
150150

151+
/** Get interface_id of based on coap service_id
152+
*
153+
*
154+
* /param service_id coap service id.
155+
*
156+
*return interface_id of thread instance if successful and -1 for failure
157+
*/
158+
int thread_management_client_get_interface_id_by_service_id(int8_t service_id);
159+
151160
/** send active configuration dataset get for parent
152161
*
153162
* /param interface_id interface id of this thread instance.

source/6LoWPAN/Thread/thread_management_server.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1159,7 +1159,6 @@ int thread_management_server_init(int8_t interface_id)
11591159
}
11601160
#endif
11611161
thread_extension_init(interface_id, this->coap_service_id);
1162-
11631162
// All thread devices
11641163
coap_service_register_uri(this->coap_service_id, THREAD_URI_MANAGEMENT_GET, COAP_SERVICE_ACCESS_GET_ALLOWED, thread_management_server_get_command_cb);
11651164

test/nanostack/unittest/stub/thread_extension_stub.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,4 +168,10 @@ uint8_t *thread_extension_discover_response_write(protocol_interface_info_entry_
168168
return ptr;
169169
}
170170

171+
int thread_extension_service_init(protocol_interface_info_entry_t *cur)
172+
{
173+
(void)cur;
174+
return 0;
175+
}
176+
171177
#endif

0 commit comments

Comments
 (0)