Skip to content

Commit

Permalink
Adding support for new SAI API sai_query_attribute_capability() (soni…
Browse files Browse the repository at this point in the history
…c-net#645)

* Addind support for new SAI API sai_query_attribute_capability()
  • Loading branch information
gechiang authored Jul 22, 2020
1 parent 8d3ae8c commit 4a3a568
Show file tree
Hide file tree
Showing 22 changed files with 449 additions and 0 deletions.
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);

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

0 comments on commit 4a3a568

Please sign in to comment.