Skip to content

Commit 3abdbdf

Browse files
author
Shuotian Cheng
authored
orchagent: Updating CoppOrch to suppport DEL command (#161)
- If DEL_COMMAND is received, the trap IDs associated to the trap group will be reset to default trap group with packet action set to forward. - Refactor debug logs
1 parent 5d31f9d commit 3abdbdf

File tree

2 files changed

+117
-52
lines changed

2 files changed

+117
-52
lines changed

orchagent/copporch.cpp

+97-45
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ CoppOrch::CoppOrch(DBConnector *db, string tableName) :
9393

9494
void CoppOrch::initDefaultTrapIds()
9595
{
96+
SWSS_LOG_ENTER();
9697

9798
sai_attribute_t attr;
9899
vector<sai_attribute_t> trap_id_attrs;
@@ -105,29 +106,34 @@ void CoppOrch::initDefaultTrapIds()
105106
attr.value.oid = m_trap_group_map[default_trap_group];
106107
trap_id_attrs.push_back(attr);
107108

109+
/* Receive packets via OS net device */
108110
attr.id = SAI_HOSTIF_TRAP_ATTR_TRAP_CHANNEL;
109111
attr.value.s32 = SAI_HOSTIF_TRAP_CHANNEL_NETDEV;
110112
trap_id_attrs.push_back(attr);
111113

112-
if (!applyAttributesToTrapIds(default_trap_ids, trap_id_attrs))
114+
if (!applyAttributesToTrapIds(m_trap_group_map[default_trap_group], default_trap_ids, trap_id_attrs))
113115
{
114-
SWSS_LOG_ERROR("Failed applying default trap Ids.");
116+
SWSS_LOG_ERROR("Failed to set attributes to default trap IDs");
115117
}
118+
119+
SWSS_LOG_INFO("Set attributes to default trap IDs");
116120
}
117121

118122
void CoppOrch::initDefaultTrapGroup()
119123
{
120124
SWSS_LOG_ENTER();
121-
sai_status_t sai_status;
122-
sai_attribute_t attrib;
123125

124-
attrib.id = SAI_SWITCH_ATTR_DEFAULT_TRAP_GROUP;
125-
sai_status = sai_switch_api->get_switch_attribute(1, &attrib);
126-
if (sai_status != SAI_STATUS_SUCCESS)
126+
sai_attribute_t attr;
127+
attr.id = SAI_SWITCH_ATTR_DEFAULT_TRAP_GROUP;
128+
129+
sai_status_t status = sai_switch_api->get_switch_attribute(1, &attr);
130+
if (status != SAI_STATUS_SUCCESS)
127131
{
128-
SWSS_LOG_ERROR("failed to get default trap group. error:%d", sai_status);
132+
SWSS_LOG_ERROR("Failed to get default trap group, rc=%d", status);
129133
}
130-
m_trap_group_map[default_trap_group] = attrib.value.oid;
134+
135+
SWSS_LOG_INFO("Get default trap group");
136+
m_trap_group_map[default_trap_group] = attr.value.oid;
131137
}
132138

133139
void CoppOrch::getTrapIdList(vector<string> &trap_id_name_list, vector<sai_hostif_trap_id_t> &trap_id_list) const
@@ -143,21 +149,24 @@ void CoppOrch::getTrapIdList(vector<string> &trap_id_name_list, vector<sai_hosti
143149
}
144150
}
145151

146-
bool CoppOrch::applyAttributesToTrapIds(const vector<sai_hostif_trap_id_t> &trap_id_list, vector<sai_attribute_t> &trap_id_attribs)
152+
bool CoppOrch::applyAttributesToTrapIds(sai_object_id_t trap_group_id,
153+
const vector<sai_hostif_trap_id_t> &trap_id_list,
154+
vector<sai_attribute_t> &trap_id_attribs)
147155
{
148156
for (auto trap_id : trap_id_list)
149157
{
150-
for (auto trap_id_attr : trap_id_attribs)
158+
for (auto attr : trap_id_attribs)
151159
{
152-
SWSS_LOG_DEBUG("Applying trap attr:%d", trap_id_attr.id);
153-
sai_status_t sai_status = sai_hostif_api->set_trap_attribute(trap_id, &trap_id_attr);
154-
if (sai_status != SAI_STATUS_SUCCESS)
160+
sai_status_t status = sai_hostif_api->set_trap_attribute(trap_id, &attr);
161+
if (status != SAI_STATUS_SUCCESS)
155162
{
156-
SWSS_LOG_ERROR("Failed to apply trap_id attribute:%d to trap_id:%d, error:%d\n", trap_id_attr.id, trap_id, sai_status);
163+
SWSS_LOG_ERROR("Failed to set attribute %d to trap %d, rc=%d", attr.id, trap_id, status);
157164
return false;
158165
}
159166
}
167+
m_syncdTrapIds[trap_id] = trap_group_id;
160168
}
169+
161170
return true;
162171
}
163172

