12
12
13
13
using namespace std ;
14
14
15
+ extern sai_switch_api_t *sai_switch_api;
15
16
extern sai_port_api_t *sai_port_api;
16
17
extern sai_queue_api_t *sai_queue_api;
17
18
extern sai_scheduler_api_t *sai_scheduler_api;
@@ -20,7 +21,9 @@ extern sai_qos_map_api_t *sai_qos_map_api;
20
21
extern sai_scheduler_group_api_t *sai_scheduler_group_api;
21
22
extern sai_switch_api_t *sai_switch_api;
22
23
extern sai_acl_api_t * sai_acl_api;
24
+ extern bool querySwitchDscpToTcCapability (sai_object_type_t , sai_attr_id_t );
23
25
26
+ extern SwitchOrch *gSwitchOrch ;
24
27
extern PortsOrch *gPortsOrch ;
25
28
extern sai_object_id_t gSwitchId ;
26
29
extern CrmOrch *gCrmOrch ;
@@ -207,12 +210,41 @@ bool DscpToTcMapHandler::convertFieldValuesToAttributes(KeyOpFieldsValuesTuple &
207
210
return true ;
208
211
}
209
212
213
+ bool DscpToTcMapHandler::applyDscpToTcMapToSwitch (sai_attr_id_t attr_id, sai_object_id_t map_id)
214
+ {
215
+ SWSS_LOG_ENTER ();
216
+
217
+ /* Apply DSCP_TO_TC QoS map at switch */
218
+ sai_attribute_t attr;
219
+ attr.id = attr_id;
220
+ attr.value .oid = map_id;
221
+
222
+ sai_status_t status = sai_switch_api->set_switch_attribute (gSwitchId , &attr);
223
+ if (status != SAI_STATUS_SUCCESS)
224
+ {
225
+ SWSS_LOG_ERROR (" Failed to apply DSCP_TO_TC QoS map to switch rv:%d" , status);
226
+ return false ;
227
+ }
228
+
229
+ SWSS_LOG_NOTICE (" Applied DSCP_TO_TC QoS map to switch successfully" );
230
+ return true ;
231
+ }
232
+
210
233
sai_object_id_t DscpToTcMapHandler::addQosItem (const vector<sai_attribute_t > &attributes)
211
234
{
212
235
SWSS_LOG_ENTER ();
213
236
sai_status_t sai_status;
214
237
sai_object_id_t sai_object;
215
238
vector<sai_attribute_t > qos_map_attrs;
239
+ bool rv;
240
+
241
+ /* Query DSCP_TO_TC QoS map at switch capability */
242
+ rv = gSwitchOrch ->querySwitchDscpToTcCapability (SAI_OBJECT_TYPE_SWITCH, SAI_SWITCH_ATTR_QOS_DSCP_TO_TC_MAP);
243
+ if (rv == false )
244
+ {
245
+ SWSS_LOG_ERROR (" Switch level DSCP to TC QoS map configuration is not supported" );
246
+ return false ;
247
+ }
216
248
217
249
sai_attribute_t qos_map_attr;
218
250
qos_map_attr.id = SAI_QOS_MAP_ATTR_TYPE;
@@ -231,6 +263,14 @@ sai_object_id_t DscpToTcMapHandler::addQosItem(const vector<sai_attribute_t> &at
231
263
return SAI_NULL_OBJECT_ID;
232
264
}
233
265
SWSS_LOG_DEBUG (" created QosMap object:%" PRIx64, sai_object);
266
+
267
+ rv = applyDscpToTcMapToSwitch (SAI_SWITCH_ATTR_QOS_DSCP_TO_TC_MAP, sai_object);
268
+ if (rv == false )
269
+ {
270
+ SWSS_LOG_ERROR (" Failed to apply dscp_to_tc map at switch" );
271
+ return SAI_NULL_OBJECT_ID;
272
+ }
273
+
234
274
return sai_object;
235
275
}
236
276
0 commit comments