[OpenWrt-Devel] Regarding bridge multicast-to-unicast patch

Linus Lüssing linus.luessing at c0d3.blue
Wed Jun 3 00:39:16 EDT 2015

On Fri, Oct 24, 2014 at 06:35:27PM +0200, Felix Fietkau wrote:
> I'd like to get back to suppressing forwarding IGMPv2/MLDv1 reports:
> I just learned that we can avoid changing mac80211 at all for this.
> If we disable forwarding between stations in mac80211 and enable hairpin
> mode on the bridge interface, we have enough control over the data path
> to selectively suppress forwarding of reports to be able to deal with
> this issue.
> Do you have some ideas on how to detect if a report needs to be
> forwarded to a station (and if so, to which station)?

After rereading the bridge code once more I noticed that technically
nothing would "break" if the querier is behind a station. If the
querier is behind a station we will flood reports back on the
incoming wifi ap interface and to all stations, therefore causing
report suppression for other listeners on another station, yes.
But: If the querier is behind a station, the bridge will also
at least send one multicast frame back without changing the ethernet
destination, resulting in a wifi broadcast (check
br_multicast_flood() in br_forward.c: "router ports" will have
precedence over "multicast port groups" due to the "lport > rport"

So the disadvantages with the current approach are just the
following two if a querier is behind an STA:
* Unnecessary broadcasts which could be forwarded to the STA with
  the querier by unicast, too
* If there are multiple STAs listening to the same multicast group,
  all but the first will get the multicast packets via unicast
  (while all, including the first, will (additionally) receive
  them via broadcast)

But since nothing "breaks" and the scenario of having a
querier/multicast router behind an STA is rather uncommon, I think
that could be optimized later when someone needs it.

So just the following changes would be needed to
OpenWRT/netifd/bridge-mcast-to-ucast-patch for now:

* If multicast-to-unicast is enabled, then enable hairpinning and
  ap-isolation, too.
* Add one option to disable the
  multicast-to-unicast+hairpinning+ap-isolation combination
* Revert Changeset 43736
  ("kernel: disable multicast-to-unicast translation for ipv6
  neighbor solicitation"
* Do the "src = eth_hdr(skb)->h_dest" initializations later, after
  any pskb_may_pull()
* Submit to upstream :)

Cheers, Linus
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org

More information about the openwrt-devel mailing list