Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
[submodule "SAI"]
path = SAI
url = https://github.com/sonic-otn/SAI.git
branch = 202411_otn
1 change: 1 addition & 0 deletions debian/libsaimetadata-dev.install
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ meta/OidRefCounter.h usr/include/sai
meta/PortRelatedSet.h usr/include/sai
meta/Notification*.h usr/include/sai
meta/Globals.h usr/include/sai
meta/sai_serialize_otn.h usr/include/sai
SAI/meta/sai*.h usr/include/sai
usr/lib/*/libsaimetadata.so
usr/lib/*/libsaimeta.so
2 changes: 0 additions & 2 deletions lib/RedisRemoteSaiInterface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -575,8 +575,6 @@ sai_status_t RedisRemoteSaiInterface::notifyCounterGroupOperations(
std::string key((const char*)flexCounterGroupParam->counter_group_name.list, flexCounterGroupParam->counter_group_name.count);

emplaceStrings(POLL_INTERVAL_FIELD, flexCounterGroupParam->poll_interval, entries);
emplaceStrings(BULK_CHUNK_SIZE_FIELD, flexCounterGroupParam->bulk_chunk_size, entries);
emplaceStrings(BULK_CHUNK_SIZE_PER_PREFIX_FIELD, flexCounterGroupParam->bulk_chunk_size_per_prefix, entries);
emplaceStrings(STATS_MODE_FIELD, flexCounterGroupParam->stats_mode, entries);
emplaceStrings(flexCounterGroupParam->plugin_name, flexCounterGroupParam->plugins, entries);
emplaceStrings(FLEX_COUNTER_STATUS_FIELD, flexCounterGroupParam->operation, entries);
Expand Down
4 changes: 3 additions & 1 deletion meta/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ libsaimeta_la_SOURCES = \
NotificationTamTelTypeConfigChange.cpp \
NotificationSwitchMacsecPostStatus.cpp \
NotificationMacsecPostStatus.cpp \
NotificationOtnAlarmEvent.cpp \
NumberOidIndexGenerator.cpp \
OidRefCounter.cpp \
PerformanceIntervalTimer.cpp \
Expand All @@ -58,7 +59,8 @@ libsaimeta_la_SOURCES = \
SaiSerialize.cpp \
SelectableChannel.cpp \
DummySaiInterface.cpp \
ZeroMQSelectableChannel.cpp
ZeroMQSelectableChannel.cpp \
sai_serialize_otn.cpp

libsaimeta_la_CPPFLAGS = $(CODE_COVERAGE_CPPFLAGS)
libsaimeta_la_CXXFLAGS = $(DBGFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS_COMMON) $(CODE_COVERAGE_CXXFLAGS)
Expand Down
80 changes: 75 additions & 5 deletions meta/Meta.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3474,18 +3474,24 @@ sai_status_t Meta::meta_generic_validation_create(
{
const char* chardata = value.chardata;

size_t len = strnlen(chardata, SAI_HOSTIF_NAME_SIZE);
// Check the length of host interface name and genetlink multicast group name.
// Others should be less than the size defined for char data array.
size_t limit_len = attr->id == SAI_HOSTIF_ATTR_NAME ? SAI_HOSTIF_NAME_SIZE :
(attr->id == SAI_HOSTIF_ATTR_GENETLINK_MCGRP_NAME ? SAI_HOSTIF_GENETLINK_MCGRP_NAME_SIZE :
sizeof(((sai_attribute_value_t*)nullptr)->chardata));

if (len == SAI_HOSTIF_NAME_SIZE)
size_t len = strnlen(chardata, limit_len);

if (len == limit_len)
{
META_LOG_ERROR(md, "host interface name is too long");
META_LOG_ERROR(md, "char data is too long");

return SAI_STATUS_INVALID_PARAMETER;
}

if (len == 0)
{
META_LOG_ERROR(md, "host interface name is zero");
META_LOG_ERROR(md, "char data is zero");

return SAI_STATUS_INVALID_PARAMETER;
}
Expand All @@ -3496,7 +3502,7 @@ sai_status_t Meta::meta_generic_validation_create(

if (c < 0x20 || c > 0x7e)
{
META_LOG_ERROR(md, "interface name contains invalid character 0x%02x", c);
META_LOG_ERROR(md, "char data contains invalid character 0x%02x", c);

return SAI_STATUS_INVALID_PARAMETER;
}
Expand Down Expand Up @@ -7591,3 +7597,67 @@ std::vector<std::string> Meta::getValidIcmpEchoSessionObjectTypes()

return v;
}

void Meta::meta_sai_on_otn_alarm_event_single(
_In_ const sai_otn_alarm_event_data_t& data)
{
SWSS_LOG_ENTER();

auto ot = objectTypeQuery(data.object_id);

bool valid = false;

switch ((int)ot)
{
// TODO hardcoded types, must advance SAI repository commit to get metadata for this
case SAI_OBJECT_TYPE_OTN_DEVICE:
case SAI_OBJECT_TYPE_OTN_ATTENUATOR:
case SAI_OBJECT_TYPE_OTN_OA:
case SAI_OBJECT_TYPE_OTN_OCM:
case SAI_OBJECT_TYPE_OTN_OCM_CHANNEL:
case SAI_OBJECT_TYPE_OTN_OSC:

valid = true;
break;

default:

SWSS_LOG_ERROR("data.object_id %s has unexpected type: %s, expected OTN_DEVICE",
sai_serialize_object_id(data.object_id).c_str(),
sai_serialize_object_type(ot).c_str());
break;
}

if (valid && !m_oids.objectReferenceExists(data.object_id))
{
SWSS_LOG_NOTICE("data.object_id new object spotted %s not present in local DB (snoop!)",
sai_serialize_object_id(data.object_id).c_str());

sai_object_meta_key_t key = { .objecttype = (sai_object_type_t)ot, .objectkey = { .key = { .object_id = data.object_id } } };

m_oids.objectReferenceInsert(data.object_id);

if (!m_saiObjectCollection.objectExists(key))
{
m_saiObjectCollection.createObject(key);
}
}
}

void Meta::meta_sai_on_otn_alarm_event(
_In_ uint32_t count,
_In_ const sai_otn_alarm_event_data_t *data)
{
SWSS_LOG_ENTER();

if (count && data == NULL)
{
SWSS_LOG_ERROR("sai_otn_alarm_event_notification_data_t pointer is NULL but count is %u", count);
return;
}

for (uint32_t i = 0; i < count; ++i)
{
meta_sai_on_otn_alarm_event_single(data[i]);
}
}
11 changes: 9 additions & 2 deletions meta/Meta.h
Original file line number Diff line number Diff line change
Expand Up @@ -273,7 +273,11 @@ namespace saimeta

void meta_sai_on_tam_tel_type_config_change(_In_ sai_object_id_t m_tam_id);

private: // notifications helpers
void meta_sai_on_otn_alarm_event(
_In_ uint32_t count,
_In_ const sai_otn_alarm_event_data_t *data);

private: // notifications helpers

void meta_sai_on_fdb_flush_event_consolidated(
_In_ const sai_fdb_event_notification_data_t& data);
Expand Down Expand Up @@ -308,7 +312,10 @@ namespace saimeta
void meta_sai_on_twamp_session_event_single(
_In_ const sai_twamp_session_event_notification_data_t& data);

private: // validation helpers
void meta_sai_on_otn_alarm_event_single(
_In_ const sai_otn_alarm_event_data_t& data);

private: // validation helpers

sai_status_t meta_generic_validation_objlist(
_In_ const sai_attr_metadata_t& md,
Expand Down
4 changes: 4 additions & 0 deletions meta/NotificationFactory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
#include "NotificationFlowBulkGetSessionEvent.h"
#include "NotificationSwitchMacsecPostStatus.h"
#include "NotificationMacsecPostStatus.h"
#include "NotificationOtnAlarmEvent.h"
#include "sairediscommon.h"

#include "swss/logger.h"
Expand Down Expand Up @@ -79,5 +80,8 @@ std::shared_ptr<Notification> NotificationFactory::deserialize(
if (name == SAI_SWITCH_NOTIFICATION_NAME_MACSEC_POST_STATUS)
return std::make_shared<NotificationMacsecPostStatus>(serializedNotification);

if (name == SAI_SWITCH_NOTIFICATION_NAME_OTN_ALARM_EVENT)
return std::make_shared<NotificationOtnAlarmEvent>(serializedNotification);

SWSS_LOG_THROW("unknown notification: '%s', FIXME", name.c_str());
}
80 changes: 80 additions & 0 deletions meta/NotificationOtnAlarmEvent.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
#include "NotificationOtnAlarmEvent.h"

#include "swss/logger.h"

#include "meta/sai_serialize_otn.h"

using namespace sairedis;

NotificationOtnAlarmEvent::NotificationOtnAlarmEvent(
_In_ const std::string& serializeNotification):
Notification(
SAI_SWITCH_NOTIFICATION_TYPE_OTN_ALARM_EVENT,
serializeNotification),
m_otnAlarmEventData(nullptr)
{
SWSS_LOG_ENTER();

sai_deserialize_otn_alarm_event_ntf(
serializeNotification,
m_count,
&m_otnAlarmEventData);
}

NotificationOtnAlarmEvent::~NotificationOtnAlarmEvent()
{
SWSS_LOG_ENTER();

sai_deserialize_free_otn_alarm_event_ntf(m_count, m_otnAlarmEventData);
}

sai_object_id_t NotificationOtnAlarmEvent::getSwitchId() const
{
SWSS_LOG_ENTER();

// Otn alarm event does not have switch id
return SAI_NULL_OBJECT_ID;
}

sai_object_id_t NotificationOtnAlarmEvent::getAnyObjectId() const
{
SWSS_LOG_ENTER();

if (m_otnAlarmEventData == nullptr)
{
return SAI_NULL_OBJECT_ID;
}

for (uint32_t i = 0; i < m_count; ++i)
{
if (m_otnAlarmEventData[i].object_id != SAI_NULL_OBJECT_ID)
{
return m_otnAlarmEventData[i].object_id;
}
}

return SAI_NULL_OBJECT_ID;
}

void NotificationOtnAlarmEvent::processMetadata(
_In_ std::shared_ptr<saimeta::Meta> meta) const
{
SWSS_LOG_ENTER();

meta->meta_sai_on_otn_alarm_event(
m_count,
m_otnAlarmEventData);
}

void NotificationOtnAlarmEvent::executeCallback(
_In_ const sai_switch_notifications_t& switchNotifications) const
{
SWSS_LOG_ENTER();

if(switchNotifications.on_otn_alarm_event)
{
switchNotifications.on_otn_alarm_event(
m_count,
m_otnAlarmEventData);
}
}
35 changes: 35 additions & 0 deletions meta/NotificationOtnAlarmEvent.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
#pragma once

#include "Notification.h"

namespace sairedis
{
class NotificationOtnAlarmEvent:
public Notification
{
public:

NotificationOtnAlarmEvent(
_In_ const std::string& serializedNotification);

virtual ~NotificationOtnAlarmEvent();

public:

virtual sai_object_id_t getSwitchId() const override;

virtual sai_object_id_t getAnyObjectId() const override;

virtual void processMetadata(
_In_ std::shared_ptr<saimeta::Meta> meta) const override;

virtual void executeCallback(
_In_ const sai_switch_notifications_t& switchNotifications) const override;

private:

uint32_t m_count;

sai_otn_alarm_event_data_t* m_otnAlarmEventData;
};
}
5 changes: 5 additions & 0 deletions meta/sai_serialize.h
Original file line number Diff line number Diff line change
Expand Up @@ -820,3 +820,8 @@ void sai_deserialize_macsec_post_status_ntf(
_In_ const std::string& s,
_Out_ sai_object_id_t& macsec_id,
_Out_ sai_macsec_post_status_t& macsec_post_status);

void sai_deserialize_hex_binary(
_In_ const std::string &s,
_Out_ void *buffer,
_In_ size_t length);
Loading