diff options
Diffstat (limited to 'src/monitor.cc')
| -rw-r--r-- | src/monitor.cc | 60 |
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) { |
