On 9/5/26 4:39 AM, Yuyang Huang wrote:
> +static int rtnl_dump_mcaddr(struct sk_buff *skb, struct netlink_callback *cb)
> +{
> + struct net *net = sock_net(skb->sk);
> + unsigned int flags = NLM_F_MULTI;
> + struct {
> + unsigned long ifindex;
> + int addr_idx;
> + } *ctx = (void *)cb->ctx;
> + struct net_device *dev;
> + int ifindex = 0;
> + int err = 0;
> +
> + if (cb->strict_check) {
this is new code. It should only work with strict checking.
> + err = rtnl_valid_dump_mcaddr_req(cb->nlh, cb->extack,
> + &ifindex);
> + if (err < 0)
> + return err;
> + }
> +
> + rcu_read_lock();
> +
> + if (ifindex) {
> + cb->answer_flags |= NLM_F_DUMP_FILTERED;
> + flags |= NLM_F_DUMP_FILTERED;
> + dev = dev_get_by_index_rcu(net, ifindex);
> + if (!dev) {
> + err = -ENODEV;
> + goto out;
> + }
> + err = rtnl_dump_mcaddr_dev(dev, skb, cb, &ctx->addr_idx, flags);
> + goto out;
> + }
> +
> + for_each_netdev_dump(net, dev, ctx->ifindex) {
> + err = rtnl_dump_mcaddr_dev(dev, skb, cb, &ctx->addr_idx,
> + flags);
> + if (err < 0)
> + break;
> + }
> +out:
> + rcu_read_unlock();
> + return err;
> +}
> +
> struct sk_buff *rtmsg_ifinfo_build_skb(int type, struct net_device *dev,
> unsigned int change,
> u32 event, gfp_t flags, int *new_nsid,