From nobody Thu Sep 24 13:47:13 2026 Received: from mail-pz2-f12.google.com (mail-pz2-f12.google.com [74.125.228.12]) (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 1523A1A683E for ; Thu, 24 Sep 2026 01:16:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.228.12 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790212568; cv=none; b=ZiioU3UaLDmhugKbslP3nMm9XF5+KeSYmsKzLNRJ0u7jv4vk1g1kJQFoe/ac4XJAZeMUpb1nA6+3BWg0/Iz+TNbZzBsLtJdcLDY7mbBxmIczxWdEr9+W/sYusU5vo8mWoAOEzbTmVS7NekmZ9jRSdzsBJPIw9mLorS/H2SM6hSQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790212568; c=relaxed/simple; bh=J8Mf3HYZaTmZYQFkYELALEytTws8uvz/goY09yFk2pM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=qOOEDrS9PdlA9UysT0JjAGFOqYg40ZulhGuCzq59ViLDZpc2qI0/gRtR/WlQx94nXtajZPllixYHS3U7GLzB2lJa9o/zm8SgRNhAg7fCDraKR1AHeajkIR+7ud54jdpcAmMZHy3w5cEZbfqP/ffK0QxarQQVTmqzL3zmFAUiwGo= 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=cyEk4hV2; arc=none smtp.client-ip=74.125.228.12 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="cyEk4hV2" Received: by mail-pz2-f12.google.com with SMTP id 41be03b00d2f7-cc1cea4bfd1so821280a12.0 for ; Wed, 23 Sep 2026 18:16:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1790212566; x=1790817366; 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=pGK4SZ365cD9EYRGUuPJEEEIN0V6+rF/hbiJa0/JQok=; b=cyEk4hV2qa0spkaYxZIwWESxomqDUjloyvE8GAcfU41Z8AUznq1Hl+VDkFSm39LFL4 rxfs1vL5qdDWAO2QoZ4HWLWkJZSgAnFVjaGm+1BwuY9qZGT9f2A5kfA0qddxuWsAf0tj q67joE6K64mWvH8pNJt+HxNpxMuMEAN+VgYDkKSVJqhEDm3g0ohC5YFzTz1tkTU8AWlG l6vbOiwuZIcA1pvKFVxY5meBQq+60W+b7TIyFihz1pMCKqNGYTNvjmiTlsUEtzCnDUpX kN2ud4IkGIS01HC7v/5IWOfYxuLXrVxLcUVapCs/Cm9yd5KrEhtI+1G0vgsFlNIHqoEF pGww== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790212566; x=1790817366; 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=pGK4SZ365cD9EYRGUuPJEEEIN0V6+rF/hbiJa0/JQok=; b=FNjdH3a+Xahz7CmbkSTq4G6Gl+RC2hxx47HViOw4dPXp3c3MxOd5vyrfQvBwJKdbbr CYQ19QKbIECqQ+i3nQjRSwa9CSHhwlwnjgjg5zCuyiKizIKUGRFPOP9u6d4pLgJ/H5uI 2HKm3RJiGF1CVtrc+AQ83yYbpxRxPAfiLGyNphkwsfpdD5jIFawX0ARr597ZiZzpVSUh AsFn4u+v4wn52cYf313i1IQmnFrfVToQ6digsCQ5kJ9guc6fTzcpRsY1O9diXYvkg0k7 +q7L+E6Mbu5FpmBIC5R3QQ68HiG+aP8HAChsGuMgUex4LLCzxqIFTGbj8zM3xbyuh8Ms 35gg== X-Forwarded-Encrypted: i=1; AKwUvBztfsMeTKP1F6S6U96hghxbrsEO0ul7Smyrmj0s8cfF/wi+cyH4YpfFBD4wxviyUdIBKzcDweEGIomADIs=@vger.kernel.org X-Gm-Message-State: AFuF++n8pgW+rzUqdAmbjTMKQ9qCNOFpCc+iIjEz2QvFmw9oxe7eVzrh YX+3ckDxA6DQNC2WGTIjIFkEAl/HSCcBzeALb2x6NghivJamBOYkZwhr X-Gm-Gg: AYBFou0pZq1dYLTpFbVYDwOfO28m8ABcjqcsWxl+G/JVHiErQ0j8PTzX0bSE412AYYP 5NgZpcQu1bh72r58Z058pT2uLMn2JHytPDpyp59JpZoIQL3bQ2wnwQ5CgLjtA1Ifdwf07zkZI7+ IcfDVu50fdv+GEilYF3mUeEVmf8VItssZImYeSufAkgQxkqLB9Qo9mYDiOrIPHmSpEYUgQP/7fX iFikUpFKQIWuaVvAYIVNVDDdd7iCl1vZvDQD6/6Nb7Jm0FHrlKjGeWXAkhMgoKWTqqI7xa5cUsi tnqpfzavt4HzUatQpHPgrRGRkG5TtqD1fMWN6/9q5EotZJw6Mo2rNOTXfxr0qFzUBwTfUUO+Owk 8VwtXd3Yv1Elct7mN0tCTZzNRKmSSJTgHeJEQfEZ2HLBKQuAzsYYQuGFg73BB/On16mkV21y7qm BvIj1w9hJj15aqOYS0DI3795xR1864GMShX5mYloDSf7+usOaPzhu+XNLg6d9rso+wkvDMzfDSO Ke/R/dWpl9+xoeOGmovCle8ycKbL95G9pOI59ujODrf+iSgZ+BgwXobei5VBDZe3aa2fnAu1lnk 5AB/imn4DJ0= X-Received: by 2002:a05:6a20:160c:b0:3dd:a196:3098 with SMTP id adf61e73a8af0-3de0e976432mr797444637.72.1790212566305; Wed, 23 Sep 2026 18:16:06 -0700 (PDT) Received: from m-upc-A520M-HDV.lan (oki-109-236-14-10.jptransit.net. [109.236.14.10]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-cc75f3d5794sm1741392a12.14.2026.09.23.18.16.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 23 Sep 2026 18:16:05 -0700 (PDT) Sender: Yuyang Huang From: Yuyang Huang To: Yuyang Huang Cc: Aleksandr Loktionov , Andrew Lunn , "David S. Miller" , David Ahern , Donald Hunter , Eric Dumazet , Ido Schimmel , Jacob Keller , Jakub Kicinski , Kuniyuki Iwashima , Nicolas Dichtel , Nikolaos Gkarlis , Paolo Abeni , Sabrina Dubroca , Shuah Khan , Simon Horman , Stanislav Fomichev , Willem de Bruijn , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, netdev@vger.kernel.org Subject: [PATCH net-next v7 1/5] netlink: specs: rt-addr: fix the type of target-netnsid Date: Thu, 24 Sep 2026 10:15:50 +0900 Message-ID: <20260924011554.3494-2-sigefriedhyy@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260924011554.3494-1-sigefriedhyy@gmail.com> References: <20260924011554.3494-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. Signed-off-by: Yuyang Huang Reviewed-by: Nicolas Dichtel --- 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 Thu Sep 24 13:47:13 2026 Received: from mail-pz2-f30.google.com (mail-pz2-f30.google.com [74.125.228.30]) (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 4A66C30D407 for ; Thu, 24 Sep 2026 01:16:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.228.30 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790212574; cv=none; b=rcs2Dd108GaLE4iEFtBO26kFqP1JTCAzkQ9yt1Kh4vPyE3rp3ppVtNRiO2XoPRFt4boZVCJQ+ocRcP3CUP14gctRhCy7QBqXz1wcaYt5CopFwmtkS48gYEsZUB5+eNPBwDBCph3xFX8Bwld/RzGtDnC+G8RBwr4GfGPA4qtAuSw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790212574; c=relaxed/simple; bh=pUzIHe6PKdCyli8y/P+wHHn1T5uzUMBGKjqLmyj7yE4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Cq188B02XS+fZDVAGPua6tX39oYG+IT3nGUCaxiKE8mGUueJDCbS3R5OqjmyRXR1iqCc45tE7nM0w+49F+BTBPHJaQhpEOcKXuKgAyEjF2ITuQKcuyQdlb5inUzJ01ZndZzXido1N31DTNx+h30Ksj2SCxAD/9j4K9KqxUblGcc= 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=VnsetaLA; arc=none smtp.client-ip=74.125.228.30 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="VnsetaLA" Received: by mail-pz2-f30.google.com with SMTP id 41be03b00d2f7-cc1cea50dc0so519462a12.2 for ; Wed, 23 Sep 2026 18:16:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1790212570; x=1790817370; 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=wTPtQHvracLD7v1fqRm5jaARHw5wOo55iDL/UXkgA5k=; b=VnsetaLA3m+JGSJcrYHtUoNVQdU/UV0skb1KA0cVVGDHK6qjgwNf8/UB/NseZ7/BpW agYr32+4lwqJZREJVQzZdSEF++SvK7nQGWylzkmrDfsAOR/UFsFI6WvX8aO1/ZRi7idy BA3aQ7W3Vw4oPaRMEJ3Cn54qc4i92NVgKgoo9UeplERoWaUzR5byxMnSw7QQVwk5oqE6 8tfL+q4PF8FbSGaJcxIlhRifOCxZUphV+tjJTIRUr3qI3OpBhmti+cuM/L/+neKd47V+ UXU2JHRYTtbkLrcc9V1wmtL812nhQjdN4QO2bHNB4mK7UHvubDNMG1vsCDnfDUmbRXsM Ucxw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790212570; x=1790817370; 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=wTPtQHvracLD7v1fqRm5jaARHw5wOo55iDL/UXkgA5k=; b=CT9gh3u6hkeLcs+R5KTsfmda9EqBKoozUo8BPXNWdztr/ASGnzW+Cc0IGg+bwofoWx 6oVF9Vg7Cl5ly33EwRy/clFSrEEwbaeVLd+mDCK6qDJSTcZ1byHkFElhUsxbdcxjQ8Bs 4QsbJPNbZnj7t+6QLFRmC60pB2LHs+AZVWQHqtruBzgoxILnoyyQBU/QB8LpSqiQFM3G MbOZcgiwDhTCpLI+pU/mYqWIjEjIE5K7YTYcoy8m2HiabrPLIu6nOj1sBAT40m8KIA0V ceGcn0zgPWe5qsF30nsC7Akg7dLhYO/EuDzSzRAxYCOIO4rFsHNrHBlRkv10U2magsp4 2yEQ== X-Forwarded-Encrypted: i=1; AKwUvBxvFVDZ3swG5P3LToF6slBkVS8MsXgKy3MpP/HGRZshHF4cZnmg39tx8YDP4Q3PyscRpEvbo4lYADKD+Dc=@vger.kernel.org X-Gm-Message-State: AFuF++l6bzPAnF4XLxIAtpdG4vOuxmLtG1QTkJyWaupW1R7gJ+fj/mS0 niYDI6gSdS4gQK+Q90A+2Za+2gkhZT634sL3Out/NhsUV07qDQSSpfOD X-Gm-Gg: AYBFou0muNWXLySI6oTCKXXA01596W9wWBf3w8irlXVMBzjLyVp20QZljaPaT4UrkyJ g7qJVHX/hW8H/EDuxz3BK7NH+Pn9dL5YmTNi2UhIxf0okeNyt0hWwVzCRW6Cfbf8mfgIQ1zGe6H vn8UcFdkLBgiOgRrAqjsAiG40spsNBOLF5B8P8jO5JXmSo/C5NNTF9uT6bPWajAMvjciZ5ZpC/I XTNafmFnyKpb/LFM5WPu3lb0dSj86elgQb1KMT2OgkJq7+EJPDNy0+Qpj8lS0F3koR4lJYzTYZN qailtmk6aFMuWBF02xM0oq6P8t4nZYRlyzWamoqCICO6nW8YV6Ni++10a0/8Mw4GmVwmzUqyKaR vmv68tRetKInDfwe5JSbrn8op1P6iuzkEdvSDQ4Zt8Dcu0yq7PjJ2joIEJOmQcfSsNtMOqdSWhg mN84yDqjLG/GesFnbjUD6r2PwEr+BDC6mf9mtzAjxLeAVf7hKtBSpZDgehBSgCw8JMW3ndVQrud uYrlIiJkVEU5PhtaosGPfM14hCDqj+bD4dQtMaK5ZIN5qIMXa9mPJYbYIvK8g/ygegKtCyAogEU X-Received: by 2002:a05:6a21:112:b0:3dd:a008:dc43 with SMTP id adf61e73a8af0-3de0e8ec1c6mr951256637.49.1790212570453; Wed, 23 Sep 2026 18:16:10 -0700 (PDT) Received: from m-upc-A520M-HDV.lan (oki-109-236-14-10.jptransit.net. [109.236.14.10]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-cc75f3d5794sm1741392a12.14.2026.09.23.18.16.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 23 Sep 2026 18:16:09 -0700 (PDT) Sender: Yuyang Huang From: Yuyang Huang To: Yuyang Huang Cc: Aleksandr Loktionov , Andrew Lunn , "David S. Miller" , David Ahern , Donald Hunter , Eric Dumazet , Ido Schimmel , Jacob Keller , Jakub Kicinski , Kuniyuki Iwashima , Nicolas Dichtel , Nikolaos Gkarlis , Paolo Abeni , Sabrina Dubroca , Shuah Khan , Simon Horman , Stanislav Fomichev , Willem de Bruijn , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, netdev@vger.kernel.org Subject: [PATCH net-next v7 2/5] net: add a generation counter for dev->mc changes Date: Thu, 24 Sep 2026 10:15:51 +0900 Message-ID: <20260924011554.3494-3-sigefriedhyy@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260924011554.3494-1-sigefriedhyy@gmail.com> References: <20260924011554.3494-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" A multi-part RTM_GETMULTICAST dump of dev->mc resumes by position, so entries added or removed between two dump rounds can be skipped or repeated. The IPv4 and IPv6 dumps report that with NLM_F_DUMP_INTR by stamping cb->seq from a per netns generation counter combined with dev_base_seq, see inet_base_seq(). Add the equivalent for the device multicast lists: a per netns counter bumped whenever an entry is added to or removed from any dev->mc. The list helpers do not know which device a list belongs to, so give netdev_hw_addr_list an owner set for dev->mc only and bump the counter of dev_net(owner) where entries are created and freed. That covers the dev_mc_* helpers, both lists of a sync, the hardware sync helpers drivers call from their rx mode callbacks or their own workers and the reconciliation after an asynchronous rx mode update, while snapshot and other lists have no owner and are not tracked. It is atomic since the writers only hold the address lock of their own device. Used by the following patch for the AF_PACKET multicast dump. Signed-off-by: Yuyang Huang --- include/linux/netdevice.h | 3 +++ include/net/net_namespace.h | 1 + net/core/dev_addr_lists.c | 21 +++++++++++++++++++++ 3 files changed, 25 insertions(+) diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 5d16737167ee..be3804cdbb2d 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -256,6 +256,9 @@ struct netdev_hw_addr_list { =20 /* Auxiliary tree for faster lookup on addition and deletion */ struct rb_root tree; + + /* Set for dev->mc, the owning device of a tracked list */ + struct net_device *owner; }; =20 #define netdev_hw_addr_list_count(l) ((l)->count) diff --git a/include/net/net_namespace.h b/include/net/net_namespace.h index 46b4c67e2966..d8c681ab5c74 100644 --- a/include/net/net_namespace.h +++ b/include/net/net_namespace.h @@ -71,6 +71,7 @@ struct net { spinlock_t rules_mod_lock; =20 unsigned int dev_base_seq; /* protected by rtnl_mutex */ + atomic_t dev_mc_genid; /* bumped on dev->mc changes */ u32 ifindex; =20 spinlock_t nsid_lock; diff --git a/net/core/dev_addr_lists.c b/net/core/dev_addr_lists.c index 08528ca0a8b3..18acd874fdbd 100644 --- a/net/core/dev_addr_lists.c +++ b/net/core/dev_addr_lists.c @@ -16,6 +16,19 @@ =20 #include "dev.h" =20 +/** + * __hw_addr_changed - account a change of a tracked address list + * @list: the address list an entry was added to or removed from + * + * Bumps the netns generation counter RTM_GETMULTICAST dumps use to detect + * changes of dev->mc between dump rounds. Untracked lists have no owner. + */ +static void __hw_addr_changed(struct netdev_hw_addr_list *list) +{ + if (list->owner) + atomic_inc(&dev_net(list->owner)->dev_mc_genid); +} + /* * General list handling functions */ @@ -126,6 +139,7 @@ static int __hw_addr_add_ex(struct netdev_hw_addr_list = *list, =20 list_add_tail_rcu(&ha->list, &list->list); list->count++; + __hw_addr_changed(list); =20 return 0; } @@ -162,6 +176,7 @@ static int __hw_addr_del_entry(struct netdev_hw_addr_li= st *list, list_del_rcu(&ha->list); kfree_rcu(ha, rcu_head); list->count--; + __hw_addr_changed(list); return 0; } =20 @@ -487,6 +502,8 @@ void __hw_addr_flush(struct netdev_hw_addr_list *list) { struct netdev_hw_addr *ha, *tmp; =20 + if (list->count) + __hw_addr_changed(list); list->tree =3D RB_ROOT; list_for_each_entry_safe(ha, tmp, &list->list, list) { list_del_rcu(&ha->list); @@ -501,6 +518,7 @@ void __hw_addr_init(struct netdev_hw_addr_list *list) INIT_LIST_HEAD(&list->list); list->count =3D 0; list->tree =3D RB_ROOT; + list->owner =3D NULL; } EXPORT_SYMBOL(__hw_addr_init); =20 @@ -612,6 +630,7 @@ void __hw_addr_list_reconcile(struct netdev_hw_addr_lis= t *real_list, __hw_addr_insert(real_list, ref_ha, addr_len); real_list->count++; + __hw_addr_changed(real_list); } continue; } @@ -623,6 +642,7 @@ void __hw_addr_list_reconcile(struct netdev_hw_addr_lis= t *real_list, list_del_rcu(&real_ha->list); kfree_rcu(real_ha, rcu_head); real_list->count--; + __hw_addr_changed(real_list); } } =20 @@ -1177,6 +1197,7 @@ EXPORT_SYMBOL(dev_mc_flush); void dev_mc_init(struct net_device *dev) { __hw_addr_init(&dev->mc); + dev->mc.owner =3D dev; } EXPORT_SYMBOL(dev_mc_init); =20 --=20 2.43.0 From nobody Thu Sep 24 13:47:13 2026 Received: from mail-pz2-f12.google.com (mail-pz2-f12.google.com [74.125.228.12]) (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 8530832ED55 for ; Thu, 24 Sep 2026 01:16:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.228.12 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790212578; cv=none; b=q2heRplSgjSfjzuiOEoSuVZiYPfDqSdce8X0vrQRvr7YvMn3KsK3843gUYou4gK1Lq+K7hOdyg0g4Suckr66Phjy8YjEGUX75AwdkIaYNm9Lc4NapJI4dhsa2UEk/KDmdJz8O7X4GPYOMbfuS9FqcPvDY6ZG4i4DVgwRYIjzuaI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790212578; c=relaxed/simple; bh=11ci6d+PehauJyAnDYY7IHsA0v6i+cSVmVMjquBbxGA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=MxlhGKNjWmbbkcuwK0ZoVzp0Td27rMnoxDvU/EDnv7/S2IPUvynR2aqvWcDITlVvO5aXYwfBiesn/5FoWtQFmfVtEevriq6Up82oYwVi2ZxihIQMPNmqonTEZWl9jEZFscFWPRSxzxf5neKSPrlGDpHLQAV9qPZACkgGGz8uSGk= 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=OQQxeERA; arc=none smtp.client-ip=74.125.228.12 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="OQQxeERA" Received: by mail-pz2-f12.google.com with SMTP id 41be03b00d2f7-cc4aa0f1766so1034451a12.0 for ; Wed, 23 Sep 2026 18:16:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1790212575; x=1790817375; 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=X966xYfqnCqja66bJ7z4Qy1B/6ctiULzRcFdO6WHqEA=; b=OQQxeERAKBPa5tR8++Hu5tBXGifRCE/Gi0KtvkvWn727RemdArdfgX58oC9bGVCuPh ocLg76RSryrvWBrormWVjncbkMvlx2LnYunZrWlrQzSJlSQfxMlSGrQx9aDGMZ/oZi1v n+ufnwkk9jr6j8xod88IOZVF5fkheoVOzOcWiQJU4TBcBAILIZZTyRgmbJs5sGXKDISU 1eYs28g3wUB4UGUgY6MCu5sADdBkBHLaIR1aNmxu79XzICKm1ODcTALnj6icvxdued5s xcKzyksBYh/3sO5NUxwBZ2cdYB4e2pdudB2KAj7UCAkilkA5XmEfN33mt2/HiT0oy+3B eHPA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790212575; x=1790817375; 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=X966xYfqnCqja66bJ7z4Qy1B/6ctiULzRcFdO6WHqEA=; b=emkb58CRyTWYs3pooDuvQI8hE8IO+vDZUuf4Kf91AHJcrt9yQXYoF85dkf4ZS3joHw Q8BMzIl+jdSaf7DEFO+qqDkH6pe0N54xnz0nyTdVh2iYOoYGw9vZjMFfj4qJu0mUFAIA 9kAjgVQR+YOB/N8CMO5vaV052ij4jCkdiC7CeUG98W9cepebiniK1P69P33ThM9i6r2i nZa41NwmXUbGbgVraBRN8G6uuuwjMRNb0DqTAzI7MgyDWngu8dVWsreXIt30aPVw/8j0 KqLtWDlOeQSrh75KEYRwhKkbzvGB6ZKgqIZyPuD10+RHZmDg4RddliOfjg2hPazPHueY uRPw== X-Forwarded-Encrypted: i=1; AKwUvBwUFojCb5THxngNmiEPjNJGXXeNO7PRwlICp4NqcvtjjUuExT4ji3ZqMQE1ayKXKxwtOxBXz/XWmEyIeBU=@vger.kernel.org X-Gm-Message-State: AFuF++lPk9BDhyzbCUAKwFgVfBxQ3ZvuKqGgj2J2IUt2RQwbvo13KFNp cCA80CiD8IvJD5qrSYA2b63pFQGlCdUOtPYTcIVI3LpDyDvkkwthnxdt X-Gm-Gg: AYBFou2oeqQkGPwR1VRXl1bQ3Du8lT/d2/N6c8T91KfQTJAUkIZoEXBHUMImsCS34RJ UFc+NUrkZyMS5/8S+vqGNy/AbcCOFxrOwgzXCgP1vsxOf84DezaIVM+jywR6DrKWc668b/kkBQ/ EHwqdySb34nZWt+uVr3YL1RIQ5jTy0ivbMUpglcE8NB2nMrQlFBbR5E0MmU+CzmfsyspnmqkTnN hAN5mSSnzikvV7hbpnglHIYRLmBr+H2wZ3NYg8POsXWZ+ZvHJEdHNGiVkggZjL8o2I140TQcvuB GgyZrl53j+K1qMadH9tPa2jVqPpymqjnUPdZqLunelLEM6GPHD5BXgbSS+o6l1vncSeUge0kQiY FeagYViUsj+1vUIxlc+Y8brQG8bDgJtbj5g6hSLZVu2eVGFqi2oohHo63eX/zrwMDs5p79JiAcr t0uiQX1WUB3hNeBsQN/ZA1PKuY8X6bcsDWd91XSlEeCD5NrX0HZ1TmAC09IBPzBIg/9dHUI17hV ITvWDSDJEthBDKrGKhFBwGkENqm8aJ7scIg8S/cIyDN/Zy2vN4aQ2l84trX1viUhuDtcbTyWbGr 2zHfrg2rj9YW X-Received: by 2002:a05:6a20:3d19:b0:3dd:85a9:55aa with SMTP id adf61e73a8af0-3de0e9ba79emr985318637.35.1790212574556; Wed, 23 Sep 2026 18:16:14 -0700 (PDT) Received: from m-upc-A520M-HDV.lan (oki-109-236-14-10.jptransit.net. [109.236.14.10]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-cc75f3d5794sm1741392a12.14.2026.09.23.18.16.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 23 Sep 2026 18:16:14 -0700 (PDT) Sender: Yuyang Huang From: Yuyang Huang To: Yuyang Huang Cc: Aleksandr Loktionov , Andrew Lunn , "David S. Miller" , David Ahern , Donald Hunter , Eric Dumazet , Ido Schimmel , Jacob Keller , Jakub Kicinski , Kuniyuki Iwashima , Nicolas Dichtel , Nikolaos Gkarlis , Paolo Abeni , Sabrina Dubroca , Shuah Khan , Simon Horman , Stanislav Fomichev , Willem de Bruijn , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, netdev@vger.kernel.org Subject: [PATCH net-next v7 3/5] net: add AF_PACKET multicast dumps Date: Thu, 24 Sep 2026 10:15:52 +0900 Message-ID: <20260924011554.3494-4-sigefriedhyy@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260924011554.3494-1-sigefriedhyy@gmail.com> References: <20260924011554.3494-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 next to the dev->mc helpers in dev_addr_lists.c 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"). 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. Requests are always validated, there are no legacy users: prefixlen, flags and scope must be zero, ifa_index selects one device and IFA_TARGET_NETNSID is the only attribute accepted. The dump runs under RCU and netif_addr_lock_bh() without RTNL. cb->seq is sampled from the dev->mc generation counter and dev_base_seq under the address lock of each device and again when a round ends, so a change since the previous device or dump round sets NLM_F_DUMP_INTR, also when the last round dumps nothing because the device it stopped at is gone. Signed-off-by: Yuyang Huang --- include/linux/netdevice.h | 1 + include/uapi/linux/if_addr.h | 1 + net/core/dev_addr_lists.c | 195 +++++++++++++++++++++++++++++++++++ net/core/rtnetlink.c | 2 + 4 files changed, 199 insertions(+) diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index be3804cdbb2d..204d56a19583 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -5165,6 +5165,7 @@ int dev_mc_sync_multiple(struct net_device *to, struc= t net_device *from); void dev_mc_unsync(struct net_device *to, struct net_device *from); void dev_mc_flush(struct net_device *dev); void dev_mc_init(struct net_device *dev); +int dev_mc_dump(struct sk_buff *skb, struct netlink_callback *cb); =20 /** * __dev_mc_sync - Synchronize device's multicast list 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/dev_addr_lists.c b/net/core/dev_addr_lists.c index 18acd874fdbd..9de9a90b9a00 100644 --- a/net/core/dev_addr_lists.c +++ b/net/core/dev_addr_lists.c @@ -10,8 +10,12 @@ #include #include #include +#include #include #include +#include +#include +#include #include =20 #include "dev.h" @@ -1201,6 +1205,197 @@ void dev_mc_init(struct net_device *dev) } EXPORT_SYMBOL(dev_mc_init); =20 +static int dev_mc_fill_addr(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; +} + +/* Combine dev_mc_genid and dev_base_seq to detect changes, like + * inet_base_seq(). + */ +static u32 dev_mc_base_seq(const struct net *net) +{ + u32 res =3D atomic_read(&net->dev_mc_genid) + + READ_ONCE(net->dev_base_seq); + + /* Must not return 0 (see nl_dump_check_consistent()). */ + if (!res) + res =3D 0x80000000; + return res; +} + +static int dev_mc_dump_dev(struct net_device *dev, struct sk_buff *skb, + 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); + /* Sampled under the lock, see nl_dump_check_consistent() */ + cb->seq =3D dev_mc_base_seq(dev_net(dev)); + netdev_for_each_mc_addr(ha, dev) { + if (addr_idx < *s_addr_idx) { + addr_idx++; + continue; + } + err =3D dev_mc_fill_addr(skb, dev, ha, NETLINK_CB(cb->skb).portid, + cb->nlh->nlmsg_seq, flags, netnsid); + if (err < 0) + break; + nl_dump_check_consistent(cb, nlmsg_hdr(skb)); + addr_idx++; + } + netif_addr_unlock_bh(dev); + + *s_addr_idx =3D err < 0 ? addr_idx : 0; + + return err; +} + +struct dev_mc_dump_filter { + struct net *tgt_net; + netns_tracker ns_tracker; + int netnsid; + int ifindex; +}; + +static const struct nla_policy dev_mc_dump_policy[IFA_MAX + 1] =3D { + [IFA_TARGET_NETNSID] =3D { .type =3D NLA_S32 }, +}; + +static int dev_mc_valid_dump_req(const struct nlmsghdr *nlh, struct sock *= sk, + struct dev_mc_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, + dev_mc_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); + } + netns_tracker_alloc(net, &filter->ns_tracker, GFP_KERNEL); + filter->tgt_net =3D net; + } + + filter->ifindex =3D ifm->ifa_index; + + return 0; +} + +int dev_mc_dump(struct sk_buff *skb, struct netlink_callback *cb) +{ + struct dev_mc_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; + unsigned long s_ifindex; + struct net_device *dev; + int err; + + err =3D dev_mc_valid_dump_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 dev_mc_dump_dev(dev, skb, cb, &ctx->addr_idx, flags, + filter.netnsid); + goto out; + } + + s_ifindex =3D ctx->ifindex; + for_each_netdev_dump(filter.tgt_net, dev, ctx->ifindex) { + /* The device the dump stopped at is gone, do not skip + * entries of the next one. + */ + if (dev->ifindex !=3D s_ifindex) + ctx->addr_idx =3D 0; + err =3D dev_mc_dump_dev(dev, skb, cb, &ctx->addr_idx, flags, + filter.netnsid); + if (err < 0) + break; + } +out: + /* A round that dumps no device, e.g. the one it stopped at is gone, + * still needs the NLMSG_DONE check to see the change. + */ + cb->seq =3D dev_mc_base_seq(filter.tgt_net); + rcu_read_unlock(); + if (filter.netnsid >=3D 0) + put_net_track(filter.tgt_net, &filter.ns_tracker); + return err; +} + static int netif_addr_lists_snapshot(struct net_device *dev, struct netdev_hw_addr_list *uc_snap, struct netdev_hw_addr_list *mc_snap, diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index e3444fd24061..204dc9040e3c 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c @@ -7278,6 +7278,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 dev_mc_dump, .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 Thu Sep 24 13:47:13 2026 Received: from mail-pz2-f41.google.com (mail-pz2-f41.google.com [74.125.228.41]) (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 892B13264DD for ; Thu, 24 Sep 2026 01:16:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.228.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790212585; cv=none; b=Bc6tHQYplHzFQHxju4z2PDUyc3PypVzdg3tzXOAF04GSCDnkY2H9gdOkfp+Z3wC8etyFBOUcVUfPueKC+roXR5CdXgMN/65BvmybTgpAbNWMGTcuoXOhhvUPtfj2vug53Hav4+wEyXJT0g1WA1AayjbJY2124npg2uRe3QqATzw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790212585; c=relaxed/simple; bh=7ym8eCannUJoplyLEig2XRjsDs0s3r99iL28MZ1+Bek=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Nb562NiCrVuKoue2Lx6AZTjygNSJEXUMI5S8/wRlFws00ZikfPVXlH7TCjol5WAbzuAKzSCfhEZDgJRZN0FSwAtoZB76jzF79U/sKSl4PT2zQuM1XWVnsp7qx17P1ljvhwTsOVreWR4dv3l0bdYQ1QR9F9nbA8OFRcrTpPvOf1I= 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=fenFzEF2; arc=none smtp.client-ip=74.125.228.41 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="fenFzEF2" Received: by mail-pz2-f41.google.com with SMTP id 41be03b00d2f7-cc50d1b048eso1008285a12.1 for ; Wed, 23 Sep 2026 18:16:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1790212579; x=1790817379; 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=pvI2CLJV63upsK+i3iXF166plHPTeUWc5AYad+dRYdo=; b=fenFzEF2O0cZvD5d06ENW2dfKhk2xFVq0NMBxEQ/mtnR+ONssC858jxvzTfpL8d+ot A2CGGX0c5iwpwl2A7oNvYyC+bXxXsDvJohOHTffCSAJeBcPh67MAih4bqaWgrz5Tm9Vz pqRIzXCqcyfgOi4WdSC1gd3xA3aBOncSiF7ra400VTqSbiXBNR+0Jvip0d2riIAQE8zH qKhuSQ0GRHDvUyQ+9aqFKz+ws15TD/UyjEeJPpDL9xMkY4O1kgqXnq8MZePguiaZVGOP jewYhCjfI0o5z/rFpNuzB0uku5FpLZmjSJ5RCS0SadHv5I1cqL5Ey1F/QILflAZuxFcU kjhw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790212579; x=1790817379; 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=pvI2CLJV63upsK+i3iXF166plHPTeUWc5AYad+dRYdo=; b=W0l9Thje1imrSScSAo1BxxOm0ykgWhJKMM77iZwMiXMYIELC3KJmH6Oolf/DQ59Yx4 MwG8MrCoxySXrmA8E6qz16al34F4QuKXe7df/kM3rpp01xFtoqqAnxImXkKWjgToSogf DDEW1M7eTckaXP9AudkH/rOM5qYbn3xfwVpUOtG/M1vYRZVTZlcl+acecjY9JBlAGECV FzCH7O6jjhWkqWkV4w1fDyMtGjyJ1FAtIRuuMvxVU7k+XIpHJVwtusPn/V6IUziRhS9X rch3dy3taddShm28cgoDLN/wdo1+3MwRd4MDZKXVSKaAKooAdbB/D9X6IiqvkK2djnP5 v/dQ== X-Forwarded-Encrypted: i=1; AKwUvBykxcZXe6yOiZR103pZ4co474LZKjedKrvkx+BTQsrKthsmpxGq+g0aCJ3Nh9CVAaFD48qG04wPfCaVluc=@vger.kernel.org X-Gm-Message-State: AFuF++nSRXF8Lfz9hLab1pV0MrlzbIoIhYtpttCkncgXE5apB5P5hVPF 29cJeqjvMmEZ5qjklHf5Cws4QX6UuqvFQBGWvKD+H/iCSXVWykswqkBe X-Gm-Gg: AYBFou1nBCkmebXB5K2ZNViS0xr2/VNEBJJMz5Jt3kFP2NbblqmzkUHRTfzGrYxyUdg W4H8p4otUtgcTxRfFhVLOm2uiv4VMEtQUvNrxW0asC9UaMpZCp17z1QJk3JGaLPuwmcTzE5XTAH iD2X6m/sGsTrQ/H+YqvvxlLUrtgM87MRphL5gZ3At70KidteHdIsiq9Z3yhqyj/zlcaUCQdXzca aHE+FcXxckf23P76+ix9LAnWtA54WhPXEjI47axcQuvygyZGq4qO3xSCkXM2s4OogIoz63wexDx mKLQAxBbBFz2/2pdt+bU2HF4tgoIHa9XxRgypmF+g56vlO8eydaN2xdEEEcY7eMFtA+RSQ8T6fz Tew5ZMHhInzLQvqno2Z8E72dCDNuzRzPGfvczKgotCdjCB08p0djfSDGD644HuMovxZmK3pmaZj puRx6qsx85qZ0y1AorLNV1L3Itkw+9Fj7dhi+QrSRClnPCx0mPdVFh98HmAma9fu3lc6GLCT47D k1YyTaM3OaA9XBsdyJPQBGb2GUpchIcv5IMlwNVGqaQBKG24VcLzo1tsGmMLCrQRcPxAbaBg/pT 7Fq3szrdET4= X-Received: by 2002:a05:6a21:7104:b0:3dd:d887:3e28 with SMTP id adf61e73a8af0-3de0ea5ce7fmr671544637.74.1790212578717; Wed, 23 Sep 2026 18:16:18 -0700 (PDT) Received: from m-upc-A520M-HDV.lan (oki-109-236-14-10.jptransit.net. [109.236.14.10]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-cc75f3d5794sm1741392a12.14.2026.09.23.18.16.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 23 Sep 2026 18:16:18 -0700 (PDT) Sender: Yuyang Huang From: Yuyang Huang To: Yuyang Huang Cc: Aleksandr Loktionov , Andrew Lunn , "David S. Miller" , David Ahern , Donald Hunter , Eric Dumazet , Ido Schimmel , Jacob Keller , Jakub Kicinski , Kuniyuki Iwashima , Nicolas Dichtel , Nikolaos Gkarlis , Paolo Abeni , Sabrina Dubroca , Shuah Khan , Simon Horman , Stanislav Fomichev , Willem de Bruijn , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, netdev@vger.kernel.org Subject: [PATCH net-next v7 4/5] netlink: specs: rt-addr: document AF_PACKET multicast dumps Date: Thu, 24 Sep 2026 10:15:53 +0900 Message-ID: <20260924011554.3494-5-sigefriedhyy@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260924011554.3494-1-sigefriedhyy@gmail.com> References: <20260924011554.3494-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 Reviewed-by: Nicolas Dichtel --- Documentation/netlink/specs/rt-addr.yaml | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/Documentation/netlink/specs/rt-addr.yaml b/Documentation/netli= nk/specs/rt-addr.yaml index 17ead2203451..dc5c0ce259ba 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,15 @@ operations: attributes: *ifaddr-all - name: getmulticast - doc: Get / dump IPv4/IPv6 multicast addresses. + doc: | + Get / dump multicast addresses. ifa-family must select 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. A non-zero + ifa-index restricts the dump to that device, ifa-prefixlen, + ifa-flags and ifa-scope must be zero. attribute-set: addr-attrs fixed-header: ifaddrmsg do: @@ -181,10 +191,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 Thu Sep 24 13:47:13 2026 Received: from mail-pz2-f41.google.com (mail-pz2-f41.google.com [74.125.228.41]) (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 BB94731E840 for ; Thu, 24 Sep 2026 01:16:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.228.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790212585; cv=none; b=PG9orp/d3N1VAnW65h5TpcXN7FICnfWseS1Iq052umDkA/qtVUxHuX+IJLL5LzGUGfizmXwLKUIpEpKndjQC54qZDi5/padV/S/epGHt7NBYNT0SPONI0Xr/fqIcWLFbILLVKOeZEAWYBr02YmAVMQv3zuozihoccsAc1v4j34k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790212585; c=relaxed/simple; bh=AIe0tVI2MDMU+wAUIOGkfF/prRfDfU5eGXTYlmKrHJ8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=XFNY78em6ySM0mr3cHoSGl10jhgkNevEQq7Uxf3Y34sVWbF+/rlVFvJPNMZnE5S3O8mnd1rws9tDzuW24TT86A313z1E/FpFiLyZv+olPnmotuaQBXynUUChC3R39CdrBe+MVr63dHWAkiywZoTIYCyUQqowJlXlQNA6RHAhfPk= 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=jMO/C/4A; arc=none smtp.client-ip=74.125.228.41 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="jMO/C/4A" Received: by mail-pz2-f41.google.com with SMTP id 41be03b00d2f7-cc4c3304833so722759a12.3 for ; Wed, 23 Sep 2026 18:16:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1790212583; x=1790817383; 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=nZghyl21slJP0T9zWNT6FTVcuW3rARquNgkyu57N/4I=; b=jMO/C/4Ag54kS56ov/JxQII15shS7hI3JW+cRl5jMqc2FTSbKGxRGmYGI2RqqL+rnc aA/TtiTooe1H01Qd12R11+Kiuz2tXPBWwMNChmV0WJdVDocVP5bEzqBPIN9XR1aNKYbo 1IwRipVi0qkXjfTeKP2UvsDusFiDv3CBnJjkmHrPZwfueDp6wGpD841oMouBprFJqaz/ B7B6c1Wf7lDysWbbwqZsJ5byQ0eyaN6uwD6saxPkafITvbL7L3bzcFlmlcjWMhE9p3q2 EgqxXRALo8BWsuS/gCtXMNB5NxuRnXZV6HGNushwBz53hOCWKi/XT/lYjfeL/zcEYkRk wLnA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790212583; x=1790817383; 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=nZghyl21slJP0T9zWNT6FTVcuW3rARquNgkyu57N/4I=; b=wjmQirsr6zjulOx9AyTxSHHE00GA7KsZamNjUmt7gdOIrqdD2FFQvn/jT1ZpGZaShY tQcvWglyjh/yUMEH2QEs65vHexQrvCDY5os0VYysvIz78oc/2wnIVBwU7oZS7iZFG4JS z0l8GXUvrHuNL16NzvcstpI3Y7+lNTQKdKQ3jL0watR5SXhKZRrW9KaAZuGsBoHRk54P 1UAUIlcG9kfIzx6/bXXSryBEiBf23taQvZc+J4ymMFEi0na+FEI0jniHqBnxOx0jcgc7 cw8FevITiiStiasFQOSuIxot4W0HZ0eEa75S/bM7ibu/wcY/8NY6k9VwFP9HdFtybttU cr/g== X-Forwarded-Encrypted: i=1; AKwUvByibdZ7WljZUevQLvy9vGX0Q16uAfYnvnAmjID2VKOv/E1BlKOYTrjZUJBsH+Op4MTe+24FwaHq0CevBU8=@vger.kernel.org X-Gm-Message-State: AFuF++m5dYEuURBIkW4UkWDxFi64ZeWN5Ok7WAyMWsH23MQk5Kkr7Itx HLLCgXw4SofE7gZTnumhB4S7na0Now2L+r7rjV820lMe8Sti1AxBGucT X-Gm-Gg: AYBFou1O4L79JexRiQeOQZ/z6dW13pfErQFvBvMRMfl5caU1IPFzRaMi/5KRoCD9YI6 kfobQMZBG+cq0hF7ofTxhqyn6GnBhrJnXGjwEO/j07fis1aDhzlH4h06eZUVfc6LTyu3fLRb5K9 9Ug0rxRAJECs0GQ+TVtNVUICpnR8Ci2tHuvpVbzqqFPjZRRVpp5Ao73TAkXJ5Jxcr420hQu7A5C xKm/xzzkHoC+xuOnqoS1wxAheFgmgn525b93SUPqZZgBQNoF6s/hDE/9vrUawikW78Kx25mECmY mkkUKXnhgm6XIV5ZMvhxikABJ63AHKKu/+Cv04IbrSPTY/UucD8cFEAMcZgG0lLM5EIG2gNCR4V QyYbhWSOkYvJku+MhLTT32O2LyynvAOFCcAp2W9DkyeF260zFNDLSo1Bq45Lt3koGAXD6n2vt1X pZqZsn2OuZSFffI60FDIFgymxlL9XuS2PVMBeZKQ8sitArLbIJAXosKuyfHDDM2YHfBbySE+S9Y Pn0NTaX0AyS3d4BDNfDzO0zo0M3GlsSZxMj1RUtTmfCs8dvgtZKkWFIIK/J0ILLzpqI1QArj1ce Z5ijDuSbDHM= X-Received: by 2002:a17:90b:440b:b0:39e:6c69:34d4 with SMTP id 98e67ed59e1d1-3a098e888c9mr768925a91.56.1790212582839; Wed, 23 Sep 2026 18:16:22 -0700 (PDT) Received: from m-upc-A520M-HDV.lan (oki-109-236-14-10.jptransit.net. [109.236.14.10]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-cc75f3d5794sm1741392a12.14.2026.09.23.18.16.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 23 Sep 2026 18:16:22 -0700 (PDT) Sender: Yuyang Huang From: Yuyang Huang To: Yuyang Huang Cc: Aleksandr Loktionov , Andrew Lunn , "David S. Miller" , David Ahern , Donald Hunter , Eric Dumazet , Ido Schimmel , Jacob Keller , Jakub Kicinski , Kuniyuki Iwashima , Nicolas Dichtel , Nikolaos Gkarlis , Paolo Abeni , Sabrina Dubroca , Shuah Khan , Simon Horman , Stanislav Fomichev , Willem de Bruijn , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, netdev@vger.kernel.org Subject: [PATCH net-next v7 5/5] selftests: net: test AF_PACKET multicast dumps Date: Thu, 24 Sep 2026 10:15:54 +0900 Message-ID: <20260924011554.3494-6-sigefriedhyy@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260924011554.3494-1-sigefriedhyy@gmail.com> References: <20260924011554.3494-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. Signed-off-by: Yuyang Huang Reviewed-by: Nicolas Dichtel --- tools/testing/selftests/net/rtnetlink.py | 73 +++++++++++++++++++++++- 1 file changed, 71 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/net/rtnetlink.py b/tools/testing/selft= ests/net/rtnetlink.py index dc8c77db4897..5534ade056a5 100755 --- a/tools/testing/selftests/net/rtnetlink.py +++ b/tools/testing/selftests/net/rtnetlink.py @@ -5,13 +5,18 @@ 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 ksft_in, ksft_not_in, ksft_not_none from lib.py import CmdExitFailure, NetNS, NetNSEnter, RtnlAddrFamily, Rtnl= RouteFamily 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(':', '= ')) +ETH_PEER_MULTICAST_STR =3D '01:00:5e:02:02:02' +ETH_PEER_MULTICAST =3D bytes.fromhex(ETH_PEER_MULTICAST_STR.replace(':', '= ')) =20 =20 def _users_for(rtnl: RtnlAddrFamily, family: int, grp: bytes, ifindex: int= ): @@ -105,6 +110,69 @@ 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() + defer(rtnl.close) + addresses =3D rtnl.getmulticast( + {"ifa-family": socket.AF_PACKET, "ifa-index": dev_idx}, + dump=3DTrue) + + # 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. + all_hosts =3D entries.get(ETH_ALL_HOSTS_MULTICAST) + ksft_not_none(all_hosts, + "dummy1 does not have the all-hosts link-layer addre= ss") + if all_hosts is not None: + ksft_not_in('global', all_hosts['flags'], + "protocol entry is global") + + static =3D entries.get(ETH_TEST_MULTICAST) + ksft_not_none(static, "dummy1 does not have the SIOCADDMULTI addre= ss") + if static is not None: + ksft_eq(static['mc-users'], 1, + "unexpected mc-users for the SIOCADDMULTI address") + ksft_in('global', static['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) + ip(f"maddr add {ETH_PEER_MULTICAST_STR} dev dummy3", 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, + "ifa-index": peer_idx}, 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") + # dummy1 in this netns can have the same ifindex as dummy3 + ksft_in(ETH_PEER_MULTICAST, + {addr['multicast'] for addr in addresses}, + "target-netnsid did not dump the peer device") + + def ipv4_devconf_notify() -> None: """ Configure an interface and set ipv4-devconf values through netlink @@ -424,7 +492,8 @@ def ipv6_verify_inter_scope_addr_order() -> 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