diff --git a/include/tins/tcp_ip/stream_follower.h b/include/tins/tcp_ip/stream_follower.h index a648664..6478396 100644 --- a/include/tins/tcp_ip/stream_follower.h +++ b/include/tins/tcp_ip/stream_follower.h @@ -124,14 +124,16 @@ public: stream_id(const address_type& client_addr, uint16_t client_port, const address_type& server_addr, uint16_t server_port); + bool operator<(const stream_id& rhs) const; + bool operator==(const stream_id& rhs) const; + address_type min_address; address_type max_address; uint16_t min_address_port; uint16_t max_address_port; - bool operator<(const stream_id& rhs) const; - - static size_t hash(const stream_id& id); + static address_type serialize(IPv4Address address); + static address_type serialize(const IPv6Address& address); }; /** @@ -228,8 +230,6 @@ private: static stream_id make_stream_id(const PDU& packet); Stream& find_stream(const stream_id& id); - static stream_id::address_type serialize(IPv4Address address); - static stream_id::address_type serialize(const IPv6Address& address); void process_packet(PDU& packet, const timestamp_type& ts); void cleanup_streams(const timestamp_type& now); diff --git a/src/tcp_ip/stream_follower.cpp b/src/tcp_ip/stream_follower.cpp index f16cad4..958d866 100644 --- a/src/tcp_ip/stream_follower.cpp +++ b/src/tcp_ip/stream_follower.cpp @@ -161,15 +161,15 @@ void StreamFollower::stream_termination_callback(const stream_termination_callba Stream& StreamFollower::find_stream(const IPv4Address& client_addr, uint16_t client_port, const IPv4Address& server_addr, uint16_t server_port) { - stream_id identifier(serialize(client_addr), client_port, - serialize(server_addr), server_port); + stream_id identifier(stream_id::serialize(client_addr), client_port, + stream_id::serialize(server_addr), server_port); return find_stream(identifier); } Stream& StreamFollower::find_stream(const IPv6Address& client_addr, uint16_t client_port, const IPv6Address& server_addr, uint16_t server_port) { - stream_id identifier(serialize(client_addr), client_port, - serialize(server_addr), server_port); + stream_id identifier(stream_id::serialize(client_addr), client_port, + stream_id::serialize(server_addr), server_port); return find_stream(identifier); } @@ -179,12 +179,12 @@ StreamFollower::stream_id StreamFollower::make_stream_id(const PDU& packet) { throw invalid_packet(); } if (const IP* ip = packet.find_pdu()) { - return stream_id(serialize(ip->src_addr()), tcp->sport(), - serialize(ip->dst_addr()), tcp->dport()); + return stream_id(stream_id::serialize(ip->src_addr()), tcp->sport(), + stream_id::serialize(ip->dst_addr()), tcp->dport()); } else if (const IPv6* ip = packet.find_pdu()) { - return stream_id(serialize(ip->src_addr()), tcp->sport(), - serialize(ip->dst_addr()), tcp->dport()); + return stream_id(stream_id::serialize(ip->src_addr()), tcp->sport(), + stream_id::serialize(ip->dst_addr()), tcp->dport()); } else { throw invalid_packet(); @@ -201,22 +201,6 @@ Stream& StreamFollower::find_stream(const stream_id& id) { } } -StreamFollower::stream_id::address_type StreamFollower::serialize(IPv4Address address) { - stream_id::address_type addr; - OutputMemoryStream output(addr.data(), addr.size()); - addr.fill(0); - output.write(address); - return addr; -} - -StreamFollower::stream_id::address_type StreamFollower::serialize(const IPv6Address& address) { - stream_id::address_type addr; - OutputMemoryStream output(addr.data(), addr.size()); - addr.fill(0); - output.write(address); - return addr; -} - void StreamFollower::cleanup_streams(const timestamp_type& now) { streams_type::iterator iter = streams_.begin(); while (iter != streams_.end()) { @@ -259,8 +243,29 @@ StreamFollower::stream_id::stream_id(const address_type& client_addr, } bool StreamFollower::stream_id::operator<(const stream_id& rhs) const { - return tie(min_address, min_address_port, max_address, max_address_port) < - tie(rhs.min_address, rhs.min_address_port, rhs.max_address, rhs.max_address_port); + return tie(min_address, max_address, min_address_port, max_address_port) < + tie(rhs.min_address, rhs.max_address, rhs.min_address_port, rhs.max_address_port); +} + +bool StreamFollower::stream_id::operator==(const stream_id& rhs) const { + return tie(min_address, min_address_port, max_address, max_address_port) == + tie(rhs.min_address, rhs.min_address_port, rhs.max_address, rhs.max_address_port); +} + +StreamFollower::stream_id::address_type StreamFollower::stream_id::serialize(IPv4Address address) { + address_type addr; + OutputMemoryStream output(addr.data(), addr.size()); + addr.fill(0); + output.write(address); + return addr; +} + +StreamFollower::stream_id::address_type StreamFollower::stream_id::serialize(const IPv6Address& address) { + address_type addr; + OutputMemoryStream output(addr.data(), addr.size()); + addr.fill(0); + output.write(address); + return addr; } } // TCPIP diff --git a/tests/src/tcp_ip.cpp b/tests/src/tcp_ip.cpp index 6ef1071..97a73e5 100644 --- a/tests/src/tcp_ip.cpp +++ b/tests/src/tcp_ip.cpp @@ -512,7 +512,6 @@ TEST_F(FlowTest, StreamFollower_FollowStream) { EXPECT_EQ(payload, merge_chunks(stream_client_payload_chunks)); } - #ifdef TINS_HAVE_ACK_TRACKER using namespace boost;