From 90c9d16b1595261a4bf459211c1a8239035322e4 Mon Sep 17 00:00:00 2001
From: Anjan Chanda <anjan.chanda@iopsys.eu>
Date: Fri, 16 Jul 2021 16:57:12 +0200
Subject: [PATCH] also loopback the relay-mcast cmdus during send

---
 src/i1905.c | 45 ++++++++++-----------------------------------
 1 file changed, 10 insertions(+), 35 deletions(-)

diff --git a/src/i1905.c b/src/i1905.c
index 575fa7fb..f040ae6b 100644
--- a/src/i1905.c
+++ b/src/i1905.c
@@ -593,34 +593,23 @@ int i1905_send_cmdu_relay_mcast(struct i1905_private *priv, const char *ifname,
 {
 	struct i1905_selfdevice *self;
 	struct i1905_interface *ifs;
-	struct ether_header *eh;
-	struct sockaddr_ll sa;
+	uint16_t mid = 0;
+	bool lo = true;
+	uint16_t type;
 	int ret;
 
 
-
 	if (!priv || !frm || !frm->cdata)
 		return -1;
 
-
 	if (!IS_CMDU_RELAY_MCAST(frm->cdata))
 		return -1;
 
-
 	self = &priv->dm.self;
+	type = cmdu_get_type(frm);
+	mid = cmdu_get_mid(frm);
 
-	if (frm->cdata && frm->cdata->hdr.mid == 0)
-		frm->cdata->hdr.mid = cmdu_get_next_mid();
-
-
-
-	/* copy ethhdr + vlan tag? */
-	//frm->head += 4;		// TODO: vlan
-
-	eh = (struct ether_header *)frm->head;
-	frm->len = frm->datalen + sizeof(struct ether_header) +
-						sizeof(struct cmdu_header);
-
+	UNUSED(ethtype);
 
 	list_for_each_entry(ifs, &self->iflist, list) {
 		struct i1905_interface_private *ifpriv = ifs->priv;
@@ -629,26 +618,12 @@ int i1905_send_cmdu_relay_mcast(struct i1905_private *priv, const char *ifname,
 		if (ifname && !strncmp(ifname, ifs->ifname, 16))
 			continue;
 
-		if (hwaddr_is_zero(src))
-			memcpy(eh->ether_shost, ifs->macaddr, 6);
-		else
-			memcpy(eh->ether_shost, src, 6);
-
-
-		if (hwaddr_is_zero(dst))
-			memcpy(eh->ether_dhost, ifs->aladdr, 6);
-		else
-			memcpy(eh->ether_dhost, dst, 6);
-
-		eh->ether_type = htons(ethtype);
-		sa.sll_ifindex = ifs->ifindex;
-		sa.sll_halen = ETH_ALEN;
-		memcpy(sa.sll_addr, dst, 6);
+		ret = i1905_cmdu_tx(ifpriv, dst, src, type, &mid,
+				     frm->data, frm->datalen, lo);
+		lo = false;
 
-		ret = sendto(ifpriv->sock_1905, frm->head, frm->len, 0,
-			     (struct sockaddr*)&sa, sizeof(struct sockaddr_ll));
 		if (ret < 0) {
-			dbg("Error sending relay mcast through '%s' (err = %d, %s)\n",
+			dbg("Error relay mcast through '%s' (err = %d, %s)\n",
 			    ifs->ifname, errno, strerror(errno));
 		}
 	}
-- 
GitLab