@@ -173,46 +182,54 @@ bool CoppOrch::applyTrapIds(sai_object_id_t trap_group, vector<string> &trap_id_
173182
attr.value.oid = trap_group;
174183
trap_id_attribs.push_back(attr);
175184

176-
// The channel is always the NETDEV device.
185+
/* Receive packets via OS net device */
177186
attr.id = SAI_HOSTIF_TRAP_ATTR_TRAP_CHANNEL;
178187
attr.value.s32 = SAI_HOSTIF_TRAP_CHANNEL_NETDEV;
179188
trap_id_attribs.push_back(attr);
180189

181-
return applyAttributesToTrapIds(trap_id_list, trap_id_attribs);
190+
return applyAttributesToTrapIds(trap_group, trap_id_list, trap_id_attribs);
182191
}
183192

184193
bool CoppOrch::removePolicer(string trap_group_name)
185194
{
186195
SWSS_LOG_ENTER();
196+
187197
sai_attribute_t attr;
188198
sai_status_t sai_status;
189199
sai_object_id_t policer_id = getPolicer(trap_group_name);
200+
190201
if (SAI_NULL_OBJECT_ID == policer_id)
191202
{
192-
SWSS_LOG_DEBUG("No policer is attached to trap group:%s\n", trap_group_name.c_str());
203+
SWSS_LOG_INFO("No policer is attached to trap group %s", trap_group_name.c_str());
193204
return true;
194205
}
206+
195207
attr.id = SAI_HOSTIF_TRAP_GROUP_ATTR_POLICER;
196208
attr.value.oid = SAI_NULL_OBJECT_ID;
209+
197210
sai_status = sai_hostif_api->set_trap_group_attribute(m_trap_group_map[trap_group_name], &attr);
198211
if (sai_status != SAI_STATUS_SUCCESS)
199212
{
200-
SWSS_LOG_ERROR("Failed to reset policer for trap group:%lx, error:%d\n", m_trap_group_map[trap_group_name], sai_status);
213+
SWSS_LOG_ERROR("Failed to set policer to NULL for trap group %s, rc=%d", trap_group_name.c_str(), sai_status);
201214
return false;
202215
}
216+
203217
sai_status = sai_policer_api->remove_policer(policer_id);
204218
if (sai_status != SAI_STATUS_SUCCESS)
205219
{
206-
SWSS_LOG_ERROR("Failed to remove policer:%lx, error:%d\n", policer_id, sai_status);
220+
SWSS_LOG_ERROR("Failed to remove policer for trap group %s, rc=%d", trap_group_name.c_str(), sai_status);
207221
return false;
208222
}
223+
224+
SWSS_LOG_NOTICE("Remove policer for trap group %s", trap_group_name.c_str());
209225
m_trap_group_policer_map.erase(m_trap_group_map[trap_group_name]);
210226
return true;
211227
}
212228

