From 9d29a3ce6c186ea20fadb6ed8cc3e8bda0fd7d54 Mon Sep 17 00:00:00 2001 From: Anjan Chanda <anjan.chanda@iopsys.eu> Date: Mon, 16 Aug 2021 15:17:49 +0200 Subject: [PATCH] do not loopback received relay multicast cmdus --- src/cmdu_input.c | 12 ++++++------ src/i1905.c | 41 +++++++++++++++++++++++++++++++++++++++++ src/i1905.h | 5 +++++ 3 files changed, 52 insertions(+), 6 deletions(-) diff --git a/src/cmdu_input.c b/src/cmdu_input.c index f7a7c1b3..a16130f7 100644 --- a/src/cmdu_input.c +++ b/src/cmdu_input.c @@ -170,8 +170,8 @@ int i1905_handle_topology_notification(const char *ifname, uint8_t *from, neigh_set_1905(&((struct i1905_private *)priv)->neigh_q, aladdr_origin); /* relay mcast the change notification */ - ret = i1905_send_cmdu_relay_mcast(priv, ifname, MCAST_1905, iface->aladdr, - ETHERTYPE_1905, rxf); + ret = i1905_relay_cmdu(priv, ifname, MCAST_1905, iface->aladdr, + ETHERTYPE_1905, rxf); if (ret) fprintf(stderr, "Error sending relaying TOPOLOGY_CHANGE\n"); @@ -472,8 +472,8 @@ int i1905_handle_ap_autoconfig_search(const char *ifname, uint8_t *from, } /* relay mcast the received cmdu */ - ret = i1905_send_cmdu_relay_mcast(priv, ifname, MCAST_1905, rxf->origin, - ETHERTYPE_1905, rxf); + ret = i1905_relay_cmdu(priv, ifname, MCAST_1905, rxf->origin, + ETHERTYPE_1905, rxf); if (ret) fprintf(stderr, "Error sending AP_AUTOCONFIG_SEARCH\n"); @@ -655,8 +655,8 @@ int i1905_handle_ap_autoconfig_renew(const char *ifname, uint8_t *from, } /* relay mcast the received cmdu */ - ret = i1905_send_cmdu_relay_mcast(priv, ifname, MCAST_1905, rxf->origin, - ETHERTYPE_1905, rxf); + ret = i1905_relay_cmdu(priv, ifname, MCAST_1905, rxf->origin, + ETHERTYPE_1905, rxf); if (ret) fprintf(stderr, "Error relaying AP_AUTOCONFIG_RENEW\n"); diff --git a/src/i1905.c b/src/i1905.c index f040ae6b..9b7ab139 100644 --- a/src/i1905.c +++ b/src/i1905.c @@ -631,6 +631,47 @@ int i1905_send_cmdu_relay_mcast(struct i1905_private *priv, const char *ifname, return 0; } +int i1905_relay_cmdu(struct i1905_private *priv, const char *ifname, + uint8_t *dst, uint8_t *src, uint16_t ethtype, + struct cmdu_buff *frm) +{ + struct i1905_selfdevice *self; + struct i1905_interface *ifs; + uint16_t mid = 0; + 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); + + UNUSED(ethtype); + + list_for_each_entry(ifs, &self->iflist, list) { + struct i1905_interface_private *ifpriv = ifs->priv; + + /* skip sending out through the receiving interface */ + if (ifname && !strncmp(ifname, ifs->ifname, 16)) + continue; + + ret = i1905_cmdu_tx(ifpriv, dst, src, type, &mid, + frm->data, frm->datalen, false); + if (ret < 0) { + dbg("Error relay mcast through '%s' (err = %d, %s)\n", + ifs->ifname, errno, strerror(errno)); + } + } + + return 0; +} + int i1905_cmdu_fragment_and_tx(struct i1905_interface_private *ifpriv, uint8_t *dst, uint8_t *src, uint16_t type, uint16_t *mid, uint8_t *data, int datalen, diff --git a/src/i1905.h b/src/i1905.h index d129bc7c..e517a7bb 100644 --- a/src/i1905.h +++ b/src/i1905.h @@ -150,6 +150,11 @@ int i1905_send_cmdu_relay_mcast(struct i1905_private *priv, const char *ifname, uint8_t *dst, uint8_t *src, uint16_t ethtype, struct cmdu_buff *frm); +int i1905_relay_cmdu(struct i1905_private *priv, const char *ifname, + uint8_t *dst, uint8_t *src, uint16_t ethtype, + struct cmdu_buff *frm); + + int i1905_process_cmdu(struct i1905_private *priv, struct cmdu_buff *rxf); -- GitLab