Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adding support for new SAI API sai_query_attribute_capability() #645

Merged
merged 5 commits into from
Jul 22, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions lib/inc/Recorder.h
Original file line number Diff line number Diff line change
Expand Up @@ -290,6 +290,18 @@ namespace sairedis
_In_ sai_status_t status,
_In_ const uint64_t *count);

void recordQueryAttributeCapability(
_In_ sai_object_id_t switch_id,
_In_ sai_object_type_t object_type,
_In_ sai_attr_id_t attr_id,
_Out_ sai_attr_capability_t *capability);

void recordQueryAttributeCapabilityResponse(
_In_ sai_status_t status,
_In_ sai_object_type_t objectType,
_In_ sai_attr_id_t attrId,
_In_ const sai_attr_capability_t* capability);

void recordQueryAattributeEnumValuesCapability(
_In_ sai_object_id_t switch_id,
_In_ sai_object_type_t object_type,
Expand All @@ -303,6 +315,14 @@ namespace sairedis
_In_ const sai_s32_list_t* enumValuesCapability);

// TODO move to private
void recordQueryAttributeCapability(
_In_ const std::string& key,
_In_ const std::vector<swss::FieldValueTuple>& arguments);

void recordQueryAttributeCapabilityResponse(
_In_ sai_status_t status,
_In_ const std::vector<swss::FieldValueTuple>& arguments);

void recordQueryAttributeEnumValuesCapability(
_In_ const std::string& key,
_In_ const std::vector<swss::FieldValueTuple>& arguments);
Expand Down
9 changes: 9 additions & 0 deletions lib/inc/RedisRemoteSaiInterface.h
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,12 @@ namespace sairedis
_In_ const sai_attribute_t *attrList,
_Out_ uint64_t *count) override;

virtual sai_status_t queryAttributeCapability(
_In_ sai_object_id_t switch_id,
_In_ sai_object_type_t object_type,
_In_ sai_attr_id_t attr_id,
_Out_ sai_attr_capability_t *capability) override;

virtual sai_status_t queryAattributeEnumValuesCapability(
_In_ sai_object_id_t switch_id,
_In_ sai_object_type_t object_type,
Expand Down Expand Up @@ -386,6 +392,9 @@ namespace sairedis

private: // SAI API response

sai_status_t waitForQueryAttributeCapabilityResponse(
_Out_ sai_attr_capability_t* capability);

sai_status_t waitForQueryAattributeEnumValuesCapabilityResponse(
_Inout_ sai_s32_list_t* enumValuesCapability);

Expand Down
6 changes: 6 additions & 0 deletions lib/inc/Sai.h
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,12 @@ namespace sairedis
_In_ const sai_attribute_t *attrList,
_Out_ uint64_t *count) override;

virtual sai_status_t queryAttributeCapability(
_In_ sai_object_id_t switch_id,
_In_ sai_object_type_t object_type,
_In_ sai_attr_id_t attr_id,
_Out_ sai_attr_capability_t *capability) override;

virtual sai_status_t queryAattributeEnumValuesCapability(
_In_ sai_object_id_t switch_id,
_In_ sai_object_type_t object_type,
Expand Down
6 changes: 6 additions & 0 deletions lib/inc/SaiInterface.h
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,12 @@ namespace sairedis
_In_ const sai_attribute_t *attrList,
_Out_ uint64_t *count) = 0;

virtual sai_status_t queryAttributeCapability(
_In_ sai_object_id_t switch_id,
_In_ sai_object_type_t object_type,
_In_ sai_attr_id_t attr_id,
_Out_ sai_attr_capability_t *capability) = 0;

