@@ -1086,6 +1086,32 @@ static int8_t ws_bootstrap_up(protocol_interface_info_entry_t *cur)
1086
1086
return ret_val ;
1087
1087
}
1088
1088
1089
+ void ws_bootstrap_disconnect (protocol_interface_info_entry_t * cur , ws_bootsrap_event_type_e event_type )
1090
+ {
1091
+ if (cur -> nwk_bootstrap_state == ER_RPL_NETWORK_LEAVING ) {
1092
+ //Already moved to leaving state.
1093
+ return ;
1094
+ }
1095
+
1096
+ if (cur -> rpl_domain && cur -> nwk_bootstrap_state == ER_BOOTSRAP_DONE ) {
1097
+ //Stop Asych Timer
1098
+ ws_bootstrap_asynch_trickle_stop (cur );
1099
+ tr_debug ("Start Network soft leaving" );
1100
+ if (event_type == WS_FAST_DISCONNECT ) {
1101
+ rpl_control_instant_poison (cur , cur -> rpl_domain );
1102
+ cur -> bootsrap_state_machine_cnt = 80 ; //Give 8 seconds time to send Poison
1103
+ } else {
1104
+ rpl_control_poison (cur -> rpl_domain , 1 );
1105
+ cur -> bootsrap_state_machine_cnt = 6000 ; //Give 10 minutes time for poison if RPL is not report
1106
+ }
1107
+
1108
+ } else {
1109
+ ws_bootstrap_event_discovery_start (cur );
1110
+ }
1111
+ cur -> nwk_bootstrap_state = ER_RPL_NETWORK_LEAVING ;
1112
+ }
1113
+
1114
+
1089
1115
static void ws_bootstrap_asynch_trickle_stop (protocol_interface_info_entry_t * cur )
1090
1116
{
1091
1117
cur -> ws_info -> trickle_pas_running = false;
@@ -1638,7 +1664,7 @@ static void ws_bootstrap_pan_config_analyse(struct protocol_interface_info_entry
1638
1664
tr_debug ("NEW Brodcast Schedule %u...BR rebooted" , ws_bs_ie .broadcast_schedule_identifier );
1639
1665
cur -> ws_info -> ws_bsi_block .block_time = cur -> ws_info -> cfg -> timing .pan_timeout ;
1640
1666
cur -> ws_info -> ws_bsi_block .old_bsi = cur -> ws_info -> hopping_schdule .fhss_bsi ;
1641
- ws_bootstrap_event_discovery_start (cur );
1667
+ ws_bootstrap_event_disconnect (cur , WS_NORMAL_DISCONNECT );
1642
1668
}
1643
1669
return ;
1644
1670
}
@@ -2553,6 +2579,15 @@ static void ws_bootstrap_rpl_callback(rpl_event_t event, void *handle)
2553
2579
if (!cur -> rpl_domain || cur -> interface_mode != INTERFACE_UP ) {
2554
2580
return ;
2555
2581
}
2582
+
2583
+ if (event == RPL_EVENT_POISON_FINISHED ) {
2584
+ //If we are waiting poison we will trig Discovery after couple seconds
2585
+ if (cur -> nwk_bootstrap_state == ER_RPL_NETWORK_LEAVING ) {
2586
+ cur -> bootsrap_state_machine_cnt = 80 ; //Give 8 seconds time to send Poison
2587
+ }
2588
+ return ;
2589
+ }
2590
+
2556
2591
// if waiting for RPL and
2557
2592
if (event == RPL_EVENT_DAO_DONE ) {
2558
2593
// Trigger statemachine check
@@ -3132,6 +3167,12 @@ void ws_bootstrap_event_routing_ready(protocol_interface_info_entry_t *cur)
3132
3167
{
3133
3168
ws_bootsrap_event_trig (WS_ROUTING_READY , cur -> bootStrapId , ARM_LIB_LOW_PRIORITY_EVENT , NULL );
3134
3169
}
3170
+
3171
+ void ws_bootstrap_event_disconnect (protocol_interface_info_entry_t * cur , ws_bootsrap_event_type_e event_type )
3172
+ {
3173
+ ws_bootsrap_event_trig (event_type , cur -> bootStrapId , ARM_LIB_LOW_PRIORITY_EVENT , NULL );
3174
+ }
3175
+
3135
3176
void ws_bootstrap_configuration_trickle_reset (protocol_interface_info_entry_t * cur )
3136
3177
{
3137
3178
trickle_inconsistent_heard (& cur -> ws_info -> trickle_pan_config , & cur -> ws_info -> trickle_params_pan_discovery );
@@ -3315,6 +3356,7 @@ static int8_t ws_bootstrap_backbone_ip_addr_get(protocol_interface_info_entry_t
3315
3356
return -1 ;
3316
3357
}
3317
3358
3359
+
3318
3360
static void ws_bootstrap_event_handler (arm_event_s * event )
3319
3361
{
3320
3362
ws_bootsrap_event_type_e event_type ;
@@ -3331,7 +3373,6 @@ static void ws_bootstrap_event_handler(arm_event_s *event)
3331
3373
break ;
3332
3374
case WS_DISCOVERY_START :
3333
3375
tr_info ("Discovery start" );
3334
-
3335
3376
protocol_mac_reset (cur );
3336
3377
ws_llc_reset (cur );
3337
3378
lowpan_adaptation_interface_reset (cur -> id );
@@ -3467,6 +3508,12 @@ static void ws_bootstrap_event_handler(arm_event_s *event)
3467
3508
ws_bootstrap_advertise_start (cur );
3468
3509
ws_bootstrap_state_change (cur , ER_BOOTSRAP_DONE );
3469
3510
break ;
3511
+ case WS_FAST_DISCONNECT :
3512
+ ws_bootstrap_disconnect (cur , WS_FAST_DISCONNECT );
3513
+ break ;
3514
+ case WS_NORMAL_DISCONNECT :
3515
+ ws_bootstrap_disconnect (cur , WS_NORMAL_DISCONNECT );
3516
+ break ;
3470
3517
3471
3518
default :
3472
3519
tr_err ("Invalid event received" );
@@ -3658,6 +3705,10 @@ void ws_bootstrap_state_machine(protocol_interface_info_entry_t *cur)
3658
3705
// Bootstrap_done event to application
3659
3706
nwk_bootsrap_state_update (ARM_NWK_BOOTSTRAP_READY , cur );
3660
3707
break ;
3708
+ case ER_RPL_NETWORK_LEAVING :
3709
+ tr_debug ("WS SM:RPL Leaving ready trigger discovery" );
3710
+ ws_bootstrap_event_discovery_start (cur );
3711
+ break ;
3661
3712
default :
3662
3713
tr_warn ("WS SM:Invalid state %d" , cur -> nwk_bootstrap_state );
3663
3714
}
@@ -3743,9 +3794,10 @@ void ws_bootstrap_seconds_timer(protocol_interface_info_entry_t *cur, uint32_t s
3743
3794
}
3744
3795
} else {
3745
3796
// Border router has timed out
3797
+ //Clear Timeout timer
3746
3798
cur -> ws_info -> pan_timeout_timer = 0 ;
3747
3799
tr_warn ("Border router has timed out" );
3748
- ws_bootstrap_event_discovery_start (cur );
3800
+ ws_bootstrap_event_disconnect (cur , WS_FAST_DISCONNECT );
3749
3801
}
3750
3802
}
3751
3803
if (cur -> ws_info -> aro_registration_timer ) {
0 commit comments