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