summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNathan Bahr <nbahr@atcorp.com>2024-10-30 22:03:04 +0100
committerNathan Bahr <nbahr@atcorp.com>2025-01-09 22:58:22 +0100
commit590c937e8a1ddca9d2a11580a289dd406ea6d82c (patch)
treeb227df3b92b5774e00b843ce10ef0befbae8147f
parentpimd: Implement rpf lookup mode as a list (diff)
downloadfrr-590c937e8a1ddca9d2a11580a289dd406ea6d82c.tar.xz
frr-590c937e8a1ddca9d2a11580a289dd406ea6d82c.zip
tests: Add tests for new RPF lookup group and source list features
Expand existing pim_mrib tests to include testing lookup modes specific to source and/or group as defined in prefix lists. Signed-off-by: Nathan Bahr <nbahr@atcorp.com>
-rw-r--r--tests/topotests/pim_mrib/r1/frr.conf3
-rw-r--r--tests/topotests/pim_mrib/r2/frr.conf1
-rw-r--r--tests/topotests/pim_mrib/r3/frr.conf1
-rw-r--r--tests/topotests/pim_mrib/r4/frr.conf14
-rw-r--r--tests/topotests/pim_mrib/test_pim_mrib.py965
5 files changed, 959 insertions, 25 deletions
diff --git a/tests/topotests/pim_mrib/r1/frr.conf b/tests/topotests/pim_mrib/r1/frr.conf
index 28cf2b2c4..7c9d27c60 100644
--- a/tests/topotests/pim_mrib/r1/frr.conf
+++ b/tests/topotests/pim_mrib/r1/frr.conf
@@ -20,9 +20,10 @@ interface r1-eth1
ip forwarding
!
ip route 10.0.2.0/24 10.0.0.2 50
-ip route 10.0.3.0/24 10.0.1.3 50
+ip route 10.0.3.0/24 10.0.0.2 50
!
router pim
rpf-lookup-mode mrib-then-urib
rp 10.0.0.1 224.0.0.0/4
+ rp 10.0.1.1 225.0.0.0/24
! \ No newline at end of file
diff --git a/tests/topotests/pim_mrib/r2/frr.conf b/tests/topotests/pim_mrib/r2/frr.conf
index 3e647f679..260b6b0f7 100644
--- a/tests/topotests/pim_mrib/r2/frr.conf
+++ b/tests/topotests/pim_mrib/r2/frr.conf
@@ -25,4 +25,5 @@ ip route 10.0.3.0/24 10.0.2.4 50
router pim
rpf-lookup-mode mrib-then-urib
rp 10.0.0.1 224.0.0.0/4
+ rp 10.0.1.1 225.0.0.0/24
! \ No newline at end of file
diff --git a/tests/topotests/pim_mrib/r3/frr.conf b/tests/topotests/pim_mrib/r3/frr.conf
index 9815484d0..5966ae0e8 100644
--- a/tests/topotests/pim_mrib/r3/frr.conf
+++ b/tests/topotests/pim_mrib/r3/frr.conf
@@ -25,4 +25,5 @@ ip route 10.0.2.0/24 10.0.3.4 50
router pim
rpf-lookup-mode mrib-then-urib
rp 10.0.0.1 224.0.0.0/4
+ rp 10.0.1.1 225.0.0.0/24
! \ No newline at end of file
diff --git a/tests/topotests/pim_mrib/r4/frr.conf b/tests/topotests/pim_mrib/r4/frr.conf
index 8432a7a35..8d9d8f7e2 100644
--- a/tests/topotests/pim_mrib/r4/frr.conf
+++ b/tests/topotests/pim_mrib/r4/frr.conf
@@ -18,12 +18,24 @@ interface r4-eth1
ip igmp
ip pim
!
+interface r4-dum0
+ ip address 10.10.0.4/24
+ ip igmp
+ ip pim
+ ip pim passive
+!
ip forwarding
!
ip route 10.0.0.0/24 10.0.2.2 50
-ip route 10.0.1.0/24 10.0.3.3 50
+ip route 10.0.1.0/24 10.0.2.2 50
+!
+ip prefix-list SRCPLIST permit 10.0.0.1/32
+ip prefix-list SRCPLIST2 permit 10.0.1.1/32
+ip prefix-list GRPPLIST permit 239.1.1.1/32
+ip prefix-list GRPPLIST2 permit 239.2.2.2/32
!
router pim
rpf-lookup-mode mrib-then-urib
rp 10.0.0.1 224.0.0.0/4
+ rp 10.0.1.1 225.0.0.0/24
! \ No newline at end of file
diff --git a/tests/topotests/pim_mrib/test_pim_mrib.py b/tests/topotests/pim_mrib/test_pim_mrib.py
index 355c503e3..2a391fa57 100644
--- a/tests/topotests/pim_mrib/test_pim_mrib.py
+++ b/tests/topotests/pim_mrib/test_pim_mrib.py
@@ -20,6 +20,8 @@ from lib.topogen import Topogen, get_topogen
from lib.topolog import logger
from lib.pim import (
verify_pim_rp_info,
+ verify_upstream_iif,
+ McastTesterHelper,
)
from lib.common_config import step, write_test_header
@@ -29,6 +31,8 @@ test_pim_mrib.py: Test PIM MRIB overrides and RPF modes
TOPOLOGY = """
Test PIM MRIB overrides and RPF modes
+ Static routes installed that uses R2 to get between R1 and R4.
+ Tests will install MRIB override through R3
+---+---+ +---+---+
| | 10.0.0.0/24 | |
@@ -42,7 +46,7 @@ TOPOLOGY = """
.3 | r3-eth0 r4-eth0 | .4
+---+---+ r3-eth1 r4-eth1 +---+---+
| | .3 .4 | |
- + R3 +----------------------+ R4 |
+ + R3 +----------------------+ R4 |---r4-dum0 10.10.0.4/24
| | 10.0.3.0/24 | |
+---+---+ +---+---+
"""
@@ -54,9 +58,12 @@ sys.path.append(os.path.join(CWD, "../"))
# Required to instantiate the topology builder class.
pytestmark = [pytest.mark.pimd]
+GROUP1 = "239.1.1.1"
+GROUP2 = "239.2.2.2"
+
def build_topo(tgen):
- '''Build function'''
+ """Build function"""
# Create routers
tgen.add_router("r1")
@@ -70,6 +77,8 @@ def build_topo(tgen):
tgen.add_link(tgen.gears["r2"], tgen.gears["r4"], "r2-eth1", "r4-eth0")
tgen.add_link(tgen.gears["r3"], tgen.gears["r4"], "r3-eth1", "r4-eth1")
+ tgen.gears["r4"].run("ip link add r4-dum0 type dummy")
+
def setup_module(mod):
logger.info("PIM MRIB/RPF functionality:\n {}".format(TOPOLOGY))
@@ -87,13 +96,13 @@ def setup_module(mod):
def teardown_module(mod):
- '''Teardown the pytest environment'''
+ """Teardown the pytest environment"""
tgen = get_topogen()
tgen.stop_topology()
def test_pim_mrib_init(request):
- '''Test boot in MRIB-than-URIB with the default MRIB'''
+ """Test boot in MRIB-than-URIB with the default MRIB"""
tgen = get_topogen()
tc_name = request.node.name
write_test_header(tc_name)
@@ -116,8 +125,23 @@ def test_pim_mrib_init(request):
)
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+ result = verify_pim_rp_info(
+ tgen,
+ None,
+ "r4",
+ "225.0.0.0/24",
+ "r4-eth0",
+ "10.0.1.1",
+ "Static",
+ False,
+ "ipv4",
+ True,
+ )
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+
def test_pim_mrib_override(request):
- '''Test MRIB override nexthop'''
+ """Test MRIB override nexthop"""
tgen = get_topogen()
tc_name = request.node.name
write_test_header(tc_name)
@@ -128,10 +152,11 @@ def test_pim_mrib_override(request):
# Install a MRIB route that has a shorter prefix length and lower cost.
# In MRIB-than-URIB mode, it should use this route
tgen.routers()["r4"].vtysh_cmd(
- '''
+ """
conf term
ip mroute 10.0.0.0/16 10.0.3.3 25
- '''
+ exit
+ """
)
step("Verify rp-info using MRIB nexthop")
@@ -149,8 +174,23 @@ def test_pim_mrib_override(request):
)
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+ result = verify_pim_rp_info(
+ tgen,
+ None,
+ "r4",
+ "225.0.0.0/24",
+ "r4-eth1",
+ "10.0.1.1",
+ "Static",
+ False,
+ "ipv4",
+ True,
+ )
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+
def test_pim_mrib_prefix_mode(request):
- '''Test longer prefix lookup mode'''
+ """Test longer prefix lookup mode"""
tgen = get_topogen()
tc_name = request.node.name
write_test_header(tc_name)
@@ -161,11 +201,13 @@ def test_pim_mrib_prefix_mode(request):
# Switch to longer prefix match, should switch back to the URIB route
# even with the lower cost, the longer prefix match will win because of the mode
tgen.routers()["r4"].vtysh_cmd(
- '''
+ """
conf term
router pim
rpf-lookup-mode longer-prefix
- '''
+ exit
+ exit
+ """
)
step("Verify rp-info using URIB nexthop")
@@ -183,8 +225,23 @@ def test_pim_mrib_prefix_mode(request):
)
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+ result = verify_pim_rp_info(
+ tgen,
+ None,
+ "r4",
+ "225.0.0.0/24",
+ "r4-eth0",
+ "10.0.1.1",
+ "Static",
+ False,
+ "ipv4",
+ True,
+ )
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+
def test_pim_mrib_dist_mode(request):
- '''Test lower distance lookup mode'''
+ """Test lower distance lookup mode"""
tgen = get_topogen()
tc_name = request.node.name
write_test_header(tc_name)
@@ -194,11 +251,13 @@ def test_pim_mrib_dist_mode(request):
# Switch to lower distance match, should switch back to the MRIB route
tgen.routers()["r4"].vtysh_cmd(
- '''
+ """
conf term
router pim
rpf-lookup-mode lower-distance
- '''
+ exit
+ exit
+ """
)
step("Verify rp-info using MRIB nexthop")
@@ -216,8 +275,23 @@ def test_pim_mrib_dist_mode(request):
)
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+ result = verify_pim_rp_info(
+ tgen,
+ None,
+ "r4",
+ "225.0.0.0/24",
+ "r4-eth1",
+ "10.0.1.1",
+ "Static",
+ False,
+ "ipv4",
+ True,
+ )
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+
def test_pim_mrib_urib_mode(request):
- '''Test URIB only lookup mode'''
+ """Test URIB only lookup mode"""
tgen = get_topogen()
tc_name = request.node.name
write_test_header(tc_name)
@@ -227,11 +301,13 @@ def test_pim_mrib_urib_mode(request):
# Switch to urib only match, should switch back to the URIB route
tgen.routers()["r4"].vtysh_cmd(
- '''
+ """
conf term
router pim
rpf-lookup-mode urib-only
- '''
+ exit
+ exit
+ """
)
step("Verify rp-info using URIB nexthop")
@@ -249,8 +325,23 @@ def test_pim_mrib_urib_mode(request):
)
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+ result = verify_pim_rp_info(
+ tgen,
+ None,
+ "r4",
+ "225.0.0.0/24",
+ "r4-eth0",
+ "10.0.1.1",
+ "Static",
+ False,
+ "ipv4",
+ True,
+ )
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+
def test_pim_mrib_mrib_mode(request):
- '''Test MRIB only lookup mode'''
+ """Test MRIB only lookup mode"""
tgen = get_topogen()
tc_name = request.node.name
write_test_header(tc_name)
@@ -260,11 +351,13 @@ def test_pim_mrib_mrib_mode(request):
# Switch to mrib only match, should switch back to the MRIB route
tgen.routers()["r4"].vtysh_cmd(
- '''
+ """
conf term
router pim
rpf-lookup-mode mrib-only
- '''
+ exit
+ exit
+ """
)
step("Verify rp-info using MRIB nexthop")
@@ -282,8 +375,23 @@ def test_pim_mrib_mrib_mode(request):
)
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+ result = verify_pim_rp_info(
+ tgen,
+ None,
+ "r4",
+ "225.0.0.0/24",
+ "r4-eth1",
+ "10.0.1.1",
+ "Static",
+ False,
+ "ipv4",
+ True,
+ )
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+
def test_pim_mrib_mrib_mode_no_route(request):
- '''Test MRIB only with no route'''
+ """Test MRIB only with no route"""
tgen = get_topogen()
tc_name = request.node.name
write_test_header(tc_name)
@@ -293,10 +401,11 @@ def test_pim_mrib_mrib_mode_no_route(request):
# Remove the MRIB route, in mrib-only mode, it should switch to no path for the RP
tgen.routers()["r4"].vtysh_cmd(
- '''
+ """
conf term
no ip mroute 10.0.0.0/16 10.0.3.3 25
- '''
+ exit
+ """
)
step("Verify rp-info with Unknown next hop")
@@ -314,8 +423,818 @@ def test_pim_mrib_mrib_mode_no_route(request):
)
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+ result = verify_pim_rp_info(
+ tgen,
+ None,
+ "r4",
+ "225.0.0.0/24",
+ "Unknown",
+ "10.0.1.1",
+ "Static",
+ False,
+ "ipv4",
+ True,
+ )
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+
+def test_pim_mrib_rpf_lookup_source_list_init(request):
+ """Test RPF lookup source list with initial setup"""
+ tgen = get_topogen()
+ tc_name = request.node.name
+ write_test_header(tc_name)
+
+ if tgen.routers_have_failure():
+ pytest.skip("skipped because of router(s) failure")
+
+ # Reset back to mrib then urib mode
+ # Also add mode using SRCPLIST(10.0.0.1) and SRCPLIST2(10.0.1.1)
+ tgen.routers()["r4"].vtysh_cmd(
+ """
+ conf term
+ router pim
+ rpf-lookup-mode mrib-then-urib
+ rpf-lookup-mode mrib-then-urib source-list SRCPLIST
+ rpf-lookup-mode mrib-then-urib source-list SRCPLIST2
+ exit
+ exit
+ """
+ )
+
+ step("Verify rp-info with default next hop")
+ result = verify_pim_rp_info(
+ tgen,
+ None,
+ "r4",
+ "224.0.0.0/4",
+ "r4-eth0",
+ "10.0.0.1",
+ "Static",
+ False,
+ "ipv4",
+ True,
+ )
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+ result = verify_pim_rp_info(
+ tgen,
+ None,
+ "r4",
+ "225.0.0.0/24",
+ "r4-eth0",
+ "10.0.1.1",
+ "Static",
+ False,
+ "ipv4",
+ True,
+ )
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+
+def test_pim_mrib_rpf_lookup_source_list_add_mroute(request):
+ """Test RPF lookup source list with MRIB route on alternate path"""
+ tgen = get_topogen()
+ tc_name = request.node.name
+ write_test_header(tc_name)
+
+ if tgen.routers_have_failure():
+ pytest.skip("skipped because of router(s) failure")
+
+ # Add a MRIB route through r4-eth1 that is better distance but worse prefix
+ tgen.routers()["r4"].vtysh_cmd(
+ """
+ conf term
+ ip mroute 10.0.0.0/16 10.0.3.3 25
+ exit
+ """
+ )
+
+ step("Verify rp-info with MRIB next hop")
+ result = verify_pim_rp_info(
+ tgen,
+ None,
+ "r4",
+ "224.0.0.0/4",
+ "r4-eth1",
+ "10.0.0.1",
+ "Static",
+ False,
+ "ipv4",
+ True,
+ )
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+ result = verify_pim_rp_info(
+ tgen,
+ None,
+ "r4",
+ "225.0.0.0/24",
+ "r4-eth1",
+ "10.0.1.1",
+ "Static",
+ False,
+ "ipv4",
+ True,
+ )
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+
+def test_pim_mrib_rpf_lookup_source_list_src1_prefix_mode(request):
+ """Test RPF lookup source list src1 longer prefix mode"""
+ tgen = get_topogen()
+ tc_name = request.node.name
+ write_test_header(tc_name)
+
+ if tgen.routers_have_failure():
+ pytest.skip("skipped because of router(s) failure")
+
+ # Switch just source 1 to longest prefix
+ tgen.routers()["r4"].vtysh_cmd(
+ """
+ conf term
+ router pim
+ rpf-lookup-mode longer-prefix source-list SRCPLIST
+ exit
+ exit
+ """
+ )
+
+ step("Verify rp-info with URIB next hop for source 1 and MRIB for source 2")
+ result = verify_pim_rp_info(
+ tgen,
+ None,
+ "r4",
+ "224.0.0.0/4",
+ "r4-eth0",
+ "10.0.0.1",
+ "Static",
+ False,
+ "ipv4",
+ True,
+ )
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+ result = verify_pim_rp_info(
+ tgen,
+ None,
+ "r4",
+ "225.0.0.0/24",
+ "r4-eth1",
+ "10.0.1.1",
+ "Static",
+ False,
+ "ipv4",
+ True,
+ )
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+
+def test_pim_mrib_rpf_lookup_source_list_src1_dist_src2_prefix_mode(request):
+ """Test RPF lookup source list src1 lower distance mode and src2 longer prefix mode"""
+ tgen = get_topogen()
+ tc_name = request.node.name
+ write_test_header(tc_name)
+
+ if tgen.routers_have_failure():
+ pytest.skip("skipped because of router(s) failure")
+
+ # Switch source 1 to shortest distance, source 2 to longest prefix
+ tgen.routers()["r4"].vtysh_cmd(
+ """
+ conf term
+ router pim
+ rpf-lookup-mode lower-distance source-list SRCPLIST
+ rpf-lookup-mode longer-prefix source-list SRCPLIST2
+ exit
+ exit
+ """
+ )
+
+ step("Verify rp-info with MRIB next hop for source 1 and URIB for source 2")
+ result = verify_pim_rp_info(
+ tgen,
+ None,
+ "r4",
+ "224.0.0.0/4",
+ "r4-eth1",
+ "10.0.0.1",
+ "Static",
+ False,
+ "ipv4",
+ True,
+ )
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+ result = verify_pim_rp_info(
+ tgen,
+ None,
+ "r4",
+ "225.0.0.0/24",
+ "r4-eth0",
+ "10.0.1.1",
+ "Static",
+ False,
+ "ipv4",
+ True,
+ )
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+
+def test_pim_mrib_rpf_lookup_source_list_src1_urib_src2_dist_mode(request):
+ """Test RPF lookup source list src1 urib mode and src2 lower distance mode"""
+ tgen = get_topogen()
+ tc_name = request.node.name
+ write_test_header(tc_name)
+
+ if tgen.routers_have_failure():
+ pytest.skip("skipped because of router(s) failure")
+
+ # Switch source 1 to urib only, source 2 to shorter distance
+ tgen.routers()["r4"].vtysh_cmd(
+ """
+ conf term
+ router pim
+ rpf-lookup-mode urib-only source-list SRCPLIST
+ rpf-lookup-mode lower-distance source-list SRCPLIST2
+ exit
+ exit
+ """
+ )
+
+ step("Verify rp-info with URIB next hop for source 1 and MRIB for source 2")
+ result = verify_pim_rp_info(
+ tgen,
+ None,
+ "r4",
+ "224.0.0.0/4",
+ "r4-eth0",
+ "10.0.0.1",
+ "Static",
+ False,
+ "ipv4",
+ True,
+ )
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+ result = verify_pim_rp_info(
+ tgen,
+ None,
+ "r4",
+ "225.0.0.0/24",
+ "r4-eth1",
+ "10.0.1.1",
+ "Static",
+ False,
+ "ipv4",
+ True,
+ )
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+
+def test_pim_mrib_rpf_lookup_source_list_src1_mrib_src2_urib_mode(request):
+ """Test RPF lookup source list src1 mrib mode and src2 urib mode"""
+ tgen = get_topogen()
+ tc_name = request.node.name
+ write_test_header(tc_name)
+
+ if tgen.routers_have_failure():
+ pytest.skip("skipped because of router(s) failure")
+
+ # Switch source 1 to mrib only, source 2 to urib only
+ tgen.routers()["r4"].vtysh_cmd(
+ """
+ conf term
+ router pim
+ rpf-lookup-mode mrib-only source-list SRCPLIST
+ rpf-lookup-mode urib-only source-list SRCPLIST2
+ exit
+ exit
+ """
+ )
+
+ step("Verify rp-info with MRIB next hop for source 1 and URIB for source 2")
+ result = verify_pim_rp_info(
+ tgen,
+ None,
+ "r4",
+ "224.0.0.0/4",
+ "r4-eth1",
+ "10.0.0.1",
+ "Static",
+ False,
+ "ipv4",
+ True,
+ )
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+ result = verify_pim_rp_info(
+ tgen,
+ None,
+ "r4",
+ "225.0.0.0/24",
+ "r4-eth0",
+ "10.0.1.1",
+ "Static",
+ False,
+ "ipv4",
+ True,
+ )
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+
+def test_pim_mrib_rpf_lookup_source_list_removed(request):
+ """Test RPF lookup source list removed"""
+ tgen = get_topogen()
+ tc_name = request.node.name
+ write_test_header(tc_name)
+
+ if tgen.routers_have_failure():
+ pytest.skip("skipped because of router(s) failure")
+
+ # Remove both special modes, both should switch to MRIB route
+ tgen.routers()["r4"].vtysh_cmd(
+ """
+ conf term
+ router pim
+ no rpf-lookup-mode mrib-only source-list SRCPLIST
+ no rpf-lookup-mode urib-only source-list SRCPLIST2
+ exit
+ exit
+ """
+ )
+
+ step("Verify rp-info with MRIB next hop for both sources")
+ result = verify_pim_rp_info(
+ tgen,
+ None,
+ "r4",
+ "224.0.0.0/4",
+ "r4-eth1",
+ "10.0.0.1",
+ "Static",
+ False,
+ "ipv4",
+ True,
+ )
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+ result = verify_pim_rp_info(
+ tgen,
+ None,
+ "r4",
+ "225.0.0.0/24",
+ "r4-eth1",
+ "10.0.1.1",
+ "Static",
+ False,
+ "ipv4",
+ True,
+ )
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+
+def test_pim_mrib_rpf_lookup_source_list_del_mroute(request):
+ """Test RPF lookup source list delete mroute"""
+ tgen = get_topogen()
+ tc_name = request.node.name
+ write_test_header(tc_name)
+
+ if tgen.routers_have_failure():
+ pytest.skip("skipped because of router(s) failure")
+
+ # Remove the MRIB route, both should switch to URIB
+ tgen.routers()["r4"].vtysh_cmd(
+ """
+ conf term
+ no ip mroute 10.0.0.0/16 10.0.3.3 25
+ exit
+ """
+ )
+
+ step("Verify rp-info with URIB next hop for both sources")
+ result = verify_pim_rp_info(
+ tgen,
+ None,
+ "r4",
+ "224.0.0.0/4",
+ "r4-eth0",
+ "10.0.0.1",
+ "Static",
+ False,
+ "ipv4",
+ True,
+ )
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+ result = verify_pim_rp_info(
+ tgen,
+ None,
+ "r4",
+ "225.0.0.0/24",
+ "r4-eth0",
+ "10.0.1.1",
+ "Static",
+ False,
+ "ipv4",
+ True,
+ )
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
+
+
+def test_pim_mrib_rpf_lookup_group_list(request):
+ """Test RPF lookup group list"""
+ tgen = get_topogen()
+ tc_name = request.node.name
+ write_test_header(tc_name)
+
+ if tgen.routers_have_failure():
+ pytest.skip("skipped because of router(s) failure")
+
+ with McastTesterHelper(tgen) as apphelper:
+ step(
+ ("Send multicast traffic from R1 to dense groups {}, {}").format(
+ GROUP1, GROUP2
+ )
+ )
+ result = apphelper.run_traffic("r1", [GROUP1, GROUP2], bind_intf="r1-eth1")
+ assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
+
+ # Reset back to mrib then urib mode
+ # Also add mode using GRPPLIST(239.1.1.1) and GRPPLIST2(239.2.2.2)
+ # And do an igmp join to both groups on r4-eth2
+ tgen.routers()["r4"].vtysh_cmd(
+ """
+ conf term
+ router pim
+ rpf-lookup-mode mrib-then-urib
+ rpf-lookup-mode mrib-then-urib group-list GRPPLIST
+ rpf-lookup-mode mrib-then-urib group-list GRPPLIST2
+ exit
+ int r4-dum0
+ ip igmp join-group {}
+ ip igmp join-group {}
+ exit
+ exit
+ """.format(
+ GROUP1, GROUP2
+ )
+ )
+
+ step("Verify upstream iif with default next hop")
+ result = verify_upstream_iif(tgen, "r4", "r4-eth0", "10.0.1.1", GROUP1)
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+ result = verify_upstream_iif(tgen, "r4", "r4-eth0", "10.0.1.1", GROUP2)
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+ step("Add MRIB route through alternate path")
+ tgen.routers()["r4"].vtysh_cmd(
+ """
+ conf term
+ ip mroute 10.0.0.0/16 10.0.3.3 25
+ exit
+ """
+ )
+
+ step("Verify upstream iif with alternate next hop")
+ result = verify_upstream_iif(tgen, "r4", "r4-eth1", "10.0.1.1", GROUP1)
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+ result = verify_upstream_iif(tgen, "r4", "r4-eth1", "10.0.1.1", GROUP2)
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+ step("Switch group1 to longer prefix match (URIB)")
+ tgen.routers()["r4"].vtysh_cmd(
+ """
+ conf term
+ router pim
+ rpf-lookup-mode longer-prefix group-list GRPPLIST
+ exit
+ exit
+ """.format(
+ GROUP1, GROUP2
+ )
+ )
+
+ step("Verify upstream iif of group1 is URIB, group2 is MRIB")
+ result = verify_upstream_iif(tgen, "r4", "r4-eth0", "10.0.1.1", GROUP1)
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+ result = verify_upstream_iif(tgen, "r4", "r4-eth1", "10.0.1.1", GROUP2)
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+ step(
+ "Switch group1 to lower distance match (MRIB), and group2 to longer prefix (URIB)"
+ )
+ tgen.routers()["r4"].vtysh_cmd(
+ """
+ conf term
+ router pim
+ rpf-lookup-mode lower-distance group-list GRPPLIST
+ rpf-lookup-mode longer-prefix group-list GRPPLIST2
+ exit
+ exit
+ """.format(
+ GROUP1, GROUP2
+ )
+ )
+
+ step("Verify upstream iif of group1 is MRIB, group2 is URIB")
+ result = verify_upstream_iif(tgen, "r4", "r4-eth1", "10.0.1.1", GROUP1)
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+ result = verify_upstream_iif(tgen, "r4", "r4-eth0", "10.0.1.1", GROUP2)
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+ step("Switch group1 to urib match only, and group2 to lower distance (URIB)")
+ tgen.routers()["r4"].vtysh_cmd(
+ """
+ conf term
+ router pim
+ rpf-lookup-mode urib-only group-list GRPPLIST
+ rpf-lookup-mode lower-distance group-list GRPPLIST2
+ exit
+ exit
+ """.format(
+ GROUP1, GROUP2
+ )
+ )
+
+ step("Verify upstream iif of group1 is URIB, group2 is MRIB")
+ result = verify_upstream_iif(tgen, "r4", "r4-eth0", "10.0.1.1", GROUP1)
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+ result = verify_upstream_iif(tgen, "r4", "r4-eth1", "10.0.1.1", GROUP2)
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+ step("Switch group1 to mrib match only, and group2 to urib match only")
+ tgen.routers()["r4"].vtysh_cmd(
+ """
+ conf term
+ router pim
+ rpf-lookup-mode mrib-only group-list GRPPLIST
+ rpf-lookup-mode urib-only group-list GRPPLIST2
+ exit
+ exit
+ """.format(
+ GROUP1, GROUP2
+ )
+ )
+
+ step("Verify upstream iif of group1 is MRIB, group2 is URIB")
+ result = verify_upstream_iif(tgen, "r4", "r4-eth1", "10.0.1.1", GROUP1)
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+ result = verify_upstream_iif(tgen, "r4", "r4-eth0", "10.0.1.1", GROUP2)
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+ step("Delete MRIB route")
+ tgen.routers()["r4"].vtysh_cmd(
+ """
+ conf term
+ no ip mroute 10.0.0.0/16 10.0.3.3 25
+ exit
+ """.format(
+ GROUP1, GROUP2
+ )
+ )
+
+ step("Verify upstream iif of group1 is Unknown, group2 is URIB")
+ result = verify_upstream_iif(
+ tgen, "r4", "Unknown", "10.0.1.1", GROUP1, "NotJoined"
+ )
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+ result = verify_upstream_iif(tgen, "r4", "r4-eth0", "10.0.1.1", GROUP2)
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+
+def test_pim_mrib_rpf_lookup_source_group_lists(request):
+ """Test RPF lookup source and group lists"""
+ tgen = get_topogen()
+ tc_name = request.node.name
+ write_test_header(tc_name)
+
+ if tgen.routers_have_failure():
+ pytest.skip("skipped because of router(s) failure")
+
+ with McastTesterHelper(tgen) as apphelper:
+ step(
+ ("Send multicast traffic from R1 to dense groups {}, {}").format(
+ GROUP1, GROUP2
+ )
+ )
+ result = apphelper.run_traffic("r1", [GROUP1, GROUP2], bind_intf="r1-eth1")
+ assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
+
+ # Reset back to mrib then urib mode
+ # Also add mode using GRPPLIST(239.1.1.1) and GRPPLIST2(239.2.2.2), both using SRCPLIST2
+ # And do an igmp join to both groups on r4-eth2
+ tgen.routers()["r4"].vtysh_cmd(
+ """
+ conf term
+ router pim
+ rpf-lookup-mode mrib-then-urib
+ rpf-lookup-mode mrib-then-urib group-list GRPPLIST source-list SRCPLIST2
+ rpf-lookup-mode mrib-then-urib group-list GRPPLIST2 source-list SRCPLIST2
+ exit
+ int r4-dum0
+ ip igmp join-group {}
+ ip igmp join-group {}
+ exit
+ exit
+ """.format(
+ GROUP1, GROUP2
+ )
+ )
+
+ step("Verify upstream iif with default next hop")
+ result = verify_upstream_iif(tgen, "r4", "r4-eth0", "10.0.1.1", GROUP1)
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+ result = verify_upstream_iif(tgen, "r4", "r4-eth0", "10.0.1.1", GROUP2)
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+ step("Add MRIB route through alternate path")
+ tgen.routers()["r4"].vtysh_cmd(
+ """
+ conf term
+ ip mroute 10.0.0.0/16 10.0.3.3 25
+ exit
+ """
+ )
+
+ step("Verify upstream iif with alternate next hop")
+ result = verify_upstream_iif(tgen, "r4", "r4-eth1", "10.0.1.1", GROUP1)
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+ result = verify_upstream_iif(tgen, "r4", "r4-eth1", "10.0.1.1", GROUP2)
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+ step("Switch group1 to longer prefix match (URIB)")
+ tgen.routers()["r4"].vtysh_cmd(
+ """
+ conf term
+ router pim
+ rpf-lookup-mode longer-prefix group-list GRPPLIST source-list SRCPLIST2
+ exit
+ exit
+ """.format(
+ GROUP1, GROUP2
+ )
+ )
+
+ step("Verify upstream iif of group1 is URIB, group2 is MRIB")
+ result = verify_upstream_iif(tgen, "r4", "r4-eth0", "10.0.1.1", GROUP1)
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+ result = verify_upstream_iif(tgen, "r4", "r4-eth1", "10.0.1.1", GROUP2)
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+ step(
+ "Switch group1 to lower distance match (MRIB), and group2 to longer prefix (URIB)"
+ )
+ tgen.routers()["r4"].vtysh_cmd(
+ """
+ conf term
+ router pim
+ rpf-lookup-mode lower-distance group-list GRPPLIST source-list SRCPLIST2
+ rpf-lookup-mode longer-prefix group-list GRPPLIST2 source-list SRCPLIST2
+ exit
+ exit
+ """.format(
+ GROUP1, GROUP2
+ )
+ )
+
+ step("Verify upstream iif of group1 is MRIB, group2 is URIB")
+ result = verify_upstream_iif(tgen, "r4", "r4-eth1", "10.0.1.1", GROUP1)
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+ result = verify_upstream_iif(tgen, "r4", "r4-eth0", "10.0.1.1", GROUP2)
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+ step("Switch group1 to urib match only, and group2 to lower distance (URIB)")
+ tgen.routers()["r4"].vtysh_cmd(
+ """
+ conf term
+ router pim
+ rpf-lookup-mode urib-only group-list GRPPLIST source-list SRCPLIST2
+ rpf-lookup-mode lower-distance group-list GRPPLIST2 source-list SRCPLIST2
+ exit
+ exit
+ """.format(
+ GROUP1, GROUP2
+ )
+ )
+
+ step("Verify upstream iif of group1 is URIB, group2 is MRIB")
+ result = verify_upstream_iif(tgen, "r4", "r4-eth0", "10.0.1.1", GROUP1)
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+ result = verify_upstream_iif(tgen, "r4", "r4-eth1", "10.0.1.1", GROUP2)
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+ step("Switch group1 to mrib match only, and group2 to urib match only")
+ tgen.routers()["r4"].vtysh_cmd(
+ """
+ conf term
+ router pim
+ rpf-lookup-mode mrib-only group-list GRPPLIST source-list SRCPLIST2
+ rpf-lookup-mode urib-only group-list GRPPLIST2 source-list SRCPLIST2
+ exit
+ exit
+ """.format(
+ GROUP1, GROUP2
+ )
+ )
+
+ step("Verify upstream iif of group1 is MRIB, group2 is URIB")
+ result = verify_upstream_iif(tgen, "r4", "r4-eth1", "10.0.1.1", GROUP1)
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+ result = verify_upstream_iif(tgen, "r4", "r4-eth0", "10.0.1.1", GROUP2)
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+ step("Delete MRIB route")
+ tgen.routers()["r4"].vtysh_cmd(
+ """
+ conf term
+ no ip mroute 10.0.0.0/16 10.0.3.3 25
+ exit
+ """.format(
+ GROUP1, GROUP2
+ )
+ )
+
+ step("Verify upstream iif of group1 is Unknown, group2 is URIB")
+ result = verify_upstream_iif(
+ tgen, "r4", "Unknown", "10.0.1.1", GROUP1, "NotJoined"
+ )
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+ result = verify_upstream_iif(tgen, "r4", "r4-eth0", "10.0.1.1", GROUP2)
+ assert result is True, "Testcase {} :Failed \n Error: {}".format(
+ tc_name, result
+ )
+
+
def test_memory_leak():
- '''Run the memory leak test and report results.'''
+ """Run the memory leak test and report results."""
tgen = get_topogen()
if not tgen.is_memleak_enabled():
pytest.skip("Memory leak test/report is disabled")