Skip to content

Commit 723bb3a

Browse files
committed
ASIC/SDK health event
Signed-off-by: Stephen Sun <[email protected]>
1 parent 5450811 commit 723bb3a

19 files changed

+469
-2
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
@@ -6470,6 +6470,54 @@ void Meta::meta_sai_on_switch_state_change(
64706470
// we should not snoop switch_id, since switch id should be created directly by user
64716471
}
64726472

6473+
void Meta::meta_sai_on_switch_asic_sdk_health_event(
6474+
_In_ sai_object_id_t switch_id,
6475+
_In_ sai_switch_asic_sdk_health_severity_t severity,
6476+
_In_ sai_timespec_t timestamp,
6477+
_In_ sai_switch_asic_sdk_health_category_t category,
6478+
_In_ sai_switch_health_data_t data,
6479+
_In_ const sai_u8_list_t description)
6480+
{
6481+
SWSS_LOG_ENTER();
6482+
6483+
if (!sai_metadata_get_enum_value_name(
6484+
&sai_metadata_enum_sai_switch_asic_sdk_health_severity_t,
6485+
severity))
6486+
{
6487+
SWSS_LOG_WARN("Switch ASIC/SDK health event severity value (%d) not found in sai_switch_asic_sdk_health_severity_t",
6488+
severity);
6489+
}
6490+
6491+
if (!sai_metadata_get_enum_value_name(
6492+
&sai_metadata_enum_sai_switch_asic_sdk_health_category_t,
6493+
category))
6494+
{
6495+
SWSS_LOG_WARN("Switch ASIC/SDK health event category value (%d) not found in sai_switch_asic_sdk_health_severity_t",
6496+
category);
6497+
}
6498+
6499+
auto ot = objectTypeQuery(switch_id);
6500+
6501+
if (ot != SAI_OBJECT_TYPE_SWITCH)
6502+
{
6503+
SWSS_LOG_WARN("switch_id %s is of type %s, but expected SAI_OBJECT_TYPE_SWITCH",
6504+
sai_serialize_object_id(switch_id).c_str(),
6505+
sai_serialize_object_type(ot).c_str());
6506+
6507+
return;
6508+
}
6509+
6510+
sai_object_meta_key_t switch_meta_key = { .objecttype = ot , .objectkey = { .key = { .object_id = switch_id } } };
6511+
6512+
if (!m_saiObjectCollection.objectExists(switch_meta_key))
6513+
{
6514+
SWSS_LOG_ERROR("switch_id %s don't exists in local database",
6515+
sai_serialize_object_id(switch_id).c_str());
6516+
}
6517+
6518+
// we should not snoop switch_id, since switch id should be created directly by user
6519+
}
6520+
64736521
void Meta::meta_sai_on_switch_shutdown_request(
64746522
_In_ sai_object_id_t switch_id)
64756523
{

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 "sairediscommon.h"
1011

@@ -33,6 +34,9 @@ std::shared_ptr<Notification> NotificationFactory::deserialize(
3334
if (name == SAI_SWITCH_NOTIFICATION_NAME_SWITCH_SHUTDOWN_REQUEST)
3435
return std::make_shared<NotificationSwitchShutdownRequest>(serializedNotification);
3536

37+
if (name == SAI_SWITCH_NOTIFICATION_NAME_SWITCH_ASIC_SDK_HEALTH_EVENT)
38+
return std::make_shared<NotificationSwitchAsicSdkHealthEvent>(serializedNotification);
39+
3640
if (name == SAI_SWITCH_NOTIFICATION_NAME_SWITCH_STATE_CHANGE)
3741
return std::make_shared<NotificationSwitchStateChange>(serializedNotification);
3842

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
@@ -1114,6 +1114,41 @@ std::string sai_serialize_egress_drop_reason(
11141114
return sai_serialize_enum(reason, &sai_metadata_enum_sai_out_drop_reason_t);
11151115
}
11161116

1117+
std::string sai_serialize_timespec(
1118+
_In_ const sai_timespec_t &timespec)
1119+
{
1120+
SWSS_LOG_ENTER();
1121+
1122+
json j;
1123+
1124+
j["tv_sec"] = sai_serialize_number<uint64_t>(timespec.tv_sec);
1125+
j["tv_nsec"] = sai_serialize_number<uint32_t>(timespec.tv_nsec);
1126+
1127+
return j.dump();
1128+
}
1129+
1130+
std::string sai_serialize_switch_asic_sdk_health_event(
1131+
_In_ sai_object_id_t switch_id,
1132+
_In_ sai_switch_asic_sdk_health_severity_t severity,
1133+
_In_ const sai_timespec_t &timestamp,
1134+
_In_ sai_switch_asic_sdk_health_category_t category,
1135+
_In_ const sai_switch_health_data_t &data,
1136+
_In_ const sai_u8_list_t &description)
1137+
{
1138+
SWSS_LOG_ENTER();
1139+
1140+
json j;
1141+
1142+
j["switch_id"] = sai_serialize_object_id(switch_id);
1143+
j["severity"] = sai_serialize_enum(severity, &sai_metadata_enum_sai_switch_asic_sdk_health_severity_t);
1144+
j["timestamp"] = sai_serialize_timespec(timestamp);
1145+
j["category"] = sai_serialize_enum(category, &sai_metadata_enum_sai_switch_asic_sdk_health_category_t);
1146+
j["data.data_type"] = sai_serialize_enum(data.data_type, &sai_metadata_enum_sai_health_data_type_t);
1147+
j["description"] = sai_serialize_number_list(description, false);
1148+
1149+
return j.dump();
1150+
}
1151+
11171152
std::string sai_serialize_switch_shutdown_request(
11181153
_In_ sai_object_id_t switch_id)
11191154
{
@@ -1282,7 +1317,7 @@ template <typename T>
12821317
std::string sai_serialize_number_list(
12831318
_In_ const T& list,
12841319
_In_ bool countOnly,
1285-
_In_ bool hex = false)
1320+
_In_ bool hex)
12861321
{
12871322
SWSS_LOG_ENTER();
12881323

@@ -3958,6 +3993,63 @@ void sai_deserialize_switch_oper_status(
39583993
sai_deserialize_enum(j["status"], &sai_metadata_enum_sai_switch_oper_status_t, (int32_t&)status);
39593994
}
39603995

3996+
void sai_deserialize_timespec(
3997+
_In_ const std::string& s,
3998+
_Out_ sai_timespec_t &timestamp)
3999+
{
4000+
SWSS_LOG_ENTER();
4001+
4002+
json j;
4003+
try
4004+
{
4005+
j = json::parse(s);
4006+
}
4007+
catch (const std::exception&)
4008+
{
4009+
SWSS_LOG_ERROR("Received an exception after trying to parse timespec_t from %s", s.c_str());
4010+
}
4011+
4012+
sai_deserialize_number<uint64_t>(j["tv_sec"], timestamp.tv_sec);
4013+
sai_deserialize_number<uint32_t>(j["tv_nsec"], timestamp.tv_nsec);
4014+
}
4015+
4016+
void sai_deserialize_switch_asic_sdk_health_event(
4017+
_In_ const std::string& s,
4018+
_Out_ sai_object_id_t &switch_id,
4019+
_Out_ sai_switch_asic_sdk_health_severity_t &severity,
4020+
_Out_ sai_timespec_t &timestamp,
4021+
_Out_ sai_switch_asic_sdk_health_category_t &category,
4022+
_Out_ sai_switch_health_data_t &data,
4023+
_Out_ sai_u8_list_t &description)
4024+
{
4025+
SWSS_LOG_ENTER();
4026+
4027+
json j;
4028+
try
4029+
{
4030+
j = json::parse(s);
4031+
}
4032+
catch (const std::exception&)
4033+
{
4034+
SWSS_LOG_ERROR("Received an exception after trying to parse switch_asic_sdk_health_event from %s", s.c_str());
4035+
}
4036+
4037+
sai_deserialize_object_id(j["switch_id"], switch_id);
4038+
sai_deserialize_enum(j["severity"], &sai_metadata_enum_sai_switch_asic_sdk_health_severity_t, (int32_t&)severity);
4039+
sai_deserialize_timespec(j["timestamp"], timestamp);
4040+
sai_deserialize_enum(j["category"], &sai_metadata_enum_sai_switch_asic_sdk_health_category_t, (int32_t&)category);
4041+
int32_t data_type;
4042+
sai_deserialize_enum(j["data.data_type"], &sai_metadata_enum_sai_health_data_type_t, data_type);
4043+
data.data_type = (sai_health_data_type_t)data_type;
4044+
data.data_type = SAI_HEALTH_DATA_TYPE_GENERAL;
4045+
sai_deserialize_number_list(j["description"], description, false, false);
4046+
}
4047+
4048+
void sai_deserialize_free_switch_asic_sdk_health_event(_In_ sai_u8_list_t &description)
4049+
{
4050+
sai_free_list(description);
4051+
}
4052+
39614053
void sai_deserialize_switch_shutdown_request(
39624054
_In_ const std::string& s,
39634055
_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

@@ -301,6 +318,19 @@ void sai_deserialize_switch_oper_status(
301318
_Out_ sai_object_id_t &switch_id,
302319
_Out_ sai_switch_oper_status_t& status);
303320

321+
void sai_deserialize_timespec(
322+
_In_ const std::string& s,
323+
_Out_ sai_timespec_t &timestamp);
324+
325+
void sai_deserialize_switch_asic_sdk_health_event(
326+
_In_ const std::string& s,
327+
_Out_ sai_object_id_t &switch_id,
328+
_Out_ sai_switch_asic_sdk_health_severity_t &severity,
329+
_Out_ sai_timespec_t &timestamp,
330+
_Out_ sai_switch_asic_sdk_health_category_t &category,
331+
_Out_ sai_switch_health_data_t &data,
332+
_Out_ sai_u8_list_t &description);
333+
304334
void sai_deserialize_switch_shutdown_request(
305335
_In_ const std::string& s,
306336
_Out_ sai_object_id_t &switch_id);
@@ -498,6 +528,9 @@ void sai_deserialize_free_bfd_session_state_ntf(
498528
_In_ uint32_t count,
499529
_In_ sai_bfd_session_state_notification_t* bfdsessionstate);
500530

531+
void sai_deserialize_free_switch_asic_sdk_health_event(
532+
_In_ sai_u8_list_t &description);
533+
501534
void sai_deserialize_ingress_priority_group_attr(
502535
_In_ const std::string& s,
503536
_Out_ sai_ingress_priority_group_attr_t& attr);

0 commit comments

Comments
 (0)