Skip to content

Commit 2b1dfb9

Browse files
author
Mika Tervonen
committed
Slaac address can be recreated after root stop
bbr_stop will clear all data related to RPL root start Stops the DHCP server at bbr stop
1 parent 66bfd98 commit 2b1dfb9

File tree

1 file changed

+24
-2
lines changed

1 file changed

+24
-2
lines changed

source/6LoWPAN/ws/ws_bbr_api.c

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -175,11 +175,24 @@ int ws_border_router_proxy_state_update(int8_t caller_interface_id, int8_t handl
175175

176176
static if_address_entry_t *ws_bbr_slaac_generate(protocol_interface_info_entry_t *cur, uint8_t *ula_prefix)
177177
{
178-
if_address_entry_t *add_entry = icmpv6_slaac_address_add(cur, ula_prefix, 64, 0xffffffff, 0xffffffff, true, SLAAC_IID_FIXED);
178+
if_address_entry_t *add_entry = NULL;
179+
const uint8_t *address;
180+
181+
address = addr_select_with_prefix(cur, ula_prefix, 64, 0);
182+
if (address) {
183+
// Address already exists for this prefix find the entry
184+
add_entry = addr_get_entry(cur, address);
185+
}
186+
187+
if (!add_entry) {
188+
add_entry = icmpv6_slaac_address_add(cur, ula_prefix, 64, 0xffffffff, 0xffffffff, true, SLAAC_IID_FIXED);
189+
}
179190
if (!add_entry) {
180191
tr_err("ula create failed");
181192
return NULL;
182193
}
194+
// Set the timeouts for this address and policy
195+
icmpv6_slaac_prefix_update(cur, ula_prefix, 64, 0xffffffff, 0xffffffff);
183196
addr_policy_table_add_entry(ula_prefix, 64, 2, WS_NON_PREFFRED_LABEL);
184197
return add_entry;
185198
}
@@ -382,6 +395,7 @@ static void ws_bbr_rpl_status_check(protocol_interface_info_entry_t *cur)
382395

383396
if (memcmp(local_prefix, ADDR_UNSPECIFIED, 8) != 0) {
384397
if (!ws_bbr_slaac_generate(cur, local_prefix)) {
398+
// Address creation failed
385399
return;
386400
}
387401

@@ -605,8 +619,16 @@ void ws_bbr_stop(int8_t interface_id)
605619
{
606620
#ifdef HAVE_WS_BORDER_ROUTER
607621

608-
(void)interface_id;
609622
backbone_interface_id = -1;
623+
protocol_interface_info_entry_t *cur = protocol_stack_interface_info_get_by_id(interface_id);
624+
625+
ws_bbr_slaac_remove(cur, current_dodag_id);
626+
if (memcmp(current_local_prefix, ADDR_UNSPECIFIED, 8) != 0) {
627+
ws_bbr_slaac_remove(cur, current_local_prefix);
628+
}
629+
if (memcmp(current_global_prefix, ADDR_UNSPECIFIED, 8) != 0) {
630+
ws_bbr_dhcp_server_stop(cur, current_global_prefix);
631+
}
610632

611633
ws_bbr_rpl_root_stop();
612634
current_instance_id++;

0 commit comments

Comments
 (0)