Skip to content

Commit ec5cf30

Browse files
author
Ashish Singh
committed
Add libsai RedisInterface for link event damping.
- This supports the link event damping config and algorithm set API. - Sends the link event damping config from libsai to syncd main thread. HLD: sonic-net/SONiC#1071 Signed-off-by: Ashish Singh <ashishksingh@google.com>
1 parent 256ce7d commit ec5cf30

10 files changed

Lines changed: 486 additions & 2 deletions

lib/ClientSai.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,8 @@ sai_status_t ClientSai::set(
240240
SWSS_LOG_ENTER();
241241
REDIS_CHECK_API_INITIALIZED();
242242

243-
if (RedisRemoteSaiInterface::isRedisAttribute(objectType, attr))
243+
if (RedisRemoteSaiInterface::isRedisAttribute(objectType, attr) ||
244+
RedisRemoteSaiInterface::isRedisPortAttribute(objectType, attr))
244245
{
245246
SWSS_LOG_ERROR("sairedis extension attributes are not supported in CLIENT mode");
246247

lib/RedisRemoteSaiInterface.cpp

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -493,6 +493,83 @@ sai_status_t RedisRemoteSaiInterface::setRedisExtensionAttribute(
493493
return SAI_STATUS_FAILURE;
494494
}
495495

496+
sai_status_t RedisRemoteSaiInterface::setLinkEventDampingConfig(
497+
_In_ sai_object_type_t objectType,
498+
_In_ sai_object_id_t objectId,
499+
_In_ const std::vector<swss::FieldValueTuple> &values)
500+
{
501+
SWSS_LOG_ENTER();
502+
503+
std::string key = sai_serialize_object_type(objectType) + ":" + sai_serialize_object_id(objectId);
504+
505+
m_communicationChannel->set(key, values, REDIS_ASIC_STATE_COMMAND_DAMPING_CONFIG_SET);
506+
507+
if (m_syncMode)
508+
{
509+
swss::KeyOpFieldsValuesTuple kco;
510+
auto status = m_communicationChannel->wait(REDIS_ASIC_STATE_COMMAND_DAMPING_CONFIG_SET, kco);
511+
512+
m_recorder->recordGenericSetResponse(status);
513+
514+
return status;
515+
}
516+
517+
return SAI_STATUS_SUCCESS;
518+
}
519+
520+
sai_status_t RedisRemoteSaiInterface::setRedisPortExtensionAttribute(
521+
_In_ sai_object_type_t objectType,
522+
_In_ sai_object_id_t objectId,
523+
_In_ const sai_attribute_t *attr)
524+
{
525+
SWSS_LOG_ENTER();
526+
527+
if (attr == nullptr)
528+
{
529+
SWSS_LOG_ERROR("attr pointer is null");
530+
531+
return SAI_STATUS_INVALID_PARAMETER;
532+
}
533+
534+
std::string str_attr_id = sai_serialize_redis_port_attr_id(
535+
static_cast<sai_redis_port_attr_t>(attr->id));
536+
537+
switch (attr->id)
538+
{
539+
case SAI_REDIS_PORT_ATTR_LINK_EVENT_DAMPING_ALGORITHM:
540+
{
541+
std::string str_attr_value = sai_serialize_redis_link_event_damping_algorithm(
542+
static_cast<sai_redis_link_event_damping_algorithm_t>(attr->value.s32));
543+
544+
return setLinkEventDampingConfig(
545+
objectType, objectId, {swss::FieldValueTuple(str_attr_id, str_attr_value)});
546+
}
547+
case SAI_REDIS_PORT_ATTR_LINK_EVENT_DAMPING_ALGO_AIED_CONFIG:
548+
{
549+
sai_redis_link_event_damping_algo_aied_config_t *config =
550+
(sai_redis_link_event_damping_algo_aied_config_t *)attr->value.ptr;
551+
552+
if (config == NULL)
553+
{
554+
SWSS_LOG_ERROR("invalid link damping config attr value NULL");
555+
556+
return SAI_STATUS_INVALID_PARAMETER;
557+
}
558+
559+
std::string str_attr_value = sai_serialize_redis_link_event_damping_aied_config(*config);
560+
561+
return setLinkEventDampingConfig(
562+
objectType, objectId, {swss::FieldValueTuple(str_attr_id, str_attr_value)});
563+
}
564+
default:
565+
break;
566+
}
567+
568+
SWSS_LOG_ERROR("unknown redis port extension attribute: %d", attr->id);
569+
570+
return SAI_STATUS_INVALID_PARAMETER;
571+
}
572+
496573
bool RedisRemoteSaiInterface::isSaiS8ListValidString(
497574
_In_ const sai_s8_list_t &s8list)
498575
{
@@ -625,6 +702,11 @@ sai_status_t RedisRemoteSaiInterface::set(
625702
return setRedisExtensionAttribute(objectType, objectId, attr);
626703
}
627704

705+
if (RedisRemoteSaiInterface::isRedisPortAttribute(objectType, attr))
706+
{
707+
return setRedisPortExtensionAttribute(objectType, objectId, attr);
708+
}
709+
628710
auto status = set(
629711
objectType,
630712
sai_serialize_object_id(objectId),
@@ -1792,6 +1874,20 @@ bool RedisRemoteSaiInterface::isRedisAttribute(
17921874
return true;
17931875
}
17941876

1877+
bool RedisRemoteSaiInterface::isRedisPortAttribute(
1878+
_In_ sai_object_id_t objectType,
1879+
_In_ const sai_attribute_t* attr)
1880+
{
1881+
SWSS_LOG_ENTER();
1882+
1883+
if ((objectType != SAI_OBJECT_TYPE_PORT) || (attr == nullptr) || (attr->id < SAI_PORT_ATTR_CUSTOM_RANGE_START))
1884+
{
1885+
return false;
1886+
}
1887+
1888+
return true;
1889+
}
1890+
17951891
void RedisRemoteSaiInterface::handleNotification(
17961892
_In_ const std::string &name,
17971893
_In_ const std::string &serializedNotification,

lib/RedisRemoteSaiInterface.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,15 @@ namespace sairedis
207207
_In_ sai_object_id_t switchId,
208208
_In_ const sai_attribute_t* attr);
209209

210+
/**
211+
* @brief Checks whether attribute is custom SAI_REDIS_PORT attribute.
212+
*
213+
* This function should only be used on port_api set function.
214+
*/
215+
static bool isRedisPortAttribute(
216+
_In_ sai_object_id_t obejctType,
217+
_In_ const sai_attribute_t* attr);
218+
210219
void setMeta(
211220
_In_ std::weak_ptr<saimeta::Meta> meta);
212221

@@ -343,6 +352,11 @@ namespace sairedis
343352
_In_ sai_object_id_t objectId,
344353
_In_ const sai_attribute_t *attr);
345354

355+
sai_status_t setRedisPortExtensionAttribute(
356+
_In_ sai_object_type_t objectType,
357+
_In_ sai_object_id_t objectId,
358+
_In_ const sai_attribute_t *attr);
359+
346360
bool isSaiS8ListValidString(
347361
_In_ const sai_s8_list_t &s8list);
348362

@@ -370,6 +384,11 @@ namespace sairedis
370384
_In_ sai_object_id_t switchId,
371385
_In_ const sai_attribute_t *attr);
372386

387+
sai_status_t setLinkEventDampingConfig(
388+
_In_ sai_object_type_t objectType,
389+
_In_ sai_object_id_t objectId,
390+
_In_ const std::vector<swss::FieldValueTuple> &values);
391+
373392
void clear_local_state();
374393

375394
sai_switch_notifications_t processNotification(

lib/Sai.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,12 @@ sai_status_t Sai::set(
245245

246246
REDIS_CHECK_CONTEXT(objectId);
247247

248+
if (RedisRemoteSaiInterface::isRedisPortAttribute(objectType, attr))
249+
{
250+
// skip metadata if attribute is redis extension port attribute.
251+
return context->m_redisSai->set(objectType, objectId, attr);
252+
}
253+
248254
return context->m_meta->set(objectType, objectId, attr);
249255
}
250256

lib/sairediscommon.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@
5252
#define REDIS_ASIC_STATE_COMMAND_OBJECT_TYPE_GET_AVAILABILITY_QUERY "object_type_get_availability_query"
5353
#define REDIS_ASIC_STATE_COMMAND_OBJECT_TYPE_GET_AVAILABILITY_RESPONSE "object_type_get_availability_response"
5454

55+
#define REDIS_ASIC_STATE_COMMAND_DAMPING_CONFIG_SET "link_event_damping_config_set"
56+
5557
#define REDIS_FLEX_COUNTER_COMMAND_START_POLL "start_poll"
5658
#define REDIS_FLEX_COUNTER_COMMAND_STOP_POLL "stop_poll"
5759
#define REDIS_FLEX_COUNTER_COMMAND_SET_GROUP "set_counter_group"

syncd/Syncd.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,9 @@ sai_status_t Syncd::processSingleEvent(
383383
if (op == REDIS_ASIC_STATE_COMMAND_OBJECT_TYPE_GET_AVAILABILITY_QUERY)
384384
return processObjectTypeGetAvailabilityQuery(kco);
385385

386+
if (op == REDIS_ASIC_STATE_COMMAND_DAMPING_CONFIG_SET)
387+
return processLinkEventDampingConfigSet(kco);
388+
386389
if (op == REDIS_FLEX_COUNTER_COMMAND_START_POLL)
387390
return processFlexCounterEvent(key, SET_COMMAND, kfvFieldsValues(kco));
388391

@@ -580,6 +583,36 @@ sai_status_t Syncd::processObjectTypeGetAvailabilityQuery(
580583
return status;
581584
}
582585

586+
sai_status_t Syncd::processLinkEventDampingConfigSet(
587+
_In_ const swss::KeyOpFieldsValuesTuple &kco)
588+
{
589+
SWSS_LOG_ENTER();
590+
591+
sendLinkEventDampingConfigResponse(SAI_STATUS_NOT_IMPLEMENTED);
592+
593+
return SAI_STATUS_NOT_IMPLEMENTED;
594+
}
595+
596+
void Syncd::sendLinkEventDampingConfigResponse(
597+
_In_ sai_status_t status)
598+
{
599+
SWSS_LOG_ENTER();
600+
601+
// If sync mode is not enabled, do not send response.
602+
if (!m_enableSyncMode)
603+
{
604+
return;
605+
}
606+
607+
std::string strStatus = sai_serialize_status(status);
608+
609+
std::vector<swss::FieldValueTuple> entry;
610+
611+
SWSS_LOG_INFO("sending link event damping config response: %s", strStatus.c_str());
612+
613+
m_selectableChannel->set(strStatus, entry, REDIS_ASIC_STATE_COMMAND_DAMPING_CONFIG_SET);
614+
}
615+
583616
sai_status_t Syncd::processFdbFlush(
584617
_In_ const swss::KeyOpFieldsValuesTuple &kco)
585618
{

syncd/Syncd.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,9 @@ namespace syncd
210210
_In_ const std::vector<swss::FieldValueTuple> &values,
211211
_In_ bool fromAsicChannel=true);
212212

213+
sai_status_t processLinkEventDampingConfigSet(
214+
_In_ const swss::KeyOpFieldsValuesTuple &kco);
215+
213216
private: // process quad oid
214217

215218
sai_status_t processOidCreate(
@@ -361,6 +364,9 @@ namespace syncd
361364
void sendNotifyResponse(
362365
_In_ sai_status_t status);
363366

367+
void sendLinkEventDampingConfigResponse(
368+
_In_ sai_status_t status);
369+
364370
private: // snoop get response oids
365371

366372
void snoopGetResponse(

syncd/tests/Makefile.am

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ LDADD_GTEST = -L/usr/src/gtest -lgtest -lgtest_main
55
bin_PROGRAMS = tests
66

77
tests_SOURCES = \
8-
main.cpp TestSyncdBrcm.cpp TestSyncdMlnx.cpp TestSyncdNvdaBf.cpp TestSyncdLib.cpp
8+
main.cpp TestSyncdBrcm.cpp TestSyncdMlnx.cpp TestSyncdNvdaBf.cpp TestSyncdLib.cpp TestSyncdLinkEventDamping.cpp
99
tests_CXXFLAGS = \
1010
$(DBGFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS_COMMON)
1111
tests_LDADD = \

0 commit comments

Comments
 (0)