Skip to content

Commit 11efd68

Browse files
committed
Address comments
Signed-off-by: bingwang <[email protected]>
1 parent 42d03ed commit 11efd68

10 files changed

+154
-125
lines changed

orchagent/muxorch.cpp

+37-33
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ extern RouteOrch *gRouteOrch;
3333
extern AclOrch *gAclOrch;
3434
extern PortsOrch *gPortsOrch;
3535
extern FdbOrch *gFdbOrch;
36+
extern QosOrch *gQosOrch;
3637

3738
extern sai_object_id_t gVirtualRouterId;
3839
extern sai_object_id_t gUnderlayIfId;
@@ -1183,13 +1184,13 @@ void MuxOrch::update(SubjectType type, void *cntx)
11831184
}
11841185
}
11851186

1186-
MuxOrch::MuxOrch(DBConnector *db, const std::vector<std::string> &tables,
1187+
MuxOrch::MuxOrch(DBConnector *cfg_db, DBConnector *app_db, const std::vector<std::string> &tables,
11871188
TunnelDecapOrch* decapOrch, NeighOrch* neighOrch, FdbOrch* fdbOrch) :
1188-
Orch2(db, tables, request_),
1189+
Orch2(cfg_db, tables, request_),
11891190
decap_orch_(decapOrch),
11901191
neigh_orch_(neighOrch),
11911192
fdb_orch_(fdbOrch),
1192-
cfgTunnelTable_(db, CFG_TUNNEL_TABLE_NAME)
1193+
app_decap_tunnel_table_(app_db, APP_TUNNEL_DECAP_TABLE_NAME)
11931194

11941195
{
11951196
handler_map_.insert(handler_pair(CFG_MUX_CABLE_TABLE_NAME, &MuxOrch::handleMuxCfg));
@@ -1249,38 +1250,35 @@ bool MuxOrch::handleMuxCfg(const Request& request)
12491250
bool MuxOrch::resolveQosTableIds()
12501251
{
12511252
std::vector<FieldValueTuple> field_value_tuples;
1252-
if (cfgTunnelTable_.get(MUX_TUNNEL, field_value_tuples))
1253+
if (app_decap_tunnel_table_.get(MUX_TUNNEL, field_value_tuples))
12531254
{
12541255
KeyOpFieldsValuesTuple tuple{"TUNNEL", MUX_TUNNEL, field_value_tuples};
1255-
for (auto it = kfvFieldsValues(tuple).begin(); it != kfvFieldsValues(tuple).end(); it++)
1256+
// Read tc_to_queue_map_id
1257+
tc_to_queue_map_id_ = gQosOrch->resolveTunnelQosMap(app_decap_tunnel_table_.getTableName(), MUX_TUNNEL, encap_tc_to_queue_field_name, tuple);
1258+
if (tc_to_queue_map_id_ == SAI_NULL_OBJECT_ID)
12561259
{
1257-
if (qos_to_ref_table_map.find(fvField(*it)) != qos_to_ref_table_map.end())
1258-
{
1259-
sai_object_id_t id;
1260-
string object_name;
1261-
string &map_type_name = fvField(*it);
1262-
string &map_name = fvValue(*it);
1263-
ref_resolve_status status = resolveFieldRefValue(QosOrch::getTypeMap(), map_type_name, qos_to_ref_table_map.at(map_type_name), tuple, id, object_name);
1264-
if (status == ref_resolve_status::success)
1265-
{
1266-
if (map_type_name == encap_tc_to_queue_field_name)
1267-
{
1268-
tc_to_queue_map_id_ = id;
1269-
}
1270-
else if (map_type_name == encap_tc_to_dscp_field_name)
1271-
{
1272-
tc_to_dscp_map_id_ = id;
1273-
}
1274-
setObjectReference(QosOrch::getTypeMap(), CFG_TUNNEL_TABLE_NAME, MUX_TUNNEL, map_type_name, object_name);
1275-
SWSS_LOG_NOTICE("Resolved QoS map for tunnel %s type %s name %s", MUX_TUNNEL, map_type_name.c_str(), map_name.c_str());
1276-
}
1277-
}
1260+
SWSS_LOG_NOTICE("QoS map for tunnel %s type %s is not set", MUX_TUNNEL, encap_tc_to_queue_field_name.c_str());
1261+
}
1262+
else
1263+
{
1264+
SWSS_LOG_NOTICE("Resolved QoS map for tunnel %s type %s id %" PRId64, MUX_TUNNEL, encap_tc_to_queue_field_name.c_str(), tc_to_queue_map_id_);
1265+
}
1266+
1267+
// Read tc_to_dscp_map_id
1268+
tc_to_dscp_map_id_ = gQosOrch->resolveTunnelQosMap(app_decap_tunnel_table_.getTableName(), MUX_TUNNEL, encap_tc_to_dscp_field_name, tuple);
1269+
if (tc_to_dscp_map_id_ == SAI_NULL_OBJECT_ID)
1270+
{
1271+
SWSS_LOG_NOTICE("QoS map for tunnel %s type %s is not set", MUX_TUNNEL, encap_tc_to_dscp_field_name.c_str());
1272+
}
1273+
else
1274+
{
1275+
SWSS_LOG_NOTICE("Resolved QoS map for tunnel %s type %s id %" PRId64, MUX_TUNNEL, encap_tc_to_dscp_field_name.c_str(), tc_to_dscp_map_id_);
12781276
}
12791277
return true;
12801278
}
12811279
else
12821280
{
1283-
SWSS_LOG_ERROR("Failed to read config from CONFIG_DB for %s", MUX_TUNNEL);
1281+
SWSS_LOG_NOTICE("Entry for table %s not created yet in APP_DB", MUX_TUNNEL);
12841282
return false;
12851283
}
12861284
}
@@ -1306,17 +1304,23 @@ bool MuxOrch::handlePeerSwitch(const Request& request)
13061304
MUX_TUNNEL, peer_ip.to_string().c_str());
13071305
return false;
13081306
}
1307+
auto it = dst_ips.getIpAddresses().begin();
1308+
const IpAddress& dst_ip = *it;
1309+
1310+
// Read dscp_mode of MuxTunnel0 from app_db
1311+
string dscp_mode_name = "pipe";
1312+
if (!app_decap_tunnel_table_.hget(MUX_TUNNEL, "dscp_mode", dscp_mode_name))
1313+
{
1314+
SWSS_LOG_NOTICE("dscp_mode not available for %s", MUX_TUNNEL);
1315+
return false;
1316+
}
1317+
1318+
// Read tc_to_dscp_map_id and tc_to_queue_map_id
13091319
if (!resolveQosTableIds())
13101320
{
13111321
return false;
13121322
}
1313-
auto it = dst_ips.getIpAddresses().begin();
1314-
const IpAddress& dst_ip = *it;
13151323

