From eab068c5da3d1d256b394523a37093c5f87e8b4f Mon Sep 17 00:00:00 2001 From: Anjan Chanda <anjan.chanda@iopsys.eu> Date: Thu, 8 Apr 2021 17:16:22 +0200 Subject: [PATCH] prepare custom cmdu_buff with cmdu_alloc_custom() --- src/cmdu.c | 28 ++++++++++++++++++++++++++++ src/cmdu.h | 4 ++++ 2 files changed, 32 insertions(+) diff --git a/src/cmdu.c b/src/cmdu.c index 458b625c..708549d7 100644 --- a/src/cmdu.c +++ b/src/cmdu.c @@ -279,6 +279,34 @@ int cmdu_copy_tlvs_linear(struct cmdu_buff *c, uint8_t *tlvs, uint32_t tlvslen) return 0; } +struct cmdu_buff *cmdu_alloc_custom(uint16_t type, uint16_t *mid, char *ifname, + uint8_t *origin, uint8_t *tlvs, + uint32_t tlvslen) +{ + struct cmdu_buff *f; + int ret; + + + f = cmdu_alloc_simple(type, mid); + if (!f) { + fprintf(stderr, "%s: -ENOMEM\n", __func__); + return NULL; + } + + ret = cmdu_copy_tlvs_linear(f, tlvs, tlvslen); + if (ret) { + fprintf(stderr, "%s: tlv-length > max cmdu size!\n", __func__); + cmdu_free(f); + return NULL; + } + + memcpy(f->dev_macaddr, origin, 6); + if (ifname) + strncpy(f->dev_ifname, ifname, 15); + + return f; +} + int cmdu_copy_tlvs(struct cmdu_buff *c, struct tlv *tv[], int tv_arrsize) { uint16_t tlvslen = 0; diff --git a/src/cmdu.h b/src/cmdu.h index 4a187496..9a410f0f 100644 --- a/src/cmdu.h +++ b/src/cmdu.h @@ -110,6 +110,10 @@ struct cmdu_buff *cmdu_alloc(int size); struct cmdu_buff *cmdu_alloc_default(void); struct cmdu_buff *cmdu_alloc_simple(uint16_t type, uint16_t *mid); +struct cmdu_buff *cmdu_alloc_custom(uint16_t type, uint16_t *mid, + char *ifname, uint8_t *origin, + uint8_t *tlvs, uint32_t tlvslen); + void cmdu_free(struct cmdu_buff *c); static inline void cmdu_set_type(struct cmdu_buff *c, uint16_t type) -- GitLab