From 0898066430e0f2908565a1b4588e50de2d41a256 Mon Sep 17 00:00:00 2001 From: Joel Klinghed Date: Fri, 28 Jul 2017 22:01:04 +0200 Subject: Break out Package read/write --- src/monitor.cc | 60 ++++++++++++++-------------------------------------------- 1 file changed, 14 insertions(+), 46 deletions(-) (limited to 'src/monitor.cc') 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(read_u32(data)) << 32 | read_u32(data + 4); - } - - static uint32_t read_u32(uint8_t const* data) { - return static_cast(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(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(package_) + offset + o, len); - o += len; - len = read_u16(package_ + offset + o); - o += 2; - if (o + len <= size) { - pkg.target_host.assign( - reinterpret_cast(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(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(package_) + offset + o, size - o, + last); } } } else if (size >= 10 && memcmp(package_ + offset, "DAT", 3) == 0) { -- cgit v1.2.3-70-g09d2