diff --git a/src/cmdu.c b/src/cmdu.c
index 458b625c0c5d94121cefb110dcda4f367335e7a4..708549d723acd92069ebbd5f0dcd257c3ce9e307 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 4a1874962fbee7cccfd9886172c309335e6ec718..9a410f0f1ffe00f4760710ba748d233ba3860fc9 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)