mbox series

[net-next,v3,00/11] net: bridge: split IPv4/v6 mc router state and export for batman-adv

Message ID 20210512231941.19211-1-linus.luessing@c0d3.blue (mailing list archive)
Headers show
Series net: bridge: split IPv4/v6 mc router state and export for batman-adv | expand

Message

Linus Lüssing May 12, 2021, 11:19 p.m. UTC
Hi,

The following patches are splitting the so far combined multicast router
state in the Linux bridge into two ones, one for IPv4 and one for IPv6,
for a more fine-grained detection of multicast routers. This avoids
sending IPv4 multicast packets to an IPv6-only multicast router and 
avoids sending IPv6 multicast packets to an IPv4-only multicast router.
This also allows batman-adv to make use of the now split information in
the final patch.

The first eight patches prepare the bridge code to avoid duplicate
code or IPv6-#ifdef clutter for the multicast router state split. And 
contain no functional changes yet.

The ninth patch then implements the IPv4+IPv6 multicast router state
split.

Patch number ten adds IPv4+IPv6 specific timers to the mdb netlink
router port dump, so that the timers validity can be checked individually
from userspace.

The final, eleventh patch exports this now per protocol family multicast
router state so that batman-adv can then later make full use of the 
Multicast Router Discovery (MRD) support in the Linux bridge. The 
batman-adv protocol format currently expects separate multicast router
states for IPv4 and IPv6, therefore it depends on the first patch.
batman-adv will then make use of this newly exported functions like
this[0].

Regards, Linus

[0]: https://git.open-mesh.org/batman-adv.git/shortlog/refs/heads/linus/multicast-routeable-mrd
     -> https://git.open-mesh.org/batman-adv.git/commit/d4bed3a92427445708baeb1f2d1841c5fb816fd4

Changelog v3:

* Patch 01/11:
  * fixed/added missing rename of br->router_list to
    br->ip4_mc_router_list in br_multicast_flood()
* Patch 02/11:
  * moved inline functions from br_forward.c to br_private.h
* Patch 03/11:
  * removed inline attribute from functions added to br_mdb.c
* Patch 04/11:
  * unchanged
* Patch 05/11:
  * converted if()'s into switch-case in br_multicast_is_router()
* Patch 06/11:
  * removed inline attribute from function added to br_multicast.c
* Patch 07/11:
  * added missing static attribute to function
    br_ip4_multicast_get_rport_slot() added to br_multicast.c
* Patch 08/11:
  * removed inline attribute from function added to br_multicast.c
* Patch 09/11:
  * added missing static attribute to function
    br_ip6_multicast_get_rport_slot() added to br_multicast.c
  * removed inline attribute from function added to br_multicast.c
* Patch 10/11:
  * unchanged
* Patch 11/11:
  * simplified bridge check in br_multicast_has_router_adjacent()
    by using br_port_get_check_rcu()
  * added missing declaration for br_multicast_has_router_adjacent()
    in include/linux/if_bridge.h

Changelog v2:

* split into multiple patches as suggested by Nikolay
* added helper functions to br_multicast_flood(), avoiding
  IPv6 #ifdef clutter
* fixed reverse xmas tree ordering in br_rports_fill_info() and
  added helper functions to avoid IPv6 #ifdef clutter
* Added a common br_multicast_add_router() and a helper function
  to retrieve the correct slot to avoid duplicate code for an
  ip4 and ip6 variant
* replaced the "1" and "2" constants in br_multicast_is_router()
  with the appropriate enums
* added br_{ip4,ip6}_multicast_rport_del() wrappers to reduce
  IPv6 #ifdef clutter
* added return values to br_*multicast_rport_del() to only notify
  if the port was actually removed and did not race with a readdition
  somewhere else
* added empty, void br_ip6_multicast_mark_router() if compiled
  without IPv6, to reduce IPv6 #ifdef clutter

Comments

