Skip to content

Commit 53949a4

Browse files
Thread device registers new address upon receipt of error notification. (ARMmbed#1767)
1 parent 1653b06 commit 53949a4

File tree

3 files changed

+27
-3
lines changed

3 files changed

+27
-3
lines changed

source/6LoWPAN/Thread/thread_bbr_api.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1125,8 +1125,7 @@ int thread_bbr_prefix_set(int8_t interface_id, uint8_t *prefix)
11251125
(void) interface_id;
11261126
(void) prefix;
11271127
#ifdef HAVE_THREAD_BORDER_ROUTER
1128-
thread_extension_bbr_prefix_set(interface_id, prefix);
1129-
return 0;
1128+
return thread_extension_bbr_prefix_set(interface_id, prefix);
11301129
#else
11311130
return -1;
11321131
#endif // HAVE_THREAD_BORDER_ROUTER

source/6LoWPAN/Thread/thread_extension.c

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,15 @@ static int thread_extension_dua_registration_cb(int8_t service_id, uint8_t sourc
125125
}
126126

127127
// registration unsuccessful
128+
// processing for ourselves - if we have the address re register
129+
if_address_entry_t *addr_entry = addr_get_entry(cur, addr_data_ptr);
130+
if (addr_entry) {
131+
cur->dad_failures++;
132+
thread_extension_address_generate(cur);
133+
return 0;
134+
}
135+
136+
// processing for MTD children
128137
ipv6_neighbour_t *neighbour_entry;
129138
uint16_t nce_short_addr;
130139
uint8_t destination_address[16] = {0};
@@ -164,9 +173,25 @@ static int thread_extension_mtd_dua_ntf_cb(int8_t service_id, uint8_t source_add
164173
(void) source_address;
165174
(void) source_port;
166175
(void) response_ptr;
176+
uint16_t addr_len;
177+
uint8_t *addr_data_ptr;
167178

168179
tr_debug("Thread MTD n/dn callback");
169180

181+
protocol_interface_info_entry_t *cur = protocol_stack_interface_info_get_by_id(thread_management_client_get_interface_id_by_service_id(service_id));
182+
if (!cur) {
183+
return -1;
184+
}
185+
addr_len = thread_meshcop_tlv_find(response_ptr->payload_ptr, response_ptr->payload_len, TMFCOP_TLV_TARGET_EID, &addr_data_ptr);
186+
187+
if (addr_len < 16) {
188+
tr_warn("Invalid target eid in DUA.rsp cb message");
189+
return -2;
190+
}
191+
// generate new dua address
192+
cur->dad_failures++;
193+
thread_extension_address_generate(cur);
194+
170195
return 0;
171196
}
172197

source/6LoWPAN/Thread/thread_extension_bbr.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ int thread_extension_bbr_prefix_set(int8_t interface_id, uint8_t *prefix);
6767
#define thread_extension_bbr_timeout_set(interface_id, timeout_a, timeout_b, delay)
6868
#define thread_extension_bbr_address_set(interface_id, addr_ptr, port) (-1)
6969
#define thread_extension_bbr_route_update(cur)
70-
#define thread_extension_bbr_prefix_set(interface_id, prefix)
70+
#define thread_extension_bbr_prefix_set(interface_id, prefix) 0
7171
#endif
7272

7373
#ifdef __cplusplus

0 commit comments

Comments
 (0)