diff --git a/orchagent/p4orch/tests/Makefile.am b/orchagent/p4orch/tests/Makefile.am index 19ec88a617..a5f4d581aa 100644 --- a/orchagent/p4orch/tests/Makefile.am +++ b/orchagent/p4orch/tests/Makefile.am @@ -54,6 +54,7 @@ p4orch_tests_SOURCES = $(ORCHAGENT_DIR)/orch.cpp \ fake_crmorch.cpp \ fake_flexcounterorch.cpp \ fake_flowcounterrouteorch.cpp \ + fake_routeorch.cpp \ fake_dbconnector.cpp \ fake_producertable.cpp \ fake_consumerstatetable.cpp \ diff --git a/orchagent/p4orch/tests/fake_routeorch.cpp b/orchagent/p4orch/tests/fake_routeorch.cpp new file mode 100644 index 0000000000..4baeaaae65 --- /dev/null +++ b/orchagent/p4orch/tests/fake_routeorch.cpp @@ -0,0 +1,24 @@ +extern "C" { +#include +#include +} + + +#include "ipaddress.h" +#include "ipaddresses.h" +#include "ipprefix.h" + +#include "orch.h" + +class RouteOrch +{ +public: + RouteOrch(); + + void addLinkLocalRouteToMe(sai_object_id_t vrf_id, swss::IpPrefix linklocal_prefix); + void delLinkLocalRouteToMe(sai_object_id_t vrf_id, swss::IpPrefix linklocal_prefix); +}; + +RouteOrch::RouteOrch() {}; +void RouteOrch::addLinkLocalRouteToMe(sai_object_id_t vrf_id, swss::IpPrefix linklocal_prefix) {}; +void RouteOrch::delLinkLocalRouteToMe(sai_object_id_t vrf_id, swss::IpPrefix linklocal_prefix) {}; diff --git a/orchagent/p4orch/tests/test_main.cpp b/orchagent/p4orch/tests/test_main.cpp index 0ad50751bc..a6687ea579 100644 --- a/orchagent/p4orch/tests/test_main.cpp +++ b/orchagent/p4orch/tests/test_main.cpp @@ -15,6 +15,7 @@ extern "C" #include "mock_sai_virtual_router.h" #include "p4orch.h" #include "portsorch.h" +#include "routeorch.h" #include "sai_serialize.h" #include "switchorch.h" #include "vrforch.h" @@ -52,6 +53,7 @@ CrmOrch *gCrmOrch; P4Orch *gP4Orch; VRFOrch *gVrfOrch; FlowCounterRouteOrch *gFlowCounterRouteOrch; +RouteOrch *gRouteOrch; SwitchOrch *gSwitchOrch; Directory gDirectory; swss::DBConnector *gAppDb; diff --git a/orchagent/vrforch.cpp b/orchagent/vrforch.cpp index a47661412f..d10511d11a 100644 --- a/orchagent/vrforch.cpp +++ b/orchagent/vrforch.cpp @@ -8,6 +8,7 @@ #include "sai.h" #include "macaddress.h" #include "orch.h" +#include "routeorch.h" #include "request_parser.h" #include "vrforch.h" #include "vxlanorch.h" @@ -22,6 +23,7 @@ extern sai_object_id_t gSwitchId; extern Directory gDirectory; extern PortsOrch* gPortsOrch; +extern RouteOrch* gRouteOrch; extern FlowCounterRouteOrch* gFlowCounterRouteOrch; bool VRFOrch::addOperation(const Request& request) @@ -108,6 +110,12 @@ bool VRFOrch::addOperation(const Request& request) vrf_table_[vrf_name].ref_count = 0; vrf_id_table_[router_id] = vrf_name; gFlowCounterRouteOrch->onAddVR(router_id); + if (gRouteOrch != nullptr) { + IpPrefix default_link_local_prefix("fe80::/10"); + gRouteOrch->addLinkLocalRouteToMe(router_id, default_link_local_prefix); + SWSS_LOG_NOTICE("Created link local ipv6 route %s to cpu for VRF '%s'", + default_link_local_prefix.to_string().c_str(), vrf_name.c_str()); + } if (vni != 0) { SWSS_LOG_INFO("VRF '%s' vni %d add", vrf_name.c_str(), vni); @@ -170,6 +178,11 @@ bool VRFOrch::delOperation(const Request& request) return false; sai_object_id_t router_id = vrf_table_[vrf_name].vrf_id; + // Delete link-local routes before removing VRF + if (gRouteOrch != nullptr) { + IpPrefix default_link_local_prefix("fe80::/10"); + gRouteOrch->delLinkLocalRouteToMe(router_id, default_link_local_prefix); + } sai_status_t status = sai_virtual_router_api->remove_virtual_router(router_id); if (status != SAI_STATUS_SUCCESS) {