From b729d794bfcea356c360f84b5114a9946724037c Mon Sep 17 00:00:00 2001 From: H1ghBre4k3r Date: Sun, 2 May 2021 21:50:13 +0200 Subject: [PATCH] Apply suggestions for ens_fs --- src/ens/ens_error.h | 3 ++- src/ens/ens_fs.c | 39 ++++++++++++++++++++++++++++----------- src/ens/ens_fs.h | 8 ++------ 3 files changed, 32 insertions(+), 18 deletions(-) diff --git a/src/ens/ens_error.h b/src/ens/ens_error.h index 2e6f91d..5f386d1 100644 --- a/src/ens/ens_error.h +++ b/src/ens/ens_error.h @@ -3,6 +3,7 @@ #define ENS_INTERR 1 // internal error #define ENS_NOENT 2 // entry not found or invalid -#define ENS_INVARG 3 // invalid argument +#define ENS_DELENT 3 // entry got deleted +#define ENS_INVARG 4 // invalid argument #endif \ No newline at end of file diff --git a/src/ens/ens_fs.c b/src/ens/ens_fs.c index 72cdbed..7827f3e 100644 --- a/src/ens/ens_fs.c +++ b/src/ens/ens_fs.c @@ -8,8 +8,13 @@ #define SEED 42 -int ens_fs_init(ens_fs_t* fs, uint8_t id, uint64_t entry_size) { - if (flash_area_open(id, &fs->area)) { +// mask for metadata +#define CRC_MASK 254 + +#define GET_CHECKSUM(x) (x&CRC_MASK) + +int ens_fs_init(ens_fs_t* fs, uint8_t flash_id, uint64_t entry_size) { + if (flash_area_open(flash_id, &fs->area)) { // opening of flash area was not successful return -ENS_INTERR; } @@ -35,21 +40,33 @@ int ens_fs_init(ens_fs_t* fs, uint8_t id, uint64_t entry_size) { return 0; } -int ens_fs_read(ens_fs_t* fs, uint64_t id, void* dist) { +int ens_fs_read(ens_fs_t* fs, uint64_t id, void* dest) { // read the entry from flash uint64_t offset = id * fs->entry_size; - if (flash_area_read(fs->area, offset, dist, fs->entry_size)) { + if (flash_area_read(fs->area, offset, dest, fs->entry_size)) { // opening of flash area was not successful return -ENS_INTERR; } // check, if checksum and not-deleted flag are as expected - uint8_t* obj = dist; - uint8_t metadata = crc7_be(SEED, obj, fs->entry_size - 1) | 1; - int isInvalid = memcmp(&obj[fs->entry_size - 1], &metadata, 1); + uint8_t* obj = dest; + + int isNotDeleted = obj[fs->entry_size - 1] & 1; + if(!isNotDeleted) { + // entry got deleted + return -ENS_DELENT; + } + + // crc stored in entry + uint8_t entryCRC = GET_CHECKSUM(obj[fs->entry_size - 1]); + + // calculated crc + uint8_t checkCRC = crc7_be(SEED, obj, fs->entry_size - 1); + + int isInvalid = memcmp(&entryCRC, &checkCRC, 1); if (isInvalid) { // if checksum is not equal to calculated checksum or if deleted flag is not 1, set memory to 0 - memset(dist, 0, fs->entry_size); + memset(dest, 0, fs->entry_size); // we do not know, if object got deleted or data is corrupt return -ENS_NOENT; } @@ -90,9 +107,9 @@ int ens_fs_delete(ens_fs_t* fs, uint64_t id) { return 0; } -int ens_fs_page_erase(ens_fs_t* fs, uint64_t offset, uint64_t sector_count) { - // calculate the next page start before (or at) the given offset - uint64_t start = (offset - offset % fs->sector_size) * fs->entry_size; +int ens_fs_page_erase(ens_fs_t* fs, uint64_t entry_id, uint64_t sector_count) { + // calculate the next page start before (or at) the given entry_id + uint64_t start = (entry_id - entry_id % fs->sector_size) * fs->entry_size; // erase given amount of pages, starting for the given offset if (flash_area_erase(fs->area, start, fs->sector_size * sector_count)) { diff --git a/src/ens/ens_fs.h b/src/ens/ens_fs.h index 9bfb10a..b6ff097 100644 --- a/src/ens/ens_fs.h +++ b/src/ens/ens_fs.h @@ -27,10 +27,6 @@ typedef struct ens_fs { * Amount of sectors in this fs. */ uint16_t sector_count; - /** - * Lock for this fs. - */ - // struct k_mutex* lock; } ens_fs_t; /** @@ -42,7 +38,7 @@ typedef struct ens_fs { * * @return 0 on success, -errno otherwise */ -int ens_fs_init(ens_fs_t* fs, uint8_t id, uint64_t entry_size); +int ens_fs_init(ens_fs_t* fs, uint8_t flash_id, uint64_t entry_size); /** * Read an entry from this file system. @@ -53,7 +49,7 @@ int ens_fs_init(ens_fs_t* fs, uint8_t id, uint64_t entry_size); * * @return 0 on success, -errno otherwise */ -int ens_fs_read(ens_fs_t* fs, uint64_t id, void* dist); +int ens_fs_read(ens_fs_t* fs, uint64_t id, void* dest); /** * Write data to the file system.