Review at https://gerrit.osmocom.org/7842
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 --- M include/osmocom/gsm/tlv.h 1 file changed, 10 insertions(+), 0 deletions(-) git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/42/7842/1 diff --git a/include/osmocom/gsm/tlv.h b/include/osmocom/gsm/tlv.h index 996f6aa..8fc7693 100644 --- a/include/osmocom/gsm/tlv.h +++ b/include/osmocom/gsm/tlv.h @@ -446,6 +446,16 @@ #define TLVP_PRES_LEN(tp, tag, min_len) \ (TLVP_PRESENT(tp, tag) && TLVP_LEN(tp, tag) >= min_len) +/* Usage: + * struct tlv_p_entry *e = TVLP_GET(&tp, TAG); + * if (!e) + * return -ENOENT; + * hexdump(e->val, e->len); + */ +#define TLVP_GET(_tp, tag) (TLVP_PRESENT(_tp, tag)? &_tp->lv[tag] : NULL) +#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 -- To view, visit https://gerrit.osmocom.org/7842 To unsubscribe, visit https://gerrit.osmocom.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I445de17fc2daa3ab051f5708dd0cc185b23dc048 Gerrit-PatchSet: 1 Gerrit-Project: libosmocore Gerrit-Branch: master Gerrit-Owner: Neels Hofmeyr <nhofm...@sysmocom.de>