le_device_db_tlv: overwrite oldest entry if no free entry found for new one

This commit is contained in:
Matthias Ringwald 2017-11-20 15:46:46 +01:00
parent 751da8891f
commit d18177fed0

View File

@ -55,6 +55,8 @@
// Single stored entry
typedef struct le_device_db_entry_t {
uint32_t seq_nr; // used for "least recently stored" eviction strategy
// Identification
int addr_type;
bd_addr_t addr;
@ -180,19 +182,52 @@ void le_device_db_remove(int index){
}
int le_device_db_add(int addr_type, bd_addr_t addr, sm_key_t irk){
uint32_t highest_seq_nr = 0;
uint32_t lowest_seq_nr = 0;
int index_for_lowest_seq_nr = -1;
int index_for_addr = -1;
int index_for_empty = -1;
// find unused entry in the used list
int i;
int index = -1;
for (i=0;i<NVM_NUM_DEVICE_DB_ENTRIES;i++){
if (entry_map[i]) continue;
index = i;
break;
if (entry_map[i]) {
le_device_db_entry_t entry;
le_device_db_tlv_fetch(i, &entry);
// found addr?
if ((memcmp(addr, entry.addr, 6) == 0) && addr_type == entry.addr_type){
index_for_addr = i;
}
// update highest seq nr
if (entry.seq_nr > highest_seq_nr){
highest_seq_nr = entry.seq_nr;
}
// find entry with lowest seq nr
if ((index_for_lowest_seq_nr == 0) || (entry.seq_nr < lowest_seq_nr)){
index_for_lowest_seq_nr = i;
lowest_seq_nr = entry.seq_nr;
}
} else {
index_for_empty = i;
}
}
// no free entry found
if (index < 0) return -1;
log_info("index_for_addr %x, index_for_empy %x, index_for_lowest_seq_nr %x", index_for_addr, index_for_empty, index_for_lowest_seq_nr);
log_info("new entry for index %u", index);
uint32_t index_to_use = 0;
if (index_for_addr >= 0){
index_to_use = index_for_addr;
} else if (index_for_empty >= 0){
index_to_use = index_for_empty;
} else if (index_for_lowest_seq_nr >= 0){
index_to_use = index_for_lowest_seq_nr;
} else {
// should not happen
return -1;
}
log_info("new entry for index %u", index_to_use);
// store entry at index
le_device_db_entry_t entry;
@ -207,15 +242,17 @@ int le_device_db_add(int addr_type, bd_addr_t addr, sm_key_t irk){
#endif
// store
le_device_db_tlv_store(index, &entry);
le_device_db_tlv_store(index_to_use, &entry);
// set in entry_mape
entry_map[index] = 1;
entry_map[index_to_use] = 1;
// keep track
// keep track - don't increase if old entry found
if (index_for_addr < 0){
num_valid_entries++;
}
return index;
return index_to_use;
}