Skip to content

Commit 2c38d9e

Browse files
committed
sys/log: Reverse TLV implementation for number of entries support
1 parent 4760b88 commit 2c38d9e

17 files changed

+850
-208
lines changed

fs/fcb2/include/fcb/fcb2.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,15 @@ int fcb2_clear(struct fcb2 *fcb);
304304
*/
305305
int fcb2_area_info(struct fcb2 *fcb, int sector, int *elemsp, int *bytesp);
306306

307+
/**
308+
* Length of data in flash considering alignment
309+
*
310+
* @param range Active range
311+
* @param len Length to be calculated using alignment
312+
*
313+
*/
314+
int fcb2_len_in_flash(const struct flash_sector_range *range, uint16_t len);
315+
307316
#ifdef __cplusplus
308317
}
309318

fs/fcb2/src/fcb.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,15 @@ fcb2_init(struct fcb2 *fcb)
101101
return rc;
102102
}
103103

104+
int
105+
fcb2_len_in_flash(const struct flash_sector_range *range, uint16_t len)
106+
{
107+
if (range->fsr_align <= 1) {
108+
return len;
109+
}
110+
return (len + (range->fsr_align - 1)) & ~(range->fsr_align - 1);
111+
}
112+
104113
int
105114
fcb2_free_sector_cnt(struct fcb2 *fcb)
106115
{

fs/fcb2/src/fcb_priv.h

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -40,15 +40,6 @@ struct fcb2_sector_info {
4040
uint16_t si_sector_in_range; /* Sector number relative to si_range */
4141
};
4242

43-
static inline int
44-
fcb2_len_in_flash(const struct flash_sector_range *range, uint16_t len)
45-
{
46-
if (range->fsr_align <= 1) {
47-
return len;
48-
}
49-
return (len + (range->fsr_align - 1)) & ~(range->fsr_align - 1);
50-
}
51-
5243
int fcb2_getnext_in_area(struct fcb2 *fcb, struct fcb2_entry *loc);
5344

5445
static inline int

sys/log/full/include/log/log.h

Lines changed: 73 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -75,36 +75,38 @@ struct log_storage_info {
7575
};
7676
#endif
7777

78-
typedef int (*log_walk_func_t)(struct log *, struct log_offset *log_offset,
78+
typedef int (*log_walk_func_t)(struct log *log, struct log_offset *log_offset,
7979
const void *dptr, uint16_t len);
8080

8181
typedef int (*log_walk_body_func_t)(struct log *log,
8282
struct log_offset *log_offset, const struct log_entry_hdr *hdr,
8383
const void *dptr, uint16_t len);
8484

85-
typedef int (*lh_read_func_t)(struct log *, const void *dptr, void *buf,
85+
typedef int (*lh_read_func_t)(struct log *log, const void *dptr, void *buf,
8686
uint16_t offset, uint16_t len);
87-
typedef int (*lh_read_mbuf_func_t)(struct log *, const void *dptr, struct os_mbuf *om,
87+
typedef int (*lh_read_mbuf_func_t)(struct log *log, const void *dptr, struct os_mbuf *om,
8888
uint16_t offset, uint16_t len);
89-
typedef int (*lh_append_func_t)(struct log *, void *buf, int len);
89+
typedef int (*lh_append_func_t)(struct log *log, void *buf, int len);
9090
typedef int (*lh_append_body_func_t)(struct log *log,
9191
const struct log_entry_hdr *hdr,
9292
const void *body, int body_len);
9393
typedef int (*lh_append_mbuf_func_t)(struct log *, struct os_mbuf *om);
9494
typedef int (*lh_append_mbuf_body_func_t)(struct log *log,
9595
const struct log_entry_hdr *hdr,
9696
struct os_mbuf *om);
97-
typedef int (*lh_walk_func_t)(struct log *,
97+
typedef int (*lh_walk_func_t)(struct log *log,
9898
log_walk_func_t walk_func, struct log_offset *log_offset);
99-
typedef int (*lh_flush_func_t)(struct log *);
100-
typedef uint16_t (*lh_read_entry_len_func_t)(struct log *, const void *dptr);
99+
typedef int (*lh_flush_func_t)(struct log *log);
100+
typedef uint16_t (*lh_read_entry_len_func_t)(struct log *log, const void *dptr);
101101
#if MYNEWT_VAL(LOG_STORAGE_INFO)
102-
typedef int (*lh_storage_info_func_t)(struct log *, struct log_storage_info *);
102+
typedef int (*lh_storage_info_func_t)(struct log *log, struct log_storage_info *);
103103
#endif
104104
#if MYNEWT_VAL(LOG_STORAGE_WATERMARK)
105-
typedef int (*lh_set_watermark_func_t)(struct log *, uint32_t);
105+
typedef int (*lh_set_watermark_func_t)(struct log *log, uint32_t);
106106
#endif
107-
typedef int (*lh_registered_func_t)(struct log *);
107+
typedef int (*lh_registered_func_t)(struct log *log);
108+
/* This calculates length based on alignment of underlying medium */
109+
typedef int (*lh_len_in_medium_func_t)(struct log *log, uint16_t len);
108110

109111
struct log_handler {
110112
int log_type;
@@ -118,6 +120,7 @@ struct log_handler {
118120
lh_walk_func_t log_walk_sector;
119121
lh_flush_func_t log_flush;
120122
lh_read_entry_len_func_t log_read_entry_len;
123+
lh_len_in_medium_func_t log_len_in_medium;
121124
#if MYNEWT_VAL(LOG_STORAGE_INFO)
122125
lh_storage_info_func_t log_storage_info;
123126
#endif
@@ -136,6 +139,7 @@ struct log_handler {
136139
#define LOG_FLAGS_TLV_SUPPORT (1 << 1)
137140

138141
#define LOG_TLV_NUM_ENTRIES (1 << 0)
142+
#define LOG_TLV_NUM_TLVS (1 << 1)
139143

140144
#if MYNEWT_VAL(LOG_VERSION) == 3
141145
struct log_entry_hdr {
@@ -146,12 +150,16 @@ struct log_entry_hdr {
146150
uint8_t ue_etype : 4;
147151
uint8_t ue_flags : 4;
148152
uint8_t ue_imghash[4];
153+
/* Number of entries field which helps in calculating number of
154+
* entries per log, these go on incrementing similar to an index
155+
* but per log.
156+
*/
149157
uint32_t ue_num_entries;
150158
} __attribute__((__packed__));
151159

152160
struct log_tlv {
153-
uint8_t tag;
154161
uint8_t len;
162+
uint8_t tag;
155163
/* Value is of variable size appended based on len,
156164
* val is logged after the tag and len are logged
157165
*/
@@ -164,6 +172,30 @@ struct log_tlv {
164172
#define LOG_BASE_ENTRY_HDR_SIZE (15)
165173

166174
#define LOG_NUM_ENTRIES_SIZE (sizeof(((struct log *)0)->l_num_entries))
175+
#define LOG_NUM_TLVS_SIZE (1)
176+
177+
#if MYNEWT_VAL(LOG_FCB2)
178+
#define LF_MAX_ALIGN LOG_FCB2_MAX_ALIGN
179+
#else
180+
#define LF_MAX_ALIGN LOG_FCB_MAX_ALIGN
181+
#endif
182+
183+
#define LOG_FCB_MAX_TLV_SIZE(__tlv_name__) \
184+
/* sizeof(struct log_tlv)) + alignment */ \
185+
(LF_MAX_ALIGN + \
186+
/* Max size per value of TLV including alignment */ \
187+
(LOG_ ## __tlv_name__ ## _SIZE/LF_MAX_ALIGN) ? \
188+
(LOG_ ## __tlv_name__ ## _SIZE + LF_MAX_ALIGN) : \
189+
LF_MAX_ALIGN)
190+
191+
#define LOG_FCB_MAX_TLVS_SIZE LOG_FCB_MAX_TLV_SIZE(NUM_ENTRIES) + \
192+
LOG_FCB_MAX_TLV_SIZE(NUM_TLVS)
193+
194+
#define LOG_FCB_EXT_HDR_SIZE LOG_BASE_ENTRY_HDR_SIZE + LOG_IMG_HASHLEN + \
195+
LF_MAX_ALIGN
196+
197+
#define LOG_FCB_FLAT_BUF_SIZE (LOG_FCB_EXT_HDR_SIZE > LOG_FCB_MAX_TLVS_SIZE) ? \
198+
LOG_FCB_EXT_HDR_SIZE : LOG_FCB_MAX_TLVS_SIZE
167199

168200
#define LOG_MODULE_STR(module) log_module_get_name(module)
169201

@@ -532,6 +564,10 @@ int log_read(struct log *log, const void *dptr, void *buf, uint16_t off,
532564
/**
533565
* Reads entry length from the specified log.
534566
*
567+
* @param log The log to read from.
568+
* @param dptr Medium-specific data describing the area to
569+
* read from; typically obtained by a call to
570+
* `log_walk`.
535571
* @return The number of bytes of entry length; 0 on failure.
536572
*/
537573
uint16_t
@@ -580,7 +616,7 @@ uint16_t log_hdr_len(const struct log_entry_hdr *hdr);
580616
*
581617
* @return Length of the trailer
582618
*/
583-
uint16_t log_trailer_len(const struct log_entry_hdr *hdr);
619+
uint16_t log_trailer_len(struct log *log, const struct log_entry_hdr *hdr);
584620

585621
/**
586622
* @brief Reads data from the body of a log entry into a flat buffer.
@@ -778,13 +814,27 @@ int log_set_watermark(struct log *log, uint32_t index);
778814
*
779815
* @param log Ptr to log structure
780816
* @param dptr Ptr to data to be read
781-
* @param hdr Ptr to the header
782-
* @param offset Offset of the num of entries in the log entry
817+
* @param num_entries Ptr to number of entries
818+
* @param offset Offset of the num of entries field in the log entry
783819
*
784820
* @return 0 on success, non-zero on failure
785821
*/
786822
int log_fill_num_entries(struct log *log, const void *dptr,
787-
struct log_entry_hdr *hdr, uint16_t offset);
823+
uint32_t *num_entries,
824+
uint16_t offset);
825+
/**
826+
* Fill number of tlvs
827+
*
828+
* @param log Ptr to log structure
829+
* @param dptr Ptr to data to be read
830+
* @param num_entries Ptr to number of entries
831+
* @param offset Offset of the num of entries field in the log entry
832+
*
833+
* @return 0 on success, non-zero on failure
834+
*/
835+
int
836+
log_fill_num_tlvs(struct log *log, const void *dptr, uint8_t *num_tlvs,
837+
uint16_t offset);
788838

789839
/**
790840
* Fill log current image hash
@@ -819,6 +869,14 @@ log_read_hdr_by_idx(struct log *log, uint32_t idx, struct log_entry_hdr *out_hdr
819869
int
820870
log_get_entries(struct log *log, uint32_t idx, uint32_t *entries);
821871

872+
/* Get the length of data in medium - storage (fcb/fcb2), memory or stream
873+
*
874+
* @param log The log to get number of entries for
875+
* @param len Length in medium with padding if any
876+
*/
877+
int
878+
log_len_in_medium(struct log *log, uint16_t len);
879+
822880
/* Handler exports */
823881
#if MYNEWT_VAL(LOG_CONSOLE)
824882
extern const struct log_handler log_console_handler;

sys/log/full/selftest/util/src/log_test_util.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,7 @@ ltu_walk_verify(struct log *log, struct log_offset *log_offset,
279279
}
280280

281281
hdr_len = log_hdr_len(&ueh);
282-
trailer_len = log_trailer_len(&ueh);
282+
trailer_len = log_trailer_len(log, &ueh);
283283
dlen = len - hdr_len - trailer_len;
284284
TEST_ASSERT(dlen < sizeof(data));
285285

@@ -350,7 +350,7 @@ ltu_walk_body_verify(struct log *log, struct log_offset *log_offset,
350350

351351
TEST_ASSERT(len < sizeof(data));
352352

353-
len -= log_trailer_len(euh);
353+
len -= log_trailer_len(log, euh);
354354

355355
rc = log_read_body(log, dptr, data, 0, len);
356356
TEST_ASSERT(rc == len);

sys/log/full/selftest/util/src/testcases/log_test_case_cbmem_append.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ TEST_CASE_SELF(log_test_case_cbmem_append)
3939

4040
for (i = 0; i < num_strs; i++) {
4141
hdr = (struct log_entry_hdr *)(dummy_log_arr + off_arr[i]);
42-
len = off_arr[i+1] - off_arr[i] - log_hdr_len(hdr) - log_trailer_len(hdr);
42+
len = off_arr[i+1] - off_arr[i] - log_hdr_len(hdr) - log_trailer_len(&log, hdr);
4343
rc = log_append_typed(&log, 2, 3, LOG_ETYPE_STRING,
4444
dummy_log_arr + off_arr[i],
4545
len);

sys/log/full/selftest/util/src/testcases/log_test_case_cbmem_append_body.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ TEST_CASE_SELF(log_test_case_cbmem_append_body)
4040
for (i = 0; i < num_strs; i++) {
4141
hdr = (struct log_entry_hdr *)(dummy_log_arr + off_arr[i]);
4242
len = off_arr[i + 1] - off_arr[i] -
43-
log_hdr_len(hdr) - log_trailer_len(hdr);
43+
log_hdr_len(hdr) - log_trailer_len(&log, hdr);
4444
rc = log_append_body(&log, 2, 3, LOG_ETYPE_STRING,
4545
dummy_log_arr + off_arr[i] + log_hdr_len(hdr),
4646
len);

sys/log/full/selftest/util/src/testcases/log_test_case_cbmem_printf.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ TEST_CASE_SELF(log_test_case_cbmem_printf)
3939

4040
for (i = 0; i < num_strs; i++) {
4141
hdr = (struct log_entry_hdr *)(dummy_log_arr + off_arr[i]);
42-
len = off_arr[i+1] - off_arr[i] - log_hdr_len(hdr) - log_trailer_len(hdr);
42+
len = off_arr[i+1] - off_arr[i] - log_hdr_len(hdr) - log_trailer_len(&log, hdr);
4343
memcpy(data, dummy_log_arr + off_arr[i] + log_hdr_len(hdr),
4444
len);
4545
data[len] = '\0';

sys/log/full/selftest/util/src/testcases/log_test_case_fcb_append.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ TEST_CASE_SELF(log_test_case_fcb_append)
3939

4040
for (i = 0;i < num_strs; i++) {
4141
hdr = (struct log_entry_hdr *)(dummy_log_arr + off_arr[i]);
42-
len = off_arr[i+1] - off_arr[i] - log_hdr_len(hdr) - log_trailer_len(hdr);
42+
len = off_arr[i+1] - off_arr[i] - log_hdr_len(hdr) - log_trailer_len(&log, hdr);
4343
rc = log_append_typed(&log, 2, 3, LOG_ETYPE_STRING,
4444
dummy_log_arr + off_arr[i],
4545
len);

sys/log/full/selftest/util/src/testcases/log_test_case_fcb_append_body.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ TEST_CASE_SELF(log_test_case_fcb_append_body)
4040
for (i = 0; i < num_strs; i++) {
4141
hdr = (struct log_entry_hdr *)(dummy_log_arr + off_arr[i]);
4242
len = off_arr[i + 1] - off_arr[i] -
43-
log_hdr_len(hdr) - log_trailer_len(hdr);
43+
log_hdr_len(hdr) - log_trailer_len(&log, hdr);
4444
rc = log_append_body(&log, 2, 3, LOG_ETYPE_STRING,
4545
dummy_log_arr + off_arr[i] + log_hdr_len(hdr),
4646
len);

sys/log/full/selftest/util/src/testcases/log_test_case_fcb_append_mbuf.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ TEST_CASE_SELF(log_test_case_fcb_append_mbuf)
4040

4141
for (i = 0; i < num_strs; i++) {
4242
hdr = (struct log_entry_hdr *)(dummy_log_arr + off_arr[i]);
43-
len = off_arr[i+1] - off_arr[i] - log_trailer_len(hdr);
43+
len = off_arr[i+1] - off_arr[i] - log_trailer_len(&log, hdr);
4444
/* Split chain into several mbufs. */
4545
om = ltu_flat_to_fragged_mbuf(dummy_log_arr + off_arr[i],
4646
len, 2);

sys/log/full/selftest/util/src/testcases/log_test_case_fcb_append_mbuf_body.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ TEST_CASE_SELF(log_test_case_fcb_append_mbuf_body)
4141
for (i = 0; i < num_strs; i++) {
4242
hdr = (struct log_entry_hdr *)(dummy_log_arr + off_arr[i]);
4343
len = off_arr[i + 1] - off_arr[i] -
44-
log_hdr_len(hdr) - log_trailer_len(hdr);
44+
log_hdr_len(hdr) - log_trailer_len(&log, hdr);
4545

4646
/* Split chain into several mbufs. */
4747
om = ltu_flat_to_fragged_mbuf(dummy_log_arr + off_arr[i] + log_hdr_len(hdr),

0 commit comments

Comments
 (0)