Skip to content

Commit d29760f

Browse files
daalllguohan
authored andcommitted
[sai_redis_interface_query] Add sairedis support for sai_object_type_get_availability (#528)
* Add sai_object_type_get_availability to libsairedis * Add handler for sai_object_type_get_availability to syncd * Add sai_object_type_get_availability implementation to virtual switch Signed-off-by: Danny Allen <[email protected]>
1 parent ff5306e commit d29760f

File tree

6 files changed

+215
-0
lines changed

6 files changed

+215
-0
lines changed

lib/inc/sairedis.h

+3
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,11 @@ extern "C" {
1111
#define ASIC_STATE_TABLE "ASIC_STATE"
1212
#define TEMP_PREFIX "TEMP_"
1313

14+
// Messages for processing queries from libsairedis to syncd
1415
const std::string attrEnumValuesCapabilityQuery("attr_enum_values_capability_query");
1516
const std::string attrEnumValuesCapabilityResponse("attr_enum_values_capability_response");
17+
const std::string objectTypeGetAvailabilityQuery("object_type_get_availability_query");
18+
const std::string objectTypeGetAvailabilityResponse("object_type_get_availability_response");
1619

1720
typedef enum _sai_redis_notify_syncd_t
1821
{

lib/src/sai_redis_interfacequery.cpp

+117
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#include "sairedis.h"
33

44
#include "meta/sai_serialize.h"
5+
#include "meta/saiattributelist.h"
56

67
#include "swss/selectableevent.h"
78
#include <string.h>
@@ -410,3 +411,119 @@ sai_status_t sai_query_attribute_enum_values_capability(
410411
SWSS_LOG_ERROR("Failed to receive a response from syncd");
411412
return SAI_STATUS_FAILURE;
412413
}
414+
415+
sai_status_t sai_object_type_get_availability(
416+
_In_ sai_object_id_t switch_id,
417+
_In_ sai_object_type_t object_type,
418+
_In_ uint32_t attr_count,
419+
_In_ const sai_attribute_t *attr_list,
420+
_Out_ uint64_t *count)
421+
{
422+
MUTEX();
423+
424+
SWSS_LOG_ENTER();
425+
426+
const std::string switch_id_str = sai_serialize_object_id(switch_id);
427+
const std::string object_type_str = sai_serialize_object_type(object_type);
428+
std::vector<swss::FieldValueTuple> query_arguments = SaiAttributeList::serialize_attr_list(
429+
object_type,
430+
attr_count,
431+
attr_list,
432+
false);
433+
434+
SWSS_LOG_DEBUG(
435+
"Query arguments: switch: %s, object type: %s, attributes: %s",
436+
switch_id_str.c_str(),
437+
object_type_str.c_str(),
438+
joinFieldValues(query_arguments).c_str()
439+
);
440+
441+
// Syncd will pop this argument off before trying to deserialize the attribute list
442+
query_arguments.push_back(swss::FieldValueTuple("OBJECT_TYPE", object_type_str));
443+
444+
if (g_record)
445+
{
446+
recordLine("q|object_type_get_availability|" + switch_id_str + "|" + joinFieldValues(query_arguments));
447+
}
448+
449+
// This query will not put any data into the ASIC view, just into the
450+
// message queue
451+
g_asicState->set(switch_id_str, query_arguments, objectTypeGetAvailabilityQuery);
452+
453+
swss::Select callback;
454+
callback.addSelectable(g_redisGetConsumer.get());
455+
456+
while (true)
457+
{
458+
SWSS_LOG_DEBUG("Waiting for a response");
459+
460+
swss::Selectable *sel;
461+
462+
auto result = callback.select(&sel, GET_RESPONSE_TIMEOUT);
463+
464+
if (result == swss::Select::OBJECT)
465+
{
466+
swss::KeyOpFieldsValuesTuple kco;
467+
468+
g_redisGetConsumer->pop(kco);
469+
470+
const std::string &message_type = kfvOp(kco);
471+
const std::string &status_str = kfvKey(kco);
472+
473+
SWSS_LOG_DEBUG("Received response: op = %s, key = %s", message_type.c_str(), status_str.c_str());
474+
475+
// Ignore messages that are not in response to our query
476+
if (message_type != objectTypeGetAvailabilityResponse)
477+
{
478+
continue;
479+
}
480+
481+
sai_status_t status;
482+
sai_deserialize_status(status_str, status);
483+
484+
if (status == SAI_STATUS_SUCCESS)
485+
{
486+
const std::vector<swss::FieldValueTuple> &values = kfvFieldsValues(kco);
487+
488+
if (values.size() != 1)
489+
{
490+
if (g_record)
491+
{
492+
recordLine("Q|object_type_get_availability|SAI_STATUS_FAILURE");
493+
}
494+
495+
SWSS_LOG_ERROR("Invalid response from syncd: expected 1 value, received %d", values.size());
496+
return SAI_STATUS_FAILURE;
497+
}
498+
499+
const std::string &availability_str = fvValue(values[0]);
500+
*count = std::stol(availability_str);
501+
502+
SWSS_LOG_DEBUG("Received payload: count = %lu", *count);
503+
504+
if (g_record)
505+
{
506+
recordLine("Q|object_type_get_availability|" + status_str + "|" + joinFieldValues(values));
507+
}
508+
}
509+
else
510+
{
511+
if (g_record)
512+
{
513+
recordLine("Q|object_type_get_availability|" + status_str);
514+
}
515+
}
516+
517+
SWSS_LOG_DEBUG("Status: %s", status_str.c_str());
518+
return status;
519+
}
520+
}
521+
522+
if (g_record)
523+
{
524+
recordLine("Q|object_type_get_availability|SAI_STATUS_FAILURE");
525+
}
526+
527+
SWSS_LOG_ERROR("Failed to receive a response from syncd");
528+
return SAI_STATUS_FAILURE;
529+
}

syncd/syncd.cpp

+55
Original file line numberDiff line numberDiff line change
@@ -2933,6 +2933,57 @@ sai_status_t processAttrEnumValuesCapabilityQuery(
29332933
return status;
29342934
}
29352935

2936+
sai_status_t processObjectTypeGetAvailabilityQuery(
2937+
_In_ const swss::KeyOpFieldsValuesTuple &kco)
2938+
{
2939+
SWSS_LOG_ENTER();
2940+
2941+
const std::string &switch_str_id = kfvKey(kco);
2942+
2943+
sai_object_id_t switch_vid;
2944+
sai_deserialize_object_id(switch_str_id, switch_vid);
2945+
2946+
const sai_object_id_t switch_rid = translate_vid_to_rid(switch_vid);
2947+
2948+
std::vector<swss::FieldValueTuple> values = kfvFieldsValues(kco);
2949+
2950+
// Syncd needs to pop the object type off the end of the list in order to
2951+
// retrieve the attribute list
2952+
sai_object_type_t object_type;
2953+
sai_deserialize_object_type(fvValue(values.back()), object_type);
2954+
values.pop_back();
2955+
2956+
SaiAttributeList attr_list(object_type, values, false);
2957+
2958+
sai_attribute_t *sai_attr_list = attr_list.get_attr_list();
2959+
uint32_t attr_count = attr_list.get_attr_count();
2960+
2961+
translate_vid_to_rid_list(object_type, attr_count, sai_attr_list);
2962+
2963+
uint64_t count;
2964+
sai_status_t status = sai_object_type_get_availability(
2965+
switch_rid,
2966+
object_type,
2967+
attr_count,
2968+
sai_attr_list,
2969+
&count);
2970+
2971+
std::vector<swss::FieldValueTuple> response_payload;
2972+
2973+
if (status == SAI_STATUS_SUCCESS)
2974+
{
2975+
response_payload =
2976+
{
2977+
swss::FieldValueTuple("OBJECT_COUNT", std::to_string(count))
2978+
};
2979+
2980+
SWSS_LOG_DEBUG("Sending response: count = %lu", count);
2981+
}
2982+
2983+
getResponse->set(sai_serialize_status(status), response_payload, objectTypeGetAvailabilityResponse);
2984+
return status;
2985+
}
2986+
29362987
sai_status_t processEvent(
29372988
_In_ swss::ConsumerTable &consumer)
29382989
{
@@ -3029,6 +3080,10 @@ sai_status_t processEvent(
30293080
{
30303081
return processAttrEnumValuesCapabilityQuery(kco);
30313082
}
3083+
else if (op == objectTypeGetAvailabilityQuery)
3084+
{
3085+
return processObjectTypeGetAvailabilityQuery(kco);
3086+
}
30323087
else
30333088
{
30343089
SWSS_LOG_THROW("api '%s' is not implemented", op.c_str());

tests/brcm.pl

+8
Original file line numberDiff line numberDiff line change
@@ -525,6 +525,13 @@ sub test_brcm_query_attr_enum_values_capability
525525
play "query_attr_enum_values_capability.rec";
526526
}
527527

528+
sub test_brcm_query_object_type_get_availability
529+
{
530+
fresh_start;
531+
532+
play "query_object_type_get_availability.rec";
533+
}
534+
528535
# RUN TESTS
529536

530537
test_brcm_warm_boot_port_remove;
@@ -576,5 +583,6 @@ sub test_brcm_query_attr_enum_values_capability
576583
test_brcm_full_to_empty_hostif_remove_segfault;
577584
test_brcm_full_to_empty_no_queue_no_ipg_no_buffer_profile;
578585
test_brcm_query_attr_enum_values_capability;
586+
test_brcm_query_object_type_get_availability;
579587

580588
kill_syncd;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
2019-10-25.17:56:23.794105|a|INIT_VIEW
2+
2019-10-25.17:56:23.795120|A|SAI_STATUS_SUCCESS
3+
2019-10-25.17:56:23.795362|c|SAI_OBJECT_TYPE_SWITCH:oid:0x21000000000000|SAI_SWITCH_ATTR_INIT_SWITCH=true|SAI_SWITCH_ATTR_SRC_MAC_ADDRESS=02:42:AC:11:00:02
4+
2019-10-25.17:56:24.786816|q|object_type_get_availability|oid:0x21000000000000|SAI_DEBUG_COUNTER_ATTR_TYPE=SAI_DEBUG_COUNTER_TYPE_SWITCH_IN_DROP_REASONS|OBJECT_TYPE=SAI_OBJECT_TYPE_DEBUG_COUNTER
5+
2019-10-25.17:56:24.789781|Q|object_type_get_availability|SAI_STATUS_SUCCESS|OBJECT_COUNT=3
6+
2019-10-25.17:56:24.792839|q|object_type_get_availability|oid:0x21000000000000|SAI_DEBUG_COUNTER_ATTR_TYPE=SAI_DEBUG_COUNTER_TYPE_PORT_OUT_DROP_REASONS|OBJECT_TYPE=SAI_OBJECT_TYPE_DEBUG_COUNTER
7+
2019-10-25.17:56:24.794665|Q|object_type_get_availability|SAI_STATUS_SUCCESS|OBJECT_COUNT=3
8+
2019-10-25.17:56:24.795255|q|object_type_get_availability|oid:0x21000000000000|SAI_DEBUG_COUNTER_ATTR_TYPE=SAI_DEBUG_COUNTER_TYPE_SWITCH_OUT_DROP_REASONS|OBJECT_TYPE=SAI_OBJECT_TYPE_DEBUG_COUNTER
9+
2019-10-25.17:56:24.796390|Q|object_type_get_availability|SAI_STATUS_SUCCESS|OBJECT_COUNT=3
10+
2019-10-25.17:56:24.796704|q|object_type_get_availability|oid:0x21000000000000|SAI_DEBUG_COUNTER_ATTR_TYPE=SAI_DEBUG_COUNTER_TYPE_PORT_IN_DROP_REASONS|OBJECT_TYPE=SAI_OBJECT_TYPE_DEBUG_COUNTER
11+
2019-10-25.17:56:24.797838|Q|object_type_get_availability|SAI_STATUS_SUCCESS|OBJECT_COUNT=3
12+
2019-10-25.17:56:24.807699|a|APPLY_VIEW
13+
2019-10-25.17:56:24.808521|A|SAI_STATUS_SUCCESS

vslib/src/sai_vs_interfacequery.cpp

+19
Original file line numberDiff line numberDiff line change
@@ -963,3 +963,22 @@ sai_status_t sai_query_attribute_enum_values_capability(
963963
return SAI_STATUS_NOT_SUPPORTED;
964964
}
965965
}
966+
967+
sai_status_t sai_object_type_get_availability(
968+
_In_ sai_object_id_t switch_id,
969+
_In_ sai_object_type_t object_type,
970+
_In_ uint32_t attr_count,
971+
_In_ const sai_attribute_t *attr_list,
972+
_Out_ uint64_t *count)
973+
{
974+
SWSS_LOG_ENTER();
975+
976+
// TODO: We should generate this metadata for the virtual switch rather than hard-coding it here.
977+
if (object_type == SAI_OBJECT_TYPE_DEBUG_COUNTER)
978+
{
979+
*count = 3;
980+
return SAI_STATUS_SUCCESS;
981+
}
982+
983+
return SAI_STATUS_NOT_SUPPORTED;
984+
}

0 commit comments

Comments
 (0)