213229
sai_object_id_t CoppOrch::getPolicer(string trap_group_name)
214230
{
215231
SWSS_LOG_ENTER();
232+
216233
SWSS_LOG_DEBUG("trap group name:%s:", trap_group_name.c_str());
217234
if (m_trap_group_map.find(trap_group_name) == m_trap_group_map.end())
218235
{
@@ -230,33 +247,39 @@ sai_object_id_t CoppOrch::getPolicer(string trap_group_name)
230247
bool CoppOrch::createPolicer(string trap_group_name, vector<sai_attribute_t> &policer_attribs)
231248
{
232249
SWSS_LOG_ENTER();
250+
233251
sai_object_id_t policer_id;
234252
sai_status_t sai_status;
235-
SWSS_LOG_DEBUG("trap group name:%s:", trap_group_name.c_str());
253+
236254
sai_status = sai_policer_api->create_policer(&policer_id, policer_attribs.size(), policer_attribs.data());
237255
if (sai_status != SAI_STATUS_SUCCESS)
238256
{
239-
SWSS_LOG_ERROR("Failed to create policer for existing trap_group_name:%lx, name:%s, error:%d", m_trap_group_map[trap_group_name], trap_group_name.c_str(), sai_status);
257+
SWSS_LOG_ERROR("Failed to create policer trap group %s, rc=%d", trap_group_name.c_str(), sai_status);
240258
return false;
241259
}
242-
SWSS_LOG_DEBUG("Created policer:%lx for trap group:%lx", policer_id, m_trap_group_map[trap_group_name]);
260+
261+
SWSS_LOG_NOTICE("Create policer for trap group %s", trap_group_name.c_str());
262+
243263
sai_attribute_t attr;
244264
attr.id = SAI_HOSTIF_TRAP_GROUP_ATTR_POLICER;
245265
attr.value.oid = policer_id;
266+
246267
sai_status = sai_hostif_api->set_trap_group_attribute(m_trap_group_map[trap_group_name], &attr);
247268
if (sai_status != SAI_STATUS_SUCCESS)
248269
{
249-
SWSS_LOG_ERROR("Failed to bind policer:%lx to trap group:%lx, name:%s, error:%d\n", policer_id, m_trap_group_map[trap_group_name], trap_group_name.c_str(), sai_status);
270+
SWSS_LOG_ERROR("Failed to bind policer to trap group %s, rc=%d", trap_group_name.c_str(), sai_status);
250271
return false;
251272
}
273+
274+
SWSS_LOG_NOTICE("Bind policer to trap group %s:", trap_group_name.c_str());
252275
m_trap_group_policer_map[m_trap_group_map[trap_group_name]] = policer_id;
253-
SWSS_LOG_DEBUG("Created policer:%lx for trap group name:%s:", policer_id, trap_group_name.c_str());
254276
return true;
255277
}
256278

257279
task_process_status CoppOrch::processCoppRule(Consumer& consumer)
258280
{
259281
SWSS_LOG_ENTER();
282+
260283
sai_status_t sai_status;
261284
vector<string> trap_id_list;
262285
string queue_ind;
@@ -265,7 +288,6 @@ task_process_status CoppOrch::processCoppRule(Consumer& consumer)
265288
string trap_group_name = kfvKey(tuple);
266289
string op = kfvOp(tuple);
267290

268-
SWSS_LOG_DEBUG("copp:processing:%s", trap_group_name.c_str());
269291
vector<sai_attribute_t> trap_gr_attribs;
270292
vector<sai_attribute_t> trap_id_attribs;
271293
vector<sai_attribute_t> policer_attribs;
@@ -385,9 +407,10 @@ task_process_status CoppOrch::processCoppRule(Consumer& consumer)
385407
}
386408
}
387409

410+
/* Set host interface trap group */
388411
if (m_trap_group_map.find(trap_group_name) != m_trap_group_map.end())
389412
{
390-
SWSS_LOG_DEBUG("found existing trap_group object:%s", trap_group_name.c_str());
413+
/* Create or set policer */
391414
if (!policer_attribs.empty())
392415
{
393416
sai_object_id_t policer_id = getPolicer(trap_group_name);
@@ -416,67 +439,101 @@ task_process_status CoppOrch::processCoppRule(Consumer& consumer)
416439
}
417440
}
418441
}
419-
SWSS_LOG_DEBUG("Applying trap group attributes");
442+
420443
for (sai_uint32_t ind = 0; ind < trap_gr_attribs.size(); ind++)
421444
{
422445
auto trap_gr_attr = trap_gr_attribs[ind];
423-
SWSS_LOG_DEBUG("Applying trap group attribute:%d", trap_gr_attr.id);
446+
424447
sai_status = sai_hostif_api->set_trap_group_attribute(m_trap_group_map[trap_group_name], &trap_gr_attr);
425448
if (sai_status != SAI_STATUS_SUCCESS)
426449
{
427450
SWSS_LOG_ERROR("Failed to apply attribute:%d to trap group:%lx, name:%s, error:%d\n", trap_gr_attr.id, m_trap_group_map[trap_group_name], trap_group_name.c_str(), sai_status);
428451
return task_process_status::task_failed;
429452
}
453+
SWSS_LOG_NOTICE("Set trap group %s to host interface", trap_group_name.c_str());
430454
}
431455
}
456+
/* Create host interface trap group */
432457
else
433458
{
434-
SWSS_LOG_DEBUG("Creating new trap_group object:%s", trap_group_name.c_str());
435459
sai_object_id_t new_trap;
460+
436461
sai_status = sai_hostif_api->create_hostif_trap_group(&new_trap, trap_gr_attribs.size(), trap_gr_attribs.data());
437462
if (sai_status != SAI_STATUS_SUCCESS)
438463
{
439-
SWSS_LOG_ERROR("Failed to create new trap_group with name:%s", trap_group_name.c_str());
464+
SWSS_LOG_ERROR("Failed to create host interface trap group %s, rc=%d", trap_group_name.c_str(), sai_status);
440465
return task_process_status::task_failed;
441466
}
442-
SWSS_LOG_DEBUG("Created new trap_group:%lx with name:%s", new_trap, trap_group_name.c_str());
467+
468+
SWSS_LOG_NOTICE("Create host interface trap group %s", trap_group_name.c_str());
443469
m_trap_group_map[trap_group_name] = new_trap;
470+
471+
/* Create policer */
444472
if (!policer_attribs.empty())
445473
{
446474
if (!createPolicer(trap_group_name, policer_attribs))
447475
{
448476
return task_process_status::task_failed;
449477
}
450-
SWSS_LOG_DEBUG("Bound policer to the trap group");
451478
}
452479
}
480+
481+
/* Apply traps to trap group */
453482
if (!applyTrapIds(m_trap_group_map[trap_group_name], trap_id_list, trap_id_attribs))
454483
{
455484
return task_process_status::task_failed;
456485
}
457486
}
458487
else if (op == DEL_COMMAND)
459488
{
460-
// delete trap group and its policer.
489+
/* Remove policer if any */
461490
if (!removePolicer(trap_group_name))
462491
{
463-
SWSS_LOG_ERROR("Failed to remove policer from trap group:%s\n", trap_group_name.c_str());
492+
SWSS_LOG_ERROR("Failed to remove policer from trap group %s", trap_group_name.c_str());
464493
return task_process_status::task_failed;
465494
}
466495

467-
// default trap group is never deleted.
496+
/* Do not remove default trap group */
468497
if (trap_group_name == default_trap_group)
469498
{
470-
SWSS_LOG_WARN("Trying to delete default trap group");
499+
SWSS_LOG_WARN("Cannot remove default trap group");
471500
return task_process_status::task_ignore;
472501
}
473502

503+
/* Reset the trap IDs to default trap group with default attributes */
504+
vector<sai_hostif_trap_id_t> trap_ids_to_reset;
505+
for (auto it : m_syncdTrapIds)
506+
{
507+
if (it.second == m_trap_group_map[trap_group_name])
508+
{
509+
trap_ids_to_reset.push_back(it.first);
510+
}
511+
}
512+
513+
sai_attribute_t attr;
514+
vector<sai_attribute_t> default_trap_attrs;
515+
516+
attr.id = SAI_HOSTIF_TRAP_ATTR_PACKET_ACTION;
517+
attr.value.s32 = SAI_PACKET_ACTION_FORWARD;
518+
default_trap_attrs.push_back(attr);
519+
520+
attr.id = SAI_HOSTIF_TRAP_ATTR_TRAP_GROUP;
521+
attr.value.oid = m_trap_group_map[default_trap_group];
522+
default_trap_attrs.push_back(attr);
523+
524+
if (!applyAttributesToTrapIds(m_trap_group_map[default_trap_group], trap_ids_to_reset, default_trap_attrs))
525+
{
526+
SWSS_LOG_ERROR("Failed to reset traps to default trap group with default attributes");
527+
return task_process_status::task_failed;
528+
}
529+
474530
sai_status = sai_hostif_api->remove_hostif_trap_group(m_trap_group_map[trap_group_name]);
475531
if (sai_status != SAI_STATUS_SUCCESS)
476532
{
477-
SWSS_LOG_ERROR("Failed to remove trap group:%lx, name:%s\n", m_trap_group_map[trap_group_name], trap_group_name.c_str());
533+
SWSS_LOG_ERROR("Failed to remove trap group %s", trap_group_name.c_str());
478534
return task_process_status::task_failed;
479535
}
536+
480537
auto it_del = m_trap_group_map.find(trap_group_name);
481538
m_trap_group_map.erase(it_del);
482539
}
@@ -491,18 +548,13 @@ task_process_status CoppOrch::processCoppRule(Consumer& consumer)
491548
void CoppOrch::doTask(Consumer &consumer)
492549
{
493550
SWSS_LOG_ENTER();
551+
494552
auto it = consumer.m_toSync.begin();
495553
while (it != consumer.m_toSync.end())
496554
{
497555
KeyOpFieldsValuesTuple tuple = it->second;
498-
string table_name = consumer.m_consumer->getTableName();
499-
if (table_name != APP_COPP_TABLE_NAME)
500-
{
501-
SWSS_LOG_ERROR("Unrecognised copp table encountered:%s\n", table_name.c_str());
502-
it = consumer.m_toSync.erase(it);
503-
continue;
504-
}
505556
task_process_status task_status;
557+
506558
try
507559
{
508560
task_status = processCoppRule(consumer);

orchagent/copporch.h

+20-7
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#define SWSS_COPPORCH_H
33

44
#include <map>
5+
#include <set>
56
#include "orch.h"
67

78
const string copp_trap_id_list = "trap_ids";
@@ -19,24 +20,36 @@ const string copp_policer_action_green_field = "green_action";
1920
const string copp_policer_action_red_field = "red_action";
2021
const string copp_policer_action_yellow_field = "yellow_action";
2122

23+
/* TrapGroupPolicerTable: trap group ID, policer ID */
24+
typedef map<sai_object_id_t, sai_object_id_t> TrapGroupPolicerTable;
25+
/* TrapIdTrapGroupTable: trap ID, trap group ID */
26+
typedef map<sai_hostif_trap_id_t, sai_object_id_t> TrapIdTrapGroupTable;
27+
2228
class CoppOrch : public Orch
2329
{
2430
public:
2531
CoppOrch(DBConnector *db, string tableName);
2632
protected:
27-
virtual void doTask(Consumer& consumer);
33+
object_map m_trap_group_map;
34+
35+
TrapGroupPolicerTable m_trap_group_policer_map;
36+
TrapIdTrapGroupTable m_syncdTrapIds;
37+
38+
void initDefaultTrapGroup();
39+
void initDefaultTrapIds();
40+
2841
task_process_status processCoppRule(Consumer& consumer);
2942
bool isValidList(vector<string> &trap_id_list, vector<string> &all_items) const;
3043
void getTrapIdList(vector<string> &trap_id_name_list, vector<sai_hostif_trap_id_t> &trap_id_list) const;
3144
bool applyTrapIds(sai_object_id_t trap_group, vector<string> &trap_id_name_list, vector<sai_attribute_t> &trap_id_attribs);
45+
bool applyAttributesToTrapIds(sai_object_id_t trap_group_id, const vector<sai_hostif_trap_id_t> &trap_id_list, vector<sai_attribute_t> &trap_id_attribs);
46+
47+
bool createPolicer(string trap_group, vector<sai_attribute_t> &policer_attribs);
3248
bool removePolicer(string trap_group_name);
49+
3350
sai_object_id_t getPolicer(string trap_group_name);
34-
bool createPolicer(string trap_group, vector<sai_attribute_t> &policer_attribs);
35-
void initDefaultTrapGroup();
36-
void initDefaultTrapIds();
37-
bool applyAttributesToTrapIds(const vector<sai_hostif_trap_id_t> &trap_id_list, vector<sai_attribute_t> &trap_id_attribs);
38-
object_map m_trap_group_map;
39-
map<sai_object_id_t, sai_object_id_t> m_trap_group_policer_map;
51+
52+
virtual void doTask(Consumer& consumer);
4053
};
4154
#endif /* SWSS_COPPORCH_H */
4255

0 commit comments

Comments
 (0)