in lib/RedisRemoteSaiInterface.cpp [279:496]
sai_status_t RedisRemoteSaiInterface::setRedisExtensionAttribute(
_In_ sai_object_type_t objectType,
_In_ sai_object_id_t objectId,
_In_ const sai_attribute_t *attr)
{
SWSS_LOG_ENTER();
if (attr == nullptr)
{
SWSS_LOG_ERROR("attr pointer is null");
return SAI_STATUS_FAILURE;
}
/*
* NOTE: that this will work without
* switch being created.
*/
switch (attr->id)
{
case SAI_REDIS_SWITCH_ATTR_PERFORM_LOG_ROTATE:
if (m_recorder)
{
m_recorder->requestLogRotate();
}
return SAI_STATUS_SUCCESS;
case SAI_REDIS_SWITCH_ATTR_RECORD:
if (m_recorder)
{
m_recorder->enableRecording(attr->value.booldata);
}
return SAI_STATUS_SUCCESS;
case SAI_REDIS_SWITCH_ATTR_NOTIFY_SYNCD:
return sai_redis_notify_syncd(objectId, attr);
case SAI_REDIS_SWITCH_ATTR_USE_TEMP_VIEW:
m_useTempView = attr->value.booldata;
return SAI_STATUS_SUCCESS;
case SAI_REDIS_SWITCH_ATTR_RECORD_STATS:
m_recorder->recordStats(attr->value.booldata);
return SAI_STATUS_SUCCESS;
case SAI_REDIS_SWITCH_ATTR_SYNC_OPERATION_RESPONSE_TIMEOUT:
m_responseTimeoutMs = attr->value.u64;
m_communicationChannel->setResponseTimeout(m_responseTimeoutMs);
SWSS_LOG_NOTICE("set response timeout to %lu ms", m_responseTimeoutMs);
return SAI_STATUS_SUCCESS;
case SAI_REDIS_SWITCH_ATTR_SYNC_MODE:
SWSS_LOG_WARN("sync mode is depreacated, use communication mode");
m_syncMode = attr->value.booldata;
if (m_contextConfig->m_zmqEnable)
{
SWSS_LOG_NOTICE("zmq enabled, forcing sync mode");
m_syncMode = true;
}
if (m_syncMode)
{
SWSS_LOG_NOTICE("disabling buffered pipeline in sync mode");
m_communicationChannel->setBuffered(false);
}
return SAI_STATUS_SUCCESS;
case SAI_REDIS_SWITCH_ATTR_REDIS_COMMUNICATION_MODE:
m_redisCommunicationMode = (sai_redis_communication_mode_t)attr->value.s32;
if (m_contextConfig->m_zmqEnable)
{
SWSS_LOG_NOTICE("zmq enabled via context config");
m_redisCommunicationMode = SAI_REDIS_COMMUNICATION_MODE_ZMQ_SYNC;
}
m_communicationChannel = nullptr;
switch (m_redisCommunicationMode)
{
case SAI_REDIS_COMMUNICATION_MODE_REDIS_ASYNC:
SWSS_LOG_NOTICE("enabling redis async mode");
m_syncMode = false;
m_communicationChannel = std::make_shared<RedisChannel>(
m_contextConfig->m_dbAsic,
std::bind(&RedisRemoteSaiInterface::handleNotification, this, _1, _2, _3));
m_communicationChannel->setResponseTimeout(m_responseTimeoutMs);
m_communicationChannel->setBuffered(true);
return SAI_STATUS_SUCCESS;
case SAI_REDIS_COMMUNICATION_MODE_REDIS_SYNC:
SWSS_LOG_NOTICE("enabling redis sync mode");
m_syncMode = true;
m_communicationChannel = std::make_shared<RedisChannel>(
m_contextConfig->m_dbAsic,
std::bind(&RedisRemoteSaiInterface::handleNotification, this, _1, _2, _3));
m_communicationChannel->setResponseTimeout(m_responseTimeoutMs);
m_communicationChannel->setBuffered(false);
return SAI_STATUS_SUCCESS;
case SAI_REDIS_COMMUNICATION_MODE_ZMQ_SYNC:
m_contextConfig->m_zmqEnable = true;
// main communication channel was created at initialize method
// so this command will replace it with zmq channel
m_communicationChannel = std::make_shared<ZeroMQChannel>(
m_contextConfig->m_zmqEndpoint,
m_contextConfig->m_zmqNtfEndpoint,
std::bind(&RedisRemoteSaiInterface::handleNotification, this, _1, _2, _3));
m_communicationChannel->setResponseTimeout(m_responseTimeoutMs);
SWSS_LOG_NOTICE("zmq enabled, forcing sync mode");
m_syncMode = true;
SWSS_LOG_NOTICE("disabling buffered pipeline in sync mode");
m_communicationChannel->setBuffered(false);
return SAI_STATUS_SUCCESS;
default:
SWSS_LOG_ERROR("invalid communication mode value: %d", m_redisCommunicationMode);
return SAI_STATUS_NOT_SUPPORTED;
}
case SAI_REDIS_SWITCH_ATTR_USE_PIPELINE:
if (m_syncMode)
{
SWSS_LOG_WARN("use pipeline is not supported in sync mode");
return SAI_STATUS_NOT_SUPPORTED;
}
m_communicationChannel->setBuffered(attr->value.booldata);
return SAI_STATUS_SUCCESS;
case SAI_REDIS_SWITCH_ATTR_FLUSH:
m_communicationChannel->flush();
return SAI_STATUS_SUCCESS;
case SAI_REDIS_SWITCH_ATTR_RECORDING_OUTPUT_DIR:
if (m_recorder)
{
m_recorder->setRecordingOutputDirectory(*attr);
}
return SAI_STATUS_SUCCESS;
case SAI_REDIS_SWITCH_ATTR_RECORDING_FILENAME:
if (m_recorder)
{
m_recorder->setRecordingFilename(*attr);
}
return SAI_STATUS_SUCCESS;
case SAI_REDIS_SWITCH_ATTR_FLEX_COUNTER_GROUP:
return notifyCounterGroupOperations(objectId,
reinterpret_cast<sai_redis_flex_counter_group_parameter_t*>(attr->value.ptr));
case SAI_REDIS_SWITCH_ATTR_FLEX_COUNTER:
return notifyCounterOperations(objectId,
reinterpret_cast<sai_redis_flex_counter_parameter_t*>(attr->value.ptr));
default:
break;
}
SWSS_LOG_ERROR("unknown redis extension attribute: %d", attr->id);
return SAI_STATUS_FAILURE;
}