saiplayer/SaiPlayer.h (213 lines of code) (raw):
#pragma once
#include "CommandLineOptions.h"
#include "meta/SaiInterface.h"
#include "meta/SaiAttributeList.h"
#include "syncd/ServiceMethodTable.h"
#include "syncd/SwitchNotifications.h"
#include <fstream>
#include <memory>
#include <map>
namespace saiplayer
{
class SaiPlayer
{
private:
SaiPlayer(const SaiPlayer&) = delete;
SaiPlayer& operator=(const SaiPlayer&) = delete;
public:
SaiPlayer(
_In_ std::shared_ptr<sairedis::SaiInterface> sai,
_In_ std::shared_ptr<CommandLineOptions> cmd);
virtual ~SaiPlayer();
public:
int run();
private:
int replay();
void processBulk(
_In_ sai_common_api_t api,
_In_ const std::string &line);
sai_status_t handle_bulk_route(
_In_ const std::vector<std::string> &object_ids,
_In_ sai_common_api_t api,
_In_ const std::vector<std::shared_ptr<saimeta::SaiAttributeList>> &attributes,
_In_ const std::vector<sai_status_t> &recorded_statuses);
sai_status_t handle_bulk_generic(
_In_ sai_object_type_t objectType,
_In_ const std::vector<std::string> &object_ids,
_In_ sai_common_api_t api,
_In_ const std::vector<std::shared_ptr<saimeta::SaiAttributeList>> &attributes,
_In_ const std::vector<sai_status_t> &recorded_statuses);
sai_status_t handle_bulk_object(
_In_ sai_object_type_t object_type,
_In_ const std::vector<std::string> &object_ids,
_In_ sai_common_api_t api,
_In_ const std::vector<std::shared_ptr<saimeta::SaiAttributeList>> &attributes,
_Out_ std::vector<sai_status_t> &statuses);
sai_status_t handle_bulk_entry(
_In_ const std::vector<std::string> &object_ids,
_In_ sai_object_type_t object_type,
_In_ sai_common_api_t api,
_In_ const std::vector<std::shared_ptr<saimeta::SaiAttributeList>> &attributes,
_Out_ std::vector<sai_status_t> &statuses);
std::vector<std::string> tokenize(
_In_ std::string input,
_In_ const std::string &delim);
void performFdbFlush(
_In_ const std::string& request,
_In_ const std::string response);
void performNotifySyncd(
_In_ const std::string& request,
_In_ const std::string& response);
void performSleep(
_In_ const std::string& line);
void handle_get_response(
_In_ sai_object_type_t object_type,
_In_ uint32_t get_attr_count,
_In_ sai_attribute_t* get_attr_list,
_In_ const std::string& response,
_In_ sai_status_t status);
sai_status_t handle_generic(
_In_ sai_object_type_t object_type,
_In_ const std::string &str_object_id,
_In_ sai_common_api_t api,
_In_ uint32_t attr_count,
_In_ sai_attribute_t *attr_list);
void update_notifications_pointers(
_In_ uint32_t attr_count,
_Inout_ sai_attribute_t *attr_list);
sai_status_t handle_route(
_In_ const std::string &str_object_id,
_In_ sai_common_api_t api,
_In_ uint32_t attr_count,
_In_ sai_attribute_t *attr_list);
sai_status_t handle_neighbor(
_In_ const std::string& str_object_id,
_In_ sai_common_api_t api,
_In_ uint32_t attr_count,
_In_ sai_attribute_t *attr_list);
sai_status_t handle_fdb(
_In_ const std::string &str_object_id,
_In_ sai_common_api_t api,
_In_ uint32_t attr_count,
_In_ sai_attribute_t *attr_list);
sai_status_t handle_inseg(
_In_ const std::string &str_object_id,
_In_ sai_common_api_t api,
_In_ uint32_t attr_count,
_In_ sai_attribute_t *attr_list);
sai_status_t handle_dash_direction_lookup(
_In_ const std::string &str_object_id,
_In_ sai_common_api_t api,
_In_ uint32_t attr_count,
_In_ sai_attribute_t *attr_list);
sai_status_t handle_dash_eni_ether_address_map(
_In_ const std::string &str_object_id,
_In_ sai_common_api_t api,
_In_ uint32_t attr_count,
_In_ sai_attribute_t *attr_list);
sai_status_t handle_dash_vip(
_In_ const std::string &str_object_id,
_In_ sai_common_api_t api,
_In_ uint32_t attr_count,
_In_ sai_attribute_t *attr_list);
sai_status_t handle_dash_inbound_routing(
_In_ const std::string &str_object_id,
_In_ sai_common_api_t api,
_In_ uint32_t attr_count,
_In_ sai_attribute_t *attr_list);
sai_status_t handle_dash_pa_validation(
_In_ const std::string &str_object_id,
_In_ sai_common_api_t api,
_In_ uint32_t attr_count,
_In_ sai_attribute_t *attr_list);
sai_status_t handle_dash_outbound_routing(
_In_ const std::string &str_object_id,
_In_ sai_common_api_t api,
_In_ uint32_t attr_count,
_In_ sai_attribute_t *attr_list);
sai_status_t handle_dash_outbound_ca_to_pa(
_In_ const std::string &str_object_id,
_In_ sai_common_api_t api,
_In_ uint32_t attr_count,
_In_ sai_attribute_t *attr_list);
void match_redis_with_rec(
_In_ sai_object_type_t object_type,
_In_ uint32_t get_attr_count,
_In_ sai_attribute_t* get_attr_list,
_In_ uint32_t attr_count,
_In_ sai_attribute_t* attr_list);
void match_redis_with_rec(
_In_ sai_object_list_t get_objlist,
_In_ sai_object_list_t objlist);
void match_redis_with_rec(
_In_ sai_object_id_t get_oid,
_In_ sai_object_id_t oid);
void match_list_lengths(
_In_ sai_object_type_t object_type,
_In_ uint32_t get_attr_count,
_In_ sai_attribute_t* get_attr_list,
_In_ uint32_t attr_count,
_In_ sai_attribute_t* attr_list);
const std::vector<swss::FieldValueTuple> get_values(
_In_ const std::vector<std::string>& items);
sai_object_type_t deserialize_object_type(
_In_ const std::string& s);
void translate_local_to_redis(
_In_ sai_object_type_t object_type,
_In_ uint32_t attr_count,
_In_ sai_attribute_t *attr_list);
sai_object_id_t translate_local_to_redis(
_In_ sai_object_id_t rid);
void translate_local_to_redis(
_Inout_ sai_object_list_t& element);
const char* profileGetValue(
_In_ sai_switch_profile_id_t profile_id,
_In_ const char* variable);
int profileGetNextValue(
_In_ sai_switch_profile_id_t profile_id,
_Out_ const char** variable,
_Out_ const char** value);
void loadProfileMap();
private: // notification handlers
void onFdbEvent(
_In_ uint32_t count,
_In_ const sai_fdb_event_notification_data_t *data);
void onPortStateChange(
_In_ uint32_t count,
_In_ const sai_port_oper_status_notification_t *data);
void onQueuePfcDeadlock(
_In_ uint32_t count,
_In_ const sai_queue_deadlock_notification_data_t *data);
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);
void onSwitchShutdownRequest(
_In_ sai_object_id_t switch_id) __attribute__ ((noreturn));
void onSwitchStateChange(
_In_ sai_object_id_t switch_id,
_In_ sai_switch_oper_status_t switch_oper_status);
void onBfdSessionStateChange(
_In_ uint32_t count,
_In_ const sai_bfd_session_state_notification_t *data);
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);
private:
std::shared_ptr<sairedis::SaiInterface> m_sai;
std::shared_ptr<CommandLineOptions> m_commandLineOptions;
std::ifstream m_infile;
std::map<sai_object_id_t,sai_object_id_t> m_local_to_redis;
std::map<sai_object_id_t,sai_object_id_t> m_redis_to_local;
syncd::ServiceMethodTable m_smt;
syncd::SwitchNotifications m_sn;
sai_switch_notifications_t m_switchNotifications;
sai_service_method_table_t m_test_services;
std::map<std::string, std::string> m_profileMap;
std::map<std::string, std::string>::iterator m_profileIter;
};
}