* Forward declaration of the stats and events command
*/
namespace interface_cmds {
-class stats_enable_cmd;
class events_cmd;
};
+class stat_reader;
/**
* A representation of an interface in VPP
* Local interface type (specific to VPP)
*/
const static type_t LOCAL;
+
/**
- * TAP interface type
+ * TAPv2 interface type
*/
- const static type_t TAP;
+ const static type_t TAPV2;
/**
* vhost-user interface type
*/
const static type_t BOND;
+ /**
+ * pipe-parent type
+ */
+ const static type_t PIPE;
+
+ /**
+ * pipe-end type
+ */
+ const static type_t PIPE_END;
+
/**
* Convert VPP's name of the interface to a type
*/
oper_state_t(int v, const std::string& s);
};
+ /**
+ * stats_t:
+ */
+ struct stats_t
+ {
+ counter_t m_rx;
+ counter_t m_tx;
+ counter_t m_rx_unicast;
+ counter_t m_tx_unicast;
+ counter_t m_rx_multicast;
+ counter_t m_tx_multicast;
+ counter_t m_rx_broadcast;
+ counter_t m_tx_broadcast;
+ };
+
/**
* Construct a new object matching the desried state
*/
*/
void set(const std::string& tag);
+ /**
+ * Get the interface stats
+ */
+ const stats_t& get_stats(void) const;
+
/**
* Comparison operator - only used for UT
*/
* A base class for interface Create commands
*/
template <typename MSG>
- class create_cmd : public rpc_cmd<HW::item<handle_t>, HW::item<handle_t>, MSG>
+ class create_cmd : public rpc_cmd<HW::item<handle_t>, MSG>
{
public:
create_cmd(HW::item<handle_t>& item, const std::string& name)
- : rpc_cmd<HW::item<handle_t>, HW::item<handle_t>, MSG>(item)
+ : rpc_cmd<HW::item<handle_t>, MSG>(item)
, m_name(name)
{
}
*/
void succeeded()
{
- rpc_cmd<HW::item<handle_t>, HW::item<handle_t>, MSG>::succeeded();
+ rpc_cmd<HW::item<handle_t>, MSG>::succeeded();
interface::add(m_name, this->item());
}
int sw_if_index = reply.get_response().get_payload().sw_if_index;
int retval = reply.get_response().get_payload().retval;
- VOM_LOG(log_level_t::DEBUG) << this->to_string() << " " << retval;
+ VOM_LOG(log_level_t::DEBUG) << this->to_string() << " res:" << retval
+ << " sw-if-index:" << sw_if_index;
rc_t rc = rc_t::from_vpp_retval(retval);
handle_t handle = handle_t::INVALID;
handle = sw_if_index;
}
- HW::item<handle_t> res(handle, rc);
-
- this->fulfill(res);
+ this->fulfill(HW::item<handle_t>(handle, rc));
return (VAPI_OK);
}
* Base class for intterface Delete commands
*/
template <typename MSG>
- class delete_cmd : public rpc_cmd<HW::item<handle_t>, HW::item<handle_t>, MSG>
+ class delete_cmd : public rpc_cmd<HW::item<handle_t>, MSG>
{
public:
delete_cmd(HW::item<handle_t>& item, const std::string& name)
- : rpc_cmd<HW::item<handle_t>, HW::item<handle_t>, MSG>(item)
+ : rpc_cmd<HW::item<handle_t>, MSG>(item)
, m_name(name)
{
}
delete_cmd(HW::item<handle_t>& item)
- : rpc_cmd<HW::item<handle_t>, HW::item<handle_t>, MSG>(item)
+ : rpc_cmd<HW::item<handle_t>, MSG>(item)
, m_name()
{
}
const std::string m_name;
};
+ struct event
+ {
+ event(const interface& itf, const interface::oper_state_t& state)
+ : itf(itf)
+ , state(state)
+ {
+ }
+
+ const interface& itf;
+ interface::oper_state_t state;
+ };
+
/**
* A class that listens to interface Events
*/
* Virtual function called on the listener when the command has data
* ready to process
*/
- virtual void handle_interface_event(interface_cmds::events_cmd* cmd) = 0;
+ virtual void handle_interface_event(std::vector<event> es) = 0;
/**
* Return the HW::item representing the status
*/
stat_listener();
+ virtual ~stat_listener() = default;
+
/**
* Virtual function called on the listener when the command has data
* ready to process
*/
- virtual void handle_interface_stat(
- interface_cmds::stats_enable_cmd* cmd) = 0;
+ virtual void handle_interface_stat(const interface&) = 0;
/**
* Return the HW::item representing the status
/**
* Enable stats for this interface
*/
- void enable_stats(stat_listener& el,
+ void enable_stats(stat_listener* el,
const stats_type_t& st = stats_type_t::NORMAL);
+ /**
+ * Disable stats for this interface
+ */
+ void disable_stats();
+
+ /**
+ * Enable the reception of events of all interfaces
+ */
+ static void enable_events(interface::event_listener& el);
+
+ /**
+ * disable the reception of events of all interfaces
+ */
+ static void disable_events();
+
protected:
/**
* Set the handle of an interface object. Only called by the interface
*/
void set(const handle_t& handle);
friend class interface_factory;
-
+ friend class pipe;
/**
* The SW interface handle VPP has asigned to the interface
*/
static event_handler m_evh;
+ /**
+ * friend with stat_reader
+ */
+ friend stat_reader;
+
+ /**
+ * publish stats
+ */
+ void publish_stats();
+
+ /**
+ * Set the interface stat
+ */
+ void set(const counter_t& count, const std::string& stat_type);
+
/**
* enable the interface stats in the singular instance
*/
- void enable_stats_i(stat_listener& el, const stats_type_t& st);
+ void enable_stats_i(stat_listener* el, const stats_type_t& st);
+
+ /**
+ * disable the interface stats in the singular instance
+ */
+ void disable_stats_i();
/**
* Commit the acculmulated changes into VPP. i.e. to a 'HW" write.
*/
std::shared_ptr<route_domain> m_rd;
- /**
- * shared pointer to the stats object for this interface.
- */
- std::shared_ptr<interface_cmds::stats_enable_cmd> m_stats;
-
/**
* The state of the interface
*/
*/
HW::item<stats_type_t> m_stats_type;
+ /**
+ * Interface stats
+ */
+ stats_t m_stats;
+
+ /**
+ * reference to stat listener
+ */
+ stat_listener* m_listener;
+
/**
* Operational state of the interface
*/
*/
template <typename MSG>
friend class delete_cmd;
+
+ static std::shared_ptr<interface_cmds::events_cmd> m_events_cmd;
};
+
+/**
+ * stream insertion operator for interface stats
+ */
+std::ostream& operator<<(std::ostream& os, const interface::stats_t& stats);
};
/*
* fd.io coding-style-patch-verification: ON