vslib/SwitchState.h (94 lines of code) (raw):
#pragma once
extern "C" {
#include "sai.h"
}
#include "SaiAttrWrap.h"
#include "SwitchConfig.h"
#include "meta/Meta.h"
#include "swss/selectableevent.h"
#include <map>
#include <memory>
#include <thread>
#include <string>
#include <mutex>
namespace saivs
{
class SwitchState
{
public:
/**
* @brief AttrHash key is attribute ID, value is actual attribute
*/
typedef std::map<std::string, std::shared_ptr<SaiAttrWrap>> AttrHash;
/**
* @brief ObjectHash is map indexed by object type and then serialized object id.
*/
typedef std::map<sai_object_type_t, std::map<std::string, AttrHash>> ObjectHash;
public:
SwitchState(
_In_ sai_object_id_t switch_id,
_In_ std::shared_ptr<SwitchConfig> config);
virtual ~SwitchState();
public:
void setMeta(
std::weak_ptr<saimeta::Meta> meta);
public:
sai_status_t getStatsExt(
_In_ sai_object_type_t obejct_type,
_In_ sai_object_id_t object_id,
_In_ uint32_t number_of_counters,
_In_ const sai_stat_id_t* counter_ids,
_In_ sai_stats_mode_t mode,
_Out_ uint64_t *counters);
sai_status_t queryStatsCapability(
_In_ sai_object_id_t switchId,
_In_ sai_object_type_t objectType,
_Inout_ sai_stat_capability_list_t *stats_capability);
sai_status_t queryStatsStCapability(
_In_ sai_object_id_t switch_id,
_In_ sai_object_type_t object_type,
_Inout_ sai_stat_st_capability_list_t *stats_capability);
public:
sai_object_id_t getSwitchId() const;
void setIfNameToPortId(
_In_ const std::string& ifname,
_In_ sai_object_id_t port_id);
void removeIfNameToPortId(
_In_ const std::string& ifname);
sai_object_id_t getPortIdFromIfName(
_In_ const std::string& ifname) const;
void setPortIdToTapName(
_In_ sai_object_id_t port_id,
_In_ const std::string& tapname);
void removePortIdToTapName(
_In_ sai_object_id_t port_id);
bool getTapNameFromPortId(
_In_ const sai_object_id_t port_id,
_Out_ std::string& if_name);
private:
sai_status_t getPortStat(
_In_ sai_object_id_t portId,
_In_ const sai_stat_id_t counterId,
_Out_ uint64_t& counter);
sai_status_t getNetStat(
_In_ sai_stat_id_t counterId,
_In_ std::string& ifName,
_Out_ uint64_t& counter);
protected:
void registerLinkCallback();
void unregisterLinkCallback();
void asyncOnLinkMsg(
_In_ int nlmsg_type,
_In_ struct nl_object *obj);
std::shared_ptr<saimeta::Meta> getMeta();
public: // TODO make private
ObjectHash m_objectHash;
protected:
std::map<std::string, std::map<int, uint64_t>> m_countersMap;
sai_object_id_t m_switch_id;
private : // tap device related objects
std::map<sai_object_id_t, std::string> m_port_id_to_tapname;
std::map<std::string, sai_object_id_t> m_ifname_to_port_id_map;
uint64_t m_linkCallbackIndex;
std::mutex m_mutex;
private : // port counter mapping
static const std::map<sai_stat_id_t, std::string> m_statIdMap;
protected:
std::weak_ptr<saimeta::Meta> m_meta;
std::shared_ptr<SwitchConfig> m_switchConfig;
};
}