Skip to content

Commit f782412

Browse files
authored
Adding support for new SAI API sai_query_attribute_capability() (sonic-net#645)
* Addind support for new SAI API sai_query_attribute_capability()
1 parent 34e93a0 commit f782412

22 files changed

+449
-0
lines changed

lib/inc/Recorder.h

+20
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,18 @@ namespace sairedis
290290
_In_ sai_status_t status,
291291
_In_ const uint64_t *count);
292292

293+
void recordQueryAttributeCapability(
294+
_In_ sai_object_id_t switch_id,
295+
_In_ sai_object_type_t object_type,
296+
_In_ sai_attr_id_t attr_id,
297+
_Out_ sai_attr_capability_t *capability);
298+
299+
void recordQueryAttributeCapabilityResponse(
300+
_In_ sai_status_t status,
301+
_In_ sai_object_type_t objectType,
302+
_In_ sai_attr_id_t attrId,
303+
_In_ const sai_attr_capability_t* capability);
304+
293305
void recordQueryAattributeEnumValuesCapability(
294306
_In_ sai_object_id_t switch_id,
295307
_In_ sai_object_type_t object_type,
@@ -303,6 +315,14 @@ namespace sairedis
303315
_In_ const sai_s32_list_t* enumValuesCapability);
304316

305317
// TODO move to private
318+
void recordQueryAttributeCapability(
319+
_In_ const std::string& key,
320+
_In_ const std::vector<swss::FieldValueTuple>& arguments);
321+
322+
void recordQueryAttributeCapabilityResponse(
323+
_In_ sai_status_t status,
324+
_In_ const std::vector<swss::FieldValueTuple>& arguments);
325+
306326
void recordQueryAttributeEnumValuesCapability(
307327
_In_ const std::string& key,
308328
_In_ const std::vector<swss::FieldValueTuple>& arguments);

lib/inc/RedisRemoteSaiInterface.h

+9
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,12 @@ namespace sairedis
240240
_In_ const sai_attribute_t *attrList,
241241
_Out_ uint64_t *count) override;
242242

243+
virtual sai_status_t queryAttributeCapability(
244+
_In_ sai_object_id_t switch_id,
245+
_In_ sai_object_type_t object_type,
246+
_In_ sai_attr_id_t attr_id,
247+
_Out_ sai_attr_capability_t *capability) override;
248+
243249
virtual sai_status_t queryAattributeEnumValuesCapability(
244250
_In_ sai_object_id_t switch_id,
245251
_In_ sai_object_type_t object_type,
@@ -386,6 +392,9 @@ namespace sairedis
386392

387393
private: // SAI API response
388394

395+
sai_status_t waitForQueryAttributeCapabilityResponse(
396+
_Out_ sai_attr_capability_t* capability);
397+
389398
sai_status_t waitForQueryAattributeEnumValuesCapabilityResponse(
390399
_Inout_ sai_s32_list_t* enumValuesCapability);
391400

lib/inc/Sai.h

+6
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,12 @@ namespace sairedis
231231
_In_ const sai_attribute_t *attrList,
232232
_Out_ uint64_t *count) override;
233233

234+
virtual sai_status_t queryAttributeCapability(
235+
_In_ sai_object_id_t switch_id,
236+
_In_ sai_object_type_t object_type,
237+
_In_ sai_attr_id_t attr_id,
238+
_Out_ sai_attr_capability_t *capability) override;
239+
234240
virtual sai_status_t queryAattributeEnumValuesCapability(
235241
_In_ sai_object_id_t switch_id,
236242
_In_ sai_object_type_t object_type,

lib/inc/SaiInterface.h

+6
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,12 @@ namespace sairedis
242242
_In_ const sai_attribute_t *attrList,
243243
_Out_ uint64_t *count) = 0;
244244

