From nobody Fri Sep 25 18:21:16 2026 Received: from mail-pl1-f177.google.com (mail-pl1-f177.google.com [209.85.214.177]) (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 692C457D217 for ; Wed, 9 Sep 2026 13:33:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788960785; cv=none; b=Ks68KvvRLe1BdVT8XTmtTOS58YDcYo/kotwJq9Vj1iOsx1y9OrcfR5rxuVE5nPz3YB5gDHvEdp3VQHaWPoU9StVjAr5NIpVxZnvOc+qvfkrGY3AXTJTzNxRSWw2LviEMv5kny81NH9dPobKifnZrWv6pFOMbdEU7PHfBsAL3QgI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788960785; c=relaxed/simple; bh=n7BwLR8vVeSP7BQUeGCqwE2IwAkiiSZQRz5EdOjjFL0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=poQ1VX1mc6YdWBguBlFWVN3wMynCpm9xV/V6wyuHEa2dAhz2Q0PDNYc/mUjVypf9PBdkWWwiTaAqXKih68nORAK8nqlyv+gJ5mGcE7csUVD4riSfNjmGJD9PnVyMnXGSraMWPtLif6U2fjP6hPMpY+qb9eHlaURq/eUn7XH+P0M= 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=es6FwusF; arc=none smtp.client-ip=209.85.214.177 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="es6FwusF" Received: by mail-pl1-f177.google.com with SMTP id d9443c01a7336-2dd020a2e44so5390175ad.1 for ; Wed, 09 Sep 2026 06:33:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788960781; x=1789565581; 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=haXVv7k48B6R2bnuYsrQ/CNSi4SRFJHWdVJePl8DmGI=; b=es6FwusF9tmU5iELSd08gM0kQDcQgOMOHtRn/wCJRS72Cvcg9tLZ4K3NDL/lPjTixN POojZMO4Ag7DXjGjDqlCjZp/tr7cVQPS6or//heqsJeJ49fgfqliDddcslZUhlGSXMll JO+fmwSluBrJfr816DgsXlTFuQVoOXX1CJYNpWGXLHOjpZylMnUcJE51zadh+KZ3QAVB SMeknSuZraPOyuIx357feZOovhuXw3DyM7jWQtQs7GkybMfTUr16aFTI0o9NAHgkAPXK P06ZGeushX9xpZeg0q1/fzxRK/PGtTtonuojeimz24AYcBcPpOCiwsR4cduK8/n8B80i M1VA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788960781; x=1789565581; 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=haXVv7k48B6R2bnuYsrQ/CNSi4SRFJHWdVJePl8DmGI=; b=r+VNkp132NyiNoMVgSGCz1c+XKOaDqrMSrsFwG4x0912a7vUU+A/cw3s4zQT9lUN82 NPqrpCNEhLudaBLU1/3Tz9ey91QFLgl5zJcbzslpuuQQUJ82QvI4a1CDZ5SY5bx+u+Ob pb+izH0ZX/fi8to6Ko/xMSVephD+WF+OLA2ZzpMiOhFkZiGCJShVsRTP2y3WYR7sZADf kyfyGkG1ux/u7I1QEjkMHUS0HiotHT6MT2XYSNpsmwACYokjRzArPz4ehBWhHswAanqE KGSqMoEMqqsd4NmnnSLFUNQEZukH/ZB/KYwJl2Lz3eMX2wSp7ei/JQkVBAwrjhOYnDyJ KRSg== X-Forwarded-Encrypted: i=1; AKwUvBxaUonnqBVRqRhona6Gxptw4PXhxNf0oCmzBiVbFWpwz528FdbfVqV3H9EmvRfMbf0nuAmk+VOm5GvvbHQ=@vger.kernel.org X-Gm-Message-State: AFuF++mUZy3ovFrscYONHodn8NmV96Fg+69Gf+4XzdCMvD0+ZUS2gQ+A fTWSsJQIosD3raTMzfYP1KEE2FXnQvWhAqJr7DnOvfYcaNHQFdJ4peiT X-Gm-Gg: AYBFou2xCu/LO6izscNCkV7b1sRWU5kI0BioyiYErGNKBWv8M8foW3vluXcUSz/mBl4 +CZsm2J7kjI/2o6Le0Q8eBUdffcCYqi2QixH0tP6z0/QlPlqqZs55IN9UaZmHLY46RCxeU2viLP +WrXmuKkiwv0OKjqFm4bpNlqOfVKFPBiGbGnSCzRwafwZLDwIdBrR4/jLwhfQU0y4aUtvJ9ji4L OGXxqvF/d7X2K7dSJiGYRgjzOCowuSlkHTwNvAqYi8WeVypmQDTcvTrZYkz54bIckGuffnndB2E 2bqPAGODMQYg32ZAtLbBJDJNs57muWTWg11Sqmu9Yf4zY+PIABI+xQ4EqFDs9xigljK14Ql7lfn Jomm0kLk12Pe88c8dM+prmO5TGV5a2MNmOAYH9CwFDh1O5P8NL9tdUOjKsD0rvMY1JIGLHrHyKt jgVMebwt4+OhGxXzhbMGkIXP5KaV0p00x/on5k5rXs0zySRbyMLtLmoXHrJzUj8ntrLS+cKiw7V U0SntJ2FAdHCWXT6ofWfOFz0f18j3YTjRDrbhaT+fxASL65yZbJ0OCiseOIoQA= X-Received: by 2002:a17:903:1acf:b0:2d8:da29:da41 with SMTP id d9443c01a7336-2db127509bemr560812515ad.15.1788960781157; Wed, 09 Sep 2026 06:33:01 -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-2db14ae8af3sm72564185ad.80.2026.09.09.06.32.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 09 Sep 2026 06:33:00 -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 v3 1/4] netlink: specs: rt-addr: fix the type of target-netnsid Date: Wed, 9 Sep 2026 22:32:44 +0900 Message-ID: <20260909133247.113923-2-sigefriedhyy@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260909133247.113923-1-sigefriedhyy@gmail.com> References: <20260909133247.113923-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" The kernel parses IFA_TARGET_NETNSID as NLA_S32 and rt-link.yaml declares its target-netnsid as s32, but rt-addr.yaml has it as binary. Fixes: dfb0f7d9d979 ("doc/netlink: Add spec for rt addr messages") Signed-off-by: Yuyang Huang --- Documentation/netlink/specs/rt-addr.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/netlink/specs/rt-addr.yaml b/Documentation/netli= nk/specs/rt-addr.yaml index 0ecbd24c890c..17ead2203451 100644 --- a/Documentation/netlink/specs/rt-addr.yaml +++ b/Documentation/netlink/specs/rt-addr.yaml @@ -119,7 +119,7 @@ attribute-sets: type: u32 - name: target-netnsid - type: binary + type: s32 - name: proto type: u8 --=20 2.43.0 From nobody Fri Sep 25 18:21:16 2026 Received: from mail-pl1-f180.google.com (mail-pl1-f180.google.com [209.85.214.180]) (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 A3BDB3DD87F for ; Wed, 9 Sep 2026 13:33:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788960789; cv=none; b=riWpLO+ZSjirI43bJR+ZTJLRYbEyhimyv9YgEidVDiuC3TbJGdVe8jWIjXMuf/0IPIWA1F0V1appfEBREvUn/XCCDIvovEktdfSIwndfRUXftnX6t5+GggRXwHGSZTTcNLB9QNDOekCQk/JOPokCBh6HL+XpKsnwJ4X3BDMOeEY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788960789; c=relaxed/simple; bh=d0JN3CPY+wwbclt55K3zNyF0YPxBkBKtEyaiVDMzDT0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=W5ab6cFixEypWzOlo3BCkIEhzJZu4rFFGELAsU3VutqAqMeuRy86tK+QDMBAn2Z+poMPD7UnLqHbkEtxY7Ud/5qpgJmSQNWR2DYMb9k+qOchA2Z+LGcLKnn2atEdEEU3LO3gDv1pX0Qha6YbuBpHa7YjFR9qkfa5Lf+u2zhyPzE= 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=kIdhTG2n; arc=none smtp.client-ip=209.85.214.180 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="kIdhTG2n" Received: by mail-pl1-f180.google.com with SMTP id d9443c01a7336-2caced6038eso53699065ad.0 for ; Wed, 09 Sep 2026 06:33:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788960786; x=1789565586; 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=DKI8rDmA6EtYV/uNKWMFCp8uKMhJUcgA3sH9u1D+As4=; b=kIdhTG2nbM4ZVlxVEmvTjyuomuxTq5OO2Q0mT0Eiw8/kx6gnmezGRL9aKTPV0KWTW4 O6HPcl37RucjOAm0ffmVoutSfroeXHJmEg+dJTgBVsTSQHpQUfNW3dcnQjTS6kzgRP1X LxdkIbmWVVsCfxzvekvvQYDoZfEP/065KRCU4QBESYapR0VTBkH9tzvqKEkUduEtr9qe mxO2D0oWp6NAFhgLB/8tF09Ie+Q+klkJykxIHNKARSKllI7QCIqZPvJ2fkrK91R1dNYN tcPPPg41eeWOR3eZ/l+ihuukXgLn2iN5i+X0+bVfKpAsp7fPyGuu6b7GGYDAMo+E10sd etuQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788960786; x=1789565586; 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=DKI8rDmA6EtYV/uNKWMFCp8uKMhJUcgA3sH9u1D+As4=; b=d8LgjuF7y4hwyMz4xqjr9ciyx9UGqEkUOdkuh6wyynxsMMvZ1tjsVLLDtSpXajwPKr OvnF7JRaP0D55XHYor+9w7r+segkHxxY2tCo6asBFtnU7FGa0w/Iww0z9CEKwBlUlB4m Eudkuef2qhjyx0YzInF5GIz9gGHH+Ju56t5kXJXD5NzlJeqw8zuDmk0OlrsTSdlIqIm4 LjBJkIDZB8tstsRsGKqYn36bfK6zxhDm8KJHHBi597Ndh2MgS6ScnYhJvBiWrBrsClN2 PcZ5KD1kh2iHfXIUhjWjk+noDyaxewhRWybrng1MwJMY+RiPwRFAZvY5UahQTXQ3GToE EmZQ== X-Forwarded-Encrypted: i=1; AKwUvBwldu/VPJuvz/4cNkJ9DtzOOYtHCVLL7e6F1yNj09SqfxL1/l28DnVbtROHPeY8rRinn1Pd4rbyMSfz9dc=@vger.kernel.org X-Gm-Message-State: AFuF++lyoAa21Mm7rGxG3xhU3qyP2aHhsgewphnsD4H1+YASRdW3ALKO OodtQjLgn63SeHoYAEdkxAF4ErPngHNeuZX4nt6t6LCtEy0LrGdg7v7b X-Gm-Gg: AYBFou2VhPDwmGr/hqlbW1ac5OoWUNlmEE/mOiTLv7jyBZDfcGowPBMDetpkaaB9Gix QbVDQUT9zNpxOu3nT+9Bf4W1pJuE3gKIjejDHk6bYi1jxm/I+xYKrJzXSYnnpeUPw0iirx9oXdg fnH8D1Ub3mmnfbUkSNuhLetn6I6qkvb4OwQK7azXJU1Gu7cIjeA0rnMttnFuJydRJnPjE7d/PAU jcfq9Y/q1mDYslwfZDxazr8ca9MdsJC0M1S09ZD0mjoz5OfGocyYVMqE2qwg3qadmnPXkNZhc4s rbVirSiEqDhVw5YlQBiMEzNRvDBfYxxLhVzLNiXHyLyosTh1ymMcGm8mRXU1j8w3wIJiYj8jr0X LRaldmdvl8bsfN3Bf5GjZUrGLo7dC1f5YWG1eSrsn4SERk3Xk395hpc1ZEFyeRC9eBtcf3llpa+ yrG/wKBKc2VEYYS9DNxVtHhE9idIYse0Ziq1YhyQN303RVrqSQVE/CwbCUIY+65F0vo8frwWLHt V/aY4QaDNieRhDKprcMr4+wwypXJlj3p7E0Y8cMf//IGd+W2o0PaV0xELDUbg== X-Received: by 2002:a17:903:19e4:b0:2d7:1cbd:9ceb with SMTP id d9443c01a7336-2dafb0af1f3mr365604135ad.12.1788960785785; Wed, 09 Sep 2026 06:33:05 -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-2db14ae8af3sm72564185ad.80.2026.09.09.06.33.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 09 Sep 2026 06:33:05 -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 v3 2/4] rtnetlink: add AF_PACKET multicast dumps Date: Wed, 9 Sep 2026 22:32:45 +0900 Message-ID: <20260909133247.113923-3-sigefriedhyy@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260909133247.113923-1-sigefriedhyy@gmail.com> References: <20260909133247.113923-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_GLOBAL in IFA_FLAGS reports netdev_hw_addr::global_use, set by dev_mc_add_global() (SIOCADDMULTI) and dev_mc_add_excl() ("bridge fdb add ... self"), i.e. entries added explicitly rather than by a protocol join. This is the static column of /proc/net/dev_mcast - 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 global_use bit. Extending it would change "bridge fdb show" output and add NDA_* attributes. There are no legacy users of AF_PACKET requests, so they are always validated: prefixlen, flags and scope must be zero and a non-zero ifa_index restricts the dump to that device. IFA_TARGET_NETNSID selects another netns like the IPv4 and IPv6 dumps and is the only attribute accepted. The dump runs under RCU and netif_addr_lock_bh() and does not need RTNL. Signed-off-by: Yuyang Huang --- include/uapi/linux/if_addr.h | 1 + net/core/rtnetlink.c | 165 +++++++++++++++++++++++++++++++++++ 2 files changed, 166 insertions(+) diff --git a/include/uapi/linux/if_addr.h b/include/uapi/linux/if_addr.h index 7fb630b7fe31..0a1ad9ebb47b 100644 --- a/include/uapi/linux/if_addr.h +++ b/include/uapi/linux/if_addr.h @@ -57,6 +57,7 @@ enum { #define IFA_F_NOPREFIXROUTE 0x200 #define IFA_F_MCAUTOJOIN 0x400 #define IFA_F_STABLE_PRIVACY 0x800 +#define IFA_F_GLOBAL 0x1000 =20 struct ifa_cacheinfo { __u32 ifa_prefered; diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 81c5a6104dea..f54e9cb3bf30 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c @@ -4566,6 +4566,169 @@ 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, int netnsid) +{ + u32 ifa_flags =3D ha->global_use ? IFA_F_GLOBAL : 0; + 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 holds 8 bits, the full value is in IFA_FLAGS */ + ifm->ifa_flags =3D (__u8)ifa_flags; + ifm->ifa_scope =3D RT_SCOPE_LINK; + ifm->ifa_index =3D dev->ifindex; + + if ((netnsid >=3D 0 && + nla_put_s32(skb, IFA_TARGET_NETNSID, netnsid)) || + nla_put(skb, IFA_MULTICAST, dev->addr_len, ha->addr) || + nla_put_u32(skb, IFA_MC_USERS, ha->refcount) || + nla_put_u32(skb, IFA_FLAGS, ifa_flags)) { + 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, int netnsid) +{ + 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, netnsid); + if (err < 0) + break; + addr_idx++; + } + netif_addr_unlock_bh(dev); + + *s_addr_idx =3D err < 0 ? addr_idx : 0; + + return err; +} + +struct rtnl_mcaddr_dump_filter { + struct net *tgt_net; + int netnsid; + int ifindex; +}; + +static const struct nla_policy rtnl_mcaddr_dump_policy[IFA_MAX + 1] =3D { + [IFA_TARGET_NETNSID] =3D { .type =3D NLA_S32 }, +}; + +static int rtnl_valid_dump_mcaddr_req(const struct nlmsghdr *nlh, + struct sock *sk, + struct rtnl_mcaddr_dump_filter *filter, + struct netlink_ext_ack *extack) +{ + struct nlattr *tb[IFA_MAX + 1]; + struct ifaddrmsg *ifm; + int err; + + 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; + } + + err =3D nlmsg_parse(nlh, sizeof(*ifm), tb, IFA_MAX, + rtnl_mcaddr_dump_policy, extack); + if (err < 0) + return err; + + if (tb[IFA_TARGET_NETNSID]) { + struct net *net; + + filter->netnsid =3D nla_get_s32(tb[IFA_TARGET_NETNSID]); + net =3D rtnl_get_net_ns_capable(sk, filter->netnsid); + if (IS_ERR(net)) { + NL_SET_ERR_MSG(extack, + "Invalid target network namespace id"); + return PTR_ERR(net); + } + filter->tgt_net =3D net; + } + + filter->ifindex =3D ifm->ifa_index; + + return 0; +} + +static int rtnl_dump_mcaddr(struct sk_buff *skb, struct netlink_callback *= cb) +{ + struct rtnl_mcaddr_dump_filter filter =3D { + .tgt_net =3D sock_net(skb->sk), + .netnsid =3D -1, + }; + unsigned int flags =3D NLM_F_MULTI; + struct { + unsigned long ifindex; + int addr_idx; + } *ctx =3D (void *)cb->ctx; + struct net_device *dev; + int err; + + err =3D rtnl_valid_dump_mcaddr_req(cb->nlh, skb->sk, &filter, + cb->extack); + if (err < 0) + return err; + + rcu_read_lock(); + + if (filter.ifindex) { + cb->answer_flags |=3D NLM_F_DUMP_FILTERED; + flags |=3D NLM_F_DUMP_FILTERED; + dev =3D dev_get_by_index_rcu(filter.tgt_net, filter.ifindex); + if (!dev) { + err =3D -ENODEV; + goto out; + } + err =3D rtnl_dump_mcaddr_dev(dev, skb, cb, &ctx->addr_idx, flags, + filter.netnsid); + goto out; + } + + for_each_netdev_dump(filter.tgt_net, dev, ctx->ifindex) { + err =3D rtnl_dump_mcaddr_dev(dev, skb, cb, &ctx->addr_idx, flags, + filter.netnsid); + if (err < 0) + break; + } +out: + rcu_read_unlock(); + if (filter.netnsid >=3D 0) + put_net(filter.tgt_net); + 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 +7414,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 18:21:16 2026 Received: from mail-pj2-f12.google.com (mail-pj2-f12.google.com [74.125.227.140]) (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 496B057EDBD for ; Wed, 9 Sep 2026 13:33:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.227.140 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788960792; cv=none; b=JLgoNXLD8dKNEbHpy0OkaXj4dW68tjNggZCzuG08Nq2QwzgCUYVsZROPXDhVfccCAkTp8exO6zf6wV1U/N2W2lNAElI2Uh1zY5uPMDNy05KpYCq64SAGy74uVGfKhrcoe3EZM0TjoszCcaJqsjEEYwfNhLUNlbnDJI6RFcs93wQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788960792; c=relaxed/simple; bh=qsiqMuArg+phRO/CZK4fjvwQbx/TLhJpLu6XR38eEAA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=kPV0kpHrbTGJccVn4H22G7MuBGwvpLM+0N3/gx5nudHnriYOPZCRZPLh20uf88oy1B3mCSuNv6LdlJYIxf6JuQ+sJmXJ9oGYC6LWXVXviekG6n7QrHsfv2wBzuQaoNszAiGnGPbOajIR79KX4Q44xaOanJypXoi41ZmkQbD+axg= 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=PY04WZOG; arc=none smtp.client-ip=74.125.227.140 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="PY04WZOG" Received: by mail-pj2-f12.google.com with SMTP id d9443c01a7336-2d8fb334ddcso2213245ad.0 for ; Wed, 09 Sep 2026 06:33:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788960790; x=1789565590; 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=t98tjzsG8/T0rL7P+QBPi2WVtiRsIvKfY/FD1komk1Y=; b=PY04WZOGxfszPss/uQln5LFYecmkAmAk9RUjQr5IOR5Jnfj/tYlA6y7/DJLNdT34CP 20GUQgNV/w5+8u1E6hHnLQXfiZiHWrjfjWp5snSW9CbZxsC8Wn5ixHswAf4Mm5iQwN9J 8nsfHxjALJcno7EnvlfaGaIYKuPP5o1DXhM80SSenA349ejZm+8hwmDXWXp0sOgxi/2k T/LIOZc9Pngp0v5aVBQmJJyM/dMG9sGTGrBTTzyvsilbLj5mI3SlROfaxR4VkkaQ49SC 8j2Qx5V4bsEgtfR+Xy1ma/D4W6aJymcfLiVgIVUzVfk8tOFpdt4u7tlK8VuNN9AfwLf4 wGYw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788960790; x=1789565590; 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=t98tjzsG8/T0rL7P+QBPi2WVtiRsIvKfY/FD1komk1Y=; b=FYb8dE6GSM75gDQ7Q7Ffk6V9iKS909Qg2wt4+/d3QZtmcYDHdJLK0WVcWTDdmEhdlW LDus/l9Wp6V7iPTZgmAJ7eRTY3xiGltGn3rvwg3SgOSsRCncXIOSLRQs/XXOFjkx+1qA TBdQSnYvA8bUKg1HHXPb3jrD/UvzsFwvnE3Q6y2SU3uyzHRHlvtstVA8Cnpexwkn20EN 4mCkaWNxr1PIKMaTBaIUncO0Ik+DqExLwjHBjDalACiLM1yXRF7sLHl9uqnoJJq98Vco RmD1TsunUbfwnqJ6qRrS54Pr0TpObp8A+Po/WtGZfa73ZEzUgDf4yVfjMygr+QsF2LKu nnrA== X-Forwarded-Encrypted: i=1; AKwUvBywNCBJ9JxhLCpcbCi/78UU1H7xp9x/TFp/SLPF6eqWLc99cAqUH3EJaLUacm15oP2haZwa34sHJdns6E8=@vger.kernel.org X-Gm-Message-State: AFuF++k3nbCuzGFc1u1YL1uKNPc3V7DO6BQNhEyft8MRH48EC5+TkNKk M6jg6kPBzbYzzxfws9gBdV9UvDghS1O85s1OQZiqzKwbE3qniQBgPsVk X-Gm-Gg: AYBFou1fo43XMK4UYekkq4GBLxfCw2M5OXx8ARgx0NVAlcQO81CPXlLgx6f8ZB1GcoK E+KqtmWKM1j7I4pDe+mSv3eDWC33HK6UR76HhN+wC/B2HY9NVA7UMV1rqqXf6gh96OoMQT4OIvY pv9pywobgFKRmvry0mKxAiBg8Ry9WFVMfFPHObfMt14lCVFTQzYxbQ9DHw8QfMcANlXfNw0I/kW 7Cl8A0qqU+6tzVo8nt3yJqqdgmCA8b+W379R4+Kd0OgLEakE+jA/r4oapDwI7u6zPOHbHrfZ35h ukwdMNxpiqIzHS6o9q7O7aZoUtS+OSJ0FRCumR8vgzubANifLRA2Y2Y5cTfOIF07El4+degjSyo +89v4lrbqB+0Si1YRs+CBlvIi0++X8wRBpyaV0R+crGTkps5hi6m34tvPh+iPAojYqIcAKDz9Vm g5hkey4My7WA4XM0QxpQ+2OGpIAAVbs8FK/7WPfFIRXLAuOu9xcEBM0KF6cfXhg8IUpKDIai69U b8spMeDitJbWeuKkI5tikZHogfl+cSRDPHBjtNbTPS70vYmoysOkya+FJy9DQ== X-Received: by 2002:a17:903:2f91:b0:2da:f1b1:56c4 with SMTP id d9443c01a7336-2dd077e1033mr17795275ad.3.1788960790302; Wed, 09 Sep 2026 06:33:10 -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-2db14ae8af3sm72564185ad.80.2026.09.09.06.33.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 09 Sep 2026 06:33:09 -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 v3 3/4] netlink: specs: rt-addr: document AF_PACKET multicast dumps Date: Wed, 9 Sep 2026 22:32:46 +0900 Message-ID: <20260909133247.113923-4-sigefriedhyy@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260909133247.113923-1-sigefriedhyy@gmail.com> References: <20260909133247.113923-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" Add the global flag, list the attributes the AF_PACKET dump uses and describe how ifa-family selects IPv4, IPv6 or link-layer output for RTM_GETMULTICAST. Signed-off-by: Yuyang Huang --- Documentation/netlink/specs/rt-addr.yaml | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/Documentation/netlink/specs/rt-addr.yaml b/Documentation/netli= nk/specs/rt-addr.yaml index 17ead2203451..adf82b69ade7 100644 --- a/Documentation/netlink/specs/rt-addr.yaml +++ b/Documentation/netlink/specs/rt-addr.yaml @@ -77,6 +77,8 @@ definitions: name: mcautojoin - name: stable-privacy + - + name: global =20 attribute-sets: - @@ -168,7 +170,13 @@ 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 explicitly, e.g. with + SIOCADDMULTI or "bridge fdb add ... self", rather than by a + protocol join are reported with the global flag set. attribute-set: addr-attrs fixed-header: ifaddrmsg do: @@ -181,10 +189,13 @@ operations: - multicast - mc-users - cacheinfo + - flags + - target-netnsid dump: request: value: 58 - attributes: [] + attributes: + - target-netnsid reply: value: 58 attributes: *mcaddr-attrs --=20 2.43.0 From nobody Fri Sep 25 18:21:16 2026 Received: from mail-pl1-f171.google.com (mail-pl1-f171.google.com [209.85.214.171]) (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 A85C85803B3 for ; Wed, 9 Sep 2026 13:33:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788960797; cv=none; b=oHJt6w9WuEnt01X5+p+BBQz6oQs6O7waMKejBBUn2HwKmBxO47ceXRkkSR7F+vPIcWASZD+OEvDRI5/caHaJMqoD3hxLwlSJqx4bUJmmYHKi523L5EzOPMa812uOAHghU7f4EcNJlonkm1ISKIyXV1sL+1UuvQ4pnDJ+hxrjdz8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788960797; c=relaxed/simple; bh=5TvSDwUtPA7AWJfw9DOFzRM1uviDoKe4HLGuTrjX9AU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=idtCldfWwxQFDMRlIUdSMjqNwO3c+9BUj72tgi0vRE8sjoh1YTo2SE9ARsZ5hhHBtegMKJFwblr7bmQ97IkMwCDR3gLhnjX5iebtrUZZQHsz11vW0zDZ2x1N3cjhcpiWZ6Rgc+NKSyRyN/71Oj4nrOAGhtd64+8ifJHDJFJVQik= 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=QBffSqbb; arc=none smtp.client-ip=209.85.214.171 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="QBffSqbb" Received: by mail-pl1-f171.google.com with SMTP id d9443c01a7336-2cfbbdfa60bso51320075ad.3 for ; Wed, 09 Sep 2026 06:33:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788960795; x=1789565595; 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=UmRYZ4H33HDuLnzRy6bagLZV8eJULQZIzyCsNwDedUI=; b=QBffSqbbVS7R5o/BEYoPERGQ4YYZ/D8FmAQKEOTlKRtnW5bslvvOjX0S0TOB2DcbXJ fOm/1q7WP+jdmuPHcMj8Sce196yj3LxIcRZMovRqi0hVUwVR6i5O93Wdz+yWUKHxnj12 +n3g6kItqrz6/SYTxQKFpZh406/cyR7QkgwX4L7FBy//1NiTUyiakKkV6qSOcuJLSRBX +6mN0F1eKwjgmmow63Z0uhGkwwtlcLVJhbKDY4IDMLM+ndSDxKv01Qe3ZV7TZZaQDT2e KlWU8UyyfvPfgLb+JdlaeKWXrC8YUHv5UptouY4mKbqqTDVHMm/YfSciRBVZiHesiueb xBVA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788960795; x=1789565595; 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=UmRYZ4H33HDuLnzRy6bagLZV8eJULQZIzyCsNwDedUI=; b=nZAA5Q/kUW+VKPccYNmjYkKvJAV0hs09F3aA6It0aLWIZZ0ZH+a5I2lXJrXMeTk/EZ k8c3doUtzsB+5r8wUcU56jgIJycsXOcVa1FpYZOPgow3auKKWRCWTda/87777vvARpxf XDkhMtFZMIPT79GoCMexlaIdexitBzYekKD3YlK/IsTsMIvqvK7fZm40V4B8DIyVJBM1 5vbur9g2AC78IdCRZ3SRHpKlqoDvfPdCAti2O01itCFChzGQGXWufSlqnAInCPQsSbXh tA+fiR52uhNln5/A6BdQthOiEXbRfNK3yvPe1gafg6gjlc2d+5a5I0cV138c2Ef4G+/A Dxog== X-Forwarded-Encrypted: i=1; AKwUvBxFlM2EvsqRMJBwWhk5nzJLhT4owIuFwXJSmFygKXHTNcKZphntC2V/atEUymiryi+RNikyYoKSqcpiDc4=@vger.kernel.org X-Gm-Message-State: AFuF++nSiFtANhCT2uUV9Qd9N8hjb9ZjO8rXL71EwDX5fxFvnyMqvPNF bYnMvHd2we+752mCeYcflUrck+BU/q79/MkdfT6WwqxTpD4Xg0c06cGO X-Gm-Gg: AYBFou2KgaT2JTP1ojHxGvVNts88cIGrsE16hsjZH5ItnPnN/FhmA2dxBXGCgk/TAd1 eeVZNIb/ifLNl7MPP3lw2eumZ1fdQcZhfZtPJuiGZiO91wMH8YPEOHwAlItlXSpHbxyM4BnEt8L J/+T9VR6Ho1Af3+Sgp5WrbQBKinKWWHcp4nw0MjQPeZLB22XNGWNPHTq0nYBXaD0yU39y24huH/ dfc/LCdAT8JF0inDPBbR/+kUKCdzWhTSIKZXG21yBTaalubu0ue2e6rEVCBJejZLtOX31u8cDmV q8asGuYhRWngqTyEG0l18sW9daB13qiGlyPyDUDvZDTAGVK4A7eAFjIARFhFVvleF1JbfdNLTTV vgm1os4v9ncJyp3olkDwiJXhdqbCNtLwPtmEvPIi9V4t93qbwXSnMB3cRNqDJhMaUIuqeqkNhyO JIfSuu90NUXHF6Cy3TP9kUQYy/wYLHYNR0oZP/ljowKtOe3rMej88c2+VpI18RsdvZsvW0JYEwO 0rj09a2I95llTrQ2Ck2C1TnEz9WKX60AZtMqEOymD28SDT9Ke6PwTUDCmd9t5+/Ei+f/d0S X-Received: by 2002:a17:902:fc8f:b0:2d8:d4cd:dc8f with SMTP id d9443c01a7336-2db1267d02fmr578562535ad.18.1788960794903; Wed, 09 Sep 2026 06:33:14 -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-2db14ae8af3sm72564185ad.80.2026.09.09.06.33.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 09 Sep 2026 06:33:14 -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 v3 4/4] selftests: net: test AF_PACKET multicast dumps Date: Wed, 9 Sep 2026 22:32:47 +0900 Message-ID: <20260909133247.113923-5-sigefriedhyy@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260909133247.113923-1-sigefriedhyy@gmail.com> References: <20260909133247.113923-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_GLOBAL, that an address added with SIOCADDMULTI is listed with IFA_F_GLOBAL and IFA_MC_USERS, and that IFA_TARGET_NETNSID dumps another netns. Skip when the kernel does not support AF_PACKET dumps. Signed-off-by: Yuyang Huang --- tools/testing/selftests/net/rtnetlink.py | 71 +++++++++++++++++++++++- 1 file changed, 68 insertions(+), 3 deletions(-) diff --git a/tools/testing/selftests/net/rtnetlink.py b/tools/testing/selft= ests/net/rtnetlink.py index 5cc3ebdcf08d..41da259c3a09 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,66 @@ 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, the global flag and + target-netnsid. + """ + + 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('global', entries[ETH_ALL_HOSTS_MULTICAST]['flags'], + "protocol entry is global") + + 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('global', entries[ETH_TEST_MULTICAST]['flags'], + "SIOCADDMULTI entry is not global") + + # target-netnsid dumps another netns, ifa-index is relative to it + with NetNS() as peer: + ip(f"netns set {peer} 5") + ip("link add name dummy3 type dummy", ns=3Dpeer) + ip("link set dummy3 up", ns=3Dpeer) + peer_idx =3D ip("link show dummy3", json=3DTrue, ns=3Dpeer)[0]= ['ifindex'] + + addresses =3D rtnl.getmulticast( + {"ifa-family": socket.AF_PACKET, "target-netnsid": 5}, + dump=3DTrue) + ksft_eq({(addr['ifa-index'], addr['target-netnsid']) + for addr in addresses}, {(peer_idx, 5)}, + "target-netnsid did not dump the peer netns") + + def ipv4_devconf_notify() -> None: """ Configure an interface and set ipv4-devconf values through netlink @@ -315,7 +379,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