From d18177fed01dc1771ec578293ac24db206f2a648 Mon Sep 17 00:00:00 2001 From: Matthias Ringwald Date: Mon, 20 Nov 2017 15:46:46 +0100 Subject: [PATCH] le_device_db_tlv: overwrite oldest entry if no free entry found for new one --- src/ble/le_device_db_tlv.c | 61 ++++++++++++++++++++++++++++++-------- 1 file changed, 49 insertions(+), 12 deletions(-) diff --git a/src/ble/le_device_db_tlv.c b/src/ble/le_device_db_tlv.c index 278ef853d..ced0c1773 100644 --- a/src/ble/le_device_db_tlv.c +++ b/src/ble/le_device_db_tlv.c @@ -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 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 - num_valid_entries++; + // keep track - don't increase if old entry found + if (index_for_addr < 0){ + num_valid_entries++; + } - return index; + return index_to_use; }