@@ -104,6 +104,8 @@ map<string, string> qos_to_ref_table_map = {
104
104
#define DSCP_MAX_VAL 63
105
105
#define EXP_MAX_VAL 7
106
106
107
+ #define PORT_NAME_GLOBAL " global"
108
+
107
109
task_process_status QosMapHandler::processWorkItem (Consumer& consumer, KeyOpFieldsValuesTuple &tuple)
108
110
{
109
111
SWSS_LOG_ENTER ();
@@ -236,37 +238,6 @@ bool DscpToTcMapHandler::convertFieldValuesToAttributes(KeyOpFieldsValuesTuple &
236
238
return true ;
237
239
}
238
240
239
- void DscpToTcMapHandler::applyDscpToTcMapToSwitch (sai_attr_id_t attr_id, sai_object_id_t map_id)
240
- {
241
- SWSS_LOG_ENTER ();
242
- bool rv = true ;
243
-
244
- /* Query DSCP_TO_TC QoS map at switch capability */
245
- rv = gSwitchOrch ->querySwitchDscpToTcCapability (SAI_OBJECT_TYPE_SWITCH, SAI_SWITCH_ATTR_QOS_DSCP_TO_TC_MAP);
246
- if (rv == false )
247
- {
248
- SWSS_LOG_ERROR (" Switch level DSCP to TC QoS map configuration is not supported" );
249
- return ;
250
- }
251
-
252
- /* Apply DSCP_TO_TC QoS map at switch */
253
- sai_attribute_t attr;
254
- attr.id = attr_id;
255
- attr.value .oid = map_id;
256
-
257
- sai_status_t status = sai_switch_api->set_switch_attribute (gSwitchId , &attr);
258
- if (status != SAI_STATUS_SUCCESS)
259
- {
260
- SWSS_LOG_ERROR (" Failed to apply DSCP_TO_TC QoS map to switch rv:%d" , status);
261
- return ;
262
- }
263
-
264
- if (map_id != gQosOrch ->m_globalDscpToTcMap )
265
- gQosOrch ->m_globalDscpToTcMap = map_id;
266
-
267
- SWSS_LOG_NOTICE (" Applied DSCP_TO_TC QoS map to switch successfully" );
268
- }
269
-
270
241
sai_object_id_t DscpToTcMapHandler::addQosItem (const vector<sai_attribute_t > &attributes)
271
242
{
272
243
SWSS_LOG_ENTER ();
@@ -292,36 +263,13 @@ sai_object_id_t DscpToTcMapHandler::addQosItem(const vector<sai_attribute_t> &at
292
263
}
293
264
SWSS_LOG_DEBUG (" created QosMap object:%" PRIx64, sai_object);
294
265
295
- applyDscpToTcMapToSwitch (SAI_SWITCH_ATTR_QOS_DSCP_TO_TC_MAP, sai_object);
296
-
297
266
return sai_object;
298
267
}
299
268
300
269
bool DscpToTcMapHandler::removeQosItem (sai_object_id_t sai_object)
301
270
{
302
271
SWSS_LOG_ENTER ();
303
272
304
- if (sai_object == gQosOrch ->m_globalDscpToTcMap )
305
- {
306
- // The current global dscp to tc map is about to be removed.
307
- // Find another one to set to the switch or NULL in case this is the last one
308
- const auto &dscpToTcObjects = (*QosOrch::getTypeMap ()[CFG_DSCP_TO_TC_MAP_TABLE_NAME]);
309
- bool found = false ;
310
- for (const auto &ref : dscpToTcObjects)
311
- {
312
- if (ref.second .m_saiObjectId == sai_object)
313
- continue ;
314
- SWSS_LOG_NOTICE (" Current global dscp_to_tc map is about to be removed, set it to %s %" PRIx64, ref.first .c_str (), ref.second .m_saiObjectId );
315
- applyDscpToTcMapToSwitch (SAI_SWITCH_ATTR_QOS_DSCP_TO_TC_MAP, ref.second .m_saiObjectId );
316
- found = true ;
317
- break ;
318
- }
319
- if (!found)
320
- {
321
- applyDscpToTcMapToSwitch (SAI_SWITCH_ATTR_QOS_DSCP_TO_TC_MAP, SAI_NULL_OBJECT_ID);
322
- }
323
- }
324
-
325
273
SWSS_LOG_DEBUG (" Removing DscpToTcMap object:%" PRIx64, sai_object);
326
274
sai_status_t sai_status = sai_qos_map_api->remove_qos_map (sai_object);
327
275
if (SAI_STATUS_SUCCESS != sai_status)
@@ -1717,12 +1665,112 @@ task_process_status QosOrch::handleQueueTable(Consumer& consumer, KeyOpFieldsVal
1717
1665
return task_process_status::task_success;
1718
1666
}
1719
1667
1668
+ bool QosOrch::applyDscpToTcMapToSwitch (sai_attr_id_t attr_id, sai_object_id_t map_id)
1669
+ {
1670
+ SWSS_LOG_ENTER ();
1671
+
1672
+ /* Query DSCP_TO_TC QoS map at switch capability */
1673
+ bool rv = gSwitchOrch ->querySwitchDscpToTcCapability (SAI_OBJECT_TYPE_SWITCH, SAI_SWITCH_ATTR_QOS_DSCP_TO_TC_MAP);
1674
+ if (rv == false )
1675
+ {
1676
+ SWSS_LOG_ERROR (" Switch level DSCP to TC QoS map configuration is not supported" );
1677
+ return true ;
1678
+ }
1679
+
1680
+ /* Apply DSCP_TO_TC QoS map at switch */
1681
+ sai_attribute_t attr;
1682
+ attr.id = attr_id;
1683
+ attr.value .oid = map_id;
1684
+
1685
+ sai_status_t status = sai_switch_api->set_switch_attribute (gSwitchId , &attr);
1686
+ if (status != SAI_STATUS_SUCCESS)
1687
+ {
1688
+ SWSS_LOG_ERROR (" Failed to apply DSCP_TO_TC QoS map to switch rv:%d" , status);
1689
+ return false ;
1690
+ }
1691
+
1692
+ SWSS_LOG_NOTICE (" Applied DSCP_TO_TC QoS map to switch successfully" );
1693
+ return true ;
1694
+ }
1695
+
1696
+ task_process_status QosOrch::handleGlobalQosMap (const string &OP, KeyOpFieldsValuesTuple &tuple)
1697
+ {
1698
+ SWSS_LOG_ENTER ();
1699
+
1700
+ task_process_status task_status = task_process_status::task_success;
1701
+
1702
+ if (OP == DEL_COMMAND)
1703
+ {
1704
+ string referenced_obj;
1705
+ if (!doesObjectExist (m_qos_maps, CFG_PORT_QOS_MAP_TABLE_NAME, PORT_NAME_GLOBAL, dscp_to_tc_field_name, referenced_obj))
1706
+ {
1707
+ return task_status;
1708
+ }
1709
+ // Set SAI_NULL_OBJECT_ID to switch level if PORT_QOS_MAP|global is removed
1710
+ if (applyDscpToTcMapToSwitch (SAI_SWITCH_ATTR_QOS_DSCP_TO_TC_MAP, SAI_NULL_OBJECT_ID))
1711
+ {
1712
+ removeObject (m_qos_maps, CFG_PORT_QOS_MAP_TABLE_NAME, PORT_NAME_GLOBAL);
1713
+ task_status = task_process_status::task_success;
1714
+ SWSS_LOG_INFO (" Global QoS map type %s is removed" , dscp_to_tc_field_name.c_str ());
1715
+ }
1716
+ else
1717
+ {
1718
+ task_status = task_process_status::task_failed;
1719
+ SWSS_LOG_WARN (" Failed to remove switch level QoS map type %s" , dscp_to_tc_field_name.c_str ());
1720
+ }
1721
+ return task_status;
1722
+ }
1723
+
1724
+ for (auto it = kfvFieldsValues (tuple).begin (); it != kfvFieldsValues (tuple).end (); it++)
1725
+ {
1726
+ string map_type_name = fvField (*it);
1727
+ string map_name = fvValue (*it);
1728
+ if (map_type_name != dscp_to_tc_field_name)
1729
+ {
1730
+ SWSS_LOG_WARN (" Qos map type %s is not supported at global level" , map_type_name.c_str ());
1731
+ continue ;
1732
+ }
1733
+
1734
+ if (qos_to_attr_map.find (map_type_name) != qos_to_attr_map.end ())
1735
+ {
1736
+ sai_object_id_t id;
1737
+ string object_name;
1738
+ ref_resolve_status status = resolveFieldRefValue (m_qos_maps, map_type_name, qos_to_ref_table_map.at (map_type_name), tuple, id, object_name);
1739
+
1740
+ if (status != ref_resolve_status::success)
1741
+ {
1742
+ SWSS_LOG_INFO (" Global QoS map %s is not yet created" , map_name.c_str ());
1743
+ task_status = task_process_status::task_need_retry;
1744
+ }
1745
+
1746
+ if (applyDscpToTcMapToSwitch (SAI_SWITCH_ATTR_QOS_DSCP_TO_TC_MAP, id))
1747
+ {
1748
+ setObjectReference (m_qos_maps, CFG_PORT_QOS_MAP_TABLE_NAME, PORT_NAME_GLOBAL, map_type_name, object_name);
1749
+ task_status = task_process_status::task_success;
1750
+ SWSS_LOG_INFO (" Applied QoS map type %s name %s to switch level" , map_type_name.c_str (), object_name.c_str ());
1751
+ }
1752
+ else
1753
+ {
1754
+ task_status = task_process_status::task_failed;
1755
+ SWSS_LOG_INFO (" Failed to apply QoS map type %s name %s to switch level" , map_type_name.c_str (), object_name.c_str ());
1756
+ }
1757
+ }
1758
+ }
1759
+ return task_status;
1760
+ }
1761
+
1720
1762
task_process_status QosOrch::handlePortQosMapTable (Consumer& consumer, KeyOpFieldsValuesTuple &tuple)
1721
1763
{
1722
1764
SWSS_LOG_ENTER ();
1723
1765
1724
1766
string key = kfvKey (tuple);
1725
1767
string op = kfvOp (tuple);
1768
+
1769
+ if (key == PORT_NAME_GLOBAL)
1770
+ {
1771
+ return handleGlobalQosMap (op, tuple);
1772
+ }
1773
+
1726
1774
vector<string> port_names = tokenize (key, list_item_delimiter);
1727
1775
1728
1776
if (op == DEL_COMMAND)
0 commit comments