From patchwork Fri Apr 5 15:40:47 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nikolay Aleksandrov X-Patchwork-Id: 1078507 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=cumulusnetworks.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=cumulusnetworks.com header.i=@cumulusnetworks.com header.b="daS3XZeS"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 44bPF00Sqvz9sNH for ; Sat, 6 Apr 2019 02:41:40 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731140AbfDEPli (ORCPT ); Fri, 5 Apr 2019 11:41:38 -0400 Received: from mail-wr1-f47.google.com ([209.85.221.47]:41191 "EHLO mail-wr1-f47.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730565AbfDEPli (ORCPT ); Fri, 5 Apr 2019 11:41:38 -0400 Received: by mail-wr1-f47.google.com with SMTP id r4so8557705wrq.8 for ; Fri, 05 Apr 2019 08:41:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cumulusnetworks.com; s=google; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=+N2HWlPPHXSvmSUQ4i4B9sFiuLtPzhZ8jDOt1z0jL0Y=; b=daS3XZeSVSjjVPWBw1e47u6Y/6+MXpbdanvT7Ce30QeLPZx/xiBdP4QbGezYP29IXq JqFBCmngWaxXtkJPzXtf4t3EE342yKNo7WxTh53b/9Lbn7I8fxew2MwEOCnxUJKqU8Wq L8tvzmaNPzihEEf/SugT5iuCu7sZ6O6FOw0kQ= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=+N2HWlPPHXSvmSUQ4i4B9sFiuLtPzhZ8jDOt1z0jL0Y=; b=VkkS8lE7kW/RIWQikBpVOQLB5icGqhX+gM51oPP3asr8Vl8go4wLrI2S4GRqCFMNJI YW0m0xs6yBCJWZdSq6j4ZwEF1jazgaGUm9tvS20mSEyaniR3TufA7b/UzUS9Sxj2kFu+ UPLLm1T1dyEgJdhRYWVzCLLZOf/rtPlgO8+FgWtL4fN+FNUERiE6Rxe03G891x8lu+HE 143SbRk1zdBdBqK+vyVwk/MEHvUTIVbx+0/KMVaxUUVSWpzcPtnmmhj0ALvQ0oRYDAc2 Vppwct+gNX5ayk7XJOK52Mw20pI11dvbhP1Ylcm42BYD4/+DXs6bPOegAWkBS5rAp+TY tzTA== X-Gm-Message-State: APjAAAVuLj7wNUn3hNzmsiYgTUqjIwU+Ckq2c6pPio2OnJiaGVDplnJ3 TbMUXfFwfwA/9OmX9J4zBnTIZxKFiB0= X-Google-Smtp-Source: APXvYqyixZSXSYf2uJUKtVITx/qy7eCJK6IopeYQoSjOPUfam+QZawzbANEEPqa+N7S3S+O2chgl7g== X-Received: by 2002:a5d:6a8a:: with SMTP id s10mr9369844wru.66.1554478896268; Fri, 05 Apr 2019 08:41:36 -0700 (PDT) Received: from localhost.localdomain ([93.152.141.58]) by smtp.gmail.com with ESMTPSA id s21sm2724341wmh.22.2019.04.05.08.41.35 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 05 Apr 2019 08:41:35 -0700 (PDT) From: Nikolay Aleksandrov To: netdev@vger.kernel.org Cc: roopa@cumulusnetworks.com, davem@davemloft.net, Nikolay Aleksandrov Subject: [PATCH net-next] selftests: forwarding: test for bridge mcast traffic after report and leave Date: Fri, 5 Apr 2019 18:40:47 +0300 Message-Id: <20190405154047.22506-1-nikolay@cumulusnetworks.com> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This test is split in two, the first part checks if a report creates a corresponding mdb entry and if traffic is properly forwarded to it, and the second part checks if the mdb entry is deleted after a leave and if traffic is *not* forwarded to it. Since the mcast querier is enabled we should see standard mcast snooping bridge behaviour. Signed-off-by: Nikolay Aleksandrov --- The first part of this test will currently fail on net-next since we need the recent mcast zeroing fix from -net. .../selftests/net/forwarding/bridge_igmp.sh | 152 ++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100755 tools/testing/selftests/net/forwarding/bridge_igmp.sh diff --git a/tools/testing/selftests/net/forwarding/bridge_igmp.sh b/tools/testing/selftests/net/forwarding/bridge_igmp.sh new file mode 100755 index 000000000000..88d2472ba151 --- /dev/null +++ b/tools/testing/selftests/net/forwarding/bridge_igmp.sh @@ -0,0 +1,152 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0 + +ALL_TESTS="reportleave_test" +NUM_NETIFS=4 +CHECK_TC="yes" +TEST_GROUP="239.10.10.10" +TEST_GROUP_MAC="01:00:5e:0a:0a:0a" +source lib.sh + +h1_create() +{ + simple_if_init $h1 192.0.2.1/24 2001:db8:1::1/64 +} + +h1_destroy() +{ + simple_if_fini $h1 192.0.2.1/24 2001:db8:1::1/64 +} + +h2_create() +{ + simple_if_init $h2 192.0.2.2/24 2001:db8:1::2/64 +} + +h2_destroy() +{ + simple_if_fini $h2 192.0.2.2/24 2001:db8:1::2/64 +} + +switch_create() +{ + ip link add dev br0 type bridge mcast_snooping 1 mcast_querier 1 + + ip link set dev $swp1 master br0 + ip link set dev $swp2 master br0 + + ip link set dev br0 up + ip link set dev $swp1 up + ip link set dev $swp2 up +} + +switch_destroy() +{ + ip link set dev $swp2 down + ip link set dev $swp1 down + + ip link del dev br0 +} + +setup_prepare() +{ + h1=${NETIFS[p1]} + swp1=${NETIFS[p2]} + + swp2=${NETIFS[p3]} + h2=${NETIFS[p4]} + + vrf_prepare + + h1_create + h2_create + + switch_create +} + +cleanup() +{ + pre_cleanup + + switch_destroy + + # Always cleanup the mcast group + ip address del dev $h2 $TEST_GROUP/32 2>&1 1>/dev/null + + h2_destroy + h1_destroy + + vrf_cleanup +} + +# return 0 if the packet wasn't seen on host2_if or 1 if it was +mcast_packet_test() +{ + local mac=$1 + local ip=$2 + local host1_if=$3 + local host2_if=$4 + local seen=0 + + # Add an ACL on `host2_if` which will tell us whether the packet + # was received by it or not. + tc qdisc add dev $host2_if ingress + tc filter add dev $host2_if ingress protocol ip pref 1 handle 101 \ + flower dst_mac $mac action drop + + $MZ $host1_if -c 1 -p 64 -b $mac -B $ip -t udp "dp=4096,sp=2048" -q + sleep 1 + + tc -j -s filter show dev $host2_if ingress \ + | jq -e ".[] | select(.options.handle == 101) \ + | select(.options.actions[0].stats.packets == 1)" &> /dev/null + if [[ $? -eq 0 ]]; then + seen=1 + fi + + tc filter del dev $host2_if ingress protocol ip pref 1 handle 101 flower + tc qdisc del dev $host2_if ingress + + return $seen +} + +reportleave_test() +{ + RET=0 + ip address add dev $h2 $TEST_GROUP/32 autojoin + check_err $? "Could not join $TEST_GROUP" + + sleep 5 + bridge mdb show dev br0 | grep $TEST_GROUP 1>/dev/null + check_err $? "Report didn't create mdb entry for $TEST_GROUP" + + mcast_packet_test $TEST_GROUP_MAC $TEST_GROUP $h1 $h2 + check_fail $? "Traffic to $TEST_GROUP wasn't forwarded" + + log_test "IGMP report $TEST_GROUP" + + RET=0 + bridge mdb show dev br0 | grep $TEST_GROUP 1>/dev/null + check_err $? "mdb entry for $TEST_GROUP is missing" + + ip address del dev $h2 $TEST_GROUP/32 + check_err $? "Could not leave $TEST_GROUP" + + sleep 5 + bridge mdb show dev br0 | grep $TEST_GROUP 1>/dev/null + check_fail $? "Leave didn't delete mdb entry for $TEST_GROUP" + + mcast_packet_test $TEST_GROUP_MAC $TEST_GROUP $h1 $h2 + check_err $? "Traffic to $TEST_GROUP was forwarded without mdb entry" + + log_test "IGMP leave $TEST_GROUP" +} + +trap cleanup EXIT + +setup_prepare +setup_wait + +tests_run + +exit $EXIT_STATUS