diff --git a/src/CompHash.cc b/src/CompHash.cc index daaa80bc49..44484ca005 100644 --- a/src/CompHash.cc +++ b/src/CompHash.cc @@ -107,8 +107,6 @@ char* CompositeHash::SingleValHash(int type_check, char* kp0, case TYPE_INTERNAL_ADDR: { - // Use uint32 instead of int, because 'int' is not - // guaranteed to be 32-bit. uint32* kp = AlignAndPadType(kp0); uint32 bytes[4]; v->AsAddr()->CopyIPv6(bytes); diff --git a/src/Conn.cc b/src/Conn.cc index 3177d48705..deb89d50d3 100644 --- a/src/Conn.cc +++ b/src/Conn.cc @@ -24,15 +24,15 @@ HashKey* ConnID::BuildConnKey() const if ( is_one_way || addr_port_canon_lt(src_addr, src_port, dst_addr, dst_port) ) { - key.ip1 = src_addr; - key.ip2 = dst_addr; + src_addr.CopyIPv6(key.ip1); + dst_addr.CopyIPv6(key.ip2); key.port1 = src_port; key.port2 = dst_port; } else { - key.ip1 = dst_addr; - key.ip2 = src_addr; + dst_addr.CopyIPv6(key.ip1); + src_addr.CopyIPv6(key.ip2); key.port1 = dst_port; key.port2 = src_port; } diff --git a/src/Conn.h b/src/Conn.h index e7f24e3693..cdd61bd67b 100644 --- a/src/Conn.h +++ b/src/Conn.h @@ -50,8 +50,8 @@ struct ConnID { // The structure used internally for hashing. struct Key { - IPAddr ip1; - IPAddr ip2; + uint32 ip1[4]; + uint32 ip2[4]; uint16 port1; uint16 port2; }; diff --git a/src/ConnCompressor.cc b/src/ConnCompressor.cc index b745854c66..b6bcc789b3 100644 --- a/src/ConnCompressor.cc +++ b/src/ConnCompressor.cc @@ -235,7 +235,8 @@ Connection* ConnCompressor::NextPacket(double t, HashKey* key, const IP_Hdr* ip, tc = FirstFromOrig(t, key, ip, tp); } - else if ( ip->SrcAddr() == SrcAddr(pending) && + else if ( ip->SrcAddr() == + IPAddr(IPAddr::IPv6, SrcAddr(pending), IPAddr::Network) && tp->th_sport == SrcPort(pending) ) // Another packet from originator. tc = NextFromOrig(pending, t, key, ip, tp); @@ -507,8 +508,8 @@ Connection* ConnCompressor::Instantiate(HashKey* key, PendingConn* pending) { // Instantantiate a Connection. ConnID conn_id; - conn_id.src_addr = SrcAddr(pending); - conn_id.dst_addr = DstAddr(pending); + conn_id.src_addr = IPAddr(IPAddr::IPv6, SrcAddr(pending), IPAddr::Network); + conn_id.dst_addr = IPAddr(IPAddr::IPv6, DstAddr(pending), IPAddr::Network); conn_id.src_port = SrcPort(pending); conn_id.dst_port = DstPort(pending); @@ -607,7 +608,8 @@ void ConnCompressor::PktHdrToPendingConn(double time, const HashKey* key, memcpy(&c->key, key->Key(), key->Size()); c->hash = key->Hash(); - c->ip1_is_src = c->key.ip1 == ip->SrcAddr() && + IPAddr ip1(IPAddr::IPv6, c->key.ip1, IPAddr::Network); + c->ip1_is_src = ip1 == ip->SrcAddr() && c->key.port1 == tp->th_sport; c->time = time; c->window = tp->th_win; @@ -656,11 +658,10 @@ const IP_Hdr* ConnCompressor::PendingConnToPacket(const PendingConn* c) tp->th_urp = 0; } - // Note, do *not* use copy_addr() here. This is because we're - // copying to an IPv4 header, which has room for exactly and - // only an IPv4 address. - if ( c->key.ip1.family() == IPAddr::IPv6 || - c->key.ip2.family() == IPAddr::IPv6 ) + IPAddr ip1(IPAddr::IPv6, c->key.ip1, IPAddr::Network); + IPAddr ip2(IPAddr::IPv6, c->key.ip2, IPAddr::Network); + if ( ip1.family() == IPAddr::IPv6 || + ip2.family() == IPAddr::IPv6 ) reporter->InternalError("IPv6 snuck into connection compressor"); else { @@ -668,13 +669,13 @@ const IP_Hdr* ConnCompressor::PendingConnToPacket(const PendingConn* c) const uint32* dst_bytes; if ( c->ip1_is_src ) { - c->key.ip1.GetBytes(&src_bytes); - c->key.ip2.GetBytes(&dst_bytes); + ip1.GetBytes(&src_bytes); + ip2.GetBytes(&dst_bytes); } else { - c->key.ip2.GetBytes(&src_bytes); - c->key.ip1.GetBytes(&dst_bytes); + ip2.GetBytes(&src_bytes); + ip1.GetBytes(&dst_bytes); } memcpy(&ip->ip_src, src_bytes, sizeof(ip->ip_src)); memcpy(&ip->ip_dst, dst_bytes, sizeof(ip->ip_dst)); diff --git a/src/ConnCompressor.h b/src/ConnCompressor.h index 97051e148a..36959b615c 100644 --- a/src/ConnCompressor.h +++ b/src/ConnCompressor.h @@ -105,9 +105,9 @@ public: private: // Helpers to extract addrs/ports from PendingConn. - const IPAddr& SrcAddr(const PendingConn* c) + const uint32* SrcAddr(const PendingConn* c) { return c->ip1_is_src ? c->key.ip1 : c->key.ip2; } - const IPAddr& DstAddr(const PendingConn* c) + const uint32* DstAddr(const PendingConn* c) { return c->ip1_is_src ? c->key.ip2 : c->key.ip1; } uint16 SrcPort(const PendingConn* c) diff --git a/src/Sessions.cc b/src/Sessions.cc index 6c262619ad..8b84063368 100644 --- a/src/Sessions.cc +++ b/src/Sessions.cc @@ -71,8 +71,8 @@ void TimerMgrExpireTimer::Dispatch(double t, int is_expire) NetSessions::NetSessions() { TypeList* t = new TypeList(); - t->Append(base_type(TYPE_COUNT)); // source IP address - t->Append(base_type(TYPE_COUNT)); // dest IP address + t->Append(base_type(TYPE_ADDR)); // source IP address + t->Append(base_type(TYPE_ADDR)); // dest IP address t->Append(base_type(TYPE_COUNT)); // source and dest ports ch = new CompositeHash(t);