m_stats.m_rx = count;
else if ("tx" == stat_type)
m_stats.m_tx = count;
+ else if ("drops" == stat_type)
+ m_stats.m_drop = count;
else if ("rx-unicast" == stat_type)
m_stats.m_rx_unicast = count;
else if ("tx-unicast" == stat_type)
operator<<(std::ostream& os, const interface::stats_t& stats)
{
os << "["
- << "rx [packets " << stats.m_rx.packets << ", bytes " << stats.m_rx.bytes
- << "]"
- << " rx-unicast [packets " << stats.m_rx_unicast.packets << ", bytes "
- << stats.m_rx_unicast.bytes << "]"
- << " rx-multicast [packets " << stats.m_rx_multicast.packets << ", bytes "
- << stats.m_rx_multicast.bytes << "]"
- << " rx-broadcast [packets " << stats.m_rx_broadcast.packets << ", bytes "
- << stats.m_rx_broadcast.bytes << "]"
- << " tx [packets " << stats.m_tx.packets << ", bytes " << stats.m_tx.bytes
- << "]"
- << " tx-unicast [packets " << stats.m_tx_unicast.packets << ", bytes "
- << stats.m_tx_unicast.bytes << "]"
- << " tx-multicast [packets " << stats.m_tx_multicast.packets << ", bytes "
- << stats.m_tx_multicast.bytes << "]"
- << " tx-broadcast [packets " << stats.m_tx_broadcast.packets << ", bytes "
- << stats.m_tx_broadcast.bytes << "]]" << std::endl;
+ << "rx " << stats.m_rx << " rx-unicast " << stats.m_rx_unicast
+ << " rx-multicast " << stats.m_rx_multicast << " rx-broadcast "
+ << stats.m_rx_broadcast << " tx " << stats.m_tx << " tx-unicast "
+ << stats.m_tx_unicast << " tx-multicast " << stats.m_tx_multicast
+ << " tx-broadcast " << stats.m_tx_broadcast << " drops " << stats.m_drop
+ << "]" << std::endl;
return (os);
}
counter_t m_tx_multicast;
counter_t m_rx_broadcast;
counter_t m_tx_broadcast;
+ counter_t m_drop;
};
/**
stat_client::stat_client(std::string& socket_name)
: m_socket_name(socket_name)
, m_patterns()
- , m_stat_connect(0)
+ , m_stat_connect(false)
, m_counter_vec()
, m_stat_seg_data(nullptr)
, m_stat_data()
stat_client::stat_client(std::vector<std::string>& pattern)
: m_socket_name("/run/vpp/stats.sock")
, m_patterns(pattern)
- , m_stat_connect(0)
+ , m_stat_connect(false)
, m_counter_vec()
, m_stat_seg_data(nullptr)
, m_stat_data()
std::vector<std::string> patterns)
: m_socket_name(socket_name)
, m_patterns(patterns)
- , m_stat_connect(0)
+ , m_stat_connect(false)
, m_counter_vec()
, m_stat_seg_data(nullptr)
, m_stat_data()
stat_client::stat_client()
: m_socket_name("/run/vpp/stats.sock")
, m_patterns()
- , m_stat_connect(0)
+ , m_stat_connect(false)
, m_counter_vec()
, m_stat_seg_data(nullptr)
, m_stat_data()
stat_client::connect()
{
if (stat_segment_connect(m_socket_name.c_str()) == 0) {
- m_stat_connect = 1;
+ m_stat_connect = true;
ls();
}
return m_stat_connect;
{
if (m_stat_connect)
stat_segment_disconnect();
+ m_stat_connect = false;
}
int
stat_client::dump()
{
stat_segment_data_free(m_stat_seg_data);
+ m_stat_seg_data = NULL;
if (m_stat_data.size()) {
m_stat_data.clear();
}
- m_stat_seg_data = stat_segment_dump(m_counter_vec);
- if (!m_stat_seg_data) {
- ls();
- return m_stat_data;
- }
- for (int i = 0; i < stat_segment_vec_len(m_stat_seg_data); i++) {
- stat_data_t sd(m_stat_seg_data[i]);
- m_stat_data.push_back(sd);
+ if (m_stat_connect) {
+ m_stat_seg_data = stat_segment_dump(m_counter_vec);
+ if (!m_stat_seg_data) {
+ ls();
+ return m_stat_data;
+ }
+ for (int i = 0; i < stat_segment_vec_len(m_stat_seg_data); i++) {
+ stat_data_t sd(m_stat_seg_data[i]);
+ m_stat_data.push_back(sd);
+ }
}
return m_stat_data;
}
stat_client::dump_entry(uint32_t index)
{
stat_segment_data_free(m_stat_seg_data);
+ m_stat_seg_data = NULL;
if (m_stat_data.size()) {
m_stat_data.clear();
}
- m_stat_seg_data = stat_segment_dump_entry(index);
- if (!m_stat_seg_data) {
- ls();
- return m_stat_data;
- }
- for (int i = 0; i < stat_segment_vec_len(m_stat_seg_data); i++) {
- stat_data_t sd(m_stat_seg_data[i]);
- m_stat_data.push_back(sd);
+ if (m_stat_connect) {
+ m_stat_seg_data = stat_segment_dump_entry(index);
+ if (!m_stat_seg_data) {
+ ls();
+ return m_stat_data;
+ }
+ for (int i = 0; i < stat_segment_vec_len(m_stat_seg_data); i++) {
+ stat_data_t sd(m_stat_seg_data[i]);
+ m_stat_data.push_back(sd);
+ }
}
return m_stat_data;
}
/**
* connection bit
*/
- int m_stat_connect;
+ bool m_stat_connect;
/**
* Pointer to VPP style vector of stat indexes
void
stat_reader::read()
{
+ std::set<std::shared_ptr<interface>> itfs_w_stats;
const stat_client::stat_data_vec_t& sd = m_client.dump();
+
for (auto& sde : sd) {
std::string name;
name = sde.name();
+ if (name.find("/if") != std::string::npos)
+ name.erase(0, 4);
+
switch (sde.type()) {
- case STAT_DIR_TYPE_COUNTER_VECTOR_SIMPLE:
case STAT_DIR_TYPE_ERROR_INDEX:
case STAT_DIR_TYPE_SCALAR_INDEX:
case STAT_DIR_TYPE_ILLEGAL:
break;
+ case STAT_DIR_TYPE_COUNTER_VECTOR_SIMPLE: {
+ uint64_t** data;
+
+ data = sde.get_stat_segment_simple_counter_data();
+
+ for (auto& i : m_stat_itf_indexes) {
+ counter_t count;
+
+ for (int k = 0; k < m_client.vec_len(data); k++) {
+ count.packets += data[k][i];
+ }
+
+ std::shared_ptr<interface> itf = interface::find(i);
+ if (itf) {
+ itf->set(count, name);
+ itfs_w_stats.insert(itf);
+ }
+ }
+ break;
+ }
+
case STAT_DIR_TYPE_COUNTER_VECTOR_COMBINED: {
vlib_counter_t** data;
data = sde.get_stat_segment_combined_counter_data();
- if (name.find("/if") != std::string::npos)
- name.erase(0, 4);
for (auto& i : m_stat_itf_indexes) {
counter_t count;
count.packets += data[k][i].packets;
count.bytes += data[k][i].bytes;
}
+
std::shared_ptr<interface> itf = interface::find(i);
- if (itf)
+ if (itf) {
itf->set(count, name);
+ itfs_w_stats.insert(itf);
+ }
}
break;
}
}
}
-
- for (auto& i : m_stat_itf_indexes) {
- std::shared_ptr<interface> itf = interface::find(i);
- if (itf)
- itf->publish_stats();
+ for (auto itf : itfs_w_stats) {
+ itf->publish_stats();
}
}
return (ethertype_t::UNSPECIFIED);
}
+std::ostream&
+operator<<(std::ostream& os, const counter_t& c)
+{
+ os << "[packets: " << c.packets << " bytes:" << c.bytes << "]";
+ return os;
+}
+
}; // namespace VOM
/*
, bytes(0)
{
}
+ counter_t(const counter_t& c)
+ : packets(c.packets)
+ , bytes(c.bytes)
+ {
+ }
uint64_t packets;
uint64_t bytes;
};
* Ostream operator for a MAC address
*/
std::ostream& operator<<(std::ostream& os, const l2_address_t& l2);
+
+/**
+ * Ostream operator for a MAC address
+ */
+std::ostream& operator<<(std::ostream& os, const counter_t& c);
};
/*