From 6b9bd0fb0e865a962cb126e8a597b3d6bcd0096e Mon Sep 17 00:00:00 2001
From: Anjan Chanda <anjan.chanda@iopsys.eu>
Date: Mon, 4 Jan 2021 16:42:57 +0100
Subject: [PATCH] check if cmdu needs any tlv with is_cmdu_tlv_required()

---
 src/cmdu.c  | 7 +++++++
 src/cmdu.h  | 1 +
 src/i1905.c | 2 +-
 3 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/src/cmdu.c b/src/cmdu.c
index 5fb18ee6..381cfaa0 100644
--- a/src/cmdu.c
+++ b/src/cmdu.c
@@ -85,6 +85,13 @@ int is_cmdu_type_valid(uint16_t type)
 		type <= CMDU_TYPE_MAX);
 }
 
+int is_cmdu_tlv_required(uint16_t type)
+{
+	return !(type == CMDU_TYPE_TOPOLOGY_DISCOVERY ||
+		type == CMDU_TYPE_HIGHER_LAYER_QUERY ||
+		type == CMDU_TYPE_GENERIC_PHY_QUERY);
+}
+
 int cmdu_should_relay(uint16_t type)
 {
 	return (type == CMDU_TYPE_TOPOLOGY_NOTIFICATION ||
diff --git a/src/cmdu.h b/src/cmdu.h
index 25f59aa3..1f500ff6 100644
--- a/src/cmdu.h
+++ b/src/cmdu.h
@@ -147,6 +147,7 @@ uint16_t cmdu_expect_response(uint16_t req_type);
 int cmdu_should_relay(uint16_t type);
 int is_cmdu_type_valid(uint16_t type);
 int is_cmdu_type_response(uint16_t type);
+int is_cmdu_tlv_required(uint16_t type);
 
 int cmdu_validate(struct cmdu_buff *c, int max_tlvtype,
 		       struct tlv_policy *policy);
diff --git a/src/i1905.c b/src/i1905.c
index a30b7641..cc428edb 100644
--- a/src/i1905.c
+++ b/src/i1905.c
@@ -401,7 +401,7 @@ int i1905_cmdu_tx(struct i1905_interface_private *ifp,
 	int ret = 0;
 
 
-	if (!data && type != CMDU_TYPE_TOPOLOGY_QUERY) {
+	if (!data && is_cmdu_tlv_required(type)) {
 		fprintf(stderr, "%s: Invalid cmdu. %s requires tlv data\n",
 			__func__, cmdu_type2str(type));
 		return -1;
-- 
GitLab