From nobody Fri Sep 25 20:02:38 2026 Received: from mail-pl1-f174.google.com (mail-pl1-f174.google.com [209.85.214.174]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 12ECC238C1A for ; Wed, 9 Sep 2026 01:34:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788917672; cv=none; b=apEWwk0KU29nDpsq012VQZQYB2YdIdEVM7ohuTXhItZA24YSwKQ1qzyO5tt4GPUGUCgp+9xrckMRXtNzQfaV/RW8oXO1dwTYYCUS33aqcp+3wksS3dHl1kescUOLmmm2tkdYBOQEkpt4sBEcz9mwf391bTlaYSgpMwAhXod8xc4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788917672; c=relaxed/simple; bh=MryJzkOFS4Eyctgw5MhZuUjVFzp0WImD/5hkAH4treA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=U4zEPrDtx/s/b5aPbvlNuZnbW2IlUtjRqnznNBGpJHd0XEGoReUIBR2ajYED7fqLyHLxXFEYf01jRyWY8YiErLcJht6CSd5YppE95M5RzCahwMGteKDGIjjXUsXINnOylAQl6N+09KG5x/68ChkG1v58uqcwBWxuEQ+1SbjZk0c= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=qsnKTrUA; arc=none smtp.client-ip=209.85.214.174 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="qsnKTrUA" Received: by mail-pl1-f174.google.com with SMTP id d9443c01a7336-2dcff8f44f2so1449655ad.1 for ; Tue, 08 Sep 2026 18:34:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788917670; x=1789522470; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to:content-type; bh=pIa3fiUNjaImZ6gnWNLkkYF/uSpKIblbnrtQvAPjzxY=; b=qsnKTrUAb1EHhWyJdST78yvQPLL0mx/R5xcdMuIDmQVHXiX3APGr2ik3ZAAVoyJY7l VxxUNJcVJUkaYwVWytNx+zI19IbdB+I9P7F0qQwlcaL8/pG+0xLX9FWGOJ5CBM+P5EtS gi6k/bCcd5fIKSi7Up6NvJX5FazCVxGjvCkgMLEoNWaTuDZsukyhu/GhMGCeeY+Su30P m9lZVA9pSSmv1QE8iB11juB88QI4KlTKO8DsXXVBUDqd7TL1XgNTawuPnkFhfAwIVirl ullfnisJNyjZBKUmTFRIxnCz9E8439Cq9q8KM4qEq8Y2dM+l6U6X4oQj6LUSqGmdwQYN Ofdw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788917670; x=1789522470; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=pIa3fiUNjaImZ6gnWNLkkYF/uSpKIblbnrtQvAPjzxY=; b=BJAQSzLAPSpzPuy/awE+BaC/7SUNUc2d6sCGE9uZtQ8oqZUj8mZCi3RJZCuVoAdGVv 7TxRI+zzKI5H6lqtIaypZCZSBW9t4MsBQfg9ZS1MJP00wXk8if6dGCPOVIIhfsOEQAkt KutfYloJRzlNWgC5TVxVsmxMpZxaPv64zgGyDXJwzzjXwWsg6PcQ8jv/O4drZOJIK31/ bWNg7hjzXQ0idEtjfd/sAL0qS02SngVxzOk1NG4DR1eNRAkbO/yvI/qQApuJof83uO6y JxlPiOdQeNdVwKItwdvrcDl2jzCTxvU/CdfSUWv/J8gPlQtIPaapW4Ctl8G/j58iqLx2 1tQQ== X-Forwarded-Encrypted: i=1; AKwUvBxZFeY5//3pKWNitmkYGqwUVgV4lwwhfuVAPb4h7xyY/pJNVsy+Ol+mFe12cY2/OZoxuPm2vX4pM3U1skA=@vger.kernel.org X-Gm-Message-State: AFuF++lv6hMAZOG2Kulzg7WqcCY7LG52HMQnCn/B7gFvr+vtmkCU1vt1 ssXs5mTtB4NX1OkUSyTgQ8swIznOQ5xCQikot8+DOATSmtyJmLd7UYfv X-Gm-Gg: AYBFou0gAPB1Ha/l3p8Ewb1FVVMfCSWwPzjUej5zLgS9i/Pz3pv7sA3rKRfqVyYBVnJ Pp2x1qEK3b0z7zBd19bCDfwm4BbrfYUlxRdtVMs1Iy2mg13VQQLRkWCqXpB58h4YoyfaI0MtyQz YiVm0EfLpeCvOKwyFtX7KH8N3SGrr7frSkpRy2uv5TA6QsdChMviZDvrayVcjyTsD/L9LS1ccsV qEAuYoYGIBsDXgYRdJ4cc/zgW1NEysYxlvtV3Fsh9TPj8Zr5C8AjD/oFQfND9Vw9455RqY0HffZ 0ybu3yAU/RWCtMUkQ6LTvI4rBj4b7P5HS7K7GeMjQGe6PrqCRyA9EN8xX7oLadIfzhQs0DOxVn7 59LUlT4SsqDbiNlS6/5Z+1AQhg31h22yCCqI0MYnHIvQnXZZCACsyqiqhfhPMskdlpQtA/bJGe5 DK21vPUkjTg8/GYcRbO41zt/L6/alhT847SsDzrYfg2cXneKAWZB1Zr5Q1zVQpksXRoox6lcibG vue50mTrpUfA1KXwkUsogju65Ydbt5is3pQ1DMexjlT+hgNZs2qBQ3DCrxzKw== X-Received: by 2002:a17:902:70cb:b0:2d8:d4cc:5bb2 with SMTP id d9443c01a7336-2db1286c86cmr350159495ad.18.1788917670168; Tue, 08 Sep 2026 18:34:30 -0700 (PDT) Received: from m-upc-A520M-HDV.flets-east.jp ([2400:2410:3f60:500:574b:e1a5:307b:15c5]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2db63c00837sm27975145ad.40.2026.09.08.18.34.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 08 Sep 2026 18:34:28 -0700 (PDT) Sender: Yuyang Huang From: Yuyang Huang To: Yuyang Huang Cc: "David S. Miller" , David Ahern , Donald Hunter , Eric Dumazet , Ido Schimmel , Jakub Kicinski , Kuniyuki Iwashima , Nicolas Dichtel , Nikolaos Gkarlis , Paolo Abeni , Sabrina Dubroca , Shuah Khan , Simon Horman , Stanislav Fomichev , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, netdev@vger.kernel.org Subject: [PATCH net-next v2 1/3] rtnetlink: add AF_PACKET multicast dumps Date: Wed, 9 Sep 2026 10:33:59 +0900 Message-ID: <20260909013401.14408-2-sigefriedhyy@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260909013401.14408-1-sigefriedhyy@gmail.com> References: <20260909013401.14408-1-sigefriedhyy@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" RTM_GETMULTICAST dumps IPv4 and IPv6 multicast group memberships, but the device multicast list (dev->mc) is only available through /proc/net/dev_mcast, so "ip maddr show" still has to parse procfs for its link-layer entries. Handle RTM_GETMULTICAST dumps with ifa_family set to AF_PACKET and report every entry of dev->mc in the existing ifaddrmsg format: - IFA_MULTICAST carries the raw link-layer address - IFA_MC_USERS carries the entry reference count - IFA_F_PERMANENT marks entries added with SIOCADDMULTI (netdev_hw_addr::global_use, "static" in "ip maddr") - ifa_scope is RT_SCOPE_LINK This covers every column of /proc/net/dev_mcast. AF_PACKET is the family iproute2 already uses for link-layer addresses ("ip -0"), and AF_UNSPEC keeps its "all families" meaning from RTM_GETADDR. The default FDB dump also walks dev->mc, but only for Ethernet devices without an ndo_fdb_dump of their own, so bridge, vxlan or macvlan devices never show their multicast filter there, and it has no users count or SIOCADDMULTI bit. Extending it would change "bridge fdb show" output and add NDA_* attributes, while this dump needs no new uAPI. There are no legacy users of AF_PACKET requests, so they are always validated: prefixlen, flags and scope must be zero, no attributes are accepted, and a non-zero ifa_index restricts the dump to that device. The dump runs under RCU and netif_addr_lock_bh() and does not need RTNL. Signed-off-by: Yuyang Huang --- net/core/rtnetlink.c | 129 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 129 insertions(+) diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 81c5a6104dea..b2febdb6915e 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c @@ -4566,6 +4566,133 @@ static int rtnl_dump_all(struct sk_buff *skb, struc= t netlink_callback *cb) return skb->len ? : ret; } =20 +static int rtnl_fill_mcaddr(struct sk_buff *skb, const struct net_device *= dev, + const struct netdev_hw_addr *ha, u32 portid, + u32 seq, unsigned int flags) +{ + struct ifaddrmsg *ifm; + struct nlmsghdr *nlh; + + nlh =3D nlmsg_put(skb, portid, seq, RTM_GETMULTICAST, sizeof(*ifm), + flags); + if (!nlh) + return -EMSGSIZE; + + ifm =3D nlmsg_data(nlh); + ifm->ifa_family =3D AF_PACKET; + ifm->ifa_prefixlen =3D 0; + ifm->ifa_flags =3D ha->global_use ? IFA_F_PERMANENT : 0; + ifm->ifa_scope =3D RT_SCOPE_LINK; + ifm->ifa_index =3D dev->ifindex; + + if (nla_put(skb, IFA_MULTICAST, dev->addr_len, ha->addr) || + nla_put_u32(skb, IFA_MC_USERS, ha->refcount)) { + nlmsg_cancel(skb, nlh); + return -EMSGSIZE; + } + + nlmsg_end(skb, nlh); + return 0; +} + +static int rtnl_dump_mcaddr_dev(struct net_device *dev, struct sk_buff *sk= b, + struct netlink_callback *cb, int *s_addr_idx, + unsigned int flags) +{ + struct netdev_hw_addr *ha; + int addr_idx =3D 0; + int err =3D 0; + + netif_addr_lock_bh(dev); + netdev_for_each_mc_addr(ha, dev) { + if (addr_idx < *s_addr_idx) { + addr_idx++; + continue; + } + err =3D rtnl_fill_mcaddr(skb, dev, ha, NETLINK_CB(cb->skb).portid, + cb->nlh->nlmsg_seq, flags); + if (err < 0) + break; + addr_idx++; + } + netif_addr_unlock_bh(dev); + + *s_addr_idx =3D err < 0 ? addr_idx : 0; + + return err; +} + +static int rtnl_valid_dump_mcaddr_req(const struct nlmsghdr *nlh, + struct netlink_ext_ack *extack, + int *pifindex) +{ + struct ifaddrmsg *ifm; + + ifm =3D nlmsg_payload(nlh, sizeof(*ifm)); + if (!ifm) { + NL_SET_ERR_MSG(extack, + "Invalid header for multicast dump request"); + return -EINVAL; + } + + if (ifm->ifa_prefixlen || ifm->ifa_flags || ifm->ifa_scope) { + NL_SET_ERR_MSG(extack, + "Invalid values in multicast dump header"); + return -EINVAL; + } + + if (nlmsg_attrlen(nlh, sizeof(*ifm))) { + NL_SET_ERR_MSG(extack, + "Invalid data after multicast dump header"); + return -EINVAL; + } + + *pifindex =3D ifm->ifa_index; + + return 0; +} + +static int rtnl_dump_mcaddr(struct sk_buff *skb, struct netlink_callback *= cb) +{ + struct net *net =3D sock_net(skb->sk); + unsigned int flags =3D NLM_F_MULTI; + struct { + unsigned long ifindex; + int addr_idx; + } *ctx =3D (void *)cb->ctx; + struct net_device *dev; + int ifindex; + int err; + + err =3D rtnl_valid_dump_mcaddr_req(cb->nlh, cb->extack, &ifindex); + if (err < 0) + return err; + + rcu_read_lock(); + + if (ifindex) { + cb->answer_flags |=3D NLM_F_DUMP_FILTERED; + flags |=3D NLM_F_DUMP_FILTERED; + dev =3D dev_get_by_index_rcu(net, ifindex); + if (!dev) { + err =3D -ENODEV; + goto out; + } + err =3D rtnl_dump_mcaddr_dev(dev, skb, cb, &ctx->addr_idx, flags); + goto out; + } + + for_each_netdev_dump(net, dev, ctx->ifindex) { + err =3D 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, @@ -7251,6 +7378,8 @@ static const struct rtnl_msg_handler rtnetlink_rtnl_m= sg_handlers[] __initconst =3D {.msgtype =3D RTM_SETSTATS, .doit =3D rtnl_stats_set}, {.msgtype =3D RTM_NEWLINKPROP, .doit =3D rtnl_newlinkprop}, {.msgtype =3D RTM_DELLINKPROP, .doit =3D rtnl_dellinkprop}, + {.protocol =3D PF_PACKET, .msgtype =3D RTM_GETMULTICAST, + .dumpit =3D rtnl_dump_mcaddr, .flags =3D RTNL_FLAG_DUMP_UNLOCKED}, {.protocol =3D PF_BRIDGE, .msgtype =3D RTM_GETLINK, .dumpit =3D rtnl_bridge_getlink}, {.protocol =3D PF_BRIDGE, .msgtype =3D RTM_DELLINK, --=20 2.43.0 From nobody Fri Sep 25 20:02:38 2026 Received: from mail-pl1-f176.google.com (mail-pl1-f176.google.com [209.85.214.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F025129B200 for ; Wed, 9 Sep 2026 01:34:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788917677; cv=none; b=EqmEl71Ayvb6nvln8WgVkSI+EUcUQJR5caDzLG6R8dF7/++COtgChw8TBqweRRVt+ZyQ1JhkBnMkm1ioAybUeKC1sunQf3tg4vMC8QomlWE5kUmLAwwuAF8bYqnM/Ncih7YLbaozTVxTf7D5TSnJZv2Hl5gAMeuzFjIaWgafIBE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788917677; c=relaxed/simple; bh=2zQvRUscIgNiPZoEjC1Z5mtgLCeG0uKE2CLDirOMMRE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=etKlj6hlJHlPSnBVuW0haSqs4poE86phLNt8AXvo9yhXI/G0QL/YoaCHDOk1cKUJoAQl0xUHxZX2hyQFs50WLXV7AiYjyvNFX1QWhS52fuJpDEr9TjCijBHuLT8DTixIQvWvOMk4U74UgwTPNKxUfpbnL+pIOVU8J2Be1s8vy84= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=FBS31s1f; arc=none smtp.client-ip=209.85.214.176 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="FBS31s1f" Received: by mail-pl1-f176.google.com with SMTP id d9443c01a7336-2d715f4a587so73762325ad.2 for ; Tue, 08 Sep 2026 18:34:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788917675; x=1789522475; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to:content-type; bh=263Ot5CK8k8W50+c/iZQZai2Z4LPXqFiKiK4/FLJICs=; b=FBS31s1fgnJFehFVpftohOqC8/T3k5VLMTm73STjTooWd9FTe87YiML5RgMrY6u0di cQ97LwM7PaK5hg7h7enhSG8sbrGWhiZ+gLX324Fif/lLq/rw9FPaKiXHfUhYXBkTreIM zN+XtQJb1NqSWNG3ZWsIZ0N6soAKXpx1e5Lic0q9ymCeSKN4Z96AhjT0aYmDp8YtYC4t hUqZ49dLeJh/SAc0Xzy1xbQhCvW8ok+eq5ou4+ogB2FtewnYuFV7keCR7OFuNo6M4Ban dlVFUgjyydQUO0QGJRjfh4yhaxjAa/kAToXkLomPm9MnZ6YzNDbtFkETUhC++SMnJ/Ei 9ztg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788917675; x=1789522475; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=263Ot5CK8k8W50+c/iZQZai2Z4LPXqFiKiK4/FLJICs=; b=StetHbm3+ZQ9pqem0jBflbMCA8KkR4szfEAlJy1vUDaqDXgmiB2KglHWxMNpHLJIY3 mMSef6rKkk7vrmKLUsIzFKc8m5auqlOA3aU+HHh6cHEYgmp8tegiOx/5eOKXq0C7nLzw anJhMWGdLiQfaSVkjo4gTNxG4z006Vm5nQ8IEjmTlJsPMBj1W2aAdFTL2wQBASeK2aS8 px5Al/oOdy+6swYmR0solTsmNXY/SdHetrE/UQAmVYGkcQF4037RrjzTQt7wq6Nlm+2Q K6BgX4ClS58Njvg5Ido0zAmyTPOfb+9giZwv48YsDLCtxXtO/JvGZI6+J99mHIzc2Hlv 9Bdg== X-Forwarded-Encrypted: i=1; AKwUvBxvj74lfseC38wwbHXyl9uTuK7gI5R1wCJcpidKCNsz3fVStfUWvGJb1Y1azNhyrk3+FDHjBnZbsNI1+9E=@vger.kernel.org X-Gm-Message-State: AFuF++mxcnW01jC665n6yfwB/kUm0xdhLtIDTtdt5/nIP4Y311SNmvel YQe3XsLuB+WHXl9sLPDxOQs57XA3RbinIyHTQyTQuxu6fBmv+aQCk4I4 X-Gm-Gg: AYBFou14ojKQoezy0WuYF6gBfNHp4955Y/N6wyBWuFKZEbdzpdm/WEkntwoUOZKq1iw qnqnru++xPaUqcP82E8MC7Q10faHxJLVxs7fs7SwC28FPcqTzLeS/fsvN4uiv8uwKq03EF4cIUj 2yqdF3APio4axuD3eOXBs61VGpIXBp9Rtq7v8QTpnIBtG52i2WN63lLQAsUQ1HEm0X2UQmxus5P Yy9/lLdWyZ3ErMXdVDhk0t76cwrZXqoLAIkVRrZyP+GkyEccF/KCmtI6OmTAF48FH42o+KhaDOY YX6eSNPExGRSgaz9Aua5bKN0ilgoPjc35OR0EE2Udum31pzMA1Q4Rxi5rWAZA0pFPyrXwS3SJby IWBUR1dW542dTf9xTqQFuWNu4ApNFjvm6aKHhqhWR8rWtBp+8lfD21q8s8VMJDrINRHcydbPigO QowfEj+ozb+N0vAG8e8SzC3P5aBK1jXdaUFYudX8rmKHM781Hgp9bRmhLKOpM1crcyWJORBIDHw lltKOMJiuHdVbGjG4z1JkDJWwXkwV4NjHS9bO8wLlDBnWHc2A2DTkVLVKiuRg== X-Received: by 2002:a17:903:3b54:b0:2ca:d91d:d3a7 with SMTP id d9443c01a7336-2db127c02a1mr331886045ad.10.1788917675355; Tue, 08 Sep 2026 18:34:35 -0700 (PDT) Received: from m-upc-A520M-HDV.flets-east.jp ([2400:2410:3f60:500:574b:e1a5:307b:15c5]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2db63c00837sm27975145ad.40.2026.09.08.18.34.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 08 Sep 2026 18:34:34 -0700 (PDT) Sender: Yuyang Huang From: Yuyang Huang To: Yuyang Huang Cc: "David S. Miller" , David Ahern , Donald Hunter , Eric Dumazet , Ido Schimmel , Jakub Kicinski , Kuniyuki Iwashima , Nicolas Dichtel , Nikolaos Gkarlis , Paolo Abeni , Sabrina Dubroca , Shuah Khan , Simon Horman , Stanislav Fomichev , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, netdev@vger.kernel.org Subject: [PATCH net-next v2 2/3] netlink: specs: rt-addr: document AF_PACKET multicast dumps Date: Wed, 9 Sep 2026 10:34:00 +0900 Message-ID: <20260909013401.14408-3-sigefriedhyy@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260909013401.14408-1-sigefriedhyy@gmail.com> References: <20260909013401.14408-1-sigefriedhyy@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Mention that ifa-family AF_PACKET dumps link-layer multicast addresses and what the permanent flag means for them. Signed-off-by: Yuyang Huang --- Documentation/netlink/specs/rt-addr.yaml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Documentation/netlink/specs/rt-addr.yaml b/Documentation/netli= nk/specs/rt-addr.yaml index 0ecbd24c890c..2a2310cb0df0 100644 --- a/Documentation/netlink/specs/rt-addr.yaml +++ b/Documentation/netlink/specs/rt-addr.yaml @@ -168,7 +168,12 @@ operations: attributes: *ifaddr-all - name: getmulticast - doc: Get / dump IPv4/IPv6 multicast addresses. + doc: | + Get / dump multicast addresses. ifa-family selects the address + family: AF_INET or AF_INET6 for the IP multicast groups joined on + a device, AF_PACKET for the link-layer multicast addresses in the + device filter. Link-layer entries added with SIOCADDMULTI are + reported with the permanent flag set. attribute-set: addr-attrs fixed-header: ifaddrmsg do: --=20 2.43.0 From nobody Fri Sep 25 20:02:38 2026 Received: from mail-pl1-f176.google.com (mail-pl1-f176.google.com [209.85.214.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 76B612D7386 for ; Wed, 9 Sep 2026 01:34:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788917684; cv=none; b=npRpYyYgZDkuzB5Wf/5TEYBBmnDw9V+z1GfICqb4bvNLP47Y4cAVEsM0fw51V9V5v8E9CA+vm4AN+faLFa+J7A9FMzG70Slkc5nJLVG5A6jIoaZduYXg4/btcBkJZAhXv01+uKsCsZi7iX5oxURIKa0T4YCKCRD11oGc4Yn4ccQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788917684; c=relaxed/simple; bh=+edinUEnt6ZoO1TKdvOI2/Cb6vTbZMYFw3UEyvP+Dak=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=uTug2upPvumuqqQ6wmU69/KfZlJq00t8AYmC7Tlokmn03JrGMBH9uIPt+wybY4ra/P3LyclCyb4BrEpeHkX85FGeKIksXcqsMDNU/eH2rVGlTCjuA3eMGFOQot27AwyI7brFgyeJVFWxm7BZ7Ztl8BCkvVmRm4hiPZXPACguVIg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Nb9Wvo4R; arc=none smtp.client-ip=209.85.214.176 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Nb9Wvo4R" Received: by mail-pl1-f176.google.com with SMTP id d9443c01a7336-2dcff8f44f2so1451615ad.1 for ; Tue, 08 Sep 2026 18:34:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788917681; x=1789522481; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to:content-type; bh=iLIDmezDXdQ70zfy5nszD8xSCALT8WngLTXlbOTB1pA=; b=Nb9Wvo4RM3X1rz74Y0hs2x8Yb72dQNJb8oZM/z37J1D4V96yAan2d8ahfiym26FDFb upclh9JsL0tIlgLSeq0o/RUZCgis9Er43VEEUJadjMBzCTfN6Bk1GhkQChz0zlla/Cjq 0E+DDEwQGsbaKSwqLPzYv0fiyvM7+m7x3ZCBOQnKOLp7dF1bR/oD85VC1D9ozqiwoixP s62d3+Py9rxkVXAbc9tT5ToyeeZrx7/LGekWXoo6FwfjH109YNDhp1q4g5AwgDy7j9Of ztp12eraqGF159wQCwGi06U7PTBn9sDiS8BshqnBjEwoLfUvLel0VD1cpesp0gwo2tFE j5uw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788917681; x=1789522481; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=iLIDmezDXdQ70zfy5nszD8xSCALT8WngLTXlbOTB1pA=; b=GnqGjrC2Cf6ZqrerTc/diIZt1z/S1DT1VlhontGbpV+a7gGh52q7QP3FGWZA0eIHRL qtaoBI3/nnGkiKu7hT+86/i6Hnh5mUtUTm6uupgK2uxuJxxWxeYYbrPCquTEYmyJyM7J 2mzORP1i8xJwV0AD8J4N1SVxmozDvEYuy/vQPpVUh+pcq1MV6RQFVXQAXIFFeskpbpnX 7hSwPiBKyRwzoKTD6cPTpW5XCzQYqSirii8b/JTYSG3xQs//hcQ60qLxHPjDXJuHRZnW GpyyNHZ+RL+QlY7aIKF15KiKkX3un3imnHH8/hB8iwvICZjXGcTNeAU39kgXGxKFtJYB u2Lw== X-Forwarded-Encrypted: i=1; AKwUvBylKb+zXm88MWpyELcIo7f86AZDB3a1NzxcQrZnMByvQC0Dd7Db7y3664mHpKmM9vNkvDRhkZ4tMtEjKo0=@vger.kernel.org X-Gm-Message-State: AFuF++kjGkkHD1DSpPzcubVDDVn40QOuSe92ds7edcPgGlqEfviw7AfG MxVdVGHqJZLfS7gKzh7jTc4K5EXGvUvx1fsUZqzAvA5xISZidFnHKCjaBG9gFjBt0+g= X-Gm-Gg: AYBFou2g58X0PBl5EGI4KdjS6czd1AvM2YZof5m99PhvpeDc+bRstqFIOsuKuKYI9GS sAElWrl2vexAnukw65UupuhMRsU+XmKKSug6ejVlfD/R8J8w6UTh7BVPqAPSCOblF+tRgdiGIp7 o+zRSnI8OHxY4HtdgBVSeiyajtxr0K+1sY0tRSyhNncuQl8ryQ00Bgq2j64P4hYdBO8E9Z8hiG3 yQCi/hC9lFB5WhshasvBVsGUHtHnFGvVVk6jBIJJYTw6ruG8z2MlwV0QhCiCYuCwbGHys1inNm2 ZwdjfcJrnVOGTa752TNTOWITrMMjhEiLOTIxRKxiNJUQvpM8C2psF89GyqjaRNIeG4cvZkx1hn3 0kV+IlbTDCpsvD2ym4xxexsPgNZeJ7gr2VNxSmLjBlQAuDOOpJk/6gXNvg11Q9ZZ0WFOEuYPp7D DPh3lo792a2jRdK3XXkVaUHp7+AVT7FO5zb5nI9iS4sUNKCKrBNHutSBJraEFd4SpV5s0S8H2yZ JTFKUgmsVnDpywZrYup3vBUYJfkjVINzUbhWCjU+1QTUeJ/cASboyiyq+WlSg== X-Received: by 2002:a17:903:19cc:b0:2d7:1cee:3682 with SMTP id d9443c01a7336-2db125cd39dmr547568255ad.5.1788917680847; Tue, 08 Sep 2026 18:34:40 -0700 (PDT) Received: from m-upc-A520M-HDV.flets-east.jp ([2400:2410:3f60:500:574b:e1a5:307b:15c5]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2db63c00837sm27975145ad.40.2026.09.08.18.34.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 08 Sep 2026 18:34:40 -0700 (PDT) Sender: Yuyang Huang From: Yuyang Huang To: Yuyang Huang Cc: "David S. Miller" , David Ahern , Donald Hunter , Eric Dumazet , Ido Schimmel , Jakub Kicinski , Kuniyuki Iwashima , Nicolas Dichtel , Nikolaos Gkarlis , Paolo Abeni , Sabrina Dubroca , Shuah Khan , Simon Horman , Stanislav Fomichev , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, netdev@vger.kernel.org Subject: [PATCH net-next v2 3/3] selftests: net: test AF_PACKET multicast dumps Date: Wed, 9 Sep 2026 10:34:01 +0900 Message-ID: <20260909013401.14408-4-sigefriedhyy@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260909013401.14408-1-sigefriedhyy@gmail.com> References: <20260909013401.14408-1-sigefriedhyy@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Dump the link-layer multicast addresses of a dummy device and verify that ifa_index restricts the dump to that device, that the all-hosts address joined on link up is listed without IFA_F_PERMANENT and that an address added with SIOCADDMULTI is listed with IFA_F_PERMANENT and IFA_MC_USERS. Skip when the kernel does not support AF_PACKET dumps. Signed-off-by: Yuyang Huang --- tools/testing/selftests/net/rtnetlink.py | 57 ++++++++++++++++++++++-- 1 file changed, 54 insertions(+), 3 deletions(-) diff --git a/tools/testing/selftests/net/rtnetlink.py b/tools/testing/selft= ests/net/rtnetlink.py index 5cc3ebdcf08d..cea636f10aeb 100755 --- a/tools/testing/selftests/net/rtnetlink.py +++ b/tools/testing/selftests/net/rtnetlink.py @@ -1,17 +1,21 @@ #!/usr/bin/env python3 # SPDX-License-Identifier: GPL-2.0 =20 +import errno import socket import struct import time from lib.py import bkg, ip, ksft_exit, ksft_run, ksft_eq, ksft_ge, ksft_tr= ue, KsftSkipEx -from lib.py import ksft_not_in, ksft_not_none -from lib.py import CmdExitFailure, NetNS, NetNSEnter, RtnlAddrFamily, Rtnl= RouteFamily +from lib.py import ksft_in, ksft_not_in, ksft_not_none +from lib.py import CmdExitFailure, NetNS, NetNSEnter, NlError, RtnlAddrFam= ily, RtnlRouteFamily from lib.py import defer =20 IPV4_ALL_HOSTS_MULTICAST =3D b'\xe0\x00\x00\x01' IPV4_TEST_MULTICAST =3D b'\xef\x01\x01\x01' IPV6_TEST_MULTICAST =3D bytes.fromhex('ff020000000000000000000000000123') +ETH_ALL_HOSTS_MULTICAST =3D bytes.fromhex('01005e000001') +ETH_TEST_MULTICAST_STR =3D '01:00:5e:01:01:01' +ETH_TEST_MULTICAST =3D bytes.fromhex(ETH_TEST_MULTICAST_STR.replace(':', '= ')) =20 =20 def _users_for(rtnl: RtnlAddrFamily, family: int, grp: bytes, ifindex: int= ): @@ -105,6 +109,52 @@ def dump_mcaddr6_check() -> None: s2.close() =20 =20 +def dump_mcaddr_l2_check() -> None: + """ + Verify link-layer multicast addresses in an AF_PACKET RTM_GETMULTICAST + dump: the ifa-index filter, mc-users and the permanent flag. + """ + + with NetNS() as ns, NetNSEnter(str(ns)): + for ifname in ("dummy1", "dummy2"): + ip(f"link add name {ifname} type dummy") + ip(f"link set {ifname} up") + dev_idx =3D socket.if_nametoindex("dummy1") + ip(f"maddr add {ETH_TEST_MULTICAST_STR} dev dummy1") + + rtnl =3D RtnlAddrFamily() + try: + addresses =3D rtnl.getmulticast( + {"ifa-family": socket.AF_PACKET, "ifa-index": dev_idx}, + dump=3DTrue) + except NlError as e: + if e.error =3D=3D errno.EOPNOTSUPP: + raise KsftSkipEx( + "kernel does not support AF_PACKET multicast dump") + raise + + # dummy2 has entries as well, only dummy1 may be listed + ksft_eq({addr['ifa-index'] for addr in addresses}, {dev_idx}, + "AF_PACKET multicast dump ignored ifa-index filter") + + entries =3D {addr['multicast']: addr for addr in addresses} + + # Bringing an Ethernet device up joins 224.0.0.1, which maps + # to 01:00:5e:00:00:01 in the device multicast list. + ksft_in(ETH_ALL_HOSTS_MULTICAST, entries, + "dummy1 does not have the all-hosts link-layer address") + ksft_not_in('permanent', + entries[ETH_ALL_HOSTS_MULTICAST]['ifa-flags'], + "protocol entry is permanent") + + ksft_in(ETH_TEST_MULTICAST, entries, + "dummy1 does not have the SIOCADDMULTI address") + ksft_eq(entries[ETH_TEST_MULTICAST]['mc-users'], 1, + "unexpected mc-users for the SIOCADDMULTI address") + ksft_in('permanent', entries[ETH_TEST_MULTICAST]['ifa-flags'], + "SIOCADDMULTI entry is not permanent") + + def ipv4_devconf_notify() -> None: """ Configure an interface and set ipv4-devconf values through netlink @@ -315,7 +365,8 @@ def ipv6_route_del_reason_absent() -> None: =20 =20 def main() -> None: - ksft_run([dump_mcaddr_check, dump_mcaddr6_check, ipv4_devconf_notify, + ksft_run([dump_mcaddr_check, dump_mcaddr6_check, dump_mcaddr_l2_check, + ipv4_devconf_notify, ipv6_route_del_reason_expired, ipv6_route_del_reason_ra_withdrawn, ipv6_route_del_reason_absent]) --=20 2.43.0