# Unpatched (linux-7.1-rc1 vanilla) $ rmmod hsr; insmod /root/hsr.ko; /root/poc_hsr_pernet 15 [child] bringing up vethA1, vethB1, hsr0 [child] HSR family_id=37 mcgrp_id=15 [child] hsr0 up [child] listening on HSR mcast in child namespace for 15s... [child] received 0 HSR notifications in child namespace [parent] creating veth pairs vethA0<->vethA1, vethB0<->vethB1 [parent] moving vethA1, vethB1 into the child namespace [parent] creating hsr1 on vethA0+vethB0 in init_net [parent] HSR family_id=37 mcgrp_id=15 (init_net) [parent] soak 4s [parent] bringing vethA0, vethB0 down [parent] listening 11s for nodedown [parent(init_net)] HSR notification cmd=2 len=32 [parent(init_net)] HSR notification cmd=2 len=32 ========== RESULT ========== init_net received 2 HSR notifications child namespace received 0 HSR notifications UNPATCHED: init_net got events that belong to the child namespace. # Patched (linux-7.1-rc1 + the two-line genlmsg_multicast_netns conversion) $ rmmod hsr; insmod /root/hsr.ko; /root/poc_hsr_pernet 15 [child] bringing up vethA1, vethB1, hsr0 [child] HSR family_id=38 mcgrp_id=15 [child] hsr0 up [child] listening on HSR mcast in child namespace for 15s... [child] HSR notification cmd=2 len=32 [child] received 1 HSR notifications in child namespace [parent] creating veth pairs vethA0<->vethA1, vethB0<->vethB1 [parent] moving vethA1, vethB1 into the child namespace [parent] creating hsr1 on vethA0+vethB0 in init_net [parent] HSR family_id=38 mcgrp_id=15 (init_net) [parent] soak 4s [parent] bringing vethA0, vethB0 down [parent] listening 11s for nodedown [parent(init_net)] HSR notification cmd=2 len=32 ========== RESULT ========== init_net received 1 HSR notifications child namespace received >=1 HSR notifications PATCHED: each namespace receives only its own events.