@@ -175,21 +175,38 @@ int ws_border_router_proxy_state_update(int8_t caller_interface_id, int8_t handl
175
175
return 0 ;
176
176
}
177
177
178
+ static if_address_entry_t * ws_bbr_slaac_generate (protocol_interface_info_entry_t * cur , uint8_t * ula_prefix )
179
+ {
180
+ if_address_entry_t * add_entry = icmpv6_slaac_address_add (cur , ula_prefix , 64 , 0xffffffff , 0xffffffff , true, SLAAC_IID_FIXED );
181
+ if (!add_entry ) {
182
+ tr_err ("ula create failed" );
183
+ return NULL ;
184
+ }
185
+ addr_policy_table_add_entry (ula_prefix , 64 , 2 , WS_NON_PREFFRED_LABEL );
186
+ return add_entry ;
187
+ }
188
+
189
+ static void ws_bbr_slaac_remove (protocol_interface_info_entry_t * cur , uint8_t * ula_prefix )
190
+ {
191
+ icmpv6_slaac_prefix_update (cur , ula_prefix , 64 , 0 , 0 );
192
+ addr_policy_table_delete_entry (ula_prefix , 64 );
193
+ }
194
+
195
+
178
196
static int ws_bbr_static_dodagid_create (protocol_interface_info_entry_t * cur )
179
197
{
180
198
if (memcmp (current_dodag_id , ADDR_UNSPECIFIED , 16 ) != 0 ) {
181
199
// address generated
182
200
return 0 ;
183
201
}
184
202
// This address is only used if no other address available.
185
- if_address_entry_t * add_entry = icmpv6_slaac_address_add (cur , static_dodag_id_prefix , 64 , 0xffffffff , 0xffffffff , true, SLAAC_IID_FIXED );
203
+ if_address_entry_t * add_entry = ws_bbr_slaac_generate (cur , static_dodag_id_prefix );
186
204
if (!add_entry ) {
187
205
tr_err ("dodagid create failed" );
188
206
return -1 ;
189
207
}
190
208
memcpy (current_dodag_id , add_entry -> address , 16 );
191
209
tr_info ("BBR generate DODAGID %s" , trace_ipv6 (current_dodag_id ));
192
- addr_policy_table_add_entry (static_dodag_id_prefix , 64 , 2 , WS_NON_PREFFRED_LABEL );
193
210
194
211
return 0 ;
195
212
}
@@ -360,9 +377,16 @@ static void ws_bbr_rpl_status_check(protocol_interface_info_entry_t *cur)
360
377
// Start static ULA prefix and routing always
361
378
if (memcmp (current_local_prefix , ADDR_UNSPECIFIED , 8 ) != 0 ) {
362
379
// Remove Old ULA prefix
380
+ ws_bbr_slaac_remove (cur , current_local_prefix );
363
381
rpl_control_update_dodag_prefix (protocol_6lowpan_rpl_root_dodag , current_local_prefix , 64 , PIO_A , 0 , 0 , true);
382
+ memset (current_local_prefix , 0 , 8 );
364
383
}
384
+
365
385
if (memcmp (local_prefix , ADDR_UNSPECIFIED , 8 ) != 0 ) {
386
+ if (!ws_bbr_slaac_generate (cur , local_prefix )) {
387
+ return ;
388
+ }
389
+
366
390
tr_info ("RPL Local prefix activate %s" , trace_ipv6_prefix (local_prefix , 64 ));
367
391
rpl_control_update_dodag_prefix (protocol_6lowpan_rpl_root_dodag , local_prefix , 64 , PIO_A , WS_ULA_LIFETIME , WS_ULA_LIFETIME , false);
368
392
memcpy (current_local_prefix , local_prefix , 8 );
@@ -372,7 +396,7 @@ static void ws_bbr_rpl_status_check(protocol_interface_info_entry_t *cur)
372
396
/*
373
397
* Check if backup ULA prefix is needed
374
398
*/
375
- if (memcmp (global_prefix , ADDR_UNSPECIFIED , 8 ) == 0 ) {
399
+ if (( configuration & BBR_ULA_C ) == 0 && memcmp (global_prefix , ADDR_UNSPECIFIED , 8 ) == 0 ) {
376
400
//Global prefix not available count if backup ULA should be created
377
401
global_prefix_unavailable_timer += BBR_CHECK_INTERVAL ;
378
402
tr_debug ("Check for backup prefix %" PRIu32 "" , global_prefix_unavailable_timer );
0 commit comments