"ip maddr show" prints link-layer, IPv4 and IPv6 entries. The IPv4 and IPv6 ones come over netlink today, with IFA_MC_USERS for the user count. The link-layer list, dev->mc, is only exported via /proc/net/dev_mcast, so iproute2 and other users still parse procfs for it.
This series adds the AF_PACKET family to RTM_GETMULTICAST so that the link-layer multicast addresses are reported the same way. Patch 4 dumps dev->mc in the ifaddrmsg format of the IPv4 and IPv6 dumps: IFA_MULTICAST carries the address, IFA_MC_USERS the reference count and a new IFA_F_GLOBAL flag marks entries added explicitly, the "static" column of /proc/net/dev_mcast. ifa_index limits the dump to one device and IFA_TARGET_NETNSID selects another netns. Patches 2 and 3 add a generation counter for dev->mc changes so a multi-part dump reports NLM_F_DUMP_INTR like the IPv4 and IPv6 ones. Patches 1 and 5 update the rt-addr spec and patch 6 adds a selftest. AF_PACKET dumps returned -EOPNOTSUPP before, so iproute2 can keep the procfs fallback for older kernels. The iproute2 side is ready and will be posted once this is in. Changes in v9: - Change the count of a netdev_hw_addr_list through helpers only and rename it to _count, as its own patch - Use the count helpers in __hw_addr_splice() too - Note in the spec doc that the header checks are unconditional for AF_PACKET only Changes in v8: - Set the owner of every list a device has, not only dev->mc, and check for dev->mc in one place when bumping the counter - Add __hw_addr_count_inc/dec/reset() so a change of list->count and the counter bump stay together Changes in v7: - Add a per netns generation counter bumped on dev->mc changes and fold it into cb->seq, dev_base_seq alone did not cover the dumped entries - Sample cb->seq under the address lock of each device and again when a dump round ends, so the NLMSG_DONE check sees a change too Changes in v6: - Move the dump to net/core/dev_addr_lists.c next to the dev->mc helpers - Stamp cb->seq from dev_base_seq and check dump consistency - Let an unexpected dump error propagate instead of skipping - Check for an address only present in the peer netns in the target-netnsid selftest, the peer and local ifindex can be equal - Document the ifa-index filter and the zero header fields in the spec Changes in v5: - Filter the target-netnsid selftest dump by ifa-index, a new netns also contains the fallback tunnel devices Changes in v4: - Reset the resume offset when the device the dump stopped at is gone - Use a tracked netns reference (put_net_track) - Say ifa-family must be set in the spec doc, drop the AF_UNSPEC remark - Close the netlink socket and guard the checks in the selftest - Drop the Fixes tag Changes in v3: - Report the static bit as a new IFA_F_GLOBAL flag in IFA_FLAGS instead of IFA_F_PERMANENT - Support IFA_TARGET_NETNSID and test it - Describe global_use accurately, it is also set by dev_mc_add_excl() - Fix the target-netnsid type in the rt-addr spec, as its own patch Changes in v2: - Always validate the request header, not only with strict checking - Use a single "with" statement in the selftest (ruff) Yuyang Huang (6): netlink: specs: rt-addr: fix the type of target-netnsid net: change netdev_hw_addr_list count through helpers net: add a generation counter for dev->mc changes net: add AF_PACKET multicast dumps netlink: specs: rt-addr: document AF_PACKET multicast dumps selftests: net: test AF_PACKET multicast dumps Documentation/netlink/specs/rt-addr.yaml | 20 +- .../net/ethernet/cavium/octeon/octeon_mgmt.c | 4 +- .../net/wireless/microchip/wilc1000/netdev.c | 8 +- include/linux/netdevice.h | 11 +- include/net/net_namespace.h | 1 + include/uapi/linux/if_addr.h | 1 + net/core/dev_addr_lists.c | 259 +++++++++++++++++- net/core/dev_addr_lists_test.c | 18 +- net/core/rtnetlink.c | 2 + net/mac80211/driver-ops.h | 2 +- tools/testing/selftests/net/rtnetlink.py | 73 ++++- 11 files changed, 364 insertions(+), 35 deletions(-) -- 2.43.0

