@@ -175,11 +175,24 @@ int ws_border_router_proxy_state_update(int8_t caller_interface_id, int8_t handl
175
175
176
176
static if_address_entry_t * ws_bbr_slaac_generate (protocol_interface_info_entry_t * cur , uint8_t * ula_prefix )
177
177
{
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
+ }
179
190
if (!add_entry ) {
180
191
tr_err ("ula create failed" );
181
192
return NULL ;
182
193
}
194
+ // Set the timeouts for this address and policy
195
+ icmpv6_slaac_prefix_update (cur , ula_prefix , 64 , 0xffffffff , 0xffffffff );
183
196
addr_policy_table_add_entry (ula_prefix , 64 , 2 , WS_NON_PREFFRED_LABEL );
184
197
return add_entry ;
185
198
}
@@ -382,6 +395,7 @@ static void ws_bbr_rpl_status_check(protocol_interface_info_entry_t *cur)
382
395
383
396
if (memcmp (local_prefix , ADDR_UNSPECIFIED , 8 ) != 0 ) {
384
397
if (!ws_bbr_slaac_generate (cur , local_prefix )) {
398
+ // Address creation failed
385
399
return ;
386
400
}
387
401
@@ -605,8 +619,16 @@ void ws_bbr_stop(int8_t interface_id)
605
619
{
606
620
#ifdef HAVE_WS_BORDER_ROUTER
607
621
608
- (void )interface_id ;
609
622
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
+ }
610
632
611
633
ws_bbr_rpl_root_stop ();
612
634
current_instance_id ++ ;
0 commit comments