1316-
// Read dscp_mode of MuxTunnel0 from config_db
1317-
string dscp_mode_name = "pipe";
1318-
cfgTunnelTable_.hget(MUX_TUNNEL, "dscp_mode", dscp_mode_name);
1319-
13201324
mux_tunnel_id_ = create_tunnel(&peer_ip, &dst_ip, tc_to_dscp_map_id_, tc_to_queue_map_id_, dscp_mode_name);
13211325
SWSS_LOG_NOTICE("Mux peer ip '%s' was added, peer name '%s'",
13221326
peer_ip.to_string().c_str(), peer_name.c_str());

orchagent/muxorch.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ class MuxCfgRequest : public Request
156156
class MuxOrch : public Orch2, public Observer, public Subject
157157
{
158158
public:
159-
MuxOrch(DBConnector *db, const std::vector<std::string> &tables, TunnelDecapOrch*, NeighOrch*, FdbOrch*);
159+
MuxOrch(DBConnector *cfg_db, DBConnector *app_db, const std::vector<std::string> &tables, TunnelDecapOrch*, NeighOrch*, FdbOrch*);
160160

161161
using handler_pair = pair<string, bool (MuxOrch::*) (const Request& )>;
162162
using handler_map = map<string, bool (MuxOrch::*) (const Request& )>;
@@ -214,7 +214,7 @@ class MuxOrch : public Orch2, public Observer, public Subject
214214
FdbOrch *fdb_orch_;
215215

216216
MuxCfgRequest request_;
217-
Table cfgTunnelTable_;
217+
Table app_decap_tunnel_table_;
218218
};
219219

