A Discrete-Event Network Simulator
API
ipv4-queue-disc-item.cc
Go to the documentation of this file.
1/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/*
3 * Copyright (c) 2016 Universita' degli Studi di Napoli Federico II
4 *
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;
8 *
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.
13 *
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
17 */
18
19#include "ns3/log.h"
21#include "ns3/tcp-header.h"
22#include "ns3/udp-header.h"
23
24namespace ns3 {
25
26NS_LOG_COMPONENT_DEFINE ("Ipv4QueueDiscItem");
27
29 uint16_t protocol, const Ipv4Header & header)
30 : QueueDiscItem (p, addr, protocol),
31 m_header (header),
32 m_headerAdded (false)
33{
34}
35
37{
38 NS_LOG_FUNCTION (this);
39}
40
42{
43 NS_LOG_FUNCTION (this);
45 NS_ASSERT (p != 0);
46 uint32_t ret = p->GetSize ();
47 if (!m_headerAdded)
48 {
50 }
51 return ret;
52}
53
54const Ipv4Header&
56{
57 return m_header;
58}
59
61{
62 NS_LOG_FUNCTION (this);
63
64 NS_ASSERT_MSG (!m_headerAdded, "The header has been already added to the packet");
66 NS_ASSERT (p != 0);
68 m_headerAdded = true;
69}
70
71void
72Ipv4QueueDiscItem::Print (std::ostream& os) const
73{
74 if (!m_headerAdded)
75 {
76 os << m_header << " ";
77 }
78 os << GetPacket () << " "
79 << "Dst addr " << GetAddress () << " "
80 << "proto " << (uint16_t) GetProtocol () << " "
81 << "txq " << (uint16_t) GetTxQueueIndex ()
82 ;
83}
84
85bool
87{
88 NS_LOG_FUNCTION (this);
90 {
92 return true;
93 }
94 return false;
95}
96
97
98bool
100{
101 bool ret = false;
102
103 switch (field)
104 {
105 case IP_DSFIELD:
106 value = m_header.GetTos ();
107 ret = true;
108 break;
109 }
110
111 return ret;
112}
113
116{
117 NS_LOG_FUNCTION (this << perturbation);
118
121 uint8_t prot = m_header.GetProtocol ();
122 uint16_t fragOffset = m_header.GetFragmentOffset ();
123
124 TcpHeader tcpHdr;
125 UdpHeader udpHdr;
126 uint16_t srcPort = 0;
127 uint16_t destPort = 0;
128
129 if (prot == 6 && fragOffset == 0) // TCP
130 {
131 GetPacket ()->PeekHeader (tcpHdr);
132 srcPort = tcpHdr.GetSourcePort ();
133 destPort = tcpHdr.GetDestinationPort ();
134 }
135 else if (prot == 17 && fragOffset == 0) // UDP
136 {
137 GetPacket ()->PeekHeader (udpHdr);
138 srcPort = udpHdr.GetSourcePort ();
139 destPort = udpHdr.GetDestinationPort ();
140 }
141 if (prot != 6 && prot != 17)
142 {
143 NS_LOG_WARN ("Unknown transport protocol, no port number included in hash computation");
144 }
145
146 /* serialize the 5-tuple and the perturbation in buf */
147 uint8_t buf[17];
148 src.Serialize (buf);
149 dest.Serialize (buf + 4);
150 buf[8] = prot;
151 buf[9] = (srcPort >> 8) & 0xff;
152 buf[10] = srcPort & 0xff;
153 buf[11] = (destPort >> 8) & 0xff;
154 buf[12] = destPort & 0xff;
155 buf[13] = (perturbation >> 24) & 0xff;
156 buf[14] = (perturbation >> 16) & 0xff;
157 buf[15] = (perturbation >> 8) & 0xff;
158 buf[16] = perturbation & 0xff;
159
160 // Linux calculates jhash2 (jenkins hash), we calculate murmur3 because it is
161 // already available in ns-3
162 uint32_t hash = Hash32 ((char*) buf, 17);
163
164 NS_LOG_DEBUG ("Hash value " << hash);
165
166 return hash;
167}
168
169} // namespace ns3
a polymophic address class
Definition: address.h:91
Ipv4 addresses are stored in host order in this class.
Definition: ipv4-address.h:41
void Serialize(uint8_t buf[4]) const
Serialize this address to a 4-byte buffer.
Packet header for IPv4.
Definition: ipv4-header.h:34
virtual uint32_t GetSerializedSize(void) const
Definition: ipv4-header.cc:375
uint16_t GetFragmentOffset(void) const
Definition: ipv4-header.cc:246
uint8_t GetTos(void) const
Definition: ipv4-header.cc:194
Ipv4Address GetSource(void) const
Definition: ipv4-header.cc:291
Ipv4Address GetDestination(void) const
Definition: ipv4-header.cc:304
EcnType GetEcn(void) const
Definition: ipv4-header.cc:167
void SetEcn(EcnType ecn)
Set ECN Field.
Definition: ipv4-header.cc:97
uint8_t GetProtocol(void) const
Definition: ipv4-header.cc:272
bool m_headerAdded
True if the header has already been added to the packet.
virtual bool GetUint8Value(Uint8Values field, uint8_t &value) const
Retrieve the value of a given field from the packet, if present.
const Ipv4Header & GetHeader(void) const
Ipv4Header m_header
The IPv4 header.
virtual uint32_t Hash(uint32_t perturbation) const
Computes the hash of the packet's 5-tuple.
virtual void AddHeader(void)
Add the header to the packet.
virtual void Print(std::ostream &os) const
Print the item contents.
virtual bool Mark(void)
Marks the packet by setting ECN_CE bits if the packet has ECN_ECT0 or ECN_ECT1 set.
virtual uint32_t GetSize(void) const
void AddHeader(const Header &header)
Add header to this packet.
Definition: packet.cc:256
uint32_t PeekHeader(Header &header) const
Deserialize but does not remove the header from the internal buffer.
Definition: packet.cc:290
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
Definition: packet.h:856
QueueDiscItem is the abstract base class for items that are stored in a queue disc.
Definition: queue-item.h:133
uint16_t GetProtocol(void) const
Get the L3 protocol included in this item.
Definition: queue-item.cc:98
Address GetAddress(void) const
Get the MAC address included in this item.
Definition: queue-item.cc:91
uint8_t GetTxQueueIndex(void) const
Get the transmission queue index included in this item.
Definition: queue-item.cc:105
Ptr< Packet > GetPacket(void) const
Definition: queue-item.cc:42
Uint8Values
1-byte fields of the packet whose value can be retrieved, if present
Definition: queue-item.h:82
Header for the Transmission Control Protocol.
Definition: tcp-header.h:45
uint16_t GetDestinationPort() const
Get the destination port.
Definition: tcp-header.cc:137
uint16_t GetSourcePort() const
Get the source port.
Definition: tcp-header.cc:131
Packet header for UDP packets.
Definition: udp-header.h:40
uint16_t GetSourcePort(void) const
Definition: udp-header.cc:65
uint16_t GetDestinationPort(void) const
Definition: udp-header.cc:70
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
Definition: assert.h:67
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
Definition: assert.h:88
uint32_t Hash32(const char *buffer, const std::size_t size)
Compute 32-bit hash of a byte buffer, using the default hash function.
Definition: hash.h:282
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition: log.h:273
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_LOG_WARN(msg)
Use NS_LOG to output a message of level LOG_WARN.
Definition: log.h:265
Every class exported by the ns3 library is enclosed in the ns3 namespace.