On 9/5/26 4:39 AM, Yuyang Huang wrote:
quoted hunk ↗ jump to hunk
+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.
quoted hunk ↗ jump to hunk
+ 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,