220220
const request_description_t mux_cable_request_description = {

orchagent/orchdaemon.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,7 @@ bool OrchDaemon::init()
303303
CFG_MUX_CABLE_TABLE_NAME,
304304
CFG_PEER_SWITCH_TABLE_NAME
305305
};
306-
MuxOrch *mux_orch = new MuxOrch(m_configDb, mux_tables, tunnel_decap_orch, gNeighOrch, gFdbOrch);
306+
MuxOrch *mux_orch = new MuxOrch(m_configDb, m_applDb, mux_tables, tunnel_decap_orch, gNeighOrch, gFdbOrch);
307307
gDirectory.set(mux_orch);
308308

309309
MuxCableOrch *mux_cb_orch = new MuxCableOrch(m_applDb, m_stateDb, APP_MUX_CABLE_TABLE_NAME);

orchagent/qosorch.cpp

+33-1
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ type_map QosOrch::m_qos_maps = {
8080
{CFG_DSCP_TO_FC_MAP_TABLE_NAME, new object_reference_map()},
8181
{CFG_EXP_TO_FC_MAP_TABLE_NAME, new object_reference_map()},
8282
{CFG_TC_TO_DSCP_MAP_TABLE_NAME, new object_reference_map()},
83-
{CFG_TUNNEL_TABLE_NAME, new object_reference_map()}
83+
{APP_TUNNEL_DECAP_TABLE_NAME, new object_reference_map()}
8484
};
8585

8686
map<string, string> qos_to_ref_table_map = {
@@ -1949,3 +1949,35 @@ void QosOrch::doTask(Consumer &consumer)
19491949
}
19501950
}
19511951
}
1952+
1953+
/**
1954+
* Function Description:
1955+
* @brief Resolve the id of QoS map that is referenced by tunnel
1956+
*
1957+
* Arguments:
1958+
* @param[in] referencing_table_name - The name of table that is referencing the QoS map
1959+
* @param[in] tunnle_name - The name of tunnel
1960+
* @param[in] map_type_name - The type of referenced QoS map
1961+
* @param[in] tuple - The KeyOpFieldsValuesTuple that contains keys - values
1962+
*
1963+
* Return Values:
1964+
* @return The sai_object_id of referenced map, or SAI_NULL_OBJECT_ID if there's an error
1965+
*/
1966+
sai_object_id_t QosOrch::resolveTunnelQosMap(std::string referencing_table_name, std::string tunnel_name, std::string map_type_name, KeyOpFieldsValuesTuple& tuple)
1967+
{
1968+
sai_object_id_t id;
1969+
string object_name;
1970+
ref_resolve_status status = resolveFieldRefValue(m_qos_maps, map_type_name, qos_to_ref_table_map.at(map_type_name), tuple, id, object_name);
1971+
if (status == ref_resolve_status::success)
1972+
{
1973+
1974+
setObjectReference(m_qos_maps, referencing_table_name, tunnel_name, map_type_name, object_name);
1975+
SWSS_LOG_INFO("Resolved QoS map for table %s tunnel %s type %s name %s", referencing_table_name.c_str(), tunnel_name.c_str(), map_type_name.c_str(), object_name.c_str());
1976+
return id;
1977+
}
1978+
else
1979+
{
1980+
SWSS_LOG_ERROR("Failed to resolve QoS map for table %s tunnel %s type %s", referencing_table_name.c_str(), tunnel_name.c_str(), map_type_name.c_str());
1981+
return SAI_NULL_OBJECT_ID;
1982+
}
1983+
}

