@@ -110,6 +110,7 @@ static int8_t ws_bootstrap_neighbor_set(protocol_interface_info_entry_t *cur, pa
110110
111111static void ws_bootstrap_candidate_table_reset (protocol_interface_info_entry_t * cur );
112112static parent_info_t * ws_bootstrap_candidate_parent_get (struct protocol_interface_info_entry * cur , const uint8_t * addr , bool create );
113+ static void ws_bootstrap_candidate_parent_sort (struct protocol_interface_info_entry * cur , parent_info_t * new_entry );
113114
114115typedef enum {
115116 WS_PARENT_SOFT_SYNCH = 0 , /**< let FHSS make decision if synchronization is needed*/
@@ -1165,7 +1166,7 @@ static void ws_bootstrap_pan_advertisement_analyse_active(struct protocol_interf
11651166static parent_info_t * ws_bootstrap_candidate_parent_get_best (protocol_interface_info_entry_t * cur )
11661167{
11671168 ns_list_foreach_safe (parent_info_t , entry , & cur -> ws_info -> parent_list_reserved ) {
1168- tr_info ("candidate list a:%s panid:%x cost:%d size:%d rssi:%d age:%" PRIu32 , trace_array (entry -> addr , 8 ), entry -> pan_id , entry -> pan_information .routing_cost , entry -> pan_information .pan_size , entry -> signal_dbm , protocol_core_monotonic_time - entry -> age );
1169+ tr_info ("candidate list a:%s panid:%x cost:%d size:%d rssi:%d txFailure:%u age:%" PRIu32 , trace_array (entry -> addr , 8 ), entry -> pan_id , entry -> pan_information .routing_cost , entry -> pan_information .pan_size , entry -> signal_dbm , entry -> tx_fail , protocol_core_monotonic_time - entry -> age );
11691170 }
11701171
11711172 return ns_list_get_first (& cur -> ws_info -> parent_list_reserved );
@@ -1263,19 +1264,12 @@ static parent_info_t *ws_bootstrap_candidate_parent_allocate(protocol_interface_
12631264 } else {
12641265 // If there is no free entries always allocate the last one of reserved as it is the worst
12651266 entry = ns_list_get_last (& cur -> ws_info -> parent_list_reserved );
1266- }
1267- return entry ;
1268- }
12691267
1270- static void ws_bootstrap_candidate_parent_free (protocol_interface_info_entry_t * cur , const uint8_t * addr )
1271- {
1272- ns_list_foreach_safe (parent_info_t , entry , & cur -> ws_info -> parent_list_reserved ) {
1273- if (memcmp (entry -> addr , addr , 8 ) == 0 ) {
1274- ns_list_remove (& cur -> ws_info -> parent_list_reserved , entry );
1275- ns_list_add_to_end (& cur -> ws_info -> parent_list_free , entry );
1276- return ;
1277- }
12781268 }
1269+ if (entry ) {
1270+ entry -> tx_fail = 0 ;
1271+ }
1272+ return entry ;
12791273}
12801274
12811275static parent_info_t * ws_bootstrap_candidate_parent_get (struct protocol_interface_info_entry * cur , const uint8_t * addr , bool create )
@@ -1291,13 +1285,34 @@ static parent_info_t *ws_bootstrap_candidate_parent_get(struct protocol_interfac
12911285 return NULL ;
12921286}
12931287
1288+ static void ws_bootstrap_candidate_parent_mark_failure (protocol_interface_info_entry_t * cur , const uint8_t * addr )
1289+ {
1290+ parent_info_t * entry = ws_bootstrap_candidate_parent_get (cur , addr , false);
1291+ if (entry ) {
1292+ ns_list_remove (& cur -> ws_info -> parent_list_reserved , entry );
1293+ if (entry -> tx_fail >= 2 ) {
1294+ ns_list_add_to_end (& cur -> ws_info -> parent_list_free , entry );
1295+ } else {
1296+ entry -> tx_fail ++ ;
1297+ //New last
1298+ ns_list_add_to_end (& cur -> ws_info -> parent_list_reserved , entry );
1299+ ws_bootstrap_candidate_parent_sort (cur , entry );
1300+ }
1301+
1302+ }
1303+ }
1304+
12941305static bool ws_bootstrap_candidate_parent_compare (parent_info_t * p1 , parent_info_t * p2 )
12951306{
12961307 // Return true if P2 is better
12971308 // signal lower than threshold for both
12981309 // pan_cost
12991310 // signal quality
13001311
1312+ if (p2 -> tx_fail > p1 -> tx_fail ) {
1313+ return false;
1314+ }
1315+
13011316 if (ws_neighbor_class_rsl_from_dbm_calculate (p1 -> signal_dbm ) < (DEVICE_MIN_SENS + CAND_PARENT_THRESHOLD + CAND_PARENT_HYSTERISIS ) &&
13021317 ws_neighbor_class_rsl_from_dbm_calculate (p2 -> signal_dbm ) > (DEVICE_MIN_SENS + CAND_PARENT_THRESHOLD + CAND_PARENT_HYSTERISIS )) {
13031318 // above threshold is always better than not.
@@ -1349,11 +1364,15 @@ static void ws_bootstrap_candidate_list_clean(struct protocol_interface_info_ent
13491364
13501365static void ws_bootstrap_candidate_parent_sort (struct protocol_interface_info_entry * cur , parent_info_t * new_entry )
13511366{
1367+ //Remove from the list
1368+
13521369 ns_list_foreach_safe (parent_info_t , entry , & cur -> ws_info -> parent_list_reserved ) {
1370+
13531371 if (entry == new_entry ) {
13541372 // own entry skip it
13551373 continue ;
13561374 }
1375+
13571376 if (ws_bootstrap_candidate_parent_compare (entry , new_entry )) {
13581377 // New entry is better
13591378 //tr_debug("candidate list new is better");
@@ -2912,7 +2931,7 @@ static void ws_bootstrap_authentication_completed(protocol_interface_info_entry_
29122931 // eapol parent selected is not working
29132932 tr_debug ("authentication TX failed" );
29142933
2915- ws_bootstrap_candidate_parent_free (cur , target_eui_64 );
2934+ ws_bootstrap_candidate_parent_mark_failure (cur , target_eui_64 );
29162935 // Go back for network scanning
29172936 ws_bootstrap_state_change (cur , ER_ACTIVE_SCAN );
29182937
@@ -2934,7 +2953,7 @@ static void ws_bootstrap_authentication_completed(protocol_interface_info_entry_
29342953
29352954static const uint8_t * ws_bootstrap_authentication_next_target (protocol_interface_info_entry_t * cur , const uint8_t * previous_eui_64 , uint16_t * pan_id )
29362955{
2937- ws_bootstrap_candidate_parent_free (cur , previous_eui_64 );
2956+ ws_bootstrap_candidate_parent_mark_failure (cur , previous_eui_64 );
29382957
29392958 // Gets best target
29402959 parent_info_t * parent_info = ws_bootstrap_candidate_parent_get_best (cur );
0 commit comments