245+
virtual sai_status_t queryAttributeCapability(
246+
_In_ sai_object_id_t switch_id,
247+
_In_ sai_object_type_t object_type,
248+
_In_ sai_attr_id_t attr_id,
249+
_Out_ sai_attr_capability_t *capability) = 0;
250+
245251
virtual sai_status_t queryAattributeEnumValuesCapability(
246252
_In_ sai_object_id_t switch_id,
247253
_In_ sai_object_type_t object_type,

lib/inc/sairediscommon.h

+3
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@
3737
#define REDIS_ASIC_STATE_COMMAND_FLUSH "flush"
3838
#define REDIS_ASIC_STATE_COMMAND_FLUSHRESPONSE "flushresponse"
3939

40+
#define REDIS_ASIC_STATE_COMMAND_ATTR_CAPABILITY_QUERY "attribute_capability_query"
41+
#define REDIS_ASIC_STATE_COMMAND_ATTR_CAPABILITY_RESPONSE "attribute_capability_response"
42+
4043
#define REDIS_ASIC_STATE_COMMAND_ATTR_ENUM_VALUES_CAPABILITY_QUERY "attr_enum_values_capability_query"
4144
#define REDIS_ASIC_STATE_COMMAND_ATTR_ENUM_VALUES_CAPABILITY_RESPONSE "attr_enum_values_capability_response"
4245

lib/src/Recorder.cpp

+89
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,25 @@ void Recorder::recordFlushFdbEntriesResponse(
265265
recordLine("F|" + sai_serialize_status(status));
266266
}
267267

268+
void Recorder::recordQueryAttributeCapability(
269+
_In_ const std::string& key,
270+
_In_ const std::vector<swss::FieldValueTuple>& arguments)
271+
{
272+
SWSS_LOG_ENTER();
273+
274+
recordLine("q|attribute_capability|" + key + "|" + joinFieldValues(arguments));
275+
}
276+
277+
void Recorder::recordQueryAttributeCapabilityResponse(
278+
_In_ sai_status_t status,
279+
_In_ const std::vector<swss::FieldValueTuple>& arguments)
280+
{
281+
SWSS_LOG_ENTER();
282+
283+
recordLine("Q|attribute_capability|" + sai_serialize_status(status) + "|" + joinFieldValues(arguments));
284+
}
285+
286+
268287
void Recorder::recordQueryAttributeEnumValuesCapability(
269288
_In_ const std::string& key,
270289
_In_ const std::vector<swss::FieldValueTuple>& arguments)
@@ -886,6 +905,76 @@ void Recorder::recordObjectTypeGetAvailabilityResponse(
886905
recordObjectTypeGetAvailabilityResponse(status, values);
887906
}
888907

908+
void Recorder::recordQueryAttributeCapability(
909+
_In_ sai_object_id_t switchId,
910+
_In_ sai_object_type_t objectType,
911+
_In_ sai_attr_id_t attrId,
912+
_Out_ sai_attr_capability_t *Capability)
913+
{
914+
SWSS_LOG_ENTER();
915+
916+
auto meta = sai_metadata_get_attr_metadata(objectType, attrId);
917+
918+
if (meta == NULL)
919+
{
920+
SWSS_LOG_ERROR("Failed to find attribute metadata: object type %s, attr id %d",
921+
sai_serialize_object_type(objectType).c_str(), attrId);
922+
return;
923+
}
924+
925+
auto key = sai_serialize_object_type(SAI_OBJECT_TYPE_SWITCH) + ":" + sai_serialize_object_id(switchId);
926+
927+
auto object_type_str = sai_serialize_object_type(objectType);
928+
const std::string attr_id_str = meta->attridname;
929+
const std::vector<swss::FieldValueTuple> values =
930+
{
931+
swss::FieldValueTuple("OBJECT_TYPE", object_type_str),
932+
swss::FieldValueTuple("ATTR_ID", attr_id_str)
933+
};
934+
935+
SWSS_LOG_DEBUG("Query arguments: switch %s, object_type: %s, attribute: %s",
936+
key.c_str(),
937+
object_type_str.c_str(),
938+
meta->attridname);
939+
940+
recordQueryAttributeCapability(key, values);
941+
}
942+
943+
944+
void Recorder::recordQueryAttributeCapabilityResponse(
945+
_In_ sai_status_t status,
946+
_In_ sai_object_type_t objectType,
947+
_In_ sai_attr_id_t attrId,
948+
_In_ const sai_attr_capability_t* capability)
949+
{
950+
SWSS_LOG_ENTER();
951+
952+
auto meta = sai_metadata_get_attr_metadata(objectType, attrId);
953+
954+
if (meta == NULL)
955+
{
956+
SWSS_LOG_ERROR("Failed to find attribute metadata: object type %s, attr id %d",
957+
sai_serialize_object_type(objectType).c_str(), attrId);
958+
return;
959+
}
960+
961+
auto object_type_str = sai_serialize_object_type(objectType);
962+
const std::string attr_id_str = meta->attridname;
963+
const std::string create_str = (status == SAI_STATUS_SUCCESS ? (capability->create_implemented? "true":"false"): "false");
964+
const std::string set_str = (status == SAI_STATUS_SUCCESS ? (capability->set_implemented? "true":"false"): "false");
965+
const std::string get_str = (status == SAI_STATUS_SUCCESS ? (capability->get_implemented? "true":"false"): "false");
966+
const std::vector<swss::FieldValueTuple> values =
967+
{
968+
swss::FieldValueTuple("OBJECT_TYPE", object_type_str),
969+
swss::FieldValueTuple("ATTR_ID", attr_id_str),
970+
swss::FieldValueTuple("CREATE_IMP", create_str),
971+
swss::FieldValueTuple("SET_IMP", set_str),
972+
swss::FieldValueTuple("GET_IMP", get_str)
973+
};
974+
975+
recordQueryAttributeCapabilityResponse(status, values);
976+
}
977+
889978
void Recorder::recordQueryAattributeEnumValuesCapability(
890979
_In_ sai_object_id_t switchId,
891980
_In_ sai_object_type_t objectType,

lib/src/RedisRemoteSaiInterface.cpp

+79
Original file line numberDiff line numberDiff line change
@@ -827,6 +827,85 @@ sai_status_t RedisRemoteSaiInterface::waitForObjectTypeGetAvailabilityResponse(
827827
return status;
828828
}
829829

830+
sai_status_t RedisRemoteSaiInterface::queryAttributeCapability(
831+
_In_ sai_object_id_t switchId,
832+
_In_ sai_object_type_t objectType,
833+
_In_ sai_attr_id_t attrId,
834+
_Out_ sai_attr_capability_t *capability)
835+
{
836+
SWSS_LOG_ENTER();
837+
838+
auto switchIdStr = sai_serialize_object_id(switchId);
839+
auto objectTypeStr = sai_serialize_object_type(objectType);
840+
841+
auto meta = sai_metadata_get_attr_metadata(objectType, attrId);
842+
843+
if (meta == NULL)
844+
{
845+
SWSS_LOG_ERROR("Failed to find attribute metadata: object type %s, attr id %d", objectTypeStr.c_str(), attrId);
846+
return SAI_STATUS_INVALID_PARAMETER;
847+
}
848+
849+
const std::string attrIdStr = meta->attridname;
850+
851+
const std::vector<swss::FieldValueTuple> entry =
852+
{
853+
swss::FieldValueTuple("OBJECT_TYPE", objectTypeStr),
854+
swss::FieldValueTuple("ATTR_ID", attrIdStr)
855+
};
856+
857+
SWSS_LOG_DEBUG(
858+
"Query arguments: switch %s, object type: %s, attribute: %s",
859+
switchIdStr.c_str(),
860+
objectTypeStr.c_str(),
861+
attrIdStr.c_str()
862+
);
863+
864+
// This query will not put any data into the ASIC view, just into the
865+
// message queue
866+
867+
m_recorder->recordQueryAttributeCapability(switchId, objectType, attrId, capability);
868+
869+
m_redisChannel->set(switchIdStr, entry, REDIS_ASIC_STATE_COMMAND_ATTR_CAPABILITY_QUERY);
870+
871+
auto status = waitForQueryAttributeCapabilityResponse(capability);
872+
873+
m_recorder->recordQueryAttributeCapabilityResponse(status, objectType, attrId, capability);
874+
875+
return status;
876+
}
877+
878+
sai_status_t RedisRemoteSaiInterface::waitForQueryAttributeCapabilityResponse(
879+
_Out_ sai_attr_capability_t* capability)
880+
{
881+
SWSS_LOG_ENTER();
882+
883+
swss::KeyOpFieldsValuesTuple kco;
884+
885+
auto status = m_redisChannel->wait(REDIS_ASIC_STATE_COMMAND_ATTR_CAPABILITY_RESPONSE, kco);
886+
887+
if (status == SAI_STATUS_SUCCESS)
888+
{
889+
const std::vector<swss::FieldValueTuple> &values = kfvFieldsValues(kco);
890+
891+
if (values.size() != 3)
892+
{
893+
SWSS_LOG_ERROR("Invalid response from syncd: expected 3 values, received %zu", values.size());
894+
895+
return SAI_STATUS_FAILURE;
896+
}
897+
898+
capability->create_implemented = (fvValue(values[0]) == "true" ? true : false);
899+
capability->set_implemented = (fvValue(values[1]) == "true" ? true : false);
900+
capability->get_implemented = (fvValue(values[2]) == "true" ? true : false);
901+
902+
SWSS_LOG_DEBUG("Received payload: create_implemented:%s, set_implemented:%s, get_implemented:%s",
903+
(capability->create_implemented? "true":"false"), (capability->set_implemented? "true":"false"), (capability->get_implemented? "true":"false"));
904+
}
905+
906+
return status;
907+
}
908+
830909
sai_status_t RedisRemoteSaiInterface::queryAattributeEnumValuesCapability(
831910
_In_ sai_object_id_t switchId,
832911
_In_ sai_object_type_t objectType,

lib/src/Sai.cpp

+18
Original file line numberDiff line numberDiff line change
@@ -576,6 +576,24 @@ sai_status_t Sai::objectTypeGetAvailability(
576576
count);
577577
}
578578

579+
sai_status_t Sai::queryAttributeCapability(
580+
_In_ sai_object_id_t switch_id,
581+
_In_ sai_object_type_t object_type,
582+
_In_ sai_attr_id_t attr_id,
583+
_Out_ sai_attr_capability_t *capability)
584+
{
585+
MUTEX();
586+
SWSS_LOG_ENTER();
587+
REDIS_CHECK_API_INITIALIZED();
588+
REDIS_CHECK_CONTEXT(switch_id);
589+
590+
return context->m_meta->queryAttributeCapability(
591+
switch_id,
592+
object_type,
593+
attr_id,
594+
capability);
595+
}
596+
579597
sai_status_t Sai::queryAattributeEnumValuesCapability(
580598
_In_ sai_object_id_t switch_id,
581599
_In_ sai_object_type_t object_type,

lib/src/sai_redis_interfacequery.cpp

+15
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,21 @@ sai_status_t sai_api_query(
105105
return SAI_STATUS_INVALID_PARAMETER;
106106
}
107107

108+
sai_status_t sai_query_attribute_capability(
109+
_In_ sai_object_id_t switch_id,
110+
_In_ sai_object_type_t object_type,
111+
_In_ sai_attr_id_t attr_id,
112+
_Out_ sai_attr_capability_t *capability)
113+
{
114+
SWSS_LOG_ENTER();
115+
116+
return redis_sai->queryAttributeCapability(
117+
switch_id,
118+
object_type,
119+
attr_id,
120+
capability);
121+
}
122+
108123
sai_status_t sai_query_attribute_enum_values_capability(
109124
_In_ sai_object_id_t switch_id,
110125
_In_ sai_object_type_t object_type,

meta/DummySaiInterface.cpp

+11
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,17 @@ sai_status_t DummySaiInterface::objectTypeGetAvailability(
153153
return m_status;
154154
}
155155

156+
sai_status_t DummySaiInterface::queryAttributeCapability(
157+
_In_ sai_object_id_t switchId,
158+
_In_ sai_object_type_t objectType,
159+
_In_ sai_attr_id_t attrId,
160+
_Out_ sai_attr_capability_t *capability)
161+
{
162+
SWSS_LOG_ENTER();
163+
164+
return m_status;
165+
}
166+
156167
sai_status_t DummySaiInterface::queryAattributeEnumValuesCapability(
157168
_In_ sai_object_id_t switchId,
158169
_In_ sai_object_type_t objectType,

meta/DummySaiInterface.h

+6
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,12 @@ namespace saimeta
230230
_In_ const sai_attribute_t *attrList,
231231
_Out_ uint64_t *count) override;
232232

233+
virtual sai_status_t queryAttributeCapability(
234+
_In_ sai_object_id_t switch_id,
235+
_In_ sai_object_type_t object_type,
236+
_In_ sai_attr_id_t attr_id,
237+
_Out_ sai_attr_capability_t *capability) override;
238+
233239
virtual sai_status_t queryAattributeEnumValuesCapability(
234240
_In_ sai_object_id_t switch_id,
235241
_In_ sai_object_type_t object_type,

meta/Meta.cpp

+31
Original file line numberDiff line numberDiff line change
@@ -1856,6 +1856,37 @@ sai_status_t Meta::objectTypeGetAvailability(
18561856
return status;
18571857
}
18581858

1859+
sai_status_t Meta::queryAttributeCapability(
1860+
_In_ sai_object_id_t switchId,
1861+
_In_ sai_object_type_t objectType,
1862+
_In_ sai_attr_id_t attrId,
1863+
_Out_ sai_attr_capability_t *capability)
1864+
{
1865+
SWSS_LOG_ENTER();
1866+
1867+
PARAMETER_CHECK_OID_OBJECT_TYPE(switchId, SAI_OBJECT_TYPE_SWITCH);
1868+
PARAMETER_CHECK_OID_EXISTS(switchId, SAI_OBJECT_TYPE_SWITCH);
1869+
PARAMETER_CHECK_OBJECT_TYPE_VALID(objectType);
1870+
1871+
auto mdp = sai_metadata_get_attr_metadata(objectType, attrId);
1872+
1873+
if (!mdp)
1874+
{
1875+
SWSS_LOG_ERROR("unable to find attribute: %s:%d",
1876+
sai_serialize_object_type(objectType).c_str(),
1877+
attrId);
1878+
1879+
return SAI_STATUS_INVALID_PARAMETER;
1880+
}
1881+
1882+
PARAMETER_CHECK_IF_NOT_NULL(capability);
1883+
1884+
auto status = m_implementation->queryAttributeCapability(switchId, objectType, attrId, capability);
1885+
1886+
return status;
1887+
}
1888+
1889+
18591890
sai_status_t Meta::queryAattributeEnumValuesCapability(
18601891
_In_ sai_object_id_t switchId,
18611892
_In_ sai_object_type_t objectType,

0 commit comments

Comments
 (0)