Skip to content

Commit 8d57ae0

Browse files
authored
VNET/VRF Changes (sonic-net#632)
* VNET/VRF Changes (#6) * VRF changes * Fixed an IPv6 address parsing issue * Updated logs, removed intfmgr changes in favour of PR sonic-net#635 * Updated VRF table name * Addressed review comment, test fixes * Remove extra semi-colon * Route handling, review comments (#8) * Vnet route table handling * Addressed review comments * Fix for interface routes, add debug logs
1 parent 3f7c431 commit 8d57ae0

15 files changed

+1054
-49
lines changed

orchagent/Makefile.am

+2
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ orchagent_SOURCES = \
4343
vrforch.cpp \
4444
countercheckorch.cpp \
4545
vxlanorch.cpp \
46+
vnetorch.cpp \
4647
dtelorch.cpp \
4748
flexcounterorch.cpp \
4849
acltable.h \
@@ -74,6 +75,7 @@ orchagent_SOURCES = \
7475
dtelorch.h \
7576
countercheckorch.h \
7677
vxlanorch.h \
78+
vnetorch.h \
7779
flexcounterorch.h \
7880
$(top_srcdir)/warmrestart/warm_restart.cpp \
7981
$(top_srcdir)/warmrestart/warm_restart.h

orchagent/intfsorch.cpp

+71-18
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,11 @@
1212
#include "routeorch.h"
1313
#include "crmorch.h"
1414
#include "bufferorch.h"
15+
#include "directory.h"
16+
#include "vnetorch.h"
1517

1618
extern sai_object_id_t gVirtualRouterId;
19+
extern Directory<Orch*> gDirectory;
1720

1821
extern sai_router_interface_api_t* sai_router_intfs_api;
1922
extern sai_route_api_t* sai_route_api;
@@ -27,8 +30,8 @@ extern BufferOrch *gBufferOrch;
2730

2831
const int intfsorch_pri = 35;
2932

30-
IntfsOrch::IntfsOrch(DBConnector *db, string tableName) :
31-
Orch(db, tableName, intfsorch_pri)
33+
IntfsOrch::IntfsOrch(DBConnector *db, string tableName, VRFOrch *vrf_orch) :
34+
Orch(db, tableName, intfsorch_pri), m_vrfOrch(vrf_orch)
3235
{
3336
SWSS_LOG_ENTER();
3437
}
@@ -113,20 +116,65 @@ void IntfsOrch::doTask(Consumer &consumer)
113116

114117
vector<string> keys = tokenize(kfvKey(t), ':');
115118
string alias(keys[0]);
116-
IpPrefix ip_prefix(kfvKey(t).substr(kfvKey(t).find(':')+1));
119+
IpPrefix ip_prefix;
120+
bool ip_prefix_in_key = false;
121+
122+
if (keys.size() > 1)
123+
{
124+
ip_prefix = kfvKey(t).substr(kfvKey(t).find(':')+1);
125+
ip_prefix_in_key = true;
126+
}
127+
128+
const vector<FieldValueTuple>& data = kfvFieldsValues(t);
129+
string vrf_name = "", vnet_name = "";
130+
131+
for (auto idx : data)
132+
{
133+
const auto &field = fvField(idx);
134+
const auto &value = fvValue(idx);
135+
if (field == "vrf_name")
136+
{
137+
vrf_name = value;
138+
}
139+
else if (field == "vnet_name")
140+
{
141+
vnet_name = value;
142+
}
143+
}
117144

118145
if (alias == "eth0" || alias == "docker0")
119146
{
120147
it = consumer.m_toSync.erase(it);
121148
continue;
122149
}
123150

151+
sai_object_id_t vrf_id = gVirtualRouterId;
152+
if (!vnet_name.empty())
153+
{
154+
VNetOrch* vnet_orch = gDirectory.get<VNetOrch*>();
155+
if (!vnet_orch->isVnetExists(vnet_name))
156+
{
157+
it++;
158+
continue;
159+
}
160+
vrf_id = vnet_orch->getVRid(vnet_name);
161+
}
162+
else if (!vrf_name.empty())
163+
{
164+
if (m_vrfOrch->isVRFexists(vrf_name))
165+
{
166+
it++;
167+
continue;
168+
}
169+
vrf_id = m_vrfOrch->getVRFid(vrf_name);
170+
}
171+
124172
string op = kfvOp(t);
125173
if (op == SET_COMMAND)
126174
{
127175
if (alias == "lo")
128176
{
129-
addIp2MeRoute(ip_prefix);
177+
addIp2MeRoute(vrf_id, ip_prefix);
130178
it = consumer.m_toSync.erase(it);
131179
continue;
132180
}
@@ -149,7 +197,7 @@ void IntfsOrch::doTask(Consumer &consumer)
149197
auto it_intfs = m_syncdIntfses.find(alias);
150198
if (it_intfs == m_syncdIntfses.end())
151199
{
152-
if (addRouterIntfs(port))
200+
if (addRouterIntfs(vrf_id, port))
153201
{
154202
IntfsEntry intfs_entry;
155203
intfs_entry.ref_count = 0;
@@ -162,9 +210,10 @@ void IntfsOrch::doTask(Consumer &consumer)
162210
}
163211
}
164212

165-
if (m_syncdIntfses[alias].ip_addresses.count(ip_prefix))
213+
vrf_id = port.m_vr_id;
214+
if (!ip_prefix_in_key || m_syncdIntfses[alias].ip_addresses.count(ip_prefix))
166215
{
167-
/* Duplicate entry */
216+
/* Request to create router interface, no prefix present or Duplicate entry */
168217
it = consumer.m_toSync.erase(it);
169218
continue;
170219
}
@@ -198,7 +247,7 @@ void IntfsOrch::doTask(Consumer &consumer)
198247
}
199248

200249
addSubnetRoute(port, ip_prefix);
201-
addIp2MeRoute(ip_prefix);
250+
addIp2MeRoute(vrf_id, ip_prefix);
202251

203252
if (port.m_type == Port::VLAN && ip_prefix.isV4())
204253
{
@@ -212,7 +261,7 @@ void IntfsOrch::doTask(Consumer &consumer)
212261
{
213262
if (alias == "lo")
214263
{
215-
removeIp2MeRoute(ip_prefix);
264+
removeIp2MeRoute(vrf_id, ip_prefix);
216265
it = consumer.m_toSync.erase(it);
217266
continue;
218267
}
@@ -225,12 +274,13 @@ void IntfsOrch::doTask(Consumer &consumer)
225274
continue;
226275
}
227276

277+
vrf_id = port.m_vr_id;
228278
if (m_syncdIntfses.find(alias) != m_syncdIntfses.end())
229279
{
230280
if (m_syncdIntfses[alias].ip_addresses.count(ip_prefix))
231281
{
232282
removeSubnetRoute(port, ip_prefix);
233-
removeIp2MeRoute(ip_prefix);
283+
removeIp2MeRoute(vrf_id, ip_prefix);
234284
if(port.m_type == Port::VLAN && ip_prefix.isV4())
235285
{
236286
removeDirectedBroadcast(port, ip_prefix.getBroadcastIp());
@@ -262,7 +312,7 @@ void IntfsOrch::doTask(Consumer &consumer)
262312
}
263313
}
264314

265-
bool IntfsOrch::addRouterIntfs(Port &port)
315+
bool IntfsOrch::addRouterIntfs(sai_object_id_t vrf_id, Port &port)
266316
{
267317
SWSS_LOG_ENTER();
268318

@@ -279,7 +329,7 @@ bool IntfsOrch::addRouterIntfs(Port &port)
279329
vector<sai_attribute_t> attrs;
280330

281331
attr.id = SAI_ROUTER_INTERFACE_ATTR_VIRTUAL_ROUTER_ID;
282-
attr.value.oid = gVirtualRouterId;
332+
attr.value.oid = vrf_id;
283333
attrs.push_back(attr);
284334

285335
attr.id = SAI_ROUTER_INTERFACE_ATTR_SRC_MAC_ADDRESS;
@@ -334,6 +384,8 @@ bool IntfsOrch::addRouterIntfs(Port &port)
334384
throw runtime_error("Failed to create router interface.");
335385
}
336386

387+
port.m_vr_id = vrf_id;
388+
337389
gPortsOrch->setPort(port.m_alias, port);
338390

339391
SWSS_LOG_NOTICE("Create router interface %s MTU %u", port.m_alias.c_str(), port.m_mtu);
@@ -359,6 +411,7 @@ bool IntfsOrch::removeRouterIntfs(Port &port)
359411
}
360412

361413
port.m_rif_id = 0;
414+
port.m_vr_id = 0;
362415
gPortsOrch->setPort(port.m_alias, port);
363416

364417
SWSS_LOG_NOTICE("Remove router interface for port %s", port.m_alias.c_str());
@@ -370,7 +423,7 @@ void IntfsOrch::addSubnetRoute(const Port &port, const IpPrefix &ip_prefix)
370423
{
371424
sai_route_entry_t unicast_route_entry;
372425
unicast_route_entry.switch_id = gSwitchId;
373-
unicast_route_entry.vr_id = gVirtualRouterId;
426+
unicast_route_entry.vr_id = port.m_vr_id;
374427
copy(unicast_route_entry.destination, ip_prefix);
375428
subnet(unicast_route_entry.destination, unicast_route_entry.destination);
376429

@@ -413,7 +466,7 @@ void IntfsOrch::removeSubnetRoute(const Port &port, const IpPrefix &ip_prefix)
413466
{
414467
sai_route_entry_t unicast_route_entry;
415468
unicast_route_entry.switch_id = gSwitchId;
416-
unicast_route_entry.vr_id = gVirtualRouterId;
469+
unicast_route_entry.vr_id = port.m_vr_id;
417470
copy(unicast_route_entry.destination, ip_prefix);
418471
subnet(unicast_route_entry.destination, unicast_route_entry.destination);
419472

@@ -441,11 +494,11 @@ void IntfsOrch::removeSubnetRoute(const Port &port, const IpPrefix &ip_prefix)
441494
gRouteOrch->notifyNextHopChangeObservers(ip_prefix, IpAddresses(), false);
442495
}
443496

444-
void IntfsOrch::addIp2MeRoute(const IpPrefix &ip_prefix)
497+
void IntfsOrch::addIp2MeRoute(sai_object_id_t vrf_id, const IpPrefix &ip_prefix)
445498
{
446499
sai_route_entry_t unicast_route_entry;
447500
unicast_route_entry.switch_id = gSwitchId;
448-
unicast_route_entry.vr_id = gVirtualRouterId;
501+
unicast_route_entry.vr_id = vrf_id;
449502
copy(unicast_route_entry.destination, ip_prefix.getIp());
450503

451504
sai_attribute_t attr;
@@ -481,11 +534,11 @@ void IntfsOrch::addIp2MeRoute(const IpPrefix &ip_prefix)
481534
}
482535
}
483536

484-
void IntfsOrch::removeIp2MeRoute(const IpPrefix &ip_prefix)
537+
void IntfsOrch::removeIp2MeRoute(sai_object_id_t vrf_id, const IpPrefix &ip_prefix)
485538
{
486539
sai_route_entry_t unicast_route_entry;
487540
unicast_route_entry.switch_id = gSwitchId;
488-
unicast_route_entry.vr_id = gVirtualRouterId;
541+
unicast_route_entry.vr_id = vrf_id;
489542
copy(unicast_route_entry.destination, ip_prefix.getIp());
490543

491544
sai_status_t status = sai_route_api->remove_route_entry(&unicast_route_entry);

orchagent/intfsorch.h

+6-4
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
#include "orch.h"
55
#include "portsorch.h"
6+
#include "vrforch.h"
67

78
#include "ipaddresses.h"
89
#include "ipprefix.h"
@@ -25,7 +26,7 @@ typedef map<string, IntfsEntry> IntfsTable;
2526
class IntfsOrch : public Orch
2627
{
2728
public:
28-
IntfsOrch(DBConnector *db, string tableName);
29+
IntfsOrch(DBConnector *db, string tableName, VRFOrch *vrf_orch);
2930

3031
sai_object_id_t getRouterIntfsId(const string&);
3132

@@ -35,19 +36,20 @@ class IntfsOrch : public Orch
3536
bool setRouterIntfsMtu(Port &port);
3637
std::set<IpPrefix> getSubnetRoutes();
3738
private:
39+
VRFOrch *m_vrfOrch;
3840
IntfsTable m_syncdIntfses;
3941
void doTask(Consumer &consumer);
4042

4143
int getRouterIntfsRefCount(const string&);
4244

43-
bool addRouterIntfs(Port &port);
45+
bool addRouterIntfs(sai_object_id_t vrf_id, Port &port);
4446
bool removeRouterIntfs(Port &port);
4547

4648
void addSubnetRoute(const Port &port, const IpPrefix &ip_prefix);
4749
void removeSubnetRoute(const Port &port, const IpPrefix &ip_prefix);
4850

49-
void addIp2MeRoute(const IpPrefix &ip_prefix);
50-
void removeIp2MeRoute(const IpPrefix &ip_prefix);
51+
void addIp2MeRoute(sai_object_id_t vrf_id, const IpPrefix &ip_prefix);
52+
void removeIp2MeRoute(sai_object_id_t vrf_id, const IpPrefix &ip_prefix);
5153

5254
void addDirectedBroadcast(const Port &port, const IpAddress &ip_addr);
5355
void removeDirectedBroadcast(const Port &port, const IpAddress &ip_addr);

orchagent/orch.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -552,6 +552,8 @@ void Orch2::doTask(Consumer &consumer)
552552
try
553553
{
554554
request_.parse(it->second);
555+
auto table_name = consumer.getTableName();
556+
request_.setTableName(table_name);
555557

556558
auto op = request_.getOperation();
557559
if (op == SET_COMMAND)

orchagent/orch.h

+5
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,11 @@ class Orch2 : public Orch
220220
{
221221
}
222222

223+
Orch2(DBConnector *db, const vector<string> &tableNames, Request& request)
224+
: Orch(db, tableNames), request_(request)
225+
{
226+
}
227+
223228
protected:
224229
virtual void doTask(Consumer& consumer);
225230

orchagent/orchdaemon.cpp

+14-3
Original file line numberDiff line numberDiff line change
@@ -69,12 +69,22 @@ bool OrchDaemon::init()
6969

7070
gCrmOrch = new CrmOrch(m_configDb, CFG_CRM_TABLE_NAME);
7171
gPortsOrch = new PortsOrch(m_applDb, ports_tables);
72-
7372
TableConnector applDbFdb(m_applDb, APP_FDB_TABLE_NAME);
7473
TableConnector stateDbFdb(m_stateDb, STATE_FDB_TABLE_NAME);
7574
gFdbOrch = new FdbOrch(applDbFdb, stateDbFdb, gPortsOrch);
7675

77-
gIntfsOrch = new IntfsOrch(m_applDb, APP_INTF_TABLE_NAME);
76+
vector<string> vnet_tables = {
77+
APP_VNET_RT_TABLE_NAME,
78+
APP_VNET_RT_TUNNEL_TABLE_NAME
79+
};
80+
VNetOrch *vnet_orch = new VNetOrch(m_applDb, APP_VNET_TABLE_NAME);
81+
gDirectory.set(vnet_orch);
82+
VNetRouteOrch *vnet_rt_orch = new VNetRouteOrch(m_applDb, vnet_tables, vnet_orch);
83+
gDirectory.set(vnet_rt_orch);
84+
VRFOrch *vrf_orch = new VRFOrch(m_applDb, APP_VRF_TABLE_NAME);
85+
gDirectory.set(vrf_orch);
86+
87+
gIntfsOrch = new IntfsOrch(m_applDb, APP_INTF_TABLE_NAME, vrf_orch);
7888
gNeighOrch = new NeighOrch(m_applDb, APP_NEIGH_TABLE_NAME, gIntfsOrch);
7989
gRouteOrch = new RouteOrch(m_applDb, APP_ROUTE_TABLE_NAME, gNeighOrch);
8090
CoppOrch *copp_orch = new CoppOrch(m_applDb, APP_COPP_TABLE_NAME);
@@ -111,7 +121,6 @@ bool OrchDaemon::init()
111121
TableConnector stateDbMirrorSession(m_stateDb, APP_MIRROR_SESSION_TABLE_NAME);
112122
TableConnector confDbMirrorSession(m_configDb, CFG_MIRROR_SESSION_TABLE_NAME);
113123
MirrorOrch *mirror_orch = new MirrorOrch(stateDbMirrorSession, confDbMirrorSession, gPortsOrch, gRouteOrch, gNeighOrch, gFdbOrch);
114-
VRFOrch *vrf_orch = new VRFOrch(m_configDb, CFG_VRF_TABLE_NAME);
115124

116125
TableConnector confDbAclTable(m_configDb, CFG_ACL_TABLE_NAME);
117126
TableConnector confDbAclRuleTable(m_configDb, CFG_ACL_RULE_TABLE_NAME);
@@ -178,6 +187,8 @@ bool OrchDaemon::init()
178187
m_orchList.push_back(gFdbOrch);
179188
m_orchList.push_back(mirror_orch);
180189
m_orchList.push_back(gAclOrch);
190+
m_orchList.push_back(vnet_orch);
191+
m_orchList.push_back(vnet_rt_orch);
181192
m_orchList.push_back(vrf_orch);
182193
m_orchList.push_back(vxlan_tunnel_orch);
183194
m_orchList.push_back(vxlan_tunnel_map_orch);

orchagent/orchdaemon.h

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "crmorch.h"
2323
#include "vrforch.h"
2424
#include "vxlanorch.h"
25+
#include "vnetorch.h"
2526
#include "countercheckorch.h"
2627
#include "flexcounterorch.h"
2728
#include "directory.h"

orchagent/port.h

+1
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ class Port
7373
sai_object_id_t m_bridge_port_id = 0; // TODO: port could have multiple bridge port IDs
7474
sai_vlan_id_t m_port_vlan_id = DEFAULT_PORT_VLAN_ID; // Port VLAN ID
7575
sai_object_id_t m_rif_id = 0;
76+
sai_object_id_t m_vr_id = 0;
7677
sai_object_id_t m_hif_id = 0;
7778
sai_object_id_t m_lag_id = 0;
7879
sai_object_id_t m_lag_member_id = 0;

0 commit comments

Comments
 (0)