144#define DEFINE_TLV_PARSER(TAG_LIST, COMMON_HANDLER, PARSE_FUNCTION_NAME) \
147 TAG_LIST(__X_DEFINE_TLV__TAG_ASSIGN) \
152 TAG_LIST(__X_DEFINE_TLV__TAG_INDEX) \
153 PARSE_FUNCTION_NAME##_TAG_COUNT, \
156 _Static_assert(PARSE_FUNCTION_NAME##_TAG_COUNT <= sizeof(TLV_flag_t) * 8, \
157 "Too many tags: exceeds the number of bits in TLV_flag_t"); \
161 TAG_LIST(__X_DEFINE_TLV__TAG_FLAG) \
168 static inline TLV_flag_t PARSE_FUNCTION_NAME##_tag_to_flag(TLV_tag_t tag) { \
170 TAG_LIST(__X_DEFINE_TLV__TAG_TO_FLAG_CASE) \
184 static inline bool PARSE_FUNCTION_NAME(const buffer_t *payload, \
186 TLV_reception_t *received_tags_flags) { \
188 _internal_tlv_handler_t handlers[PARSE_FUNCTION_NAME##_TAG_COUNT] = { \
189 TAG_LIST(__X_DEFINE_TLV__TAG_CALLBACKS) \
191 return _parse_tlv_internal(handlers, \
192 PARSE_FUNCTION_NAME##_TAG_COUNT, \
193 (tlv_handler_cb_t*) COMMON_HANDLER, \
194 PARSE_FUNCTION_NAME##_tag_to_flag, \
197 received_tags_flags); \
225#define TLV_CHECK_RECEIVED_TAGS(received, ...) \
226 tlv_check_received_tags(received, \
227 (TLV_tag_t[]){__VA_ARGS__}, \
228 sizeof((TLV_tag_t[]){__VA_ARGS__}) / sizeof(TLV_tag_t))
244 uint8_t handlers_count,
TLV_flag_t() tag_to_flag_function_t(TLV_tag_t tag)
enum tag_unicity_e tag_unicity_t
bool() tlv_handler_cb_t(const tlv_data_t *data, void *tlv_extracted)
bool get_uint16_t_from_tlv_data(const tlv_data_t *data, uint16_t *value)
Extract a uint16_t value from TLV data.
bool get_string_from_tlv_data(const tlv_data_t *data, char *out, uint16_t min_length, uint16_t out_size)
Copy a NUL-terminated string from TLV data.
bool get_uint64_t_from_tlv_data(const tlv_data_t *data, uint64_t *value)
Extract a uint64_t value from TLV data.
bool get_bool_from_tlv_data(const tlv_data_t *data, bool *value)
Extract a boolean value from TLV data.
bool get_uint8_t_from_tlv_data(const tlv_data_t *data, uint8_t *value)
Extract a uint8_t value from TLV data.
TLV_reception_internal_t TLV_reception_t
struct tlv_data_s tlv_data_t
bool tlv_check_received_tags(TLV_reception_t received, const TLV_tag_t *tags, size_t tag_count)
Check that every tag in tags was received during parsing.
bool tlv_enforce_u8_value(const tlv_data_t *data, uint8_t expected_value)
Enforce that a TLV data contains the expected uint8 value.
bool _parse_tlv_internal(const _internal_tlv_handler_t *handlers, uint8_t handlers_count, tlv_handler_cb_t *common_handler, tag_to_flag_function_t *tag_to_flag_function, const buffer_t *payload, void *tlv_out, TLV_reception_t *received_tags_flags)
Parse a raw TLV payload using a pre-built handler table.
bool get_buffer_from_tlv_data(const tlv_data_t *data, buffer_t *out, uint16_t min_size, uint16_t max_size)
Extract a sized buffer from TLV data (zero-copy).
bool get_uint32_t_from_tlv_data(const tlv_data_t *data, uint32_t *value)
Extract a uint32_t value from TLV data.