From mboxrd@z Thu Jan 1 00:00:00 1970 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 19294366829 for ; Sat, 28 Feb 2026 07:16:19 +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=1772262982; cv=none; b=dwwNZa8T4Zl+W6cX3i6TRthUU+WRJDDyj8RTTzJGvz5Tkcw0chNJ+6l5Xpi6OdUJM4TqYJqRR0QJlBYk429P3di+dIsGQluwNDbnmeAWHMWRyDsxvStgRXZcUhl30TT+grScFvrOqXSaV5Loz1jnjFyBhE5HljlN4WnfXuEv6hg= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772262982; c=relaxed/simple; bh=FTYLMrg6206po8qLXh2VYTUEJmwCnHlioxfcai+cfUU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=FzwRU/UcIjxcy112w4d9Pw1x6JbPiZSiKt4gwC1wC7ijZd2ub11rcqp4V810eCWb6mozlr6uCB9WlIQFJrz22/8UySRth9NmYoZJ1TAAZ2KI+C6yIXTx2FGK8KN8XI8qdYqiHfsZPZz92JLjH1z9CYKiswu8sAzj9Y4k39+5KkM= 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=jReCwRGu; 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="jReCwRGu" Received: by mail-pl1-f174.google.com with SMTP id d9443c01a7336-2aaecf9c325so18746185ad.1 for ; Fri, 27 Feb 2026 23:16:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1772262979; x=1772867779; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=bmJzsuFRLBUvnAtfdwJXgQ3SY6YhuOsJjknIwY8/1vI=; b=jReCwRGuxAZTpGSv4xtdEhrhebWp1jjsCF24myJP4kS5CZeWVX50vb5LNJaU5AZxJ/ rm0k85Bn+s5RC91qgyyJ78u00pPqAWK1P3AQnVZvG9N186xuKjHKANJYkPzoGoI5fCEu EKBOm3F6iqyx/aQfwomeeTLOOq6nNjL9osKeMyrPOfzHTa1yN0Wnxa21sb2Sq7UXhpDI iFdOgW6o2t/el0IzDjd3haDOThhIyZ1n1ZA7DRxY2JFbdq6SigcMd8i97ONttNiVcCtI spQmV8w87Zs7rbTY3Kr4Xsz0IDq9Cmvaw+rMUEmM6i/0ahzGkJtDhjYv4KiNk588vGj1 6T3g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772262979; x=1772867779; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=bmJzsuFRLBUvnAtfdwJXgQ3SY6YhuOsJjknIwY8/1vI=; b=nsWT9nilJzSudj10sJAkYlhyY/nhQOsu3BO3hgUoVKTnixuuNzDno3rhWwN0u+16t1 yGDyhWu6yEhuSzwRzDFRY3pcAViu2oJV4dGj5ImQ1B4enn+raq7hTvqteUNHE3272QqY XZj4i/LVkVoSrhW6HjxBmTy0MT82eVSkvITfGdnfY2umVbcsb7RrnwciYneMZHXgdAfn i7kfEYBvbjHg6xR2mcMAtf/lzuTrc2YM/36ML6WOQEFqsBh6Wl9e8vAN5Jn/N9HOHpji pothnqqKxB1ZzHaMWZlSSL6aU82bhEzuHseyd5VO35RPGfkKbGlXdYWx8bnJoXF/YpD6 zf5A== X-Forwarded-Encrypted: i=1; AJvYcCXQJQ9cStPkX0aYbU2CbnzLNpdOZZcx11piY45Y4TgV0Hw0ELf7P5+15+FFDI7BPWYv0FRwoTNMiHWa1wE=@vger.kernel.org X-Gm-Message-State: AOJu0YwcGVIkzpAJKmtc+W8Jjyk3/h8pRuE4QcnRO6oe+MJ975YetBA5 X6lBDV8h2vY7FjCQ39MjyCQbUQWPNrkWtwd1EBd0e38Umq/SMKLwylWL X-Gm-Gg: ATEYQzwgGXLbxdOxj4/XGKT5Sb1vr3fOOIz7rN4x4j7ch1tBzPnjh46nZtdtJQZ7X7l lov5H6QlwE2nggCq94l365RqKqjXOmB2aW3fFx2MH4vs6vtCIcbZpQNK6qezbmG8tWYqHrxaIW0 lWt0UUZxhfpHGT0nG/+TLWoEuK5DjFsU513EBAJDFCxTHvCzclY9i0btYQMxyDFvdCLdHF9JIh5 LHiH+ZOqeec5ZVOp2CU2mHHmkK/BMnr7sPVBmtygHmDO8ZEmhR2b127JMJ/v3yZchlR9hrXu+Np 48wjRB1fM8U1lYnifpIxgqKu2jBb3ppNImQXpjUpr5G//CMRAkahtJzrn8a6wkTZuaxjjTgjPis IMl3FBIAhvlKfGlA5mV6EygqyplHQ4wFutUY2mUchn7KTRYMnSvogU/AzqqIpX5gMXWE+/CrOcY KsCZpIMsRh3tZ0tyqK6Bd6Yxe+PW4Vb7KQzk82FlE7iYymmij3/eTuYY+zAw== X-Received: by 2002:a17:902:ea08:b0:2aa:e9f0:146c with SMTP id d9443c01a7336-2adf79cd7d5mr104999395ad.29.1772262979381; Fri, 27 Feb 2026 23:16:19 -0800 (PST) Received: from localhost.localdomain ([183.96.230.140]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2adfb5b4535sm72004075ad.17.2026.02.27.23.16.17 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Fri, 27 Feb 2026 23:16:19 -0800 (PST) From: Kibaek Yoo To: andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Kibaek Yoo Subject: [PATCH v2 2/2] selftests: net: add macvlan multicast test for shared source MAC Date: Sat, 28 Feb 2026 16:16:13 +0900 Message-ID: <20260228071613.4360-2-psykibaek@gmail.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260228071613.4360-1-psykibaek@gmail.com> References: <20260225100024.38937-1-psykibaek@gmail.com> <20260228071613.4360-1-psykibaek@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: 8bit Add a selftest that verifies multicast delivery to a macvlan bridge port when the source MAC of the incoming frame matches the macvlan's own MAC address. This scenario occurs with protocols like VRRP where multiple hosts share the same virtual MAC address. Without the corresponding kernel change, macvlan bridge mode does not handle this case and the multicast frame is not delivered. Signed-off-by: Kibaek Yoo --- tools/testing/selftests/net/Makefile | 1 + .../selftests/net/macvlan_mcast_shared_mac.sh | 93 +++++++++++++++++++ 2 files changed, 94 insertions(+) create mode 100755 tools/testing/selftests/net/macvlan_mcast_shared_mac.sh diff --git a/tools/testing/selftests/net/Makefile b/tools/testing/selftests/net/Makefile index afdea6d95bde0..c12f6f600ee5e 100644 --- a/tools/testing/selftests/net/Makefile +++ b/tools/testing/selftests/net/Makefile @@ -54,6 +54,7 @@ TEST_PROGS := \ l2tp.sh \ link_netns.py \ lwt_dst_cache_ref_loop.sh \ + macvlan_mcast_shared_mac.sh \ msg_zerocopy.sh \ nat6to4.sh \ ndisc_unsolicited_na_test.sh \ diff --git a/tools/testing/selftests/net/macvlan_mcast_shared_mac.sh b/tools/testing/selftests/net/macvlan_mcast_shared_mac.sh new file mode 100755 index 0000000000000..ff5b893472474 --- /dev/null +++ b/tools/testing/selftests/net/macvlan_mcast_shared_mac.sh @@ -0,0 +1,93 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0 +# +# Test multicast delivery to macvlan bridge ports when the source MAC +# matches the macvlan's own MAC address (e.g., VRRP virtual MAC shared +# across multiple hosts). +# +# Topology: +# +# NS_SRC NS_BRIDGE +# veth_src (SHARED_MAC) <-----> veth_dst +# | +# +-- macvlan0 (bridge mode, SHARED_MAC) +# +# A multicast packet sent from NS_SRC with source MAC equal to +# macvlan0's MAC must still be delivered to macvlan0. + +source lib.sh + +SHARED_MAC="00:00:5e:00:01:01" +MCAST_ADDR="239.0.0.1" + +setup() { + setup_ns NS_SRC NS_BRIDGE + + ip -net "${NS_BRIDGE}" link add veth_dst type veth \ + peer name veth_src netns "${NS_SRC}" + + ip -net "${NS_SRC}" link set veth_src address "${SHARED_MAC}" + ip -net "${NS_SRC}" link set veth_src up + ip -net "${NS_SRC}" addr add 192.168.1.1/24 dev veth_src + + ip -net "${NS_BRIDGE}" link set veth_dst up + + ip -net "${NS_BRIDGE}" link add macvlan0 link veth_dst \ + type macvlan mode bridge + ip -net "${NS_BRIDGE}" link set macvlan0 address "${SHARED_MAC}" + ip -net "${NS_BRIDGE}" link set macvlan0 up + ip -net "${NS_BRIDGE}" addr add 192.168.1.2/24 dev macvlan0 + + # Accept all multicast so the mc_filter passes for any group. + ip -net "${NS_BRIDGE}" link set macvlan0 allmulticast on +} + +cleanup() { + rm -f "${CAPFILE}" "${CAPOUT}" + cleanup_ns "${NS_SRC}" "${NS_BRIDGE}" +} + +test_macvlan_mcast_shared_mac() { + CAPFILE=$(mktemp) + CAPOUT=$(mktemp) + + echo "Testing multicast delivery to macvlan with shared source MAC" + + # Listen for one ICMP packet on macvlan0. + timeout 5s ip netns exec "${NS_BRIDGE}" \ + tcpdump -i macvlan0 -c 1 -w "${CAPFILE}" icmp &> "${CAPOUT}" & + local pid=$! + if ! slowwait 1 grep -qs "listening" "${CAPOUT}"; then + echo "[FAIL] tcpdump did not start listening" + return "${ksft_fail}" + fi + + # Send multicast ping from NS_SRC; source MAC equals macvlan0's MAC. + ip netns exec "${NS_SRC}" \ + ping -W 0.1 -c 3 -I veth_src "${MCAST_ADDR}" &> /dev/null + + wait "${pid}" + + local count + count=$(tcpdump -r "${CAPFILE}" 2>/dev/null | wc -l) + if [[ "${count}" -ge 1 ]]; then + echo "[ OK ]" + return "${ksft_pass}" + else + echo "[FAIL] expected at least 1 ICMP packet on macvlan0," \ + "got ${count}" + return "${ksft_fail}" + fi +} + +if [ ! -x "$(command -v tcpdump)" ]; then + echo "SKIP: Could not run test without tcpdump tool" + exit "${ksft_skip}" +fi + +trap cleanup EXIT + +setup +test_macvlan_mcast_shared_mac + +exit $? -- 2.50.1 (Apple Git-155)