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