virtual sai_status_t queryAattributeEnumValuesCapability(
_In_ sai_object_id_t switch_id,
_In_ sai_object_type_t object_type,
Expand Down
3 changes: 3 additions & 0 deletions lib/inc/sairediscommon.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@
#define REDIS_ASIC_STATE_COMMAND_FLUSH "flush"
#define REDIS_ASIC_STATE_COMMAND_FLUSHRESPONSE "flushresponse"

#define REDIS_ASIC_STATE_COMMAND_ATTR_CAPABILITY_QUERY "attribute_capability_query"
#define REDIS_ASIC_STATE_COMMAND_ATTR_CAPABILITY_RESPONSE "attribute_capability_response"

#define REDIS_ASIC_STATE_COMMAND_ATTR_ENUM_VALUES_CAPABILITY_QUERY "attr_enum_values_capability_query"
#define REDIS_ASIC_STATE_COMMAND_ATTR_ENUM_VALUES_CAPABILITY_RESPONSE "attr_enum_values_capability_response"

Expand Down
89 changes: 89 additions & 0 deletions lib/src/Recorder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,25 @@ void Recorder::recordFlushFdbEntriesResponse(
recordLine("F|" + sai_serialize_status(status));
}

void Recorder::recordQueryAttributeCapability(
_In_ const std::string& key,
_In_ const std::vector<swss::FieldValueTuple>& arguments)
{
SWSS_LOG_ENTER();

recordLine("q|attribute_capability|" + key + "|" + joinFieldValues(arguments));
}

void Recorder::recordQueryAttributeCapabilityResponse(
_In_ sai_status_t status,
_In_ const std::vector<swss::FieldValueTuple>& arguments)
{
SWSS_LOG_ENTER();

recordLine("Q|attribute_capability|" + sai_serialize_status(status) + "|" + joinFieldValues(arguments));
}


void Recorder::recordQueryAttributeEnumValuesCapability(
_In_ const std::string& key,
_In_ const std::vector<swss::FieldValueTuple>& arguments)
Expand Down Expand Up @@ -886,6 +905,76 @@ void Recorder::recordObjectTypeGetAvailabilityResponse(
recordObjectTypeGetAvailabilityResponse(status, values);
}

void Recorder::recordQueryAttributeCapability(
_In_ sai_object_id_t switchId,
_In_ sai_object_type_t objectType,
_In_ sai_attr_id_t attrId,
_Out_ sai_attr_capability_t *Capability)
{
SWSS_LOG_ENTER();

auto meta = sai_metadata_get_attr_metadata(objectType, attrId);

if (meta == NULL)
{
SWSS_LOG_ERROR("Failed to find attribute metadata: object type %s, attr id %d",
sai_serialize_object_type(objectType).c_str(), attrId);
return;
}

auto key = sai_serialize_object_type(SAI_OBJECT_TYPE_SWITCH) + ":" + sai_serialize_object_id(switchId);

auto object_type_str = sai_serialize_object_type(objectType);
const std::string attr_id_str = meta->attridname;
const std::vector<swss::FieldValueTuple> values =
{
swss::FieldValueTuple("OBJECT_TYPE", object_type_str),
swss::FieldValueTuple("ATTR_ID", attr_id_str)
};

SWSS_LOG_DEBUG("Query arguments: switch %s, object_type: %s, attribute: %s",
key.c_str(),
object_type_str.c_str(),
meta->attridname);

recordQueryAttributeCapability(key, values);
}


void Recorder::recordQueryAttributeCapabilityResponse(
_In_ sai_status_t status,
_In_ sai_object_type_t objectType,
_In_ sai_attr_id_t attrId,
_In_ const sai_attr_capability_t* capability)
{
SWSS_LOG_ENTER();

auto meta = sai_metadata_get_attr_metadata(objectType, attrId);

if (meta == NULL)
{
SWSS_LOG_ERROR("Failed to find attribute metadata: object type %s, attr id %d",
sai_serialize_object_type(objectType).c_str(), attrId);
return;
}

auto object_type_str = sai_serialize_object_type(objectType);
const std::string attr_id_str = meta->attridname;
const std::string create_str = (status == SAI_STATUS_SUCCESS ? (capability->create_implemented? "true":"false"): "false");
const std::string set_str = (status == SAI_STATUS_SUCCESS ? (capability->set_implemented? "true":"false"): "false");
const std::string get_str = (status == SAI_STATUS_SUCCESS ? (capability->get_implemented? "true":"false"): "false");
const std::vector<swss::FieldValueTuple> values =
{
swss::FieldValueTuple("OBJECT_TYPE", object_type_str),
swss::FieldValueTuple("ATTR_ID", attr_id_str),
swss::FieldValueTuple("CREATE_IMP", create_str),
swss::FieldValueTuple("SET_IMP", set_str),
swss::FieldValueTuple("GET_IMP", get_str)
};

recordQueryAttributeCapabilityResponse(status, values);
}

void Recorder::recordQueryAattributeEnumValuesCapability(
_In_ sai_object_id_t switchId,
_In_ sai_object_type_t objectType,
Expand Down
79 changes: 79 additions & 0 deletions lib/src/RedisRemoteSaiInterface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -827,6 +827,85 @@ sai_status_t RedisRemoteSaiInterface::waitForObjectTypeGetAvailabilityResponse(
return status;
}

sai_status_t RedisRemoteSaiInterface::queryAttributeCapability(
_In_ sai_object_id_t switchId,
_In_ sai_object_type_t objectType,
_In_ sai_attr_id_t attrId,
_Out_ sai_attr_capability_t *capability)
{
SWSS_LOG_ENTER();

auto switchIdStr = sai_serialize_object_id(switchId);
auto objectTypeStr = sai_serialize_object_type(objectType);

auto meta = sai_metadata_get_attr_metadata(objectType, attrId);

if (meta == NULL)
{
SWSS_LOG_ERROR("Failed to find attribute metadata: object type %s, attr id %d", objectTypeStr.c_str(), attrId);
return SAI_STATUS_INVALID_PARAMETER;
}

const std::string attrIdStr = meta->attridname;

const std::vector<swss::FieldValueTuple> entry =
{
swss::FieldValueTuple("OBJECT_TYPE", objectTypeStr),
swss::FieldValueTuple("ATTR_ID", attrIdStr)
};

SWSS_LOG_DEBUG(
"Query arguments: switch %s, object type: %s, attribute: %s",
switchIdStr.c_str(),
objectTypeStr.c_str(),
attrIdStr.c_str()
);

// This query will not put any data into the ASIC view, just into the
// message queue

m_recorder->recordQueryAttributeCapability(switchId, objectType, attrId, capability);

m_redisChannel->set(switchIdStr, entry, REDIS_ASIC_STATE_COMMAND_ATTR_CAPABILITY_QUERY);

auto status = waitForQueryAttributeCapabilityResponse(capability);

m_recorder->recordQueryAttributeCapabilityResponse(status, objectType, attrId, capability);

return status;
}

sai_status_t RedisRemoteSaiInterface::waitForQueryAttributeCapabilityResponse(
_Out_ sai_attr_capability_t* capability)
{
SWSS_LOG_ENTER();

swss::KeyOpFieldsValuesTuple kco;

auto status = m_redisChannel->wait(REDIS_ASIC_STATE_COMMAND_ATTR_CAPABILITY_RESPONSE, kco);

if (status == SAI_STATUS_SUCCESS)
{
const std::vector<swss::FieldValueTuple> &values = kfvFieldsValues(kco);

if (values.size() != 3)
{
SWSS_LOG_ERROR("Invalid response from syncd: expected 3 values, received %zu", values.size());

return SAI_STATUS_FAILURE;
}

capability->create_implemented = (fvValue(values[0]) == "true" ? true : false);
capability->set_implemented = (fvValue(values[1]) == "true" ? true : false);
capability->get_implemented = (fvValue(values[2]) == "true" ? true : false);

SWSS_LOG_DEBUG("Received payload: create_implemented:%s, set_implemented:%s, get_implemented:%s",
(capability->create_implemented? "true":"false"), (capability->set_implemented? "true":"false"), (capability->get_implemented? "true":"false"));
}

return status;
}

sai_status_t RedisRemoteSaiInterface::queryAattributeEnumValuesCapability(
_In_ sai_object_id_t switchId,
_In_ sai_object_type_t objectType,
Expand Down
18 changes: 18 additions & 0 deletions lib/src/Sai.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -576,6 +576,24 @@ sai_status_t Sai::objectTypeGetAvailability(
count);
}

sai_status_t Sai::queryAttributeCapability(
_In_ sai_object_id_t switch_id,
_In_ sai_object_type_t object_type,
_In_ sai_attr_id_t attr_id,
_Out_ sai_attr_capability_t *capability)
{
MUTEX();
SWSS_LOG_ENTER();
REDIS_CHECK_API_INITIALIZED();
REDIS_CHECK_CONTEXT(switch_id);

return context->m_meta->queryAttributeCapability(
switch_id,
object_type,
attr_id,
capability);
}

sai_status_t Sai::queryAattributeEnumValuesCapability(
_In_ sai_object_id_t switch_id,
_In_ sai_object_type_t object_type,
Expand Down
15 changes: 15 additions & 0 deletions lib/src/sai_redis_interfacequery.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,21 @@ sai_status_t sai_api_query(
return SAI_STATUS_INVALID_PARAMETER;
}

sai_status_t sai_query_attribute_capability(
_In_ sai_object_id_t switch_id,
_In_ sai_object_type_t object_type,
_In_ sai_attr_id_t attr_id,
_Out_ sai_attr_capability_t *capability)
{
SWSS_LOG_ENTER();

return redis_sai->queryAttributeCapability(
switch_id,
object_type,
attr_id,
capability);
}

sai_status_t sai_query_attribute_enum_values_capability(
_In_ sai_object_id_t switch_id,
_In_ sai_object_type_t object_type,
Expand Down
11 changes: 11 additions & 0 deletions meta/DummySaiInterface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,17 @@ sai_status_t DummySaiInterface::objectTypeGetAvailability(
return m_status;
}

sai_status_t DummySaiInterface::queryAttributeCapability(
_In_ sai_object_id_t switchId,
_In_ sai_object_type_t objectType,
_In_ sai_attr_id_t attrId,
_Out_ sai_attr_capability_t *capability)
{
SWSS_LOG_ENTER();

return m_status;
}

sai_status_t DummySaiInterface::queryAattributeEnumValuesCapability(
_In_ sai_object_id_t switchId,
_In_ sai_object_type_t objectType,
Expand Down
6 changes: 6 additions & 0 deletions meta/DummySaiInterface.h
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,12 @@ namespace saimeta
_In_ const sai_attribute_t *attrList,
_Out_ uint64_t *count) override;

virtual sai_status_t queryAttributeCapability(
_In_ sai_object_id_t switch_id,
_In_ sai_object_type_t object_type,
_In_ sai_attr_id_t attr_id,
_Out_ sai_attr_capability_t *capability) override;

virtual sai_status_t queryAattributeEnumValuesCapability(
_In_ sai_object_id_t switch_id,
_In_ sai_object_type_t object_type,
Expand Down
31 changes: 31 additions & 0 deletions meta/Meta.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1856,6 +1856,37 @@ sai_status_t Meta::objectTypeGetAvailability(
return status;
}

sai_status_t Meta::queryAttributeCapability(
_In_ sai_object_id_t switchId,
_In_ sai_object_type_t objectType,
_In_ sai_attr_id_t attrId,
_Out_ sai_attr_capability_t *capability)
{
SWSS_LOG_ENTER();

PARAMETER_CHECK_OID_OBJECT_TYPE(switchId, SAI_OBJECT_TYPE_SWITCH);
PARAMETER_CHECK_OID_EXISTS(switchId, SAI_OBJECT_TYPE_SWITCH);
PARAMETER_CHECK_OBJECT_TYPE_VALID(objectType);

auto mdp = sai_metadata_get_attr_metadata(objectType, attrId);
daall marked this conversation as resolved.
Show resolved Hide resolved

if (!mdp)
{
SWSS_LOG_ERROR("unable to find attribute: %s:%d",
sai_serialize_object_type(objectType).c_str(),
attrId);

return SAI_STATUS_INVALID_PARAMETER;
}

PARAMETER_CHECK_IF_NOT_NULL(capability);

auto status = m_implementation->queryAttributeCapability(switchId, objectType, attrId, capability);

return status;
}


sai_status_t Meta::queryAattributeEnumValuesCapability(
_In_ sai_object_id_t switchId,
_In_ sai_object_type_t objectType,
Expand Down
Loading