X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=extras%2Fvom%2Fvom%2Fstat_reader.cpp;h=50a25d2e0bad05cacad4f02010c3d682b8d1bc4a;hb=7c0eb56f4;hp=4b054aba5af2db3c702187e83b8cd92a87cd22bd;hpb=51edc3ab01e0af58d457da97bf6ca9cc3ebc6b8d;p=vpp.git diff --git a/extras/vom/vom/stat_reader.cpp b/extras/vom/vom/stat_reader.cpp index 4b054aba5af..50a25d2e0ba 100644 --- a/extras/vom/vom/stat_reader.cpp +++ b/extras/vom/vom/stat_reader.cpp @@ -22,17 +22,13 @@ stat_reader::stat_indexes_t stat_reader::m_stat_itf_indexes; stat_reader::stat_reader() : m_client() -{ -} +{} stat_reader::stat_reader(stat_client sc) : m_client(sc) -{ -} +{} -stat_reader::~stat_reader() -{ -} +stat_reader::~stat_reader() {} int stat_reader::connect() @@ -49,19 +45,21 @@ stat_reader::disconnect() void stat_reader::registers(const interface& intf) { - m_stat_itf_indexes.insert(intf.handle().value()); + m_stat_itf_indexes.insert(intf.handle_i().value()); } void stat_reader::unregisters(const interface& intf) { - m_stat_itf_indexes.erase(intf.handle().value()); + m_stat_itf_indexes.erase(intf.handle_i().value()); } void stat_reader::read() { - stat_client::stat_data_vec_t sd = m_client.dump(); + std::set> itfs_w_stats; + const stat_client::stat_data_vec_t& sd = m_client.dump(); + for (auto& sde : sd) { std::string name; @@ -70,39 +68,63 @@ stat_reader::read() 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_NAME_VECTOR: + case STAT_DIR_TYPE_ILLEGAL: + case STAT_DIR_TYPE_EMPTY: break; - case STAT_DIR_TYPE_COUNTER_VECTOR_COMBINED: - if (name.find("/if") != std::string::npos) - name.erase(0, 4); + 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 = {.packets = 0, .bytes = 0 }; - for (int k = 0; k < m_client.vec_len( - sde.get_stat_segment_combined_counter_data()); - k++) { - count.packets += - sde.get_stat_segment_combined_counter_data()[k][i].packets; - count.bytes += - sde.get_stat_segment_combined_counter_data()[k][i].bytes; + counter_t count; + + for (int k = 0; k < m_client.vec_len(data); k++) { + count.packets += data[k][i]; } + std::shared_ptr itf = interface::find(i); - if (itf) + if (itf) { itf->set(count, name); + itfs_w_stats.insert(itf); + } } break; + } - default:; + case STAT_DIR_TYPE_COUNTER_VECTOR_COMBINED: { + vlib_counter_t** data; + + data = sde.get_stat_segment_combined_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].packets; + count.bytes += data[k][i].bytes; + } + + std::shared_ptr itf = interface::find(i); + if (itf) { + itf->set(count, name); + itfs_w_stats.insert(itf); + } + } + break; + } } } - - for (auto& i : m_stat_itf_indexes) { - std::shared_ptr itf = interface::find(i); - if (itf) - itf->publish_stats(); + for (auto itf : itfs_w_stats) { + itf->publish_stats(); } }