@@ -88,6 +88,7 @@ typedef struct {
88
88
bool gtks_set : 1 ; /**< GTKs are set */
89
89
bool gtkhash_set : 1 ; /**< GTK hashes are set */
90
90
bool key_index_set : 1 ; /**< NW key index is set */
91
+ bool frame_counter_read : 1 ; /**< Frame counters has been read */
91
92
} pae_controller_t ;
92
93
93
94
typedef struct {
@@ -380,9 +381,11 @@ static int8_t ws_pae_controller_nw_key_check_and_insert(protocol_interface_info_
380
381
// Read current counter from MAC
381
382
uint32_t curr_frame_counter ;
382
383
controller -> nw_frame_counter_read (controller -> interface_ptr , & curr_frame_counter , i );
384
+
383
385
// If stored frame counter is greater than MAC counter
384
386
if (controller -> frame_counters .counter [i ].frame_counter > curr_frame_counter ) {
385
- tr_debug ("Frame counter set: %i, stored %" PRIu32 " current: %" PRIu32 "" , i , controller -> frame_counters .counter [i ].frame_counter , curr_frame_counter );
387
+ tr_debug ("Frame counter set: %i, stored %" PRIu32 " current: %" PRIu32 "" , i ,
388
+ controller -> frame_counters .counter [i ].frame_counter , curr_frame_counter );
386
389
curr_frame_counter = controller -> frame_counters .counter [i ].frame_counter ;
387
390
// Updates MAC frame counter
388
391
controller -> nw_frame_counter_set (controller -> interface_ptr , curr_frame_counter , i );
@@ -474,6 +477,9 @@ void ws_pae_controller_nw_keys_remove(protocol_interface_info_entry_t *interface
474
477
return ;
475
478
}
476
479
480
+ /* Checks if frame counters needs to be stored when keys are removed */
481
+ ws_pae_controller_frame_counter_store (controller , true);
482
+
477
483
tr_info ("NW keys remove" );
478
484
479
485
nw_key_t * nw_key = controller -> nw_key ;
@@ -589,6 +595,7 @@ static void ws_pae_controller_data_init(pae_controller_t *controller)
589
595
controller -> gtks_set = false;
590
596
controller -> gtkhash_set = false;
591
597
controller -> key_index_set = false;
598
+ controller -> frame_counter_read = false;
592
599
controller -> gtk_index = -1 ;
593
600
controller -> network_name = NULL ;
594
601
controller -> frame_cnt_store_timer = FRAME_COUNTER_STORE_INTERVAL ;
@@ -602,6 +609,11 @@ static void ws_pae_controller_data_init(pae_controller_t *controller)
602
609
603
610
static void ws_pae_controller_frame_counter_read (pae_controller_t * controller )
604
611
{
612
+ if (controller -> frame_counter_read ) {
613
+ return ;
614
+ }
615
+ controller -> frame_counter_read = true;
616
+
605
617
// Read frame counters
606
618
if (ws_pae_controller_nvm_frame_counter_read (& controller -> frame_counters ) >= 0 ) {
607
619
bool updated = false;
@@ -610,6 +622,8 @@ static void ws_pae_controller_frame_counter_read(pae_controller_t *controller)
610
622
if (controller -> frame_counters .counter [index ].set ) {
611
623
// Increments frame counters
612
624
controller -> frame_counters .counter [index ].frame_counter += FRAME_COUNTER_INCREMENT ;
625
+ controller -> frame_counters .counter [index ].stored_frame_counter =
626
+ controller -> frame_counters .counter [index ].frame_counter ;
613
627
614
628
tr_info ("Read frame counter: index %i value %" PRIu32 "" , index , controller -> frame_counters .counter [index ].frame_counter );
615
629
@@ -620,7 +634,6 @@ static void ws_pae_controller_frame_counter_read(pae_controller_t *controller)
620
634
// Writes incremented frame counters
621
635
ws_pae_nvm_store_frame_counter_tlv_create (controller -> pae_nvm_buffer , & controller -> frame_counters );
622
636
ws_pae_controller_nvm_frame_counter_write (controller -> pae_nvm_buffer );
623
- //ws_pae_controller_frame_counter_write(controller, &controller->frame_counters);
624
637
}
625
638
}
626
639
}
@@ -630,6 +643,7 @@ static void ws_pae_controller_frame_counter_reset(frame_counters_t *frame_counte
630
643
for (uint8_t index = 0 ; index < GTK_NUM ; index ++ ) {
631
644
memset (frame_counters -> counter [index ].gtk , 0 , GTK_LEN );
632
645
frame_counters -> counter [index ].frame_counter = 0 ;
646
+ frame_counters -> counter [index ].stored_frame_counter = 0 ;
633
647
frame_counters -> counter [index ].set = false;
634
648
}
635
649
}
@@ -689,9 +703,6 @@ int8_t ws_pae_controller_stop(protocol_interface_info_entry_t *interface_ptr)
689
703
return -1 ;
690
704
}
691
705
692
- // Stores frame counter
693
- ws_pae_controller_frame_counter_store (controller , false);
694
-
695
706
// Removes network keys from PAE controller and MAC
696
707
ws_pae_controller_nw_keys_remove (interface_ptr );
697
708
@@ -1241,18 +1252,25 @@ static void ws_pae_controller_frame_counter_store(pae_controller_t *entry, bool
1241
1252
// If frame counter for the network key has already been stored
1242
1253
if (entry -> frame_counters .counter [i ].set &&
1243
1254
memcmp (entry -> nw_key [i ].gtk , entry -> frame_counters .counter [i ].gtk , GTK_LEN ) == 0 ) {
1255
+
1256
+ if (curr_frame_counter > entry -> frame_counters .counter [i ].frame_counter ) {
1257
+ entry -> frame_counters .counter [i ].frame_counter = curr_frame_counter ;
1258
+ }
1259
+ uint32_t frame_counter = entry -> frame_counters .counter [i ].frame_counter ;
1260
+
1244
1261
// If threshold check is disabled or frame counter has advanced for the threshold value, stores the new value
1245
1262
if (!use_threshold ||
1246
- curr_frame_counter > entry -> frame_counters .counter [i ].frame_counter + FRAME_COUNTER_STORE_THRESHOLD ) {
1247
- entry -> frame_counters .counter [i ].frame_counter = curr_frame_counter ;
1263
+ frame_counter > entry -> frame_counters .counter [i ].stored_frame_counter + FRAME_COUNTER_STORE_THRESHOLD ) {
1264
+ entry -> frame_counters .counter [i ].stored_frame_counter = frame_counter ;
1248
1265
update_needed = true;
1249
- tr_debug ("Stored updated frame counter: index %i value %" PRIu32 "" , i , curr_frame_counter );
1266
+ tr_debug ("Stored updated frame counter: index %i value %" PRIu32 "" , i , frame_counter );
1250
1267
}
1251
1268
} else {
1252
1269
// For new or modified network keys, stores the frame counter value
1253
1270
entry -> frame_counters .counter [i ].set = true;
1254
1271
memcpy (entry -> frame_counters .counter [i ].gtk , entry -> nw_key [i ].gtk , GTK_LEN );
1255
1272
entry -> frame_counters .counter [i ].frame_counter = curr_frame_counter ;
1273
+ entry -> frame_counters .counter [i ].stored_frame_counter = curr_frame_counter ;
1256
1274
update_needed = true;
1257
1275
tr_debug ("Stored new frame counter: index %i value %" PRIu32 "" , i , curr_frame_counter );
1258
1276
}
0 commit comments