Nikolay Aleksandrov May 13, 2021, 12:02 p.m. UTC | #1
On 13/05/2021 02:19, Linus Lüssing wrote:
> Hi,
> 
> The following patches are splitting the so far combined multicast router
> state in the Linux bridge into two ones, one for IPv4 and one for IPv6,
> for a more fine-grained detection of multicast routers. This avoids
> sending IPv4 multicast packets to an IPv6-only multicast router and 
> avoids sending IPv6 multicast packets to an IPv4-only multicast router.
> This also allows batman-adv to make use of the now split information in
> the final patch.
> 
> The first eight patches prepare the bridge code to avoid duplicate
> code or IPv6-#ifdef clutter for the multicast router state split. And 
> contain no functional changes yet.
> 
> The ninth patch then implements the IPv4+IPv6 multicast router state
> split.
> 
> Patch number ten adds IPv4+IPv6 specific timers to the mdb netlink
> router port dump, so that the timers validity can be checked individually
> from userspace.
> 
> The final, eleventh patch exports this now per protocol family multicast
> router state so that batman-adv can then later make full use of the 
> Multicast Router Discovery (MRD) support in the Linux bridge. The 
> batman-adv protocol format currently expects separate multicast router
> states for IPv4 and IPv6, therefore it depends on the first patch.
> batman-adv will then make use of this newly exported functions like
> this[0].
> 
> Regards, Linus
> 
> [0]: https://git.open-mesh.org/batman-adv.git/shortlog/refs/heads/linus/multicast-routeable-mrd
>      -> https://git.open-mesh.org/batman-adv.git/commit/d4bed3a92427445708baeb1f2d1841c5fb816fd4
> 

Nice work overall, thank you. I hope it was tested well. :)
It'd be great if later you could add some selftests.

Cheers,
 Nik
Linus Lüssing May 13, 2021, 1:34 p.m. UTC | #2
On Thu, May 13, 2021 at 03:02:13PM +0300, Nikolay Aleksandrov wrote:
> Nice work overall, thank you. I hope it was tested well. :)
> It'd be great if later you could add some selftests.
> 
> Cheers,
>  Nik

Hi Nikolay,

I think I found a way now to better deal with the protocol
specific hlist_for_each_entry(), by using hlist_for_each()
and a helper function, to reduce the duplicate code
with br_{ip4,ip6}_multicast_get_rport_slot() as you suggested
(and also removing duplicate code with 
br_{ip4,ip6}_multicast_mark_router()) and reworked patches 7
and 9 a bit for that...

Sorry for the inconvience and my bad timing with your reviews. But
thanks a lot for all your valuable feedback!

Also netdevbpf patchwork had a few more remarks, they should
hopefully be fixed now, too.

Regards, Linus
Nikolay Aleksandrov May 13, 2021, 1:36 p.m. UTC | #3
On 13/05/2021 16:34, Linus Lüssing wrote:
> On Thu, May 13, 2021 at 03:02:13PM +0300, Nikolay Aleksandrov wrote:
>> Nice work overall, thank you. I hope it was tested well. :)
>> It'd be great if later you could add some selftests.
>>
>> Cheers,
>>  Nik
> 
> Hi Nikolay,
> 
> I think I found a way now to better deal with the protocol
> specific hlist_for_each_entry(), by using hlist_for_each()
> and a helper function, to reduce the duplicate code
> with br_{ip4,ip6}_multicast_get_rport_slot() as you suggested
> (and also removing duplicate code with 
> br_{ip4,ip6}_multicast_mark_router()) and reworked patches 7
> and 9 a bit for that...
> 
> Sorry for the inconvience and my bad timing with your reviews. But
> thanks a lot for all your valuable feedback!
> 
> Also netdevbpf patchwork had a few more remarks, they should
> hopefully be fixed now, too.
> 
> Regards, Linus
> 

Awesome, I'll try to review the new set tonight or tomorrow at the latest.

Thanks,
 Nik