1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
3 * Copyright (c) 2009 University of Texas at Dallas
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation;
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 * Author: Qasim Javed <qasim@utdallas.edu>
21 #include "netfilter-conntrack-tuple.h"
23 NS_LOG_COMPONENT_DEFINE ("ConntrackTupleHash");
27 NetfilterConntrackTuple::NetfilterConntrackTuple ()
33 NetfilterConntrackTuple::NetfilterConntrackTuple (Ipv4Address src, uint16_t srcPort, Ipv4Address dst, uint16_t dstPort)
37 m_l3Destination = dst;
38 m_l4Destination = dstPort;
42 NetfilterConntrackTuple::operator== (const NetfilterConntrackTuple t) const
44 return (m_l3Source == t.m_l3Source) &&
45 (m_l4Source == t.m_l4Source) &&
46 (m_l3Destination == t.m_l3Destination) &&
47 (m_l4Destination == t.m_l4Destination);
51 NetfilterConntrackTuple::SourceEqual (NetfilterConntrackTuple t1, NetfilterConntrackTuple t2)
53 return (t1.m_l3Source == t2.m_l3Source) &&
54 (t1.m_l4Source == t2.m_l4Source);
58 NetfilterConntrackTuple::DestinationEqual (NetfilterConntrackTuple t1, NetfilterConntrackTuple t2)
60 return (t1.m_l3Destination == t2.m_l3Destination) &&
61 (t1.m_l4Destination == t2.m_l4Destination);
66 NetfilterConntrackTuple::GetSource () const
72 NetfilterConntrackTuple::SetSource (Ipv4Address source)
78 NetfilterConntrackTuple::SetSourcePort (uint16_t port)
84 NetfilterConntrackTuple::SetDestination (Ipv4Address destination)
86 m_l3Destination = destination;
90 NetfilterConntrackTuple::SetDestinationPort (uint16_t destination)
92 m_l4Destination = destination;
96 NetfilterConntrackTuple::GetDestination () const
98 return m_l3Destination;
102 NetfilterConntrackTuple::GetSourcePort () const
108 NetfilterConntrackTuple::GetDestinationPort () const
110 return m_l4Destination;
114 NetfilterConntrackTuple::GetDestinationProtocol () const
116 return m_protocolNumber;
120 NetfilterConntrackTuple::SetProtocol (uint16_t protocol)
122 m_l3Protocol = protocol;
125 uint16_t NetfilterConntrackTuple::GetProtocol ()
131 NetfilterConntrackTuple::SetDirection (ConntrackDirection_t direction)
133 m_direction = (uint8_t)direction;
137 NetfilterConntrackTuple::GetDirection () const
143 NetfilterConntrackTuple::ToString () const
148 NetfilterConntrackTuple
149 NetfilterConntrackTuple::Invert ()
151 NetfilterConntrackTuple inverse (GetDestination (), GetDestinationPort (), GetSource (), GetSourcePort ());
152 inverse.SetDirection (this->GetDirection () == IP_CT_DIR_ORIGINAL ? IP_CT_DIR_REPLY : IP_CT_DIR_ORIGINAL);
157 NetfilterConntrackTuple::Print (std::ostream &os) const
159 os << "( " << GetSource () << "," << GetSourcePort () << "," << GetDestination () << "," << GetDestinationPort () << (int)GetDirection () << ")";
162 NetfilterConntrackTuple&
163 NetfilterConntrackTuple::operator= (const NetfilterConntrackTuple& tuple)
167 m_l3Source = tuple.m_l3Source;
168 m_l4Source = tuple.m_l4Source;
169 m_l3Destination = tuple.m_l3Destination;
170 m_l4Destination = tuple.m_l4Destination;
172 m_l3Protocol = tuple.m_l3Protocol;
173 m_protocolNumber = tuple.m_protocolNumber;
174 m_direction = tuple.m_direction;
180 std::ostream& operator << (std::ostream& os, NetfilterConntrackTuple const& tuple)
182 os << "( " << tuple.GetSource () << "," << tuple.GetSourcePort () << "," << tuple.GetDestination () << "," << tuple.GetDestinationPort () << ", " << (int)tuple.GetDirection () << ")";
186 #define JHASH_GOLDEN_RATIO 0x9e3779b9
189 JHashMix (uint32_t a, uint32_t b, uint32_t c)
191 a -= b; a -= c; a ^= (c>>13);
192 b -= c; b -= a; b ^= (a<<8);
193 c -= a; c -= b; c ^= (b>>13);
194 a -= b; a -= c; a ^= (c>>12);
195 b -= c; b -= a; b ^= (a<<16);
196 c -= a; c -= b; c ^= (b>>5);
197 a -= b; a -= c; a ^= (c>>3);
198 b -= c; b -= a; b ^= (a<<10);
199 c -= a; c -= b; c ^= (b>>15);
203 JHash2 (const uint32_t *k, uint32_t length, uint32_t initval)
205 uint32_t a, b, c, len;
207 a = b = JHASH_GOLDEN_RATIO;
232 ConntrackTupleHash::operator() (const NetfilterConntrackTuple &x) const
239 n = (sizeof (x.GetSource ())+ sizeof (x.GetSourcePort ()) +
240 sizeof (x.GetDestination())+ sizeof (x.GetDestinationPort ()))/sizeof (uint32_t);
242 h = JHash2 ((uint32_t*)(x.ToString ()), n, rnd ^ (((x.GetDestinationPort ()) << 16) | x.GetDestinationProtocol ()));
244 NS_LOG_DEBUG ("Hashing ==> Tuple " << "( " << x.GetSource () << "," << x.GetSourcePort () << "," << x.GetDestination () << "," << x.GetDestinationPort () << "," << (int)x.GetDirection () << ")" << " Hash: " << (((uint64_t)h * size) >> 32));
246 return ((uint64_t)h * size) >> 32;