Skip to content

Commit

Permalink
Support ecn on/off on a queue (sonic-net#577)
Browse files Browse the repository at this point in the history
* Use "[WRED_PROFILE|]" as a CLI signal to unbind wred profile from a queue or
a list of queues; Add the parsing and processing logic in qosorch to
support such an operation

Signed-off-by: Wenda <[email protected]>

* Add print out for debugging purpose

	modified:   orchagent/qosorch.cpp

* Adjust log level

Signed-off-by: Wenda <[email protected]>

* Change to use "[]" as a signal to unbind wred profile from a queue
or a list of queues

Signed-off-by: Wenda <[email protected]>

* Remove logs for debugging

* Adjust code format

* Address comments

Signed-off-by: Wenda <[email protected]>
  • Loading branch information
wendani authored and lguohan committed Aug 18, 2018
1 parent ca9649d commit cb28e4a
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 5 deletions.
22 changes: 21 additions & 1 deletion orchagent/orch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -260,13 +260,18 @@ bool Orch::bake()
- Validates reference has proper format which is [table_name:object_name]
- validates table_name exists
- validates object with object_name exists
- Special case:
- Deem reference format [] as valid, and return true. But in such a case,
- both type_name and object_name are cleared to empty strings as an
- indication to the caller of the special case
*/
bool Orch::parseReference(type_map &type_maps, string &ref_in, string &type_name, string &object_name)
{
SWSS_LOG_ENTER();

SWSS_LOG_DEBUG("input:%s", ref_in.c_str());
if (ref_in.size() < 3)
if (ref_in.size() < 2)
{
SWSS_LOG_ERROR("invalid reference received:%s\n", ref_in.c_str());
return false;
Expand All @@ -276,6 +281,17 @@ bool Orch::parseReference(type_map &type_maps, string &ref_in, string &type_name
SWSS_LOG_ERROR("malformed reference:%s. Must be surrounded by [ ]\n", ref_in.c_str());
return false;
}
if (ref_in.size() == 2)
{
// value set by user is "[]"
// Deem it as a valid format
// clear both type_name and object_name
// as an indication to the caller that
// such a case has been encountered
type_name.clear();
object_name.clear();
return true;
}
string ref_content = ref_in.substr(1, ref_in.size() - 2);
vector<string> tokens;
tokens = tokenize(ref_content, delimiter);
Expand Down Expand Up @@ -331,6 +347,10 @@ ref_resolve_status Orch::resolveFieldRefValue(
{
return ref_resolve_status::not_resolved;
}
else if (ref_type_name.empty() && object_name.empty())
{
return ref_resolve_status::empty;
}
sai_object = (*(type_maps[ref_type_name]))[object_name];
hit = true;
}
Expand Down
1 change: 1 addition & 0 deletions orchagent/orch.h
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,7 @@ typedef enum
field_not_found,
multiple_instances,
not_resolved,
empty,
failure
} ref_resolve_status;

Expand Down
23 changes: 19 additions & 4 deletions orchagent/qosorch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1182,13 +1182,28 @@ task_process_status QosOrch::handleQueueTable(Consumer& consumer)
}
else if (resolve_result != ref_resolve_status::field_not_found)
{
if(ref_resolve_status::not_resolved == resolve_result)
if (ref_resolve_status::empty == resolve_result)
{
SWSS_LOG_INFO("Missing or invalid wred reference");
SWSS_LOG_INFO("Missing wred reference. Unbind wred profile from queue");
// NOTE: The wred profile is un-bound from the port. But the wred profile itself still exists
// and stays untouched.
result = applyWredProfileToQueue(port, queue_ind, SAI_NULL_OBJECT_ID);
if (!result)
{
SWSS_LOG_ERROR("Failed unbinding field:%s from port:%s, queue:%zd, line:%d", wred_profile_field_name.c_str(), port.m_alias.c_str(), queue_ind, __LINE__);
return task_process_status::task_failed;
}
}
else if (ref_resolve_status::not_resolved == resolve_result)
{
SWSS_LOG_INFO("Invalid wred reference");
return task_process_status::task_need_retry;
}
SWSS_LOG_ERROR("Resolving wred reference failed");
return task_process_status::task_failed;
else
{
SWSS_LOG_ERROR("Resolving wred reference failed");
return task_process_status::task_failed;
}
}
}
}
Expand Down

0 comments on commit cb28e4a

Please sign in to comment.