@@ -58,6 +58,8 @@ map<string, sai_port_attr_t> qos_to_attr_map = {
5858 {mpls_tc_to_tc_field_name, SAI_PORT_ATTR_QOS_MPLS_EXP_TO_TC_MAP},
5959 {dot1p_to_tc_field_name, SAI_PORT_ATTR_QOS_DOT1P_TO_TC_MAP},
6060 {tc_to_queue_field_name, SAI_PORT_ATTR_QOS_TC_TO_QUEUE_MAP},
61+ {tc_to_dot1p_field_name, SAI_PORT_ATTR_QOS_TC_AND_COLOR_TO_DOT1P_MAP},
62+ {tc_to_dscp_field_name, SAI_PORT_ATTR_QOS_TC_AND_COLOR_TO_DSCP_MAP},
6163 {tc_to_pg_map_field_name, SAI_PORT_ATTR_QOS_TC_TO_PRIORITY_GROUP_MAP},
6264 {pfc_to_pg_map_name, SAI_PORT_ATTR_QOS_PFC_PRIORITY_TO_PRIORITY_GROUP_MAP},
6365 {pfc_to_queue_map_name, SAI_PORT_ATTR_QOS_PFC_PRIORITY_TO_QUEUE_MAP},
@@ -85,6 +87,7 @@ type_map QosOrch::m_qos_maps = {
8587 {CFG_PFC_PRIORITY_TO_QUEUE_MAP_TABLE_NAME, new object_reference_map ()},
8688 {CFG_DSCP_TO_FC_MAP_TABLE_NAME, new object_reference_map ()},
8789 {CFG_EXP_TO_FC_MAP_TABLE_NAME, new object_reference_map ()},
90+ {CFG_TC_TO_DOT1P_MAP_TABLE_NAME, new object_reference_map ()},
8891 {CFG_TC_TO_DSCP_MAP_TABLE_NAME, new object_reference_map ()},
8992 {APP_TUNNEL_DECAP_TABLE_NAME, new object_reference_map ()}
9093};
@@ -94,6 +97,8 @@ map<string, string> qos_to_ref_table_map = {
9497 {mpls_tc_to_tc_field_name, CFG_MPLS_TC_TO_TC_MAP_TABLE_NAME},
9598 {dot1p_to_tc_field_name, CFG_DOT1P_TO_TC_MAP_TABLE_NAME},
9699 {tc_to_queue_field_name, CFG_TC_TO_QUEUE_MAP_TABLE_NAME},
100+ {tc_to_dot1p_field_name, CFG_TC_TO_DOT1P_MAP_TABLE_NAME},
101+ {tc_to_dscp_field_name, CFG_TC_TO_DSCP_MAP_TABLE_NAME},
97102 {tc_to_pg_map_field_name, CFG_TC_TO_PRIORITY_GROUP_MAP_TABLE_NAME},
98103 {pfc_to_pg_map_name, CFG_PFC_PRIORITY_TO_PRIORITY_GROUP_MAP_TABLE_NAME},
99104 {pfc_to_queue_map_name, CFG_PFC_PRIORITY_TO_QUEUE_MAP_TABLE_NAME},
@@ -178,7 +183,7 @@ task_process_status QosMapHandler::processWorkItem(Consumer& consumer, KeyOpFiel
178183 }
179184 if (!removeQosItem (sai_object))
180185 {
181- SWSS_LOG_ERROR (" Failed to remove dscp_to_tc map. db name:%s sai object:%" PRIx64, qos_object_name.c_str (), sai_object);
186+ SWSS_LOG_ERROR (" Failed to remove QoS map. db name:%s sai object:%" PRIx64, qos_object_name.c_str (), sai_object);
182187 return task_process_status::task_failed;
183188 }
184189 auto it_to_delete = (QosOrch::getTypeMap ()[qos_map_type_name])->find (qos_object_name);
@@ -470,6 +475,60 @@ task_process_status QosOrch::handleTcToQueueTable(Consumer& consumer, KeyOpField
470475 return tc_queue_handler.processWorkItem (consumer, tuple);
471476}
472477
478+ // Functions for TC-to-DOT1P qos map handling
479+ bool TcToDot1pMapHandler::convertFieldValuesToAttributes (KeyOpFieldsValuesTuple &tuple, vector<sai_attribute_t > &attributes)
480+ {
481+ SWSS_LOG_ENTER ();
482+ sai_attribute_t list_attr;
483+ sai_qos_map_list_t tc_map_list;
484+ tc_map_list.count = (uint32_t )kfvFieldsValues (tuple).size ();
485+ tc_map_list.list = new sai_qos_map_t [tc_map_list.count ]();
486+ uint32_t ind = 0 ;
487+ for (auto i = kfvFieldsValues (tuple).begin (); i != kfvFieldsValues (tuple).end (); i++, ind++)
488+ {
489+ tc_map_list.list [ind].key .tc = (uint8_t )stoi (fvField (*i));
490+ tc_map_list.list [ind].value .dot1p = (uint8_t )stoi (fvValue (*i));
491+ }
492+ list_attr.id = SAI_QOS_MAP_ATTR_MAP_TO_VALUE_LIST;
493+ list_attr.value .qosmap .count = tc_map_list.count ;
494+ list_attr.value .qosmap .list = tc_map_list.list ;
495+ attributes.push_back (list_attr);
496+ return true ;
497+ }
498+
499+ sai_object_id_t TcToDot1pMapHandler::addQosItem (const vector<sai_attribute_t > &attributes)
500+ {
501+ SWSS_LOG_ENTER ();
502+ sai_status_t sai_status;
503+ sai_object_id_t sai_object;
504+ vector<sai_attribute_t > qos_map_attrs;
505+ sai_attribute_t qos_map_attr;
506+
507+ qos_map_attr.id = SAI_QOS_MAP_ATTR_TYPE;
508+ qos_map_attr.value .s32 = SAI_QOS_MAP_TYPE_TC_AND_COLOR_TO_DOT1P;
509+ qos_map_attrs.push_back (qos_map_attr);
510+
511+ qos_map_attr.id = SAI_QOS_MAP_ATTR_MAP_TO_VALUE_LIST;
512+ qos_map_attr.value .qosmap .count = attributes[0 ].value .qosmap .count ;
513+ qos_map_attr.value .qosmap .list = attributes[0 ].value .qosmap .list ;
514+ qos_map_attrs.push_back (qos_map_attr);
515+
516+ sai_status = sai_qos_map_api->create_qos_map (&sai_object, gSwitchId , (uint32_t )qos_map_attrs.size (), qos_map_attrs.data ());
517+ if (SAI_STATUS_SUCCESS != sai_status)
518+ {
519+ SWSS_LOG_ERROR (" Failed to create tc_to_dot1p qos map. status:%d" , sai_status);
520+ return SAI_NULL_OBJECT_ID;
521+ }
522+ return sai_object;
523+ }
524+
525+ task_process_status QosOrch::handleTcToDot1pTable (Consumer& consumer, KeyOpFieldsValuesTuple &tuple)
526+ {
527+ SWSS_LOG_ENTER ();
528+ TcToDot1pMapHandler tc_dot1p_handler;
529+ return tc_dot1p_handler.processWorkItem (consumer, tuple);
530+ }
531+
473532void WredMapHandler::freeAttribResources (vector<sai_attribute_t > &attributes)
474533{
475534 SWSS_LOG_ENTER ();
@@ -857,7 +916,7 @@ sai_object_id_t TcToPgHandler::addQosItem(const vector<sai_attribute_t> &attribu
857916 sai_status = sai_qos_map_api->create_qos_map (&sai_object, gSwitchId , (uint32_t )qos_map_attrs.size (), qos_map_attrs.data ());
858917 if (SAI_STATUS_SUCCESS != sai_status)
859918 {
860- SWSS_LOG_ERROR (" Failed to create tc_to_queue map. status:%d" , sai_status);
919+ SWSS_LOG_ERROR (" Failed to create tc_to_pg map. status:%d" , sai_status);
861920 return SAI_NULL_OBJECT_ID;
862921 }
863922 return sai_object;
@@ -911,7 +970,7 @@ sai_object_id_t PfcPrioToPgHandler::addQosItem(const vector<sai_attribute_t> &at
911970 sai_status = sai_qos_map_api->create_qos_map (&sai_object, gSwitchId , (uint32_t )qos_map_attrs.size (), qos_map_attrs.data ());
912971 if (SAI_STATUS_SUCCESS != sai_status)
913972 {
914- SWSS_LOG_ERROR (" Failed to create tc_to_queue map. status:%d" , sai_status);
973+ SWSS_LOG_ERROR (" Failed to create pfc_priority_to_queue map. status:%d" , sai_status);
915974 return SAI_NULL_OBJECT_ID;
916975 }
917976 return sai_object;
@@ -966,7 +1025,7 @@ sai_object_id_t PfcToQueueHandler::addQosItem(const vector<sai_attribute_t> &att
9661025 sai_status = sai_qos_map_api->create_qos_map (&sai_object, gSwitchId , (uint32_t )qos_map_attrs.size (), qos_map_attrs.data ());
9671026 if (SAI_STATUS_SUCCESS != sai_status)
9681027 {
969- SWSS_LOG_ERROR (" Failed to create tc_to_queue map. status:%d" , sai_status);
1028+ SWSS_LOG_ERROR (" Failed to create pfc_priority_to_queue map. status:%d" , sai_status);
9701029 return SAI_NULL_OBJECT_ID;
9711030 }
9721031 return sai_object;
@@ -1274,6 +1333,7 @@ void QosOrch::initTableHandlers()
12741333 m_qos_handler_map.insert (qos_handler_pair (CFG_DSCP_TO_FC_MAP_TABLE_NAME, &QosOrch::handleDscpToFcTable));
12751334 m_qos_handler_map.insert (qos_handler_pair (CFG_EXP_TO_FC_MAP_TABLE_NAME, &QosOrch::handleExpToFcTable));
12761335 m_qos_handler_map.insert (qos_handler_pair (CFG_TC_TO_DSCP_MAP_TABLE_NAME, &QosOrch::handleTcToDscpTable));
1336+ m_qos_handler_map.insert (qos_handler_pair (CFG_TC_TO_DOT1P_MAP_TABLE_NAME, &QosOrch::handleTcToDot1pTable));
12771337
12781338 m_qos_handler_map.insert (qos_handler_pair (CFG_TC_TO_PRIORITY_GROUP_MAP_TABLE_NAME, &QosOrch::handleTcToPgTable));
12791339 m_qos_handler_map.insert (qos_handler_pair (CFG_PFC_PRIORITY_TO_PRIORITY_GROUP_MAP_TABLE_NAME, &QosOrch::handlePfcPrioToPgTable));
0 commit comments