Skip to content

Commit

Permalink
Expose the capability to config wred drop probability (sonic-net#571)
Browse files Browse the repository at this point in the history
* Add the capability to set wred drop probability of all packet colors
(green, yellow, and red)

Signed-off-by: Wenda <wenni@microsoft.com>

* Ensure drop probability takes default value 100% if not explicitly
specified in qos.json

Signed-off-by: Wenda <wenni@microsoft.com>
  • Loading branch information
wendani authored and lguohan committed Aug 16, 2018
1 parent 76f258b commit 367017a
Show file tree
Hide file tree
Showing 2 changed files with 95 additions and 43 deletions.
65 changes: 57 additions & 8 deletions orchagent/qosorch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,12 @@ map<string, sai_ecn_mark_mode_t> ecn_map = {
{"ecn_all", SAI_ECN_MARK_MODE_ALL}
};

enum {
GREEN_DROP_PROBABILITY_SET = (1U << 0),
YELLOW_DROP_PROBABILITY_SET = (1U << 1),
RED_DROP_PROBABILITY_SET = (1U << 2)
};

map<string, sai_port_attr_t> qos_to_attr_map = {
{dscp_to_tc_field_name, SAI_PORT_ATTR_QOS_DSCP_TO_TC_MAP},
{tc_to_queue_field_name, SAI_PORT_ATTR_QOS_TC_TO_QUEUE_MAP},
Expand Down Expand Up @@ -329,6 +335,24 @@ bool WredMapHandler::convertFieldValuesToAttributes(KeyOpFieldsValuesTuple &tupl
attr.value.s32 = stoi(fvValue(*i));
attribs.push_back(attr);
}
else if (fvField(*i) == green_drop_probability_field_name)
{
attr.id = SAI_WRED_ATTR_GREEN_DROP_PROBABILITY;
attr.value.s32 = stoi(fvValue(*i));
attribs.push_back(attr);
}
else if (fvField(*i) == yellow_drop_probability_field_name)
{
attr.id = SAI_WRED_ATTR_YELLOW_DROP_PROBABILITY;
attr.value.s32 = stoi(fvValue(*i));
attribs.push_back(attr);
}
else if (fvField(*i) == red_drop_probability_field_name)
{
attr.id = SAI_WRED_ATTR_RED_DROP_PROBABILITY;
attr.value.s32 = stoi(fvValue(*i));
attribs.push_back(attr);
}
else if (fvField(*i) == wred_green_enable_field_name)
{
attr.id = SAI_WRED_ATTR_GREEN_ENABLE;
Expand Down Expand Up @@ -394,14 +418,7 @@ sai_object_id_t WredMapHandler::addQosItem(const vector<sai_attribute_t> &attrib
sai_object_id_t sai_object;
sai_attribute_t attr;
vector<sai_attribute_t> attrs;

attr.id = SAI_WRED_ATTR_GREEN_DROP_PROBABILITY;
attr.value.s32 = 100;
attrs.push_back(attr);

attr.id = SAI_WRED_ATTR_YELLOW_DROP_PROBABILITY;
attr.value.s32 = 100;
attrs.push_back(attr);
uint8_t drop_prob_set = 0;

attr.id = SAI_WRED_ATTR_WEIGHT;
attr.value.s32 = 0;
Expand All @@ -410,7 +427,39 @@ sai_object_id_t WredMapHandler::addQosItem(const vector<sai_attribute_t> &attrib
for(auto attrib : attribs)
{
attrs.push_back(attrib);

if (attrib.id == SAI_WRED_ATTR_GREEN_DROP_PROBABILITY)
{
drop_prob_set |= GREEN_DROP_PROBABILITY_SET;
}
else if (attrib.id == SAI_WRED_ATTR_YELLOW_DROP_PROBABILITY)
{
drop_prob_set |= YELLOW_DROP_PROBABILITY_SET;
}
else if (attrib.id == SAI_WRED_ATTR_RED_DROP_PROBABILITY)
{
drop_prob_set |= RED_DROP_PROBABILITY_SET;
}
}
if (!(drop_prob_set & GREEN_DROP_PROBABILITY_SET))
{
attr.id = SAI_WRED_ATTR_GREEN_DROP_PROBABILITY;
attr.value.s32 = 100;
attrs.push_back(attr);
}
if (!(drop_prob_set & YELLOW_DROP_PROBABILITY_SET))
{
attr.id = SAI_WRED_ATTR_YELLOW_DROP_PROBABILITY;
attr.value.s32 = 100;
attrs.push_back(attr);
}
if (!(drop_prob_set & RED_DROP_PROBABILITY_SET))
{
attr.id = SAI_WRED_ATTR_RED_DROP_PROBABILITY;
attr.value.s32 = 100;
attrs.push_back(attr);
}

sai_status = sai_wred_api->create_wred(&sai_object, gSwitchId, (uint32_t)attrs.size(), attrs.data());
if (sai_status != SAI_STATUS_SUCCESS)
{
Expand Down
73 changes: 38 additions & 35 deletions orchagent/qosorch.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,41 +7,44 @@
#include "orch.h"
#include "portsorch.h"

const string dscp_to_tc_field_name = "dscp_to_tc_map";
const string pfc_to_pg_map_name = "pfc_to_pg_map";
const string pfc_to_queue_map_name = "pfc_to_queue_map";
const string pfc_enable_name = "pfc_enable";
const string tc_to_pg_map_field_name = "tc_to_pg_map";
const string tc_to_queue_field_name = "tc_to_queue_map";
const string scheduler_field_name = "scheduler";
const string red_max_threshold_field_name = "red_max_threshold";
const string red_min_threshold_field_name = "red_min_threshold";
const string yellow_max_threshold_field_name = "yellow_max_threshold";
const string yellow_min_threshold_field_name = "yellow_min_threshold";
const string green_max_threshold_field_name = "green_max_threshold";
const string green_min_threshold_field_name = "green_min_threshold";

const string wred_profile_field_name = "wred_profile";
const string wred_red_enable_field_name = "wred_red_enable";
const string wred_yellow_enable_field_name = "wred_yellow_enable";
const string wred_green_enable_field_name = "wred_green_enable";

const string scheduler_algo_type_field_name = "type";
const string scheduler_algo_DWRR = "DWRR";
const string scheduler_algo_WRR = "WRR";
const string scheduler_algo_STRICT = "STRICT";
const string scheduler_weight_field_name = "weight";
const string scheduler_priority_field_name = "priority";

const string ecn_field_name = "ecn";
const string ecn_none = "ecn_none";
const string ecn_red = "ecn_red";
const string ecn_yellow = "ecn_yellow";
const string ecn_yellow_red = "ecn_yellow_red";
const string ecn_green = "ecn_green";
const string ecn_green_red = "ecn_green_red";
const string ecn_green_yellow = "ecn_green_yellow";
const string ecn_all = "ecn_all";
const string dscp_to_tc_field_name = "dscp_to_tc_map";
const string pfc_to_pg_map_name = "pfc_to_pg_map";
const string pfc_to_queue_map_name = "pfc_to_queue_map";
const string pfc_enable_name = "pfc_enable";
const string tc_to_pg_map_field_name = "tc_to_pg_map";
const string tc_to_queue_field_name = "tc_to_queue_map";
const string scheduler_field_name = "scheduler";
const string red_max_threshold_field_name = "red_max_threshold";
const string red_min_threshold_field_name = "red_min_threshold";
const string yellow_max_threshold_field_name = "yellow_max_threshold";
const string yellow_min_threshold_field_name = "yellow_min_threshold";
const string green_max_threshold_field_name = "green_max_threshold";
const string green_min_threshold_field_name = "green_min_threshold";
const string red_drop_probability_field_name = "red_drop_probability";
const string yellow_drop_probability_field_name = "yellow_drop_probability";
const string green_drop_probability_field_name = "green_drop_probability";

const string wred_profile_field_name = "wred_profile";
const string wred_red_enable_field_name = "wred_red_enable";
const string wred_yellow_enable_field_name = "wred_yellow_enable";
const string wred_green_enable_field_name = "wred_green_enable";

const string scheduler_algo_type_field_name = "type";
const string scheduler_algo_DWRR = "DWRR";
const string scheduler_algo_WRR = "WRR";
const string scheduler_algo_STRICT = "STRICT";
const string scheduler_weight_field_name = "weight";
const string scheduler_priority_field_name = "priority";

const string ecn_field_name = "ecn";
const string ecn_none = "ecn_none";
const string ecn_red = "ecn_red";
const string ecn_yellow = "ecn_yellow";
const string ecn_yellow_red = "ecn_yellow_red";
const string ecn_green = "ecn_green";
const string ecn_green_red = "ecn_green_red";
const string ecn_green_yellow = "ecn_green_yellow";
const string ecn_all = "ecn_all";

class QosMapHandler
{
Expand Down

0 comments on commit 367017a

Please sign in to comment.