@@ -91,6 +91,7 @@ typedef struct {
91
91
ws_pae_gtks_updated * pae_gtks_updated ; /**< PAE GTKs updated */
92
92
ws_pae_gtk_hash_update * pae_gtk_hash_update ; /**< PAE GTK HASH update */
93
93
ws_pae_nw_key_index_update * pae_nw_key_index_update ; /**< PAE NW key index update */
94
+ nvm_tlv_entry_t * pae_nvm_buffer ; /**< Buffer For PAE NVM write operation*/
94
95
bool gtks_set : 1 ; /**< GTKs are set */
95
96
bool gtkhash_set : 1 ; /**< GTK hashes are set */
96
97
bool key_index_set : 1 ; /**< NW key index is set */
@@ -99,7 +100,7 @@ typedef struct {
99
100
static pae_controller_t * ws_pae_controller_get (protocol_interface_info_entry_t * interface_ptr );
100
101
static void ws_pae_controller_frame_counter_timer (uint16_t seconds , pae_controller_t * entry );
101
102
static void ws_pae_controller_frame_counter_store (pae_controller_t * entry );
102
- static int8_t ws_pae_controller_nvm_frame_counter_write (uint8_t index , uint8_t * hash , uint32_t frame_counter );
103
+ static void ws_pae_controller_nvm_frame_counter_write (nvm_tlv_entry_t * tlv_entry );
103
104
static int8_t ws_pae_controller_nvm_frame_counter_read (uint8_t * index , uint8_t * hash , uint32_t * frame_counter );
104
105
static pae_controller_t * ws_pae_controller_get_or_create (int8_t interface_id );
105
106
static void ws_pae_controller_gtk_hash_set (protocol_interface_info_entry_t * interface_ptr , uint8_t * gtkhash );
@@ -109,10 +110,10 @@ static void ws_pae_controller_active_nw_key_set(protocol_interface_info_entry_t
109
110
static int8_t ws_pae_controller_gak_from_gtk (uint8_t * gak , uint8_t * gtk , char * network_name );
110
111
static void ws_pae_controller_nw_key_index_check_and_set (protocol_interface_info_entry_t * interface_ptr , uint8_t index );
111
112
static void ws_pae_controller_data_init (pae_controller_t * controller );
112
- static void ws_pae_controller_frame_counter_read (stored_frame_counter_t * counter );
113
+ static void ws_pae_controller_frame_counter_read (pae_controller_t * controller );
113
114
static void ws_pae_controller_frame_counter_reset (stored_frame_counter_t * counter );
114
115
static uint32_t ws_pae_controller_frame_counter_get (stored_frame_counter_t * counter , uint8_t index , uint8_t * key_hash );
115
- static void ws_pae_controller_frame_counter_write (stored_frame_counter_t * counter , uint8_t index , uint8_t * key_hash , uint32_t curr_counter );
116
+ static void ws_pae_controller_frame_counter_write (pae_controller_t * controller , uint8_t index , uint8_t * key_hash , uint32_t curr_counter );
116
117
117
118
static const char * FRAME_COUNTER_FILE = FRAME_COUNTER_FILE_NAME ;
118
119
@@ -450,7 +451,7 @@ static void ws_pae_controller_nw_key_index_check_and_set(protocol_interface_info
450
451
uint32_t frame_counter = ws_pae_controller_frame_counter_get (& controller -> stored_frame_counter , index , controller -> nw_key [index ].hash );
451
452
controller -> nw_frame_counter_set (interface_ptr , frame_counter );
452
453
tr_info ("NW frame counter set: %i" , frame_counter );
453
- ws_pae_controller_frame_counter_write (& controller -> stored_frame_counter , index , controller -> nw_key [index ].hash , frame_counter );
454
+ ws_pae_controller_frame_counter_write (controller , index , controller -> nw_key [index ].hash , frame_counter );
454
455
}
455
456
456
457
// Do not update PAN version for initial key index set
@@ -479,7 +480,7 @@ static void ws_pae_controller_active_nw_key_set(protocol_interface_info_entry_t
479
480
uint32_t frame_counter = ws_pae_controller_frame_counter_get (& controller -> stored_frame_counter , index , controller -> nw_key [index ].hash );
480
481
controller -> nw_frame_counter_set (cur , frame_counter );
481
482
tr_info ("NW frame counter set: %i" , frame_counter );
482
- ws_pae_controller_frame_counter_write (& controller -> stored_frame_counter , index , controller -> nw_key [index ].hash , frame_counter );
483
+ ws_pae_controller_frame_counter_write (controller , index , controller -> nw_key [index ].hash , frame_counter );
483
484
}
484
485
485
486
controller -> gtk_index = index ;
@@ -498,7 +499,11 @@ int8_t ws_pae_controller_init(protocol_interface_info_entry_t *interface_ptr)
498
499
}
499
500
500
501
pae_controller_t * controller = ns_dyn_mem_alloc (sizeof (pae_controller_t ));
501
- if (!controller ) {
502
+ void * pae_nvm_buffer = ws_pae_buffer_allocate ();
503
+
504
+ if (!controller || !pae_nvm_buffer ) {
505
+ ns_dyn_mem_free (controller );
506
+ ns_dyn_mem_free (pae_nvm_buffer );
502
507
return -1 ;
503
508
}
504
509
@@ -509,6 +514,7 @@ int8_t ws_pae_controller_init(protocol_interface_info_entry_t *interface_ptr)
509
514
controller -> nw_send_key_index_set = NULL ;
510
515
controller -> nw_frame_counter_set = NULL ;
511
516
controller -> pan_ver_increment = NULL ;
517
+ controller -> pae_nvm_buffer = pae_nvm_buffer ;
512
518
513
519
ws_pae_controller_data_init (controller );
514
520
@@ -550,15 +556,17 @@ static void ws_pae_controller_data_init(pae_controller_t *controller)
550
556
ws_pae_timers_settings_init (& controller -> timer_settings );
551
557
}
552
558
553
- static void ws_pae_controller_frame_counter_read (stored_frame_counter_t * counter )
559
+ static void ws_pae_controller_frame_counter_read (pae_controller_t * controller )
554
560
{
561
+ stored_frame_counter_t * counter = & controller -> stored_frame_counter ;
555
562
// If not already, read frame counter and check if index and hash matches
556
563
if (!counter -> set && ws_pae_controller_nvm_frame_counter_read (& counter -> index , counter -> hash , & counter -> frame_counter ) >= 0 ) {
557
564
counter -> frame_counter += FRAME_COUNTER_INCREMENT ;
558
565
counter -> set = true;
559
566
tr_debug ("Read frame counter: %" PRIu32 ", index %i, hash %s, system time: %" PRIu32 "" , counter -> frame_counter , counter -> index , trace_array (counter -> hash , 8 ), protocol_core_monotonic_time / 10 );
560
567
// Write incremented frame counter
561
- ws_pae_controller_nvm_frame_counter_write (counter -> index , counter -> hash , counter -> frame_counter );
568
+ ws_pae_nvm_store_frame_counter_tlv_create (controller -> pae_nvm_buffer , counter -> index , counter -> hash , counter -> frame_counter );
569
+ ws_pae_controller_nvm_frame_counter_write (controller -> pae_nvm_buffer );
562
570
}
563
571
}
564
572
@@ -581,11 +589,13 @@ static uint32_t ws_pae_controller_frame_counter_get(stored_frame_counter_t *coun
581
589
return frame_counter ;
582
590
}
583
591
584
- static void ws_pae_controller_frame_counter_write (stored_frame_counter_t * counter , uint8_t index , uint8_t * key_hash , uint32_t curr_frame_counter )
592
+ static void ws_pae_controller_frame_counter_write (pae_controller_t * controller , uint8_t index , uint8_t * key_hash , uint32_t curr_frame_counter )
585
593
{
594
+ stored_frame_counter_t * counter = & controller -> stored_frame_counter ;
586
595
// If index or hash changes, or frame counter has been incremented by the threshold updates frame counter
587
596
if (!counter -> set || counter -> index != index || memcmp (key_hash , counter -> hash , 8 ) != 0 || curr_frame_counter > counter -> frame_counter + FRAME_COUNTER_STORE_THRESHOLD ) {
588
- ws_pae_controller_nvm_frame_counter_write (index , key_hash , curr_frame_counter );
597
+ ws_pae_nvm_store_frame_counter_tlv_create (controller -> pae_nvm_buffer , index , key_hash , curr_frame_counter );
598
+ ws_pae_controller_nvm_frame_counter_write (controller -> pae_nvm_buffer );
589
599
counter -> index = index ;
590
600
counter -> frame_counter = curr_frame_counter ;
591
601
memcpy (counter -> hash , key_hash , GTK_HASH_LEN );
@@ -615,7 +625,7 @@ int8_t ws_pae_controller_supp_init(protocol_interface_info_entry_t *interface_pt
615
625
616
626
ws_pae_supp_cb_register (controller -> interface_ptr , controller -> auth_completed , ws_pae_controller_nw_key_check_and_insert , ws_pae_controller_active_nw_key_set );
617
627
618
- ws_pae_controller_frame_counter_read (& controller -> stored_frame_counter );
628
+ ws_pae_controller_frame_counter_read (controller );
619
629
620
630
return 0 ;
621
631
}
@@ -637,7 +647,7 @@ int8_t ws_pae_controller_auth_init(protocol_interface_info_entry_t *interface_pt
637
647
controller -> pae_gtks_updated = ws_pae_auth_gtks_updated ;
638
648
controller -> pae_nw_key_index_update = ws_pae_auth_nw_key_index_update ;
639
649
640
- ws_pae_controller_frame_counter_read (& controller -> stored_frame_counter );
650
+ ws_pae_controller_frame_counter_read (controller );
641
651
642
652
return 0 ;
643
653
}
@@ -680,6 +690,7 @@ int8_t ws_pae_controller_delete(protocol_interface_info_entry_t *interface_ptr)
680
690
}
681
691
682
692
ns_list_remove (& pae_controller_list , controller );
693
+ ns_dyn_mem_free (controller -> pae_nvm_buffer );
683
694
ns_dyn_mem_free (controller );
684
695
685
696
return 0 ;
@@ -1071,24 +1082,10 @@ static void ws_pae_controller_frame_counter_store(pae_controller_t *entry)
1071
1082
1072
1083
uint32_t curr_frame_counter ;
1073
1084
entry -> nw_frame_counter_read (entry -> interface_ptr , & curr_frame_counter );
1074
- ws_pae_controller_frame_counter_write (& entry -> stored_frame_counter , active_index , hash , curr_frame_counter );
1085
+ ws_pae_controller_frame_counter_write (entry , active_index , hash , curr_frame_counter );
1075
1086
}
1076
1087
}
1077
1088
1078
- static int8_t ws_pae_controller_nvm_frame_counter_write (uint8_t index , uint8_t * hash , uint32_t frame_counter )
1079
- {
1080
- nvm_tlv_list_t tlv_list ;
1081
- ns_list_init (& tlv_list );
1082
-
1083
- nvm_tlv_entry_t * tlv_entry = ws_pae_nvm_store_frame_counter_tlv_create (index , hash , frame_counter );
1084
- ns_list_add_to_end (& tlv_list , tlv_entry );
1085
-
1086
- ws_pae_nvm_store_tlv_file_write (FRAME_COUNTER_FILE , & tlv_list );
1087
- ns_list_remove (& tlv_list , tlv_entry );
1088
- ns_dyn_mem_free (tlv_entry );
1089
-
1090
- return 0 ;
1091
- }
1092
1089
1093
1090
static int8_t ws_pae_controller_nvm_frame_counter_read (uint8_t * index , uint8_t * hash , uint32_t * frame_counter )
1094
1091
{
@@ -1141,5 +1138,24 @@ static pae_controller_t *ws_pae_controller_get_or_create(int8_t interface_id)
1141
1138
return controller ;
1142
1139
}
1143
1140
1141
+ nvm_tlv_entry_t * ws_pae_controller_nvm_tlv_get (protocol_interface_info_entry_t * interface_ptr )
1142
+ {
1143
+ pae_controller_t * controller = ws_pae_controller_get (interface_ptr );
1144
+ if (!controller ) {
1145
+ return NULL ;
1146
+ }
1147
+
1148
+ return controller -> pae_nvm_buffer ;
1149
+ }
1150
+
1151
+ static void ws_pae_controller_nvm_frame_counter_write (nvm_tlv_entry_t * tlv_entry )
1152
+ {
1153
+ nvm_tlv_list_t tlv_list ;
1154
+ ns_list_init (& tlv_list );
1155
+ ns_list_add_to_end (& tlv_list , tlv_entry );
1156
+ ws_pae_nvm_store_tlv_file_write (FRAME_COUNTER_FILE , & tlv_list );
1157
+
1158
+ }
1159
+
1144
1160
#endif /* HAVE_WS */
1145
1161
0 commit comments