mirror of https://gerrit.osmocom.org/libosmocore
tlv: add TLV_GET() and TLV_GET_MINLEN()
Rationale: so far we use code like if (TLVP_PRESENT(&tp, VERY_LONG_ENUM_VALUE_NAME_THAT_NEVER_ENDS)) { val = TLVP_VAL(&tp, VERY_LONG_ENUM_VALUE_NAME_THAT_NEVER_ENDS); len = TLVP_LEN(&tp, VERY_L0NG_ENUM_VALUE_NAME_TH4T_NEVER_EMDS); } This is a) very long and b) prone to picking the wrong name one of the three times, which would use the wrong length or val without necessarily being noticed. A safer and shorter, more readable pattern is: struct tlv_p_entry *e = TVLP_GET(&tp, VERY_LONG_ENUM_VALUE_NAME_THAT_NEVER_ENDS); if (!e) return -ENOENT; hexdump(e->val, e->len); Change-Id: I445de17fc2daa3ab051f5708dd0cc185b23dc048
This commit is contained in:
parent
8d41d722d6
commit
74e4ed6f36
|
@ -446,6 +446,27 @@ void tlv_def_patch(struct tlv_definition *dst, const struct tlv_definition *src)
|
|||
#define TLVP_PRES_LEN(tp, tag, min_len) \
|
||||
(TLVP_PRESENT(tp, tag) && TLVP_LEN(tp, tag) >= min_len)
|
||||
|
||||
/*! Return pointer to a TLV element if it is present.
|
||||
* Usage:
|
||||
* struct tlv_p_entry *e = TVLP_GET(&tp, TAG);
|
||||
* if (!e)
|
||||
* return -ENOENT;
|
||||
* hexdump(e->val, e->len);
|
||||
* \param[in] _tp pointer to \ref tlv_parsed.
|
||||
* \param[in] tag IE tag to return.
|
||||
* \returns struct tlv_p_entry pointer, or NULL if not present.
|
||||
*/
|
||||
#define TLVP_GET(_tp, tag) (TLVP_PRESENT(_tp, tag)? &(_tp)->lv[tag] : NULL)
|
||||
|
||||
/*! Like TLVP_GET(), but enforcing a minimum val length.
|
||||
* \param[in] _tp pointer to \ref tlv_parsed.
|
||||
* \param[in] tag IE tag to return.
|
||||
* \param[in] min_len Minimum value length in bytes.
|
||||
* \returns struct tlv_p_entry pointer, or NULL if not present or too short.
|
||||
*/
|
||||
#define TLVP_GET_MINLEN(_tp, tag, min_len) \
|
||||
(TLVP_PRES_LEN(_tp, tag, min_len)? &(_tp)->lv[tag] : NULL)
|
||||
|
||||
/*! Align given TLV element with 16 bit value to an even address
|
||||
* \param[in] tp pointer to \ref tlv_parsed
|
||||
* \param[in] pos element to return
|
||||
|
|
Loading…
Reference in New Issue