syncd/SwitchNotifications.h (207 lines of code) (raw):

#pragma once extern "C"{ #include "saimetadata.h" } #include "swss/logger.h" #include <functional> #include <vector> namespace syncd { class SwitchNotifications { private: class SlotBase { public: SlotBase( _In_ const sai_switch_notifications_t& sn); virtual ~SlotBase(); public: void setHandler( _In_ SwitchNotifications* handler); SwitchNotifications* getHandler() const; const sai_switch_notifications_t& getSwitchNotifications() const; protected: static void onFdbEvent( _In_ int context, _In_ uint32_t count, _In_ const sai_fdb_event_notification_data_t *data); static void onNatEvent( _In_ int context, _In_ uint32_t count, _In_ const sai_nat_event_notification_data_t *data); static void onPortStateChange( _In_ int context, _In_ uint32_t count, _In_ const sai_port_oper_status_notification_t *data); static void onPortHostTxReady( _In_ int context, _In_ sai_object_id_t switch_id, _In_ sai_object_id_t port_id, _In_ sai_port_host_tx_ready_status_t host_tx_ready_status); static void onQueuePfcDeadlock( _In_ int context, _In_ uint32_t count, _In_ const sai_queue_deadlock_notification_data_t *data); static void onSwitchAsicSdkHealthEvent( _In_ int context, _In_ sai_object_id_t switch_id, _In_ sai_switch_asic_sdk_health_severity_t severity, _In_ sai_timespec_t timestamp, _In_ sai_switch_asic_sdk_health_category_t category, _In_ sai_switch_health_data_t data, _In_ const sai_u8_list_t description); static void onSwitchShutdownRequest( _In_ int context, _In_ sai_object_id_t switch_id); static void onSwitchStateChange( _In_ int context, _In_ sai_object_id_t switch_id, _In_ sai_switch_oper_status_t switch_oper_status); static void onBfdSessionStateChange( _In_ int context, _In_ uint32_t count, _In_ const sai_bfd_session_state_notification_t *data); static void onTwampSessionEvent( _In_ int context, _In_ uint32_t count, _In_ const sai_twamp_session_event_notification_data_t *data); protected: SwitchNotifications* m_handler; sai_switch_notifications_t m_sn; }; template<size_t context> class Slot: public SlotBase { public: Slot(): SlotBase({ .on_switch_state_change = &Slot<context>::onSwitchStateChange, .on_switch_shutdown_request = &Slot<context>::onSwitchShutdownRequest, .on_fdb_event = &Slot<context>::onFdbEvent, .on_port_state_change = &Slot<context>::onPortStateChange, .on_packet_event = nullptr, .on_queue_pfc_deadlock = &Slot<context>::onQueuePfcDeadlock, .on_bfd_session_state_change = &Slot<context>::onBfdSessionStateChange, .on_tam_event = nullptr, .on_ipsec_sa_status_change = nullptr, .on_nat_event = &Slot<context>::onNatEvent, .on_switch_asic_sdk_health_event = &Slot<context>::onSwitchAsicSdkHealthEvent, .on_port_host_tx_ready = &Slot<context>::onPortHostTxReady, .on_twamp_session_event = &Slot<context>::onTwampSessionEvent, .on_icmp_echo_session_state_change = nullptr, .on_extended_port_state_change = nullptr, .on_tam_tel_type_config_change = nullptr, .on_ha_set_event = nullptr, .on_ha_scope_event = nullptr, }) { } virtual ~Slot() {} private: static void onFdbEvent( _In_ uint32_t count, _In_ const sai_fdb_event_notification_data_t *data) { SWSS_LOG_ENTER(); return SlotBase::onFdbEvent(context, count, data); } static void onNatEvent( _In_ uint32_t count, _In_ const sai_nat_event_notification_data_t *data) { SWSS_LOG_ENTER(); return SlotBase::onNatEvent(context, count, data); } static void onPortStateChange( _In_ uint32_t count, _In_ const sai_port_oper_status_notification_t *data) { SWSS_LOG_ENTER(); return SlotBase::onPortStateChange(context, count, data); } static void onPortHostTxReady( _In_ sai_object_id_t switch_id, _In_ sai_object_id_t port_id, _In_ sai_port_host_tx_ready_status_t host_tx_ready_status) { SWSS_LOG_ENTER(); return SlotBase::onPortHostTxReady(context, switch_id, port_id, host_tx_ready_status); } static void onBfdSessionStateChange( _In_ uint32_t count, _In_ const sai_bfd_session_state_notification_t *data) { SWSS_LOG_ENTER(); return SlotBase::onBfdSessionStateChange(context, count, data); } static void onQueuePfcDeadlock( _In_ uint32_t count, _In_ const sai_queue_deadlock_notification_data_t *data) { SWSS_LOG_ENTER(); return SlotBase::onQueuePfcDeadlock(context, count, data); } static void onSwitchAsicSdkHealthEvent( _In_ sai_object_id_t switch_id, _In_ sai_switch_asic_sdk_health_severity_t severity, _In_ sai_timespec_t timestamp, _In_ sai_switch_asic_sdk_health_category_t category, _In_ sai_switch_health_data_t data, _In_ const sai_u8_list_t description) { SWSS_LOG_ENTER(); return SlotBase::onSwitchAsicSdkHealthEvent(context, switch_id, severity, timestamp, category, data, description); } static void onSwitchShutdownRequest( _In_ sai_object_id_t switch_id) { SWSS_LOG_ENTER(); return SlotBase::onSwitchShutdownRequest(context, switch_id); } static void onSwitchStateChange( _In_ sai_object_id_t switch_id, _In_ sai_switch_oper_status_t switch_oper_status) { SWSS_LOG_ENTER(); return SlotBase::onSwitchStateChange(context, switch_id, switch_oper_status); } static void onTwampSessionEvent( _In_ uint32_t count, _In_ const sai_twamp_session_event_notification_data_t *data) { SWSS_LOG_ENTER(); return SlotBase::onTwampSessionEvent(context, count, data); } }; static std::vector<SwitchNotifications::SlotBase*> m_slots; public: SwitchNotifications(); virtual ~SwitchNotifications(); public: const sai_switch_notifications_t& getSwitchNotifications() const; public: // wrapped methods std::function<void(uint32_t, const sai_fdb_event_notification_data_t*)> onFdbEvent; std::function<void(uint32_t, const sai_nat_event_notification_data_t*)> onNatEvent; std::function<void(uint32_t, const sai_port_oper_status_notification_t*)> onPortStateChange; std::function<void(sai_object_id_t, sai_object_id_t, sai_port_host_tx_ready_status_t)> onPortHostTxReady; std::function<void(uint32_t, const sai_queue_deadlock_notification_data_t*)> onQueuePfcDeadlock; std::function<void(sai_object_id_t, sai_switch_asic_sdk_health_severity_t, sai_timespec_t, sai_switch_asic_sdk_health_category_t, sai_switch_health_data_t, const sai_u8_list_t)> onSwitchAsicSdkHealthEvent; std::function<void(sai_object_id_t)> onSwitchShutdownRequest; std::function<void(sai_object_id_t switch_id, sai_switch_oper_status_t)> onSwitchStateChange; std::function<void(uint32_t, const sai_bfd_session_state_notification_t*)> onBfdSessionStateChange; std::function<void(uint32_t, const sai_twamp_session_event_notification_data_t*)> onTwampSessionEvent; private: SlotBase*m_slot; }; }