From 976cb18a81bb92219ffe75f1e66b6f1d9afb6edf Mon Sep 17 00:00:00 2001
From: Anjan Chanda <anjan.chanda@iopsys.eu>
Date: Tue, 23 Feb 2021 11:50:25 +0100
Subject: [PATCH] move topology and bridge discovery functions to cmdu_output.c

---
 src/cmdu_output.c | 146 +++++++++++++++++++++++++++++++++++++++++++
 src/i1905.c       | 153 +---------------------------------------------
 src/i1905.h       |   4 ++
 3 files changed, 152 insertions(+), 151 deletions(-)

diff --git a/src/cmdu_output.c b/src/cmdu_output.c
index 4836c8ff..a0f54fd8 100644
--- a/src/cmdu_output.c
+++ b/src/cmdu_output.c
@@ -47,6 +47,152 @@
 #include "i1905_extension.h"
 
 
+int i1905_send_bridge_discovery(struct i1905_interface *iface)
+{
+	struct cmdu_buff *frm = NULL;
+	uint8_t *lldpbuf;
+	int ret = 0;
+
+
+	frm = cmdu_alloc_default();
+	if (!frm) {
+		fprintf(stderr, "%s: -ENOMEM\n", __func__);
+		return -1;
+	}
+
+	frm->data = (uint8_t *)(frm->head + 18);
+	frm->tail = frm->data;
+
+	/* lldp tlvs are not compatible with 1905's.
+	 * So, the same struct tlv cannot be used here.
+	 */
+	lldpbuf = calloc(1, 256 * sizeof(uint8_t));
+	if (!lldpbuf) {
+		cmdu_free(frm);
+		fprintf(stderr, "%s: -ENOMEM\n", __func__);
+		return -1;
+	}
+
+	lldpbuf[0] = (LLDP_TLV_CHASSIS_ID << 1) | ((7 & 0x80) >> 7);
+	lldpbuf[1] = 7 & 0x7f;
+	lldpbuf[2] = LLDP_CHASSIS_ID_SUBTYPE_MAC_ADDRESS;
+	memcpy(&lldpbuf[3], iface->aladdr, 6);
+
+	ret = cmdu_put(frm, lldpbuf, 9);
+	if (ret) {
+		fprintf(stderr, "%s: error: cmdu_put()\n", __func__);
+		cmdu_free(frm);
+		free(lldpbuf);
+		return -1;
+	}
+
+	memset(lldpbuf, 0, 256);
+	lldpbuf[0] = (LLDP_TLV_PORT_ID << 1) | ((7 & 0x80) >> 7);
+	lldpbuf[1] = 7 & 0x7f;
+	lldpbuf[2] = LLDP_PORT_ID_SUBTYPE_MAC_ADDRESS;
+	memcpy(&lldpbuf[3], iface->macaddr, 6);
+
+	ret = cmdu_put(frm, lldpbuf, 9);
+	if (ret) {
+		fprintf(stderr, "%s: error: cmdu_put()\n", __func__);
+		cmdu_free(frm);
+		free(lldpbuf);
+		return -1;
+	}
+
+	memset(lldpbuf, 0, 256);
+	lldpbuf[0] = (LLDP_TLV_TTL << 1) | ((2 & 0x80) >> 7);
+	lldpbuf[1] = 2 & 0x7f;
+	buf_put_be16(&lldpbuf[2], LLDP_TTL_1905_DEFAULT_VALUE);
+
+	ret = cmdu_put(frm, lldpbuf, 4);
+	if (ret) {
+		fprintf(stderr, "%s: error: cmdu_put()\n", __func__);
+		cmdu_free(frm);
+		free(lldpbuf);
+		return -1;
+	}
+
+	ret = i1905_send_cmdu(iface->priv, MCAST_LLDP, iface->aladdr,
+			      ETHERTYPE_LLDP, frm);
+	if (ret) {
+		fprintf(stderr, "Error sending BRIDGE DISCOVERY\n");
+	}
+
+	free(lldpbuf);
+	cmdu_free(frm);
+
+	return 0;
+}
+
+int i1905_send_topology_discovery(struct i1905_interface *iface)
+{
+	struct cmdu_buff *frm = NULL;
+	struct tlv *t;
+	int ret = 0;
+
+
+	frm = cmdu_alloc_default();
+	if (!frm) {
+		fprintf(stderr, "%s: -ENOMEM\n", __func__);
+		return -1;
+	}
+
+	frm->cdata = (struct cmdu_linear *)(frm->head + 18);
+	cmdu_set_type(frm, CMDU_TYPE_TOPOLOGY_DISCOVERY);
+	cmdu_set_mid(frm, cmdu_get_next_mid());
+	CMDU_SET_LAST_FRAGMENT(frm->cdata);
+
+	frm->data = (uint8_t *)(frm->cdata + 1);
+	frm->tail = frm->data;
+
+
+	/* prepare TLVs */
+	t = cmdu_reserve_tlv(frm, 6);
+	if (!t) {
+		cmdu_free(frm);
+		fprintf(stderr, "%s: -ENOMEM\n", __func__);
+		return -1;
+	}
+
+	t->type = TLV_TYPE_AL_MAC_ADDRESS_TYPE;
+	t->len = 6;
+	memcpy(t->data, iface->aladdr, 6);
+	ret = cmdu_put_tlv(frm, t);
+	if (ret) {
+		fprintf(stderr, "%s: error: cmdu_put_tlv()\n", __func__);
+		cmdu_free(frm);
+		return -1;
+	}
+
+	t = cmdu_reserve_tlv(frm, 6);
+	if (!t) {
+		cmdu_free(frm);
+		return -1;
+	}
+
+	t->type = TLV_TYPE_MAC_ADDRESS_TYPE;
+	t->len = 6;
+	memcpy(t->data, iface->macaddr, 6);
+	ret = cmdu_put_tlv(frm, t);
+	if (ret) {
+		fprintf(stderr, "%s: error: cmdu_put_tlv()\n", __func__);
+		cmdu_free(frm);
+		return -1;
+	}
+
+	cmdu_put_eom(frm);
+
+	ret = i1905_send_cmdu(iface->priv, MCAST_1905, iface->aladdr,
+			      ETHERTYPE_1905, frm);
+	if (ret) {
+		fprintf(stderr, "Error sending TOPOLOGY_DISCOVERY\n");
+	}
+
+	cmdu_free(frm);
+
+	return 0;
+}
 
 int i1905_send_topology_query(struct i1905_interface *iface, uint8_t *dest)
 {
diff --git a/src/i1905.c b/src/i1905.c
index 8235055c..56308c54 100644
--- a/src/i1905.c
+++ b/src/i1905.c
@@ -1107,86 +1107,7 @@ int i1905_run_bridge_discovery(struct i1905_private *p)
 
 
 	list_for_each_entry(iface, &p->dm.self.iflist, list) {
-		struct cmdu_buff *frm = NULL;
-		uint8_t *lldpbuf;
-		int ret = 0;
-
-
-		//fprintf(stderr, "%s: %d  ifname = %s\n", __func__, __LINE__,
-		//	iface->ifname);
-
-		frm = cmdu_alloc_default();
-		if (!frm) {
-			fprintf(stderr, "%s: -ENOMEM\n", __func__);
-			return -1;
-		}
-
-		frm->data = (uint8_t *)(frm->head + 18);
-		frm->tail = frm->data;
-
-		//fprintf(stderr, "%s: head = %p data = %p  tail = %p  end = %p\n",
-		//	__func__, frm->head, frm->data, frm->tail, frm->end);
-
-		/* prepare and append TLVs */
-
-		/* lldp tlvs are not compatible with 1905's.
-		 * So, the same struct tlv cannot be used here.
-		 */
-		lldpbuf = calloc(1, 256 * sizeof(uint8_t));
-		if (!lldpbuf) {
-			cmdu_free(frm);
-			fprintf(stderr, "%s: -ENOMEM\n", __func__);
-			return -1;
-		}
-
-		lldpbuf[0] = (LLDP_TLV_CHASSIS_ID << 1) | ((7 & 0x80) >> 7);
-		lldpbuf[1] = 7 & 0x7f;
-		lldpbuf[2] = LLDP_CHASSIS_ID_SUBTYPE_MAC_ADDRESS;
-		memcpy(&lldpbuf[3], iface->aladdr, 6);
-
-		ret = cmdu_put(frm, lldpbuf, 9);
-		if (ret) {
-			fprintf(stderr, "%s: error: cmdu_put()\n", __func__);
-			cmdu_free(frm);
-			free(lldpbuf);
-			return -1;
-		}
-
-		memset(lldpbuf, 0, 256);
-		lldpbuf[0] = (LLDP_TLV_PORT_ID << 1) | ((7 & 0x80) >> 7);
-		lldpbuf[1] = 7 & 0x7f;
-		lldpbuf[2] = LLDP_PORT_ID_SUBTYPE_MAC_ADDRESS;
-		memcpy(&lldpbuf[3], iface->macaddr, 6);
-
-		ret = cmdu_put(frm, lldpbuf, 9);
-		if (ret) {
-			fprintf(stderr, "%s: error: cmdu_put()\n", __func__);
-			cmdu_free(frm);
-			free(lldpbuf);
-			return -1;
-		}
-
-		memset(lldpbuf, 0, 256);
-		lldpbuf[0] = (LLDP_TLV_TTL << 1) | ((2 & 0x80) >> 7);
-		lldpbuf[1] = 2 & 0x7f;
-		buf_put_be16(&lldpbuf[2], LLDP_TTL_1905_DEFAULT_VALUE);
-
-		ret = cmdu_put(frm, lldpbuf, 4);
-		if (ret) {
-			fprintf(stderr, "%s: error: cmdu_put()\n", __func__);
-			cmdu_free(frm);
-			free(lldpbuf);
-			return -1;
-		}
-
-		ret = i1905_send_cmdu(iface->priv, MCAST_LLDP, iface->aladdr,
-				      ETHERTYPE_LLDP, frm);
-		if (ret) {
-			fprintf(stderr, "Error sending TOPOLOGY_DISCOVERY\n");
-		}
-
-		free(lldpbuf);
-		cmdu_free(frm);
+		i1905_send_bridge_discovery(iface);
 	}
 
 	return 0;
@@ -1198,82 +1119,12 @@ int i1905_run_topology_discovery(struct i1905_private *p)
 
 
 	list_for_each_entry(iface, &p->dm.self.iflist, list) {
-		struct cmdu_buff *frm = NULL;
-		struct tlv *t;
-		int ret = 0;
-
-
-		//fprintf(stderr, "%s: %d  ifname = %s\n", __func__, __LINE__,
-		//	iface->ifname);
-
-		frm = cmdu_alloc_default();
-		if (!frm) {
-			fprintf(stderr, "%s: -ENOMEM\n", __func__);
-			return -1;
-		}
-
-		frm->cdata = (struct cmdu_linear *)(frm->head + 18);
-		cmdu_set_type(frm, CMDU_TYPE_TOPOLOGY_DISCOVERY);
-		cmdu_set_mid(frm, cmdu_get_next_mid());
-		CMDU_SET_LAST_FRAGMENT(frm->cdata);
-
-		frm->data = (uint8_t *)(frm->cdata + 1);
-		frm->tail = frm->data;
-
-
-		/* fprintf(stderr, "%s: head = %p data = %p  tail = %p  end = %p\n",
-			__func__, frm->head, frm->data, frm->tail, frm->end); */
-
-		/* prepare TLVs */
-		t = cmdu_reserve_tlv(frm, 6);
-		if (!t) {
-			cmdu_free(frm);
-			fprintf(stderr, "%s: -ENOMEM\n", __func__);
-			return -1;
-		}
-
-		t->type = TLV_TYPE_AL_MAC_ADDRESS_TYPE;
-		t->len = 6;
-		memcpy(t->data, iface->aladdr, 6);
-		ret = cmdu_put_tlv(frm, t);
-		if (ret) {
-			fprintf(stderr, "%s: error: cmdu_put_tlv()\n", __func__);
-			cmdu_free(frm);
-			return -1;
-		}
-
-		t = cmdu_reserve_tlv(frm, 6);
-		if (!t) {
-			cmdu_free(frm);
-			return -1;
-		}
-
-		t->type = TLV_TYPE_MAC_ADDRESS_TYPE;
-		t->len = 6;
-		memcpy(t->data, iface->macaddr, 6);
-		ret = cmdu_put_tlv(frm, t);
-		if (ret) {
-			fprintf(stderr, "%s: error: cmdu_put_tlv()\n", __func__);
-			cmdu_free(frm);
-			return -1;
-		}
-
-		cmdu_put_eom(frm);
-
-		ret = i1905_send_cmdu(iface->priv, MCAST_1905, iface->aladdr,
-				      ETHERTYPE_1905, frm);
-		if (ret) {
-			fprintf(stderr, "Error sending TOPOLOGY_DISCOVERY\n");
-		}
-
-		cmdu_free(frm);
+		i1905_send_topology_discovery(iface);
 	}
 
-
 	return 0;
 }
 
-
 void topology_timer_cb(atimer_t *t)
 {
 	struct i1905_private *p = container_of(t, struct i1905_private, topotimer);
diff --git a/src/i1905.h b/src/i1905.h
index 1824ac16..298cf878 100644
--- a/src/i1905.h
+++ b/src/i1905.h
@@ -123,6 +123,10 @@ int i1905_send_cmdu_relay_mcast(struct i1905_private *priv, const char *ifname,
 int i1905_process_cmdu(struct i1905_private *priv, struct cmdu_buff *rxf);
 
 
+int i1905_send_bridge_discovery(struct i1905_interface *iface);
+
+int i1905_send_topology_discovery(struct i1905_interface *iface);
+
 int i1905_send_topology_notification(struct i1905_private *priv);
 
 int i1905_send_topology_query(struct i1905_interface *iface, uint8_t *dest);
-- 
GitLab