@@ -174,7 +174,7 @@ void RouteSync::setRouteWithWarmRestart(FieldValueTupleWrapperBase & fvw,
174174 }
175175 else
176176 {
177- m_warmStartHelper.insertRefreshMap (fvw.KeyOpFieldsValuesTupleVector ()[1 ]);
177+ m_warmStartHelper.insertRefreshMap (fvw.KeyOpFieldsValuesTupleVector ()[0 ]);
178178 }
179179}
180180
@@ -923,39 +923,17 @@ bool RouteSync::getSrv6SteerRouteNextHop(struct nlmsghdr *h, int received_bytes,
923923vector<FieldValueTuple>
924924RouteTableFieldValueTupleWrapper::fieldValueTupleVector () {
925925 vector<FieldValueTuple> fvVector;
926- if (protocol != string ()) {
927- fvVector.push_back (FieldValueTuple (" protocol" , protocol.c_str ()));
928- }
929- if (blackhole != string ()) {
930- fvVector.push_back (FieldValueTuple (" blackhole" , blackhole.c_str ()));
931- }
932- if (nexthop != string ()) {
933- fvVector.push_back (FieldValueTuple (" nexthop" , nexthop.c_str ()));
934- }
935- if (ifname != string ()) {
936- fvVector.push_back (FieldValueTuple (" ifname" , ifname.c_str ()));
937- }
938- if (nexthop_group != string ()) {
939- fvVector.push_back (FieldValueTuple (" nexthop_group" , nexthop_group.c_str ()));
940- }
941- if (mpls_nh != string ()) {
942- fvVector.push_back (FieldValueTuple (" mpls_nh" , mpls_nh.c_str ()));
943- }
944- if (weight != string ()) {
945- fvVector.push_back (FieldValueTuple (" weight" , weight.c_str ()));
946- }
947- if (vni_label != string ()) {
948- fvVector.push_back (FieldValueTuple (" vni_label" , vni_label.c_str ()));
949- }
950- if (router_mac != string ()) {
951- fvVector.push_back (FieldValueTuple (" router_mac" , router_mac.c_str ()));
952- }
953- if (segment != string ()) {
954- fvVector.push_back (FieldValueTuple (" segment" , segment.c_str ()));
955- }
956- if (seg_src != string ()) {
957- fvVector.push_back (FieldValueTuple (" seg_src" , seg_src.c_str ()));
958- }
926+ fvVector.push_back (FieldValueTuple (" protocol" , protocol.c_str ()));
927+ fvVector.push_back (FieldValueTuple (" blackhole" , blackhole.c_str ()));
928+ fvVector.push_back (FieldValueTuple (" nexthop" , nexthop.c_str ()));
929+ fvVector.push_back (FieldValueTuple (" ifname" , ifname.c_str ()));
930+ fvVector.push_back (FieldValueTuple (" nexthop_group" , nexthop_group.c_str ()));
931+ fvVector.push_back (FieldValueTuple (" mpls_nh" , mpls_nh.c_str ()));
932+ fvVector.push_back (FieldValueTuple (" weight" , weight.c_str ()));
933+ fvVector.push_back (FieldValueTuple (" vni_label" , vni_label.c_str ()));
934+ fvVector.push_back (FieldValueTuple (" router_mac" , router_mac.c_str ()));
935+ fvVector.push_back (FieldValueTuple (" segment" , segment.c_str ()));
936+ fvVector.push_back (FieldValueTuple (" seg_src" , seg_src.c_str ()));
959937 // Return value optimization will avoid copy of the following vector
960938 return fvVector;
961939}
@@ -965,24 +943,12 @@ RouteTableFieldValueTupleWrapper::fieldValueTupleVector() {
965943vector<FieldValueTuple>
966944LabelRouteTableFieldValueTupleWrapper::fieldValueTupleVector () {
967945 vector<FieldValueTuple> fvVector;
968- if (protocol != string ()) {
969- fvVector.push_back (FieldValueTuple (" protocol" , protocol.c_str ()));
970- }
971- if (blackhole != string ()) {
972- fvVector.push_back (FieldValueTuple (" blackhole" , blackhole.c_str ()));
973- }
974- if (nexthop != string ()) {
975- fvVector.push_back (FieldValueTuple (" nexthop" , nexthop.c_str ()));
976- }
977- if (ifname != string ()) {
978- fvVector.push_back (FieldValueTuple (" ifname" , ifname.c_str ()));
979- }
980- if (mpls_nh != string ()) {
981- fvVector.push_back (FieldValueTuple (" mpls_nh" , mpls_nh.c_str ()));
982- }
983- if (mpls_pop != string ()) {
984- fvVector.push_back (FieldValueTuple (" mpls_pop" , mpls_pop.c_str ()));
985- }
946+ fvVector.push_back (FieldValueTuple (" protocol" , protocol.c_str ()));
947+ fvVector.push_back (FieldValueTuple (" blackhole" , blackhole.c_str ()));
948+ fvVector.push_back (FieldValueTuple (" nexthop" , nexthop.c_str ()));
949+ fvVector.push_back (FieldValueTuple (" ifname" , ifname.c_str ()));
950+ fvVector.push_back (FieldValueTuple (" mpls_nh" , mpls_nh.c_str ()));
951+ fvVector.push_back (FieldValueTuple (" mpls_pop" , mpls_pop.c_str ()));
986952 return fvVector;
987953}
988954
@@ -991,12 +957,8 @@ LabelRouteTableFieldValueTupleWrapper::fieldValueTupleVector() {
991957vector<FieldValueTuple>
992958VnetRouteTableFieldValueTupleWrapper::fieldValueTupleVector () {
993959 vector<FieldValueTuple> fvVector;
994- if (nexthop != string ()) {
995- fvVector.push_back (FieldValueTuple (" nexthop" , nexthop.c_str ()));
996- }
997- if (ifname != string ()) {
998- fvVector.push_back (FieldValueTuple (" ifname" , ifname.c_str ()));
999- }
960+ fvVector.push_back (FieldValueTuple (" nexthop" , nexthop.c_str ()));
961+ fvVector.push_back (FieldValueTuple (" ifname" , ifname.c_str ()));
1000962 return fvVector;
1001963}
1002964
@@ -1005,9 +967,7 @@ VnetRouteTableFieldValueTupleWrapper::fieldValueTupleVector() {
1005967vector<FieldValueTuple>
1006968VnetTunnelTableFieldValueTupleWrapper::fieldValueTupleVector () {
1007969 vector<FieldValueTuple> fvVector;
1008- if (endpoint != string ()) {
1009- fvVector.push_back (FieldValueTuple (" endpoint" , endpoint.c_str ()));
1010- }
970+ fvVector.push_back (FieldValueTuple (" endpoint" , endpoint.c_str ()));
1011971 return fvVector;
1012972}
1013973
@@ -1016,15 +976,9 @@ VnetTunnelTableFieldValueTupleWrapper::fieldValueTupleVector() {
1016976vector<FieldValueTuple>
1017977NextHopGroupTableFieldValueTupleWrapper::fieldValueTupleVector () {
1018978 vector<FieldValueTuple> fvVector;
1019- if (nexthop != string ()) {
1020- fvVector.push_back (FieldValueTuple (" nexthop" , nexthop.c_str ()));
1021- }
1022- if (ifname != string ()) {
1023- fvVector.push_back (FieldValueTuple (" ifname" , ifname.c_str ()));
1024- }
1025- if (weight != string ()) {
1026- fvVector.push_back (FieldValueTuple (" weight" , weight.c_str ()));
1027- }
979+ fvVector.push_back (FieldValueTuple (" nexthop" , nexthop.c_str ()));
980+ fvVector.push_back (FieldValueTuple (" ifname" , ifname.c_str ()));
981+ fvVector.push_back (FieldValueTuple (" weight" , weight.c_str ()));
1028982 return fvVector;
1029983}
1030984
@@ -1033,15 +987,9 @@ NextHopGroupTableFieldValueTupleWrapper::fieldValueTupleVector() {
1033987vector<FieldValueTuple>
1034988Srv6MySidTableFieldValueTupleWrapper::fieldValueTupleVector () {
1035989 vector<FieldValueTuple> fvVector;
1036- if (action != string ()) {
1037- fvVector.push_back (FieldValueTuple (" action" , action.c_str ()));
1038- }
1039- if (vrf != string ()) {
1040- fvVector.push_back (FieldValueTuple (" vrf" , vrf.c_str ()));
1041- }
1042- if (adj != string ()) {
1043- fvVector.push_back (FieldValueTuple (" adj" , adj.c_str ()));
1044- }
990+ fvVector.push_back (FieldValueTuple (" action" , action.c_str ()));
991+ fvVector.push_back (FieldValueTuple (" vrf" , vrf.c_str ()));
992+ fvVector.push_back (FieldValueTuple (" adj" , adj.c_str ()));
1045993 return fvVector;
1046994}
1047995
@@ -1050,9 +998,7 @@ Srv6MySidTableFieldValueTupleWrapper::fieldValueTupleVector() {
1050998vector<FieldValueTuple>
1051999Srv6SidListTableFieldValueTupleWrapper::fieldValueTupleVector () {
10521000 vector<FieldValueTuple> fvVector;
1053- if (path != string ()) {
1054- fvVector.push_back (FieldValueTuple (" path" , path.c_str ()));
1055- }
1001+ fvVector.push_back (FieldValueTuple (" path" , path.c_str ()));
10561002 return fvVector;
10571003}
10581004
@@ -1220,28 +1166,69 @@ void RouteSync::onSrv6SteerRouteMsg(struct nlmsghdr *h, int len)
12201166 if (nlmsg_type == RTM_DELROUTE)
12211167 {
12221168 string routeTableKeyStr = string (routeTableKey);
1223- string srv6SidListTableKey = routeTableKeyStr ;
1169+ string srv6SidListTableKey = vpn_sid_str ;
12241170
12251171 SWSS_LOG_INFO (" SRV6 RouteTable del msg: %s" , routeTableKeyStr.c_str ());
12261172 delWithWarmRestart (
12271173 RouteTableFieldValueTupleWrapper{std::move (routeTableKeyStr), std::string ()},
12281174 *m_routeTable);
1229- m_srv6SidListTable.del (srv6SidListTableKey);
1175+
1176+ auto it = m_srv6_sidlist_refcnt.find (srv6SidListTableKey);
1177+ if (it != m_srv6_sidlist_refcnt.end ())
1178+ {
1179+ assert (it->second > 0 );
1180+
1181+ /* Decrement the refcount for this SID list */
1182+ (it->second )--;
1183+ SWSS_LOG_INFO (" Refcount for SID list '%s' decreased to %u" ,
1184+ srv6SidListTableKey.c_str (), it->second );
1185+
1186+ /* If the refcount drops to zero, remove the SID list from ApplDB */
1187+ if (it->second == 0 )
1188+ {
1189+ m_srv6SidListTable.del (srv6SidListTableKey);
1190+ SWSS_LOG_INFO (" Refcount for SID list '%s' is zero. SID list removed from ApplDB" ,
1191+ srv6SidListTableKey.c_str ());
1192+
1193+ m_srv6_sidlist_refcnt.erase (srv6SidListTableKey);
1194+ }
1195+ }
1196+ else
1197+ {
1198+ SWSS_LOG_WARN (" SID list '%s' not found in the map." , srv6SidListTableKey.c_str ());
1199+ }
1200+
12301201 return ;
12311202 }
12321203 else if (nlmsg_type == RTM_NEWROUTE)
12331204 {
12341205 string routeTableKeyStr = string (routeTableKey);
12351206 /* Write SID list to SRV6_SID_LIST_TABLE */
12361207
1237- string srv6SidListTableKey = routeTableKeyStr ;
1208+ string srv6SidListTableKey = vpn_sid_str ;
12381209
1239- Srv6SidListTableFieldValueTupleWrapper fvw{srv6SidListTableKey};
1240- fvw.path = vpn_sid_str;
1210+ auto it = m_srv6_sidlist_refcnt.find (srv6SidListTableKey);
1211+ if (it != m_srv6_sidlist_refcnt.end ())
1212+ {
1213+ /* SID list already exists: just bump the refcount */
1214+ (it->second )++;
1215+ SWSS_LOG_INFO (" Refcount for SID list'%s' increased to %u" ,
1216+ srv6SidListTableKey.c_str (), it->second );
1217+ }
1218+ else
1219+ {
1220+ /* First time we see this SID list: program it into ApplDB and initialize the refcount to 1 */
1221+ Srv6SidListTableFieldValueTupleWrapper fvw{srv6SidListTableKey};
1222+ fvw.path = vpn_sid_str;
12411223
1242- setTable (fvw, m_srv6SidListTable);
1243- SWSS_LOG_DEBUG (" Srv6SidListTable set msg: %s path: %s" ,
1244- srv6SidListTableKey.c_str (), vpn_sid_str.c_str ());
1224+ setTable (fvw, m_srv6SidListTable);
1225+ SWSS_LOG_DEBUG (" Srv6SidListTable set msg: %s path: %s" ,
1226+ srv6SidListTableKey.c_str (), vpn_sid_str.c_str ());
1227+
1228+ m_srv6_sidlist_refcnt[srv6SidListTableKey] = 1 ;
1229+ SWSS_LOG_INFO (" SID list '%s' created and refcount initialized to 1" ,
1230+ srv6SidListTableKey.c_str ());
1231+ }
12451232
12461233 /* Write route to ROUTE_TABLE */
12471234
@@ -1800,11 +1787,11 @@ void RouteSync::onRouteMsg(int nlmsg_type, struct nl_object *obj, char *vrf)
18001787
18011788 if (alsv.size () == 1 )
18021789 {
1803- if (alsv[0 ] == " eth0" || alsv[0 ] == " docker0" )
1790+ if (alsv[0 ] == " eth0" || alsv[0 ] == " docker0" || alsv[ 0 ] == " eth1-midplane " )
18041791 {
1805- SWSS_LOG_DEBUG (" Skip routes to eth0 or docker0: %s %s %s" ,
1792+ SWSS_LOG_DEBUG (" Skip routes to eth0 or docker0 or eth1-midplane : %s %s %s" ,
18061793 destipprefix, gw_list.c_str (), intf_list.c_str ());
1807- SWSS_LOG_INFO (" RouteTable del msg for eth0/docker0 route: %s" , destipprefix);
1794+ SWSS_LOG_INFO (" RouteTable del msg for eth0/docker0/eth1-midplane route: %s" , destipprefix);
18081795 delWithWarmRestart (RouteTableFieldValueTupleWrapper{std::move (destipprefix), " " },
18091796 *m_routeTable);
18101797 return ;
@@ -1818,9 +1805,9 @@ void RouteSync::onRouteMsg(int nlmsg_type, struct nl_object *obj, char *vrf)
18181805 * A change in FRR behavior from version 7.2 to 7.5 causes the default route to be updated to eth0
18191806 * during interface up/down events. This skips routes to eth0 or docker0 to avoid such behavior.
18201807 */
1821- if (alias == " eth0" || alias == " docker0" )
1808+ if (alias == " eth0" || alias == " docker0" || alias == " eth1-midplane " )
18221809 {
1823- SWSS_LOG_DEBUG (" Skip routes to eth0 or docker0: %s %s %s" ,
1810+ SWSS_LOG_DEBUG (" Skip routes to eth0 or docker0 or eth1-midplane : %s %s %s" ,
18241811 destipprefix, gw_list.c_str (), intf_list.c_str ());
18251812 continue ;
18261813 }
@@ -1959,7 +1946,7 @@ void RouteSync::onNextHopMsg(struct nlmsghdr *h, int len)
19591946 strcpy (if_name, ifname_unknown);
19601947 }
19611948 ifname = string (if_name);
1962- if (ifname == " eth0" || ifname == " docker0" )
1949+ if (ifname == " eth0" || ifname == " docker0" || ifname == " eth1-midplane " )
19631950 {
19641951 SWSS_LOG_DEBUG (" Skip routes to interface: %s id[%d]" , ifname.c_str (), id);
19651952 return ;
0 commit comments