summaryrefslogtreecommitdiff
path: root/src/monitor-gui.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/monitor-gui.cc')
-rw-r--r--src/monitor-gui.cc59
1 files changed, 51 insertions, 8 deletions
diff --git a/src/monitor-gui.cc b/src/monitor-gui.cc
index 61c720f..f4f80d5 100644
--- a/src/monitor-gui.cc
+++ b/src/monitor-gui.cc
@@ -126,9 +126,12 @@ public:
std::string from;
std::string to;
std::string size;
+ std::string duration;
std::string data;
+ struct timespec last;
+
size_t related;
Package()
@@ -141,7 +144,7 @@ public:
}
size_t columns() const override {
- return 4;
+ return 5;
}
std::string header(size_t column) const override {
@@ -154,6 +157,8 @@ public:
return "To";
case 3:
return "Data";
+ case 4:
+ return "Duration";
}
assert(false);
return "";
@@ -167,6 +172,7 @@ public:
case 1: return pkg.from;
case 2: return pkg.to;
case 3: return pkg.size;
+ case 4: return pkg.duration;
}
}
assert(false);
@@ -187,10 +193,12 @@ public:
packages_.emplace_back();
auto& pkg = packages_.back();
pkg.pkg = package;
+ pkg.last = package.timestamp;
format_timestamp(&pkg.timestamp, package.timestamp);
format_host_port(&pkg.from, package.source_host, package.source_port);
format_host_port(&pkg.to, package.target_host, package.target_port);
format_size(&pkg.size, 0, false);
+ format_duration(&pkg.duration, pkg.pkg.timestamp, pkg.last, false);
auto related = related_.find(pkg.to);
if (related == related_.end()) {
@@ -204,7 +212,8 @@ public:
notify_added(index, index);
}
- size_t package_data(uint32_t id, char const* data, size_t size, bool last) {
+ size_t package_data(uint32_t id, char const* data, size_t size, bool last,
+ struct timespec timestamp) {
auto it = open_.find(id);
if (it == open_.end()) {
return std::string::npos;
@@ -213,6 +222,8 @@ public:
auto& pkg = packages_[index];
pkg.data.append(data, size);
format_size(&pkg.size, pkg.data.size(), last);
+ pkg.last = timestamp;
+ format_duration(&pkg.duration, pkg.pkg.timestamp, pkg.last, last);
if (last) open_.erase(it);
notify_changed(index, index);
@@ -271,6 +282,31 @@ private:
out->assign(tmp, len);
}
+ static void format_duration(std::string* out, struct timespec const& start,
+ struct timespec const& end, bool) {
+ char tmp[50];
+ if (start.tv_sec == end.tv_sec) {
+ if (start.tv_nsec == end.tv_nsec) {
+ out->clear();
+ return;
+ }
+ auto len = snprintf(tmp, sizeof(tmp), "%lums",
+ static_cast<unsigned long>(
+ (end.tv_nsec - start.tv_nsec) / 1000000));
+ out->assign(tmp, len);
+ } else {
+ auto s = end.tv_sec - start.tv_sec;
+ auto n = (end.tv_nsec - start.tv_nsec) / 1000000;
+ if (n < 0) {
+ --s;
+ n += 1000;
+ }
+ auto len = snprintf(tmp, sizeof(tmp), "%ld.%03lus",
+ static_cast<long>(s), static_cast<unsigned long>(n));
+ out->assign(tmp, len);
+ }
+ }
+
void notify_added(size_t first, size_t last) {
auto it = listeners_.notify();
while (it.has_next()) {
@@ -689,16 +725,21 @@ private:
: packages_(packages) {
}
- void package(Package const& package) override {
+ void package(Package const& package, struct timespec end) override {
packages_->package(package);
+ id_ = package.id;
+ timestamp_ = end;
}
void data(uint32_t id, char const* data, size_t size, bool last) override {
- packages_->package_data(id, data, size, last);
+ assert(id_ == id);
+ packages_->package_data(id, data, size, last, timestamp_);
}
private:
PackageList* const packages_;
+ uint32_t id_;
+ struct timespec timestamp_;
};
public:
@@ -1177,9 +1218,10 @@ public:
}
void package_data(Monitor* monitor, uint32_t id,
- char const* data, size_t size, bool last) override {
+ char const* data, size_t size, bool last,
+ struct timespec timestamp) override {
assert(monitor == monitor_.get());
- auto index = packages_->package_data(id, data, size, last);
+ auto index = packages_->package_data(id, data, size, last, timestamp);
auto const& pkg = packages_->package(index);
protocols_->update(index, pkg.data.data(), pkg.data.size());
if (has_selection_ && index == selection_) {
@@ -1416,7 +1458,8 @@ private:
packages->package(pkg);
packages->package_data(pkg.id, reinterpret_cast<char const*>(data)
+ offset + len_ip + len_tcp,
- len - offset - len_ip - len_tcp, true);
+ len - offset - len_ip - len_tcp, true,
+ pkg.timestamp);
} else if (ret == -2) {
break;
} else if (ret == -1) {
@@ -1638,7 +1681,7 @@ private:
auto writer = std::unique_ptr<PackagesWriter>(PackagesWriter::create(&out));
for (size_t i = 0; i < packages->rows(); ++i) {
auto const& pkg = packages->package(i);
- writer->write(pkg.pkg, pkg.data);
+ writer->write(pkg.pkg, pkg.data, pkg.last);
}
writer->flush();
if (!out.good()) {