]> git.puffer.fish Git - mirror/frr.git/commitdiff
tests: Add tests for new RPF lookup group and source list features
authorNathan Bahr <nbahr@atcorp.com>
Wed, 30 Oct 2024 21:03:04 +0000 (21:03 +0000)
committerNathan Bahr <nbahr@atcorp.com>
Thu, 9 Jan 2025 21:58:22 +0000 (21:58 +0000)
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>
tests/topotests/pim_mrib/r1/frr.conf
tests/topotests/pim_mrib/r2/frr.conf
tests/topotests/pim_mrib/r3/frr.conf
tests/topotests/pim_mrib/r4/frr.conf
tests/topotests/pim_mrib/test_pim_mrib.py

index 28cf2b2c460f151a3e5df636b57d33743f2458a2..7c9d27c60beff38e00d699d61a0fcef751c010da 100644 (file)
@@ -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
index 3e647f6795d2ca19fe0e5bcc5e122cc112fac7bf..260b6b0f72c585fa0bced8c818c2342cc81cda64 100644 (file)
@@ -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
index 9815484d02d5ce77e57963f5d093beff414fc5e6..5966ae0e8c324b4f08b9506c4329fd2a31e4d28b 100644 (file)
@@ -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
index 8432a7a35044790c9e8bc088fc0256f8a5429070..8d9d8f7e2b52f73d2e5665bda4ae0dea98f5a1e0 100644 (file)
@@ -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
index 355c503e3b83ff6157e6db79e95fa72e76934bbd..2a391fa575c6164224dea09bafe880112fcd8a3f 100644 (file)
@@ -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")