orchagent/qosorch.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,6 @@ const string ecn_green_red = "ecn_green_red";
6060
const string ecn_green_yellow = "ecn_green_yellow";
6161
const string ecn_all = "ecn_all";
6262

63-
// Declaration for being referenced in muxorch and decaporch
64-
extern std::map<string, string> qos_to_ref_table_map;
6563
class QosMapHandler
6664
{
6765
public:
@@ -168,6 +166,8 @@ class QosOrch : public Orch
168166

169167
static type_map& getTypeMap();
170168
static type_map m_qos_maps;
169+
170+
sai_object_id_t resolveTunnelQosMap(std::string referencing_table_name, std::string tunnel_name, std::string map_type_name, KeyOpFieldsValuesTuple& tuple);
171171
private:
172172
void doTask() override;
173173
virtual void doTask(Consumer& consumer);

orchagent/tunneldecaporch.cpp

+15-48
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ extern sai_object_id_t gUnderlayIfId;
1818
extern sai_object_id_t gSwitchId;
1919
extern PortsOrch* gPortsOrch;
2020
extern CrmOrch* gCrmOrch;
21+
extern QosOrch* gQosOrch;
2122

2223
TunnelDecapOrch::TunnelDecapOrch(DBConnector *db, string tableName) : Orch(db, tableName)
2324
{
@@ -32,7 +33,7 @@ void TunnelDecapOrch::doTask(Consumer& consumer)
3233
{
3334
return;
3435
}
35-
36+
string table_name = consumer.getTableName();
3637
auto it = consumer.m_toSync.begin();
3738
while (it != consumer.m_toSync.end())
3839
{
@@ -41,8 +42,8 @@ void TunnelDecapOrch::doTask(Consumer& consumer)
4142
string key = kfvKey(t);
4243
string op = kfvOp(t);
4344

44-
IpAddresses dst_ip_addresses;
45-
IpAddress src_ip_address("0.0.0.0");
45+
IpAddresses ip_addresses;
46+
IpAddress src_ip;
4647
IpAddress* p_src_ip = nullptr;
4748
string tunnel_type;
4849
string dscp_mode;
@@ -51,7 +52,6 @@ void TunnelDecapOrch::doTask(Consumer& consumer)
5152
string ttl_mode;
5253
sai_object_id_t dscp_to_dc_map_id = SAI_NULL_OBJECT_ID;
5354
sai_object_id_t tc_to_pg_map_id = SAI_NULL_OBJECT_ID;
54-
TunnelTermType term_type = TUNNEL_TERM_TYPE_P2MP;
5555

5656
bool valid = true;
5757

@@ -83,7 +83,7 @@ void TunnelDecapOrch::doTask(Consumer& consumer)
8383
{
8484
try
8585
{
86-
dst_ip_addresses = IpAddresses(fvValue(i));
86+
ip_addresses = IpAddresses(fvValue(i));
8787
}
8888
catch (const std::invalid_argument &e)
8989
{
@@ -93,17 +93,15 @@ void TunnelDecapOrch::doTask(Consumer& consumer)
9393
}
9494
if (exists)
9595
{
96-
setIpAttribute(key, dst_ip_addresses, tunnelTable.find(key)->second.tunnel_id);
96+
setIpAttribute(key, ip_addresses, tunnelTable.find(key)->second.tunnel_id);
9797
}
9898
}
9999
else if (fvField(i) == "src_ip")
100100
{
101101
try
102102
{
103-
src_ip_address = IpAddress(fvValue(i));
104-
p_src_ip = &src_ip_address;
105-
//Tunnel term type is set to P2P when source ip is present
106-
term_type = TUNNEL_TERM_TYPE_P2P;
103+
src_ip = IpAddress(fvValue(i));
104+
p_src_ip = &src_ip;
107105
}
108106
catch (const std::invalid_argument &e)
109107
{
@@ -174,15 +172,15 @@ void TunnelDecapOrch::doTask(Consumer& consumer)
174172
}
175173
else if (fvField(i) == decap_dscp_to_tc_field_name)
176174
{
177-
dscp_to_dc_map_id = resolveQosMapId(key, decap_dscp_to_tc_field_name, t);
175+
dscp_to_dc_map_id = gQosOrch->resolveTunnelQosMap(table_name, key, decap_dscp_to_tc_field_name, t);
178176
if (exists && dscp_to_dc_map_id != SAI_NULL_OBJECT_ID)
179177
{
180178
setTunnelAttribute(fvField(i), dscp_to_dc_map_id, tunnel_id);
181179
}
182180
}
183181
else if (fvField(i) == decap_tc_to_pg_field_name)
184182
{
185-
tc_to_pg_map_id = resolveQosMapId(key, decap_tc_to_pg_field_name, t);
183+
tc_to_pg_map_id = gQosOrch->resolveTunnelQosMap(table_name, key, decap_tc_to_pg_field_name, t);
186184
if (exists && tc_to_pg_map_id != SAI_NULL_OBJECT_ID)
187185
{
188186
setTunnelAttribute(fvField(i), tc_to_pg_map_id, tunnel_id);
@@ -194,8 +192,8 @@ void TunnelDecapOrch::doTask(Consumer& consumer)
194192
if (valid && !exists)
195193
{
196194

197-
if (addDecapTunnel(key, tunnel_type, dst_ip_addresses, p_src_ip, dscp_mode, ecn_mode, encap_ecn_mode, ttl_mode,
198-
term_type, dscp_to_dc_map_id, tc_to_pg_map_id))
195+
if (addDecapTunnel(key, tunnel_type, ip_addresses, p_src_ip, dscp_mode, ecn_mode, encap_ecn_mode, ttl_mode,
196+
dscp_to_dc_map_id, tc_to_pg_map_id))
199197
{
200198
SWSS_LOG_NOTICE("Tunnel(s) added to ASIC_DB.");
201199
}
@@ -233,7 +231,6 @@ void TunnelDecapOrch::doTask(Consumer& consumer)
233231
* @param[in] dscp - dscp mode (uniform/pipe)
234232
* @param[in] ecn - ecn mode (copy_from_outer/standard)
235233
* @param[in] ttl - ttl mode (uniform/pipe)
236-
* @param[in] term_type - The type of tunnel term
237234
* @param[in] dscp_to_tc_map_id - Map ID for remapping DSCP to TC (decap)
238235
* @param[in] tc_to_pg_map_id - Map ID for remapping TC to PG (decap)
239236
*
@@ -249,7 +246,6 @@ bool TunnelDecapOrch::addDecapTunnel(
249246
string ecn,
250247
string encap_ecn,
251248
string ttl,
252-
TunnelTermType term_type,
253249
sai_object_id_t dscp_to_tc_map_id,
254250
sai_object_id_t tc_to_pg_map_id)
255251
{
@@ -262,6 +258,7 @@ bool TunnelDecapOrch::addDecapTunnel(
262258
sai_attribute_t attr;
263259
vector<sai_attribute_t> tunnel_attrs;
264260
sai_object_id_t overlayIfId;
261+
TunnelTermType term_type = TUNNEL_TERM_TYPE_P2MP;
265262

266263
// create the overlay router interface to create a LOOPBACK type router interface (decap)
267264
vector<sai_attribute_t> overlay_intf_attrs;
@@ -310,6 +307,7 @@ bool TunnelDecapOrch::addDecapTunnel(
310307
copy(attr.value.ipaddr, p_src_ip->to_string());
311308
tunnel_attrs.push_back(attr);
312309
src_ip = *p_src_ip;
310+
term_type = TUNNEL_TERM_TYPE_P2P;
313311
}
314312

315313
// decap ecn mode (copy from outer/standard)
@@ -474,7 +472,7 @@ bool TunnelDecapOrch::addDecapTunnelTermEntries(string tunnelKey, swss::IpAddres
474472
// check if the there's an entry already for the key pair
475473
if (existingIps.find(key) != existingIps.end())
476474
{
477-
SWSS_LOG_ERROR("%s already exists. Did not create entry.", key.c_str());
475+
SWSS_LOG_NOTICE("%s already exists. Did not create entry.", key.c_str());
478476
}
479477
else
480478
{
@@ -941,34 +939,3 @@ IpAddresses TunnelDecapOrch::getDstIpAddresses(std::string tunnelKey)
941939
return tunnelTable[tunnelKey].dst_ip_addrs;
942940
}
943941

944-
/**
945-
* Function Description:
946-
* @brief Resolve the map id from QosOrch
947-
*
948-
* Arguments:
949-
* @param[in] tunnle_name - The name of tunnel
950-
* @param[in] map_type_name - The type of referenced QoS map
951-
* @param[in] tuple - The KeyOpFieldsValuesTuple that contains keys - values
952-
*
953-
* Return Values:
954-
* @return The sai_object_id of referenced map, or SAI_NULL_OBJECT_ID if there's an error
955-
*/
956-
sai_object_id_t TunnelDecapOrch::resolveQosMapId(std::string tunnle_name, std::string map_type_name, KeyOpFieldsValuesTuple& tuple)
957-
{
958-
sai_object_id_t id;
959-
string object_name;
960-
ref_resolve_status status = resolveFieldRefValue(QosOrch::getTypeMap(), map_type_name, qos_to_ref_table_map.at(map_type_name), tuple, id, object_name);
961-
if (status == ref_resolve_status::success)
962-
{
963-
964-
setObjectReference(QosOrch::getTypeMap(), CFG_TUNNEL_TABLE_NAME, tunnle_name, map_type_name, object_name);
965-
SWSS_LOG_INFO("Resolved QoS map for tunnel %s type %s name %s", tunnle_name.c_str(), map_type_name.c_str(), object_name.c_str());
966-
return id;
967-
}
968-
else
969-
{
970-
SWSS_LOG_ERROR("Failed to resolce QoS map for tunnel %s type %s", tunnle_name.c_str(), map_type_name.c_str());
971-
return SAI_NULL_OBJECT_ID;
972-
}
973-
974-
}

orchagent/tunneldecaporch.h

+1-3
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ class TunnelDecapOrch : public Orch
7272
TunnelNhs tunnelNhs;
7373

7474
bool addDecapTunnel(std::string key, std::string type, swss::IpAddresses dst_ip, swss::IpAddress* p_src_ip,
75-
std::string dscp, std::string ecn, std::string encap_ecn, std::string ttl, TunnelTermType term_type,
75+
std::string dscp, std::string ecn, std::string encap_ecn, std::string ttl,
7676
sai_object_id_t dscp_to_tc_map_id, sai_object_id_t tc_to_pg_map_id);
7777
bool removeDecapTunnel(std::string key);
7878

@@ -88,7 +88,5 @@ class TunnelDecapOrch : public Orch
8888
int decNextHopRef(std::string tunnelKey, swss::IpAddress& ipAddr);
8989

9090
void doTask(Consumer& consumer);
91-
92-
sai_object_id_t resolveQosMapId(std::string tunnle_name, std::string map_type_name, swss::KeyOpFieldsValuesTuple& tuple);
9391
};
9492
#endif

0 commit comments

Comments
 (0)