summaryrefslogtreecommitdiff
path: root/src/monitor.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/monitor.cc')
-rw-r--r--src/monitor.cc60
1 files changed, 14 insertions, 46 deletions
diff --git a/src/monitor.cc b/src/monitor.cc
index ba95596..e07b036 100644
--- a/src/monitor.cc
+++ b/src/monitor.cc
@@ -6,6 +6,7 @@
#include "buffer.hh"
#include "chunked.hh"
+#include "data.hh"
#include "http.hh"
#include "io.hh"
#include "looper.hh"
@@ -150,18 +151,6 @@ private:
return true;
}
- static uint64_t read_u64(uint8_t const* data) {
- return static_cast<uint64_t>(read_u32(data)) << 32 | read_u32(data + 4);
- }
-
- static uint32_t read_u32(uint8_t const* data) {
- return static_cast<uint32_t>(read_u16(data)) << 16 | read_u16(data + 2);
- }
-
- static uint16_t read_u16(uint8_t const* data) {
- return data[0] << 8 | data[1];
- }
-
void package(void const* data, size_t size) {
auto d = reinterpret_cast<char const*>(data);
auto const end = d + size;
@@ -177,41 +166,20 @@ private:
uint16_t size = read_u16(package_ + offset + 3);
if (offset + size > package_fill_) break;
size_t o = 5;
- if (size >= 29 && memcmp(package_ + offset, "PKG", 3) == 0) {
+ if (size >= 3 && memcmp(package_ + offset, "PKG", 3) == 0) {
Package pkg;
- pkg.id = read_u32(package_ + offset + o);
- o += 4;
- pkg.timestamp.tv_sec = read_u64(package_ + offset + o);
- o += 8;
- pkg.timestamp.tv_nsec = read_u32(package_ + offset + o);
- o += 4;
- pkg.flags = read_u16(package_ + offset + o);
- o += 2;
- pkg.source_port = read_u16(package_ + offset + o);
- o += 2;
- pkg.target_port = read_u16(package_ + offset + o);
- o += 2;
- auto len = read_u16(package_ + offset + o);
- o += 2;
- if (o + len + 2 <= size) {
- pkg.source_host.assign(
- reinterpret_cast<char*>(package_) + offset + o, len);
- o += len;
- len = read_u16(package_ + offset + o);
- o += 2;
- if (o + len <= size) {
- pkg.target_host.assign(
- reinterpret_cast<char*>(package_) + offset + o, len);
- o += len;
- bool last = !(pkg.flags & 0x01);
- pkg.flags >>= 1;
- delegate_->package(this, pkg);
- if (o < size || last) {
- delegate_->package_data(
- this, pkg.id,
- reinterpret_cast<char*>(package_) + offset + o, size - o,
- last);
- }
+ auto ret = read_package(&pkg,
+ package_ + offset + o, size - offset - o);
+ if (ret > 0) {
+ o += ret;
+ bool last = !(pkg.flags & 0x01);
+ pkg.flags >>= 1;
+ delegate_->package(this, pkg);
+ if (o < size || last) {
+ delegate_->package_data(
+ this, pkg.id,
+ reinterpret_cast<char*>(package_) + offset + o, size - o,
+ last);
}
}
} else if (size >= 10 && memcmp(package_ + offset, "DAT", 3) == 0) {