diff --git a/src/cmdu.c b/src/cmdu.c
index 5fb18ee6144cdd6efb0ddf63d187a0ab01f677cf..381cfaa036673bdb230bcfd263bed25e24e06cc0 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 25f59aa37d63d5df05ee664313c216ae21816da7..1f500ff6066b939b61a2070f41072f22c4e8911b 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 a30b76416810c5541fbabe7ef18c4a4a35034647..cc428edb20463a9c801cf4642d104950b1957827 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;