Skip to content

Commit ac3103a

Browse files
authored
Add missing neighbor resolution for MPLS route programming (sonic-net#1968)
* Added unit test to test unresolved neighbor entries.
1 parent bfba0ad commit ac3103a

File tree

2 files changed

+58
-19
lines changed

2 files changed

+58
-19
lines changed

orchagent/mplsrouteorch.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -526,6 +526,7 @@ bool RouteOrch::addLabelRoute(LabelRouteBulkContext& ctx, const NextHopGroupKey
526526
{
527527
SWSS_LOG_INFO("Failed to get next hop %s for %u",
528528
nextHops.to_string().c_str(), label);
529+
m_neighOrch->resolveNeighbor(nexthop);
529530
return false;
530531
}
531532
}

tests/test_mpls.py

+57-19
Original file line numberDiff line numberDiff line change
@@ -598,46 +598,84 @@ def test_RouteAddRemoveMplsRouteMixedNHG(self, dvs, testlog):
598598

599599
self.teardown_mpls(dvs)
600600

601-
def test_RouteUnresolvedMplsRouteSwap(self, dvs, testlog):
602-
self.setup_mpls(dvs, False)
601+
def test_RouteAddRemoveMplsRouteResolveNeigh(self, dvs, testlog):
602+
if not self.mpls_appdb_mode():
603+
dvs.runcmd("modprobe mpls_router")
604+
dvs.runcmd("modprobe mpls_iptunnel")
605+
dvs.runcmd("sysctl -w net.mpls.platform_labels=1000")
603606

604-
# add route entry
605-
label = "200"
607+
self.setup_db(dvs)
608+
609+
self.clear_srv_config(dvs)
610+
611+
# create mpls interface
612+
self.create_mpls_intf("Ethernet0")
613+
self.create_mpls_intf("Ethernet4")
614+
615+
# set ip address
616+
self.add_ip_address("Ethernet0", "10.0.0.0/31")
617+
self.add_ip_address("Ethernet4", "10.0.0.2/31")
618+
619+
# bring up interface
620+
self.set_admin_status("Ethernet0", "up")
621+
self.set_admin_status("Ethernet4", "up")
622+
623+
# set ip address and default route
624+
dvs.servers[0].runcmd("ip address add 10.0.0.1/31 dev eth0")
625+
dvs.servers[0].runcmd("ip route add default via 10.0.0.0")
626+
627+
dvs.servers[1].runcmd("ip address add 10.0.0.3/31 dev eth0")
628+
dvs.servers[1].runcmd("ip route add default via 10.0.0.2")
629+
time.sleep(2)
630+
631+
# add route entries. The neighbor entries for 10.0.0.1 and 10.0.0.3 are not yet resolved, so will trigger an ARP request
632+
label = "100"
633+
label2 = "200"
606634
if self.mpls_appdb_mode():
607-
fieldValues = {"nexthop": "10.0.0.1", "ifname": "Ethernet0", "mpls_nh": "swap201", "mpls_pop": "1"}
635+
fieldValues = {"nexthop": "10.0.0.1", "ifname": "Ethernet0", "mpls_nh": "swap101", "mpls_pop": "1"}
608636
self.create_inseg_entry(label, fieldValues)
637+
fieldValues = {"nexthop": "10.0.0.1,10.0.0.3", "ifname": "Ethernet0,Ethernet4", "mpls_nh": "swap201,swap202", "mpls_pop": "1"}
638+
self.create_inseg_entry(label2, fieldValues)
609639
else:
610-
# dvs.runcmd("ip -f mpls route add 200 as 201 via inet 10.0.0.1 dev Ethernet0")
611-
dvs.runcmd("vtysh -c \"configure terminal\" -c \"mpls lsp 200 10.0.0.1 201\"")
640+
dvs.runcmd("ip -f mpls route add 100 nexthop as 101 via inet 10.0.0.1 dev Ethernet0")
641+
dvs.runcmd("ip -f mpls route add 200 nexthop as 201 via inet 10.0.0.1 dev Ethernet0 nexthop as 202 via inet 10.0.0.3 dev Ethernet4")
612642

613643
# check application database
614644
self.pdb.wait_for_entry("LABEL_ROUTE_TABLE", label)
645+
self.pdb.wait_for_entry("LABEL_ROUTE_TABLE", label2)
615646

616-
# check ASIC inseg database. inseg with unresolved NH should not be present.
617-
self.check_inseg_entries(False, [label])
618-
self.check_nexthop(False, "SAI_NEXT_HOP_TYPE_MPLS", "10.0.0.1", "SAI_OUTSEG_TYPE_SWAP", "1:201")
619-
620-
# now resolve the NH
621-
dvs.servers[0].runcmd("ping -c 1 10.0.0.3")
622-
dvs.servers[2].runcmd("ping -c 1 10.0.0.3")
647+
# check neighbor got resolved and removed from NEIGH_RESOLVE_TABLE
648+
self.pdb.wait_for_deleted_entry("NEIGH_RESOLVE_TABLE", "Ethernet0:10.0.0.1")
649+
self.pdb.wait_for_deleted_entry("NEIGH_RESOLVE_TABLE", "Ethernet4:10.0.0.3")
623650

624651
# check ASIC inseg database
625652
self.check_inseg_entries(True, [label])
626-
self.check_inseg_nexthop(label, "SAI_NEXT_HOP_TYPE_MPLS", "10.0.0.1", "SAI_OUTSEG_TYPE_SWAP", "1:201")
653+
self.check_inseg_nexthop(label, "SAI_NEXT_HOP_TYPE_MPLS", "10.0.0.1", "SAI_OUTSEG_TYPE_SWAP", "1:101")
654+
self.check_inseg_entries(True, [label2])
655+
self.check_inseg_nexthop_group(label2, 2)
656+
self.check_nexthop(True, "SAI_NEXT_HOP_TYPE_MPLS", "10.0.0.1", "SAI_OUTSEG_TYPE_SWAP", "1:201")
657+
self.check_nexthop(True, "SAI_NEXT_HOP_TYPE_MPLS", "10.0.0.3", "SAI_OUTSEG_TYPE_SWAP", "1:202")
658+
nhg = self.get_inseg_nexthop(label)
627659

628-
# remove route entry
660+
# remove inseg entry
629661
if self.mpls_appdb_mode():
630662
self.remove_inseg_entry(label)
663+
self.remove_inseg_entry(label2)
631664
else:
632-
# dvs.runcmd("ip -f mpls route del 200 as 201 via inet 10.0.0.1 dev Ethernet0")
633-
dvs.runcmd("vtysh -c \"configure terminal\" -c \"no mpls lsp 200 10.0.0.1 201\"")
665+
dvs.runcmd("ip -f mpls route del 100 nexthop as 101 via inet 10.0.0.1 dev Ethernet0")
666+
dvs.runcmd("ip -f mpls route del 200 nexthop as 201 via inet 10.0.0.1 dev Ethernet0 nexthop as 202 via inet 10.0.0.3 dev Ethernet4")
634667

635668
# check application database
636669
self.pdb.wait_for_deleted_entry("LABEL_ROUTE_TABLE", label)
670+
self.pdb.wait_for_deleted_entry("LABEL_ROUTE_TABLE", label2)
637671

638-
# check ASIC inseg database
672+
# check ASIC route database
639673
self.check_inseg_entries(False, [label])
674+
self.check_inseg_entries(False, [label2])
675+
self.check_nexthop_group(False, nhg)
676+
self.check_nexthop(False, "SAI_NEXT_HOP_TYPE_MPLS", "10.0.0.1", "SAI_OUTSEG_TYPE_SWAP", "1:101")
640677
self.check_nexthop(False, "SAI_NEXT_HOP_TYPE_MPLS", "10.0.0.1", "SAI_OUTSEG_TYPE_SWAP", "1:201")
678+
self.check_nexthop(False, "SAI_NEXT_HOP_TYPE_MPLS", "10.0.0.3", "SAI_OUTSEG_TYPE_SWAP", "1:202")
641679

642680
self.teardown_mpls(dvs)
643681

0 commit comments

Comments
 (0)