Skip to content

Commit 60813fb

Browse files
committed
ASIC/SDK health event
Signed-off-by: Stephen Sun <[email protected]>
1 parent 4f4c6d1 commit 60813fb

23 files changed

+572
-4
lines changed

lib/Switch.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,11 @@ void Switch::updateNotifications(
8383
(sai_switch_state_change_notification_fn)attr.value.ptr;
8484
break;
8585

86+
case SAI_SWITCH_ATTR_SWITCH_ASIC_SDK_HEALTH_EVENT_NOTIFY:
87+
m_switchNotifications.on_switch_asic_sdk_health_event =
88+
(sai_switch_asic_sdk_health_event_notification_fn)attr.value.ptr;
89+
break;
90+
8691
case SAI_SWITCH_ATTR_SHUTDOWN_REQUEST_NOTIFY:
8792
m_switchNotifications.on_switch_shutdown_request =
8893
(sai_switch_shutdown_request_notification_fn)attr.value.ptr;

meta/Makefile.am

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ libsaimeta_la_SOURCES = \
3232
NotificationNatEvent.cpp \
3333
NotificationPortStateChange.cpp \
3434
NotificationQueuePfcDeadlock.cpp \
35+
NotificationSwitchAsicSdkHealthEvent.cpp \
3536
NotificationSwitchShutdownRequest.cpp \
3637
NotificationSwitchStateChange.cpp \
3738
NotificationBfdSessionStateChange.cpp \

meta/Meta.cpp

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6513,6 +6513,54 @@ void Meta::meta_sai_on_switch_state_change(
65136513
// we should not snoop switch_id, since switch id should be created directly by user
65146514
}
65156515

6516+
void Meta::meta_sai_on_switch_asic_sdk_health_event(
6517+
_In_ sai_object_id_t switch_id,
6518+
_In_ sai_switch_asic_sdk_health_severity_t severity,
6519+
_In_ sai_timespec_t timestamp,
6520+
_In_ sai_switch_asic_sdk_health_category_t category,
6521+
_In_ sai_switch_health_data_t data,
6522+
_In_ const sai_u8_list_t description)
6523+
{
6524+
SWSS_LOG_ENTER();
6525+
6526+
if (!sai_metadata_get_enum_value_name(
6527+
&sai_metadata_enum_sai_switch_asic_sdk_health_severity_t,
6528+
severity))
6529+
{
6530+
SWSS_LOG_WARN("Switch ASIC/SDK health event severity value (%d) not found in sai_switch_asic_sdk_health_severity_t",
6531+
severity);
6532+
}
6533+
6534+
if (!sai_metadata_get_enum_value_name(
6535+
&sai_metadata_enum_sai_switch_asic_sdk_health_category_t,
6536+
category))
6537+
{
6538+
SWSS_LOG_WARN("Switch ASIC/SDK health event category value (%d) not found in sai_switch_asic_sdk_health_severity_t",
6539+
category);
6540+
}
6541+
6542+
auto ot = objectTypeQuery(switch_id);
6543+
6544+
if (ot != SAI_OBJECT_TYPE_SWITCH)
6545+
{
6546+
SWSS_LOG_WARN("switch_id %s is of type %s, but expected SAI_OBJECT_TYPE_SWITCH",
6547+
sai_serialize_object_id(switch_id).c_str(),
6548+
sai_serialize_object_type(ot).c_str());
6549+
6550+
return;
6551+
}
6552+
6553+
sai_object_meta_key_t switch_meta_key = { .objecttype = ot , .objectkey = { .key = { .object_id = switch_id } } };
6554+
6555+
if (!m_saiObjectCollection.objectExists(switch_meta_key))
6556+
{
6557+
SWSS_LOG_ERROR("switch_id %s don't exists in local database",
6558+
sai_serialize_object_id(switch_id).c_str());
6559+
}
6560+
6561+
// we should not snoop switch_id, since switch id should be created directly by user
6562+
}
6563+
65166564
void Meta::meta_sai_on_switch_shutdown_request(
65176565
_In_ sai_object_id_t switch_id)
65186566
{

meta/Meta.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,14 @@ namespace saimeta
205205
_In_ sai_object_id_t switch_id,
206206
_In_ sai_switch_oper_status_t switch_oper_status);
207207

208+
void meta_sai_on_switch_asic_sdk_health_event(
209+
_In_ sai_object_id_t switch_id,
210+
_In_ sai_switch_asic_sdk_health_severity_t severity,
211+
_In_ sai_timespec_t timestamp,
212+
_In_ sai_switch_asic_sdk_health_category_t category,
213+
_In_ sai_switch_health_data_t data,
214+
_In_ const sai_u8_list_t description);
215+
208216
void meta_sai_on_switch_shutdown_request(
209217
_In_ sai_object_id_t switch_id);
210218

meta/NotificationFactory.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include "NotificationQueuePfcDeadlock.h"
66
#include "NotificationSwitchShutdownRequest.h"
77
#include "NotificationSwitchStateChange.h"
8+
#include "NotificationSwitchAsicSdkHealthEvent.h"
89
#include "NotificationBfdSessionStateChange.h"
910
#include "NotificationTwampSessionEvent.h"
1011
#include "NotificationPortHostTxReadyEvent.h"
@@ -38,6 +39,9 @@ std::shared_ptr<Notification> NotificationFactory::deserialize(
3839
if (name == SAI_SWITCH_NOTIFICATION_NAME_SWITCH_SHUTDOWN_REQUEST)
3940
return std::make_shared<NotificationSwitchShutdownRequest>(serializedNotification);
4041

42+
if (name == SAI_SWITCH_NOTIFICATION_NAME_SWITCH_ASIC_SDK_HEALTH_EVENT)
43+
return std::make_shared<NotificationSwitchAsicSdkHealthEvent>(serializedNotification);
44+
4145
if (name == SAI_SWITCH_NOTIFICATION_NAME_SWITCH_STATE_CHANGE)
4246
return std::make_shared<NotificationSwitchStateChange>(serializedNotification);
4347

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
#include "NotificationSwitchAsicSdkHealthEvent.h"
2+
3+
#include "swss/logger.h"
4+
5+
#include "sai_serialize.h"
6+
7+
using namespace sairedis;
8+
9+
NotificationSwitchAsicSdkHealthEvent::NotificationSwitchAsicSdkHealthEvent(
10+
_In_ const std::string& serializedNotification):
11+
Notification(
12+
SAI_SWITCH_NOTIFICATION_TYPE_SWITCH_ASIC_SDK_HEALTH_EVENT,
13+
serializedNotification)
14+
{
15+
SWSS_LOG_ENTER();
16+
17+
sai_deserialize_switch_asic_sdk_health_event(serializedNotification,
18+
m_switchId,
19+
m_severity,
20+
m_timestamp,
21+
m_category,
22+
m_healthData,
23+
m_description);
24+
}
25+
26+
NotificationSwitchAsicSdkHealthEvent::~NotificationSwitchAsicSdkHealthEvent()
27+
{
28+
SWSS_LOG_ENTER();
29+
30+
sai_deserialize_free_switch_asic_sdk_health_event(m_description);
31+
}
32+
33+
sai_object_id_t NotificationSwitchAsicSdkHealthEvent::getSwitchId() const
34+
{
35+
SWSS_LOG_ENTER();
36+
37+
return m_switchId;
38+
}
39+
40+
sai_object_id_t NotificationSwitchAsicSdkHealthEvent::getAnyObjectId() const
41+
{
42+
SWSS_LOG_ENTER();
43+
44+
return m_switchId;
45+
}
46+
47+
void NotificationSwitchAsicSdkHealthEvent::processMetadata(
48+
_In_ std::shared_ptr<saimeta::Meta> meta) const
49+
{
50+
SWSS_LOG_ENTER();
51+
52+
meta->meta_sai_on_switch_asic_sdk_health_event(m_switchId,
53+
m_severity,
54+
m_timestamp,
55+
m_category,
56+
m_healthData,
57+
m_description);
58+
}
59+
60+
void NotificationSwitchAsicSdkHealthEvent::executeCallback(
61+
_In_ const sai_switch_notifications_t& switchNotifications) const
62+
{
63+
SWSS_LOG_ENTER();
64+
65+
if (switchNotifications.on_switch_asic_sdk_health_event)
66+
{
67+
switchNotifications.on_switch_asic_sdk_health_event(m_switchId,
68+
m_severity,
69+
m_timestamp,
70+
m_category,
71+
m_healthData,
72+
m_description);
73+
}
74+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#pragma once
2+
3+
#include "Notification.h"
4+
5+
namespace sairedis
6+
{
7+
class NotificationSwitchAsicSdkHealthEvent:
8+
public Notification
9+
{
10+
public:
11+
12+
NotificationSwitchAsicSdkHealthEvent(
13+
_In_ const std::string& serializedNotification);
14+
15+
virtual ~NotificationSwitchAsicSdkHealthEvent();
16+
17+
public:
18+
19+
virtual sai_object_id_t getSwitchId() const override;
20+
21+
virtual sai_object_id_t getAnyObjectId() const override;
22+
23+
virtual void processMetadata(
24+
_In_ std::shared_ptr<saimeta::Meta> meta) const override;
25+
26+
virtual void executeCallback(
27+
_In_ const sai_switch_notifications_t& switchNotifications) const override;
28+
29+
private:
30+
31+
sai_object_id_t m_switchId;
32+
sai_switch_asic_sdk_health_severity_t m_severity;
33+
sai_switch_asic_sdk_health_category_t m_category;
34+
sai_timespec_t m_timestamp;
35+
sai_switch_health_data_t m_healthData;
36+
sai_u8_list_t m_description;
37+
};
38+
}

meta/SaiSerialize.cpp

Lines changed: 93 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1131,6 +1131,41 @@ std::string sai_serialize_egress_drop_reason(
11311131
return sai_serialize_enum(reason, &sai_metadata_enum_sai_out_drop_reason_t);
11321132
}
11331133

1134+
std::string sai_serialize_timespec(
1135+
_In_ const sai_timespec_t &timespec)
1136+
{
1137+
SWSS_LOG_ENTER();
1138+
1139+
json j;
1140+
1141+
j["tv_sec"] = sai_serialize_number<uint64_t>(timespec.tv_sec);
1142+
j["tv_nsec"] = sai_serialize_number<uint32_t>(timespec.tv_nsec);
1143+
1144+
return j.dump();
1145+
}
1146+
1147+
std::string sai_serialize_switch_asic_sdk_health_event(
1148+
_In_ sai_object_id_t switch_id,
1149+
_In_ sai_switch_asic_sdk_health_severity_t severity,
1150+
_In_ const sai_timespec_t &timestamp,
1151+
_In_ sai_switch_asic_sdk_health_category_t category,
1152+
_In_ const sai_switch_health_data_t &data,
1153+
_In_ const sai_u8_list_t &description)
1154+
{
1155+
SWSS_LOG_ENTER();
1156+
1157+
json j;
1158+
1159+
j["switch_id"] = sai_serialize_object_id(switch_id);
1160+
j["severity"] = sai_serialize_enum(severity, &sai_metadata_enum_sai_switch_asic_sdk_health_severity_t);
1161+
j["timestamp"] = sai_serialize_timespec(timestamp);
1162+
j["category"] = sai_serialize_enum(category, &sai_metadata_enum_sai_switch_asic_sdk_health_category_t);
1163+
j["data.data_type"] = sai_serialize_enum(data.data_type, &sai_metadata_enum_sai_health_data_type_t);
1164+
j["description"] = sai_serialize_number_list(description, false);
1165+
1166+
return j.dump();
1167+
}
1168+
11341169
std::string sai_serialize_switch_shutdown_request(
11351170
_In_ sai_object_id_t switch_id)
11361171
{
@@ -1299,7 +1334,7 @@ template <typename T>
12991334
std::string sai_serialize_number_list(
13001335
_In_ const T& list,
13011336
_In_ bool countOnly,
1302-
_In_ bool hex = false)
1337+
_In_ bool hex)
13031338
{
13041339
SWSS_LOG_ENTER();
13051340

@@ -4147,6 +4182,63 @@ void sai_deserialize_switch_oper_status(
41474182
sai_deserialize_enum(j["status"], &sai_metadata_enum_sai_switch_oper_status_t, (int32_t&)status);
41484183
}
41494184

4185+
void sai_deserialize_timespec(
4186+
_In_ const std::string& s,
4187+
_Out_ sai_timespec_t &timestamp)
4188+
{
4189+
SWSS_LOG_ENTER();
4190+
4191+
json j;
4192+
try
4193+
{
4194+
j = json::parse(s);
4195+
}
4196+
catch (const std::exception&)
4197+
{
4198+
SWSS_LOG_ERROR("Received an exception after trying to parse timespec_t from %s", s.c_str());
4199+
}
4200+
4201+
sai_deserialize_number<uint64_t>(j["tv_sec"], timestamp.tv_sec);
4202+
sai_deserialize_number<uint32_t>(j["tv_nsec"], timestamp.tv_nsec);
4203+
}
4204+
4205+
void sai_deserialize_switch_asic_sdk_health_event(
4206+
_In_ const std::string& s,
4207+
_Out_ sai_object_id_t &switch_id,
4208+
_Out_ sai_switch_asic_sdk_health_severity_t &severity,
4209+
_Out_ sai_timespec_t &timestamp,
4210+
_Out_ sai_switch_asic_sdk_health_category_t &category,
4211+
_Out_ sai_switch_health_data_t &data,
4212+
_Out_ sai_u8_list_t &description)
4213+
{
4214+
SWSS_LOG_ENTER();
4215+
4216+
json j;
4217+
try
4218+
{
4219+
j = json::parse(s);
4220+
}
4221+
catch (const std::exception&)
4222+
{
4223+
SWSS_LOG_ERROR("Received an exception after trying to parse switch_asic_sdk_health_event from %s", s.c_str());
4224+
}
4225+
4226+
sai_deserialize_object_id(j["switch_id"], switch_id);
4227+
sai_deserialize_enum(j["severity"], &sai_metadata_enum_sai_switch_asic_sdk_health_severity_t, (int32_t&)severity);
4228+
sai_deserialize_timespec(j["timestamp"], timestamp);
4229+
sai_deserialize_enum(j["category"], &sai_metadata_enum_sai_switch_asic_sdk_health_category_t, (int32_t&)category);
4230+
int32_t data_type;
4231+
sai_deserialize_enum(j["data.data_type"], &sai_metadata_enum_sai_health_data_type_t, data_type);
4232+
data.data_type = (sai_health_data_type_t)data_type;
4233+
data.data_type = SAI_HEALTH_DATA_TYPE_GENERAL;
4234+
sai_deserialize_number_list(j["description"], description, false, false);
4235+
}
4236+
4237+
void sai_deserialize_free_switch_asic_sdk_health_event(_In_ sai_u8_list_t &description)
4238+
{
4239+
sai_free_list(description);
4240+
}
4241+
41504242
void sai_deserialize_switch_shutdown_request(
41514243
_In_ const std::string& s,
41524244
_Out_ sai_object_id_t &switch_id)

meta/sai_serialize.h

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,17 @@ std::string sai_serialize_switch_oper_status(
204204
_In_ sai_object_id_t switch_id,
205205
_In_ sai_switch_oper_status_t status);
206206

207+
std::string sai_serialize_timespec(
208+
_In_ const sai_timespec_t &timespec);
209+
210+
std::string sai_serialize_switch_asic_sdk_health_event(
211+
_In_ sai_object_id_t switch_id,
212+
_In_ sai_switch_asic_sdk_health_severity_t severity,
213+
_In_ const sai_timespec_t &timestamp,
214+
_In_ sai_switch_asic_sdk_health_category_t category,
215+
_In_ const sai_switch_health_data_t &data,
216+
_In_ const sai_u8_list_t &description);
217+
207218
std::string sai_serialize_switch_shutdown_request(
208219
_In_ sai_object_id_t switch_id);
209220

@@ -220,6 +231,12 @@ std::string sai_serialize_number(
220231
_In_ uint32_t number,
221232
_In_ bool hex = false);
222233

234+
template <typename T>
235+
std::string sai_serialize_number_list(
236+
_In_ const T& list,
237+
_In_ bool countOnly,
238+
_In_ bool hex = false);
239+
223240
std::string sai_serialize_attr_id(
224241
_In_ const sai_attr_metadata_t& meta);
225242

@@ -327,6 +344,19 @@ void sai_deserialize_switch_oper_status(
327344
_Out_ sai_object_id_t &switch_id,
328345
_Out_ sai_switch_oper_status_t& status);
329346

347+
void sai_deserialize_timespec(
348+
_In_ const std::string& s,
349+
_Out_ sai_timespec_t &timestamp);
350+
351+
void sai_deserialize_switch_asic_sdk_health_event(
352+
_In_ const std::string& s,
353+
_Out_ sai_object_id_t &switch_id,
354+
_Out_ sai_switch_asic_sdk_health_severity_t &severity,
355+
_Out_ sai_timespec_t &timestamp,
356+
_Out_ sai_switch_asic_sdk_health_category_t &category,
357+
_Out_ sai_switch_health_data_t &data,
358+
_Out_ sai_u8_list_t &description);
359+
330360
void sai_deserialize_switch_shutdown_request(
331361
_In_ const std::string& s,
332362
_Out_ sai_object_id_t &switch_id);
@@ -536,6 +566,9 @@ void sai_deserialize_free_bfd_session_state_ntf(
536566
_In_ uint32_t count,
537567
_In_ sai_bfd_session_state_notification_t* bfdsessionstate);
538568

569+
void sai_deserialize_free_switch_asic_sdk_health_event(
570+
_In_ sai_u8_list_t &description);
571+
539572
void sai_deserialize_ingress_priority_group_attr(
540573
_In_ const std::string& s,
541574
_Out_ sai_ingress_priority_group_attr_t& attr);

0 commit comments

Comments
 (0)