diff --git a/src/cmdu_input.c b/src/cmdu_input.c index f7a7c1b3272f6b6db7e0c897886599665fe792d3..a16130f759dee005ce123a6f44c987530c9d2575 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 f040ae6bb1732ed0b7bd980d3ec24b3a9c53c2e1..9b7ab139870d1f9ce1818dab6f5db9b266b3f233 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 d129bc7c8eafb16ea8f1156ac474bea5fbf9002f..e517a7bb387defccde396fc5df870f0a363e4711 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);