diff --git a/src/cmdu.c b/src/cmdu.c index ff02d052ce92780b3585045ff95b71ab03a87203..825c743d1514d8229738d2666b92b52b248e2ebe 100644 --- a/src/cmdu.c +++ b/src/cmdu.c @@ -348,6 +348,23 @@ int cmdu_put_eom(struct cmdu_buff *c) return cmdu_put(c, eom, sizeof(eom)); } +struct tlv *cmdu_reserve_tlv(struct cmdu_buff *c, uint16_t tlv_datalen) +{ + uint16_t len = tlv_datalen + TLV_HLEN; + + if (!c) + return NULL; + + if (c->end - c->tail < len) { + fprintf(stderr, "%s: Failed to reserve %hu! Allocate new cmdu fragment\n", + __func__, tlv_datalen); + + return NULL; + } + + return (struct tlv *)c->tail; +} + int cmdu_parse_tlvs(struct cmdu_buff *c, struct tlv *tv[][16], struct tlv_policy *policy, int policy_len) { diff --git a/src/cmdu.h b/src/cmdu.h index 90fcd0d9cac52163a93cad2658e31f71a331390d..9a78e8d57381c325c37d1d9cd7cf3935bf0af6f3 100644 --- a/src/cmdu.h +++ b/src/cmdu.h @@ -159,6 +159,7 @@ int cmdu_parse_tlvs(struct cmdu_buff *c, struct tlv *tv[][16], int cmdu_copy_tlvs_linear(struct cmdu_buff *c, uint8_t *tlvs, uint32_t tlvslen); int cmdu_copy_tlvs(struct cmdu_buff *c, struct tlv *tv[], int tv_arrsize); +struct tlv *cmdu_reserve_tlv(struct cmdu_buff *c, uint16_t tlv_datalen); int cmdu_put_tlv(struct cmdu_buff *c, struct tlv *t); int cmdu_put(struct cmdu_buff *c, uint8_t *bytes, int len); int cmdu_put_eom(struct cmdu_buff *c);