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,


Reply via email to