77#include < iostream>
88
99using namespace swss ;
10+ using namespace std ;
1011
1112extern sai_hostif_api_t * sai_hostif_api;
1213extern 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+
7886CoppOrch::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+
84133void 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
131184bool 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+
203257task_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:
0 commit comments