@@ -122,7 +122,6 @@ static bool ws_pae_controller_auth_congestion_get(protocol_interface_info_entry_
122
122
#endif
123
123
static pae_controller_t * ws_pae_controller_get (protocol_interface_info_entry_t * interface_ptr );
124
124
static void ws_pae_controller_frame_counter_timer (uint16_t seconds , pae_controller_t * entry );
125
- static void ws_pae_controller_frame_counter_timer_trigger (uint16_t seconds , pae_controller_t * entry );
126
125
static void ws_pae_controller_frame_counter_store (pae_controller_t * entry , bool use_threshold );
127
126
static void ws_pae_controller_nvm_frame_counter_write (frame_cnt_nvm_tlv_t * tlv_entry );
128
127
static int8_t ws_pae_controller_nvm_frame_counter_read (uint32_t * restart_cnt , uint64_t * stored_time , uint16_t * pan_version , frame_counters_t * counters );
@@ -516,10 +515,6 @@ static int8_t ws_pae_controller_nw_key_check_and_insert(protocol_interface_info_
516
515
controller -> nw_frame_counter_set (controller -> interface_ptr , curr_frame_counter , i );
517
516
}
518
517
}
519
- /* Trigger storing of frame counters; there is 5 seconds delay to give time for the
520
- other keys to be inserted, so that frame counters for several keys are updated on
521
- a same time. */
522
- ws_pae_controller_frame_counter_timer_trigger (FRAME_COUNTER_STORE_TRIGGER , controller );
523
518
}
524
519
}
525
520
@@ -614,6 +609,8 @@ static void ws_pae_controller_frame_counter_store_and_nw_keys_remove(protocol_in
614
609
615
610
tr_info ("NW keys remove" );
616
611
612
+ controller -> gtk_index = -1 ;
613
+
617
614
nw_key_t * nw_key = controller -> nw_key ;
618
615
for (uint8_t i = 0 ; i < GTK_NUM ; i ++ ) {
619
616
// Deletes the key if it is set
@@ -637,9 +634,12 @@ static void ws_pae_controller_nw_key_index_check_and_set(protocol_interface_info
637
634
}
638
635
639
636
if (controller -> nw_send_key_index_set ) {
637
+ controller -> gtk_index = index ;
638
+ /* Checks if frame counters needs to be stored for the new GTK that is taken into
639
+ use; this is the last check that stored counters are in sync before activating key */
640
+ ws_pae_controller_frame_counter_store (controller , true);
640
641
tr_info ("NW send key index set: %i" , index + 1 );
641
642
controller -> nw_send_key_index_set (interface_ptr , index );
642
- controller -> gtk_index = index ;
643
643
}
644
644
645
645
// Do not update PAN version for initial key index set
@@ -661,13 +661,14 @@ static void ws_pae_controller_active_nw_key_set(protocol_interface_info_entry_t
661
661
}
662
662
663
663
if (controller -> nw_send_key_index_set ) {
664
+ controller -> gtk_index = index ;
664
665
/* Checks if frame counters needs to be stored for the new GTK that is taken into
665
666
use; this is the last check that stored counters are in sync before activating key */
666
667
ws_pae_controller_frame_counter_store (controller , true);
667
668
// Activates key on MAC
668
669
controller -> nw_send_key_index_set (controller -> interface_ptr , index );
669
670
tr_info ("NW send key index set: %i" , index + 1 );
670
- controller -> gtk_index = index ;
671
+
671
672
}
672
673
}
673
674
@@ -801,7 +802,6 @@ static int8_t ws_pae_controller_frame_counter_read(pae_controller_t *controller)
801
802
// Increments PAN version to ensure that it is fresh
802
803
controller -> sec_keys_nw_info .pan_version += PAN_VERSION_STORAGE_READ_INCREMENT ;
803
804
804
- bool updated = false;
805
805
// Checks frame counters
806
806
for (uint8_t index = 0 ; index < GTK_NUM ; index ++ ) {
807
807
if (controller -> frame_counters .counter [index ].set ) {
@@ -817,15 +817,8 @@ static int8_t ws_pae_controller_frame_counter_read(pae_controller_t *controller)
817
817
controller -> frame_counters .counter [index ].frame_counter ;
818
818
819
819
tr_info ("Read frame counter: index %i value %" PRIu32 "" , index , controller -> frame_counters .counter [index ].frame_counter );
820
-
821
- updated = true;
822
820
}
823
821
}
824
- if (updated ) {
825
- // Writes incremented frame counters
826
- ws_pae_nvm_store_frame_counter_tlv_create ((frame_cnt_nvm_tlv_t * ) & controller -> pae_nvm_buffer , controller -> restart_cnt , controller -> sec_keys_nw_info .pan_version , & controller -> frame_counters );
827
- ws_pae_controller_nvm_frame_counter_write ((frame_cnt_nvm_tlv_t * ) & controller -> pae_nvm_buffer );
828
- }
829
822
}
830
823
831
824
return ret_value ;
@@ -836,6 +829,7 @@ static void ws_pae_controller_frame_counter_reset(frame_counters_t *frame_counte
836
829
for (uint8_t index = 0 ; index < GTK_NUM ; index ++ ) {
837
830
ws_pae_controller_frame_counter_index_reset (frame_counters , index );
838
831
}
832
+ frame_counters -> active_gtk_index = -1 ;
839
833
}
840
834
841
835
static void ws_pae_controller_frame_counter_index_reset (frame_counters_t * frame_counters , uint8_t index )
@@ -1712,13 +1706,6 @@ static void ws_pae_controller_frame_counter_timer(uint16_t seconds, pae_controll
1712
1706
}
1713
1707
}
1714
1708
1715
- static void ws_pae_controller_frame_counter_timer_trigger (uint16_t seconds , pae_controller_t * entry )
1716
- {
1717
- if (entry -> frame_cnt_store_timer > seconds ) {
1718
- entry -> frame_cnt_store_timer = seconds ;
1719
- }
1720
- }
1721
-
1722
1709
static void ws_pae_controller_frame_counter_store (pae_controller_t * entry , bool use_threshold )
1723
1710
{
1724
1711
bool update_needed = false;
@@ -1731,7 +1718,7 @@ static void ws_pae_controller_frame_counter_store(pae_controller_t *entry, bool
1731
1718
* frame counters will be still valid.
1732
1719
*/
1733
1720
if (entry -> nw_key [i ].installed ) {
1734
- // Reads frame counter for the key
1721
+ // Reads MAC frame counter for the key
1735
1722
uint32_t curr_frame_counter ;
1736
1723
entry -> nw_frame_counter_read (entry -> interface_ptr , & curr_frame_counter , i );
1737
1724
@@ -1752,13 +1739,22 @@ static void ws_pae_controller_frame_counter_store(pae_controller_t *entry, bool
1752
1739
tr_debug ("Stored updated frame counter: index %i value %" PRIu32 "" , i , frame_counter );
1753
1740
}
1754
1741
} else {
1755
- // For new or modified network keys, stores the frame counter value
1742
+ // New or modified network key
1756
1743
entry -> frame_counters .counter [i ].set = true;
1757
1744
memcpy (entry -> frame_counters .counter [i ].gtk , entry -> nw_key [i ].gtk , GTK_LEN );
1758
1745
entry -> frame_counters .counter [i ].frame_counter = curr_frame_counter ;
1759
1746
entry -> frame_counters .counter [i ].stored_frame_counter = curr_frame_counter ;
1747
+ tr_debug ("Pending to store new frame counter: index %i value %" PRIu32 "" , i , curr_frame_counter );
1748
+ }
1749
+
1750
+ /* If currently active key is changed or active key is set for the first time,
1751
+ stores the frame counter value */
1752
+ if (entry -> gtk_index == i && entry -> frame_counters .active_gtk_index != i ) {
1753
+ entry -> frame_counters .active_gtk_index = entry -> gtk_index ;
1760
1754
update_needed = true;
1761
- tr_debug ("Stored new frame counter: index %i value %" PRIu32 "" , i , curr_frame_counter );
1755
+ // Updates MAC frame counter for the key
1756
+ entry -> nw_frame_counter_set (entry -> interface_ptr , entry -> frame_counters .counter [i ].frame_counter , i );
1757
+ tr_debug ("Stored frame counters, active key set: index %i value %" PRIu32 "" , i , entry -> frame_counters .counter [i ].frame_counter );
1762
1758
}
1763
1759
}
1764
1760
}
0 commit comments