Skip to content

Commit 7683bef

Browse files
author
Mika Leppänen
committed
Added storing of all MAC frame counters to NVM
PAE controller now stores all frame counters (for 4 keys) to NVM. Counters are stored with GTKs so that frame counters can be accosicated with the specific key. Storing is triggered: 1) Keys are checked on 60 seconds interval. Storing to NVM is triggered if keys (GTKs) are changed or frame counter storing is needed (defined by hysteresis). 2) When new key is inserted (e.g. due to 4WH or GKH). There is 5 seconds delay to give time for BR to insert several keys before NVM write is triggered 3) When new send key index is taken into use. On most cases (1) or (2) should be triggered before this check, in which case no NVM updates are needed on this step 4) On ifdown Reading is triggered: 1) On ifup Added storing/reading MAC frame counters to MAC helper. Re-wrote the key update code (ws_pae_controller_nw_key_check_and_insert) and changed the checks to use actual GTKs instead of GTK hash.
1 parent b8a4f8d commit 7683bef

File tree

10 files changed

+272
-183
lines changed

10 files changed

+272
-183
lines changed

source/6LoWPAN/MAC/mac_helper.c

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -834,20 +834,41 @@ int8_t mac_helper_link_frame_counter_read(int8_t interface_id, uint32_t *seq_ptr
834834
{
835835
protocol_interface_info_entry_t *cur = protocol_stack_interface_info_get_by_id(interface_id);
836836

837+
if (!cur || !cur->mac_api || !seq_ptr) {
838+
return -1;
839+
}
840+
841+
return mac_helper_key_link_frame_counter_read(interface_id, seq_ptr, cur->mac_parameters->mac_default_key_attribute_id);
842+
}
843+
844+
int8_t mac_helper_link_frame_counter_set(int8_t interface_id, uint32_t seq_ptr)
845+
{
846+
protocol_interface_info_entry_t *cur = protocol_stack_interface_info_get_by_id(interface_id);
847+
848+
if (!cur || !cur->mac_api) {
849+
return -1;
850+
}
851+
852+
return mac_helper_key_link_frame_counter_set(interface_id, seq_ptr, cur->mac_parameters->mac_default_key_attribute_id);
853+
}
854+
855+
int8_t mac_helper_key_link_frame_counter_read(int8_t interface_id, uint32_t *seq_ptr, uint8_t descriptor)
856+
{
857+
protocol_interface_info_entry_t *cur = protocol_stack_interface_info_get_by_id(interface_id);
858+
837859
if (!cur || !cur->mac_api || !seq_ptr) {
838860
return -1;
839861
}
840862
mlme_get_t get_req;
841863
get_req.attr = macFrameCounter;
842-
get_req.attr_index = cur->mac_parameters->mac_default_key_attribute_id;
864+
get_req.attr_index = descriptor;
843865
cur->mac_api->mlme_req(cur->mac_api, MLME_GET, &get_req);
844866
*seq_ptr = cur->mac_parameters->security_frame_counter;
845867

846868
return 0;
847869
}
848870

849-
850-
int8_t mac_helper_link_frame_counter_set(int8_t interface_id, uint32_t seq_ptr)
871+
int8_t mac_helper_key_link_frame_counter_set(int8_t interface_id, uint32_t seq_ptr, uint8_t descriptor)
851872
{
852873
protocol_interface_info_entry_t *cur = protocol_stack_interface_info_get_by_id(interface_id);
853874

@@ -856,7 +877,7 @@ int8_t mac_helper_link_frame_counter_set(int8_t interface_id, uint32_t seq_ptr)
856877
}
857878
mlme_set_t set_req;
858879
set_req.attr = macFrameCounter;
859-
set_req.attr_index = cur->mac_parameters->mac_default_key_attribute_id;
880+
set_req.attr_index = descriptor;
860881
set_req.value_pointer = &seq_ptr;
861882
set_req.value_size = 4;
862883
cur->mac_api->mlme_req(cur->mac_api, MLME_SET, &set_req);

source/6LoWPAN/MAC/mac_helper.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,10 @@ int8_t mac_helper_link_frame_counter_read(int8_t interface_id, uint32_t *seq_ptr
115115

116116
int8_t mac_helper_link_frame_counter_set(int8_t interface_id, uint32_t seq_ptr);
117117

118+
int8_t mac_helper_key_link_frame_counter_read(int8_t interface_id, uint32_t *seq_ptr, uint8_t descriptor);
119+
120+
int8_t mac_helper_key_link_frame_counter_set(int8_t interface_id, uint32_t seq_ptr, uint8_t descriptor);
121+
118122
void mac_helper_devicetable_remove(struct mac_api_s *mac_api, uint8_t attribute_index, uint8_t *mac64);
119123

120124
void mac_helper_device_description_write(struct protocol_interface_info_entry *cur, mlme_device_descriptor_t *device_desc, uint8_t *mac64, uint16_t mac16, uint32_t frame_counter, bool exempt);

source/6LoWPAN/ws/ws_bootstrap.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,8 @@ static void ws_bootstrap_mac_security_enable(protocol_interface_info_entry_t *cu
9090
static void ws_bootstrap_nw_key_set(protocol_interface_info_entry_t *cur, uint8_t operation, uint8_t index, uint8_t *key);
9191
static void ws_bootstrap_nw_key_clear(protocol_interface_info_entry_t *cur, uint8_t slot);
9292
static void ws_bootstrap_nw_key_index_set(protocol_interface_info_entry_t *cur, uint8_t index);
93-
static void ws_bootstrap_nw_frame_counter_set(protocol_interface_info_entry_t *cur, uint32_t counter);
94-
static void ws_bootstrap_nw_frame_counter_read(protocol_interface_info_entry_t *cur, uint32_t *counter);
93+
static void ws_bootstrap_nw_frame_counter_set(protocol_interface_info_entry_t *cur, uint32_t counter, uint8_t slot);
94+
static void ws_bootstrap_nw_frame_counter_read(protocol_interface_info_entry_t *cur, uint32_t *counter, uint8_t slot);
9595
static void ws_bootstrap_authentication_completed(protocol_interface_info_entry_t *cur, auth_result_e result, uint8_t *target_eui_64);
9696
static void ws_bootstrap_pan_version_increment(protocol_interface_info_entry_t *cur);
9797
static ws_nud_table_entry_t *ws_nud_entry_discover(protocol_interface_info_entry_t *cur, void *neighbor);
@@ -2311,16 +2311,16 @@ static void ws_bootstrap_nw_key_index_set(protocol_interface_info_entry_t *cur,
23112311
mac_helper_security_auto_request_key_index_set(cur, index, index + 1);
23122312
}
23132313

2314-
static void ws_bootstrap_nw_frame_counter_set(protocol_interface_info_entry_t *cur, uint32_t counter)
2314+
static void ws_bootstrap_nw_frame_counter_set(protocol_interface_info_entry_t *cur, uint32_t counter, uint8_t slot)
23152315
{
23162316
// Set frame counter
2317-
mac_helper_link_frame_counter_set(cur->id, counter);
2317+
mac_helper_key_link_frame_counter_set(cur->id, counter, slot);
23182318
}
23192319

2320-
static void ws_bootstrap_nw_frame_counter_read(protocol_interface_info_entry_t *cur, uint32_t *counter)
2320+
static void ws_bootstrap_nw_frame_counter_read(protocol_interface_info_entry_t *cur, uint32_t *counter, uint8_t slot)
23212321
{
23222322
// Read frame counter
2323-
mac_helper_link_frame_counter_read(cur->id, counter);
2323+
mac_helper_key_link_frame_counter_read(cur->id, counter, slot);
23242324
}
23252325

23262326
static void ws_bootstrap_authentication_completed(protocol_interface_info_entry_t *cur, auth_result_e result, uint8_t *target_eui_64)

source/6LoWPAN/ws/ws_config.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ extern uint8_t DEVICE_MIN_SENS;
135135
* MAC frame counter NVM storing configuration
136136
*/
137137
#define FRAME_COUNTER_STORE_INTERVAL 60 // Time interval (on seconds) between frame counter store operations
138+
#define FRAME_COUNTER_STORE_TRIGGER 5 // Delay (on seconds) before storing, when storing of frame counters is triggered
138139
#define FRAME_COUNTER_INCREMENT 1000 // How much frame counter is incremented on start up
139140
#define FRAME_COUNTER_STORE_THRESHOLD 800 // How much frame counter must increment before it is stored
140141

0 commit comments

Comments
 (0)