Skip to content

Commit 91da248

Browse files
hrachyamstcheng
authored andcommitted
Adding default trap group support (#68)
* Default trap group should be referenced with name 'default' in the configuration JSON file * Create policer and attach to default trap group * Initialize TTL_ERROR with TRAP action belonging to default trap group
1 parent c567c77 commit 91da248

5 files changed

Lines changed: 130 additions & 81 deletions

File tree

orchagent/copporch.cpp

Lines changed: 99 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -7,27 +7,30 @@
77
#include <iostream>
88

99
using namespace swss;
10+
using namespace std;
1011

1112
extern sai_hostif_api_t* sai_hostif_api;
1213
extern sai_policer_api_t* sai_policer_api;
14+
extern sai_switch_api_t* sai_switch_api;
1315

14-
std::map<string, sai_meter_type_t> policer_meter_map = {
16+
17+
map<string, sai_meter_type_t> policer_meter_map = {
1518
{"packets", SAI_METER_TYPE_PACKETS},
1619
{"bytes", SAI_METER_TYPE_BYTES}
1720
};
1821

19-
std::map<string, sai_policer_mode_t> policer_mode_map = {
22+
map<string, sai_policer_mode_t> policer_mode_map = {
2023
{"sr_tcm", SAI_POLICER_MODE_Sr_TCM},
2124
{"tr_tcm", SAI_POLICER_MODE_Tr_TCM},
2225
{"storm", SAI_POLICER_MODE_STORM_CONTROL}
2326
};
2427

25-
std::map<string, sai_policer_color_source_t> policer_color_aware_map = {
28+
map<string, sai_policer_color_source_t> policer_color_aware_map = {
2629
{"aware", SAI_POLICER_COLOR_SOURCE_AWARE},
2730
{"blind", SAI_POLICER_COLOR_SOURCE_BLIND}
2831
};
2932

30-
std::map<string, sai_hostif_trap_id_t> trap_id_map = {
33+
map<string, sai_hostif_trap_id_t> trap_id_map = {
3134
{"stp", SAI_HOSTIF_TRAP_ID_STP},
3235
{"lacp", SAI_HOSTIF_TRAP_ID_LACP},
3336
{"eapol", SAI_HOSTIF_TRAP_ID_EAPOL},
@@ -64,7 +67,7 @@ std::map<string, sai_hostif_trap_id_t> trap_id_map = {
6467
{"ttl_error", SAI_HOSTIF_TRAP_ID_TTL_ERROR}
6568
};
6669

67-
std::map<string, sai_packet_action_t> packet_action_map = {
70+
map<string, sai_packet_action_t> packet_action_map = {
6871
{"drop", SAI_PACKET_ACTION_DROP},
6972
{"forward", SAI_PACKET_ACTION_FORWARD},
7073
{"copy", SAI_PACKET_ACTION_COPY},
@@ -75,12 +78,58 @@ std::map<string, sai_packet_action_t> packet_action_map = {
7578
{"transit", SAI_PACKET_ACTION_TRANSIT}
7679
};
7780

81+
const string default_trap_group = "default";
82+
const vector<sai_hostif_trap_id_t> default_trap_ids = {
83+
SAI_HOSTIF_TRAP_ID_TTL_ERROR
84+
};
85+
7886
CoppOrch::CoppOrch(DBConnector *db, string tableName) :
7987
Orch(db, tableName)
8088
{
8189
SWSS_LOG_ENTER();
90+
initDefaultTrapGroup();
91+
initDefaultTrapIds();
8292
};
8393

94+
void CoppOrch::initDefaultTrapIds()
95+
{
96+
97+
sai_attribute_t attr;
98+
vector<sai_attribute_t> trap_id_attrs;
99+
100+
attr.id = SAI_HOSTIF_TRAP_ATTR_PACKET_ACTION;
101+
attr.value.s32 = SAI_PACKET_ACTION_TRAP;
102+
trap_id_attrs.push_back(attr);
103+
104+
attr.id = SAI_HOSTIF_TRAP_ATTR_TRAP_GROUP;
105+
attr.value.oid = m_trap_group_map[default_trap_group];
106+
trap_id_attrs.push_back(attr);
107+
108+
attr.id = SAI_HOSTIF_TRAP_ATTR_TRAP_CHANNEL;
109+
attr.value.s32 = SAI_HOSTIF_TRAP_CHANNEL_NETDEV;
110+
trap_id_attrs.push_back(attr);
111+
112+
if (!applyAttributesToTrapIds(default_trap_ids, trap_id_attrs))
113+
{
114+
SWSS_LOG_ERROR("Failed applying default trap Ids.");
115+
}
116+
}
117+
118+
void CoppOrch::initDefaultTrapGroup()
119+
{
120+
SWSS_LOG_ENTER();
121+
sai_status_t sai_status;
122+
sai_attribute_t attrib;
123+
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)
127+
{
128+
SWSS_LOG_ERROR("failed to get default trap group. error:%d", sai_status);
129+
}
130+
m_trap_group_map[default_trap_group] = attrib.value.oid;
131+
}
132+
84133
void CoppOrch::getTrapIdList(vector<string> &trap_id_name_list, vector<sai_hostif_trap_id_t> &trap_id_list) const
85134
{
86135
SWSS_LOG_ENTER();
@@ -94,10 +143,27 @@ void CoppOrch::getTrapIdList(vector<string> &trap_id_name_list, vector<sai_hosti
94143
}
95144
}
96145

97-
bool CoppOrch::applyTrapIds(sai_object_id_t trap_group, vector<string> &trap_id_name_list, std::vector<sai_attribute_t> &trap_id_attribs)
146+
bool CoppOrch::applyAttributesToTrapIds(const vector<sai_hostif_trap_id_t> &trap_id_list, vector<sai_attribute_t> &trap_id_attribs)
147+
{
148+
for (auto trap_id : trap_id_list)
149+
{
150+
for (auto trap_id_attr : trap_id_attribs)
151+
{
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)
155+
{
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);
157+
return false;
158+
}
159+
}
160+
}
161+
return true;
162+
}
163+
164+
bool CoppOrch::applyTrapIds(sai_object_id_t trap_group, vector<string> &trap_id_name_list, vector<sai_attribute_t> &trap_id_attribs)
98165
{
99166
SWSS_LOG_ENTER();
100-
sai_status_t sai_status;
101167
vector<sai_hostif_trap_id_t> trap_id_list;
102168

103169
getTrapIdList(trap_id_name_list, trap_id_list);
@@ -112,20 +178,7 @@ bool CoppOrch::applyTrapIds(sai_object_id_t trap_group, vector<string> &trap_id_
112178
attr.value.s32 = SAI_HOSTIF_TRAP_CHANNEL_NETDEV;
113179
trap_id_attribs.push_back(attr);
114180

115-
for (auto trap_id : trap_id_list)
116-
{
117-
for (auto trap_id_attr : trap_id_attribs)
118-
{
119-
SWSS_LOG_DEBUG("Applying trap attr:%d", trap_id_attr.id);
120-
sai_status = sai_hostif_api->set_trap_attribute(trap_id, &trap_id_attr);
121-
if (sai_status != SAI_STATUS_SUCCESS)
122-
{
123-
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);
124-
return false;
125-
}
126-
}
127-
}
128-
return true;
181+
return applyAttributesToTrapIds(trap_id_list, trap_id_attribs);
129182
}
130183

131184
bool CoppOrch::removePolicer(string trap_group_name)
@@ -174,7 +227,7 @@ sai_object_id_t CoppOrch::getPolicer(string trap_group_name)
174227
return m_trap_group_policer_map[m_trap_group_map[trap_group_name]];
175228
}
176229

177-
bool CoppOrch::createPolicer(string trap_group_name, std::vector<sai_attribute_t> &policer_attribs)
230+
bool CoppOrch::createPolicer(string trap_group_name, vector<sai_attribute_t> &policer_attribs)
178231
{
179232
SWSS_LOG_ENTER();
180233
sai_object_id_t policer_id;
@@ -200,6 +253,7 @@ bool CoppOrch::createPolicer(string trap_group_name, std::vector<sai_attribute_t
200253
SWSS_LOG_DEBUG("Created policer:%llx for trap group name:%s:", policer_id, trap_group_name.c_str());
201254
return true;
202255
}
256+
203257
task_process_status CoppOrch::processCoppRule(Consumer& consumer)
204258
{
205259
SWSS_LOG_ENTER();
@@ -212,9 +266,9 @@ task_process_status CoppOrch::processCoppRule(Consumer& consumer)
212266
string op = kfvOp(tuple);
213267

214268
SWSS_LOG_DEBUG("copp:processing:%s", trap_group_name.c_str());
215-
std::vector<sai_attribute_t> trap_gr_attribs;
216-
std::vector<sai_attribute_t> trap_id_attribs;
217-
std::vector<sai_attribute_t> policer_attribs;
269+
vector<sai_attribute_t> trap_gr_attribs;
270+
vector<sai_attribute_t> trap_id_attribs;
271+
vector<sai_attribute_t> policer_attribs;
218272

219273
if (op == SET_COMMAND)
220274
{
@@ -231,7 +285,7 @@ task_process_status CoppOrch::processCoppRule(Consumer& consumer)
231285
queue_ind = fvValue(*i);
232286
SWSS_LOG_DEBUG("queue data:%s", queue_ind.c_str());
233287
attr.id = SAI_HOSTIF_TRAP_GROUP_ATTR_QUEUE;
234-
attr.value.u32 = std::stoul(queue_ind);
288+
attr.value.u32 = stoul(queue_ind);
235289
trap_gr_attribs.push_back(attr);
236290
}
237291
//
@@ -275,28 +329,28 @@ task_process_status CoppOrch::processCoppRule(Consumer& consumer)
275329
else if (fvField(*i) == copp_policer_cbs_field)
276330
{
277331
attr.id = SAI_POLICER_ATTR_CBS;
278-
attr.value.u64 = std::stoul(fvValue(*i));
332+
attr.value.u64 = stoul(fvValue(*i));
279333
policer_attribs.push_back(attr);
280334
SWSS_LOG_DEBUG("obtained cbs:%d", attr.value.u64);
281335
}
282336
else if (fvField(*i) == copp_policer_cir_field)
283337
{
284338
attr.id = SAI_POLICER_ATTR_CIR;
285-
attr.value.u64 = std::stoul(fvValue(*i));
339+
attr.value.u64 = stoul(fvValue(*i));
286340
policer_attribs.push_back(attr);
287341
SWSS_LOG_DEBUG("obtained cir:%d", attr.value.u64);
288342
}
289343
else if (fvField(*i) == copp_policer_pbs_field)
290344
{
291345
attr.id = SAI_POLICER_ATTR_PBS;
292-
attr.value.u64 = std::stoul(fvValue(*i));
346+
attr.value.u64 = stoul(fvValue(*i));
293347
policer_attribs.push_back(attr);
294348
SWSS_LOG_DEBUG("obtained pbs:%d", attr.value.u64);
295349
}
296350
else if (fvField(*i) == copp_policer_pir_field)
297351
{
298352
attr.id = SAI_POLICER_ATTR_PIR;
299-
attr.value.u64 = std::stoul(fvValue(*i));
353+
attr.value.u64 = stoul(fvValue(*i));
300354
policer_attribs.push_back(attr);
301355
SWSS_LOG_DEBUG("obtained pir:%d", attr.value.u64);
302356
}
@@ -409,6 +463,14 @@ task_process_status CoppOrch::processCoppRule(Consumer& consumer)
409463
SWSS_LOG_ERROR("Failed to remove policer from trap group:%s\n", trap_group_name.c_str());
410464
return task_process_status::task_failed;
411465
}
466+
467+
// default trap group is never deleted.
468+
if (trap_group_name == default_trap_group)
469+
{
470+
SWSS_LOG_WARN("Trying to delete default trap group");
471+
return task_process_status::task_ignore;
472+
}
473+
412474
sai_status = sai_hostif_api->remove_hostif_trap_group(m_trap_group_map[trap_group_name]);
413475
if (sai_status != SAI_STATUS_SUCCESS)
414476
{
@@ -445,14 +507,20 @@ void CoppOrch::doTask(Consumer &consumer)
445507
{
446508
task_status = processCoppRule(consumer);
447509
}
448-
catch(const std::out_of_range e)
510+
catch(const out_of_range e)
511+
{
512+
SWSS_LOG_ERROR("processing copp rule threw out_of_range exception:%s", e.what());
513+
task_status = task_process_status::task_invalid_entry;
514+
}
515+
catch(exception& e)
449516
{
450517
SWSS_LOG_ERROR("processing copp rule threw exception:%s", e.what());
451518
task_status = task_process_status::task_invalid_entry;
452519
}
453520
switch(task_status)
454521
{
455522
case task_process_status::task_success :
523+
case task_process_status::task_ignore :
456524
it = consumer.m_toSync.erase(it);
457525
break;
458526
case task_process_status::task_invalid_entry:

orchagent/copporch.h

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,20 @@
44
#include <map>
55
#include "orch.h"
66

7-
const std::string copp_trap_id_list = "trap_ids";
8-
const std::string copp_queue_field = "queue";
7+
const string copp_trap_id_list = "trap_ids";
8+
const string copp_queue_field = "queue";
99
// policer fields
10-
const std::string copp_policer_meter_type_field = "meter_type";
11-
const std::string copp_policer_mode_field = "mode";
12-
const std::string copp_policer_color_field = "color";
13-
const std::string copp_policer_cbs_field = "cbs";
14-
const std::string copp_policer_cir_field = "cir";
15-
const std::string copp_policer_pbs_field = "pbs";
16-
const std::string copp_policer_pir_field = "pir";
17-
const std::string copp_trap_action_field = "trap_action";
18-
const std::string copp_policer_action_green_field = "green_action";
19-
const std::string copp_policer_action_red_field = "red_action";
20-
const std::string copp_policer_action_yellow_field = "yellow_action";
10+
const string copp_policer_meter_type_field = "meter_type";
11+
const string copp_policer_mode_field = "mode";
12+
const string copp_policer_color_field = "color";
13+
const string copp_policer_cbs_field = "cbs";
14+
const string copp_policer_cir_field = "cir";
15+
const string copp_policer_pbs_field = "pbs";
16+
const string copp_policer_pir_field = "pir";
17+
const string copp_trap_action_field = "trap_action";
18+
const string copp_policer_action_green_field = "green_action";
19+
const string copp_policer_action_red_field = "red_action";
20+
const string copp_policer_action_yellow_field = "yellow_action";
2121

2222
class CoppOrch : public Orch
2323
{
@@ -28,12 +28,15 @@ class CoppOrch : public Orch
2828
task_process_status processCoppRule(Consumer& consumer);
2929
bool isValidList(vector<string> &trap_id_list, vector<string> &all_items) const;
3030
void getTrapIdList(vector<string> &trap_id_name_list, vector<sai_hostif_trap_id_t> &trap_id_list) const;
31-
bool applyTrapIds(sai_object_id_t trap_group, vector<string> &trap_id_name_list, std::vector<sai_attribute_t> &trap_id_attribs);
31+
bool applyTrapIds(sai_object_id_t trap_group, vector<string> &trap_id_name_list, vector<sai_attribute_t> &trap_id_attribs);
3232
bool removePolicer(string trap_group_name);
3333
sai_object_id_t getPolicer(string trap_group_name);
34-
bool createPolicer(string trap_group, std::vector<sai_attribute_t> &policer_attribs);
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);
3538
object_map m_trap_group_map;
36-
std::map<sai_object_id_t, sai_object_id_t> m_trap_group_policer_map;
39+
map<sai_object_id_t, sai_object_id_t> m_trap_group_policer_map;
3740
};
3841
#endif /* SWSS_COPPORCH_H */
3942

orchagent/orch.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ typedef enum
2323
task_success,
2424
task_invalid_entry,
2525
task_failed,
26-
task_need_retry
26+
task_need_retry,
27+
task_ignore
2728
} task_process_status;
2829

2930
typedef std::map<string, sai_object_id_t> object_map;

orchagent/portsorch.cpp

Lines changed: 0 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -43,39 +43,6 @@ PortsOrch::PortsOrch(DBConnector *db, vector<string> tableNames) :
4343

4444
m_cpuPort = attr.value.oid;
4545

46-
/* Set traps to CPU */
47-
sai_hostif_trap_id_t trap_ids[] = {
48-
SAI_HOSTIF_TRAP_ID_TTL_ERROR,
49-
SAI_HOSTIF_TRAP_ID_ARP_REQUEST,
50-
SAI_HOSTIF_TRAP_ID_ARP_RESPONSE,
51-
SAI_HOSTIF_TRAP_ID_LLDP,
52-
SAI_HOSTIF_TRAP_ID_LACP
53-
};
54-
55-
int trap_length = sizeof(trap_ids)/sizeof(*trap_ids);
56-
57-
for (i = 0; i < trap_length; i++)
58-
{
59-
attr.id = SAI_HOSTIF_TRAP_ATTR_PACKET_ACTION;
60-
attr.value.s32 = SAI_PACKET_ACTION_TRAP;
61-
status = sai_hostif_api->set_trap_attribute(trap_ids[i], &attr);
62-
if (status != SAI_STATUS_SUCCESS)
63-
{
64-
SWSS_LOG_ERROR("Failed to set trap attribute\n");
65-
}
66-
}
67-
68-
for (i = 0; i < trap_length; i++)
69-
{
70-
attr.id = SAI_HOSTIF_TRAP_ATTR_TRAP_CHANNEL;
71-
attr.value.s32 = SAI_HOSTIF_TRAP_CHANNEL_NETDEV;
72-
status = sai_hostif_api->set_trap_attribute(trap_ids[i], &attr);
73-
if (status != SAI_STATUS_SUCCESS)
74-
{
75-
SWSS_LOG_ERROR("Failed to set trap attribute\n");
76-
}
77-
}
78-
7946
/* Get port number */
8047
attr.id = SAI_SWITCH_ATTR_PORT_NUMBER;
8148

swssconfig/sample/copp.config.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,14 @@
11
[
2+
{
3+
"COPP_TABLE:default": {
4+
"queue": "0",
5+
"meter_type":"packets",
6+
"mode":"sr_tcm",
7+
"cir":"600",
8+
"red_action":"drop"
9+
},
10+
"OP": "SET"
11+
},
212
{
313
"COPP_TABLE:trap.group.bgp.lacp": {
414
"trap_ids": "bgp,lacp",

0 commit comments

Comments
 (0)