A Discrete-Event Network Simulator
API
udp-header.cc
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2005 INRIA
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  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
19  */
20 
21 #include "udp-header.h"
22 #include "ns3/address-utils.h"
23 
24 namespace ns3 {
25 
26 NS_OBJECT_ENSURE_REGISTERED (UdpHeader);
27 
28 /* The magic values below are used only for debugging.
29  * They can be used to easily detect memory corruption
30  * problems so you can see the patterns in memory.
31  */
33  : m_sourcePort (0xfffd),
34  m_destinationPort (0xfffd),
35  m_payloadSize (0),
36  m_checksum (0),
37  m_calcChecksum (false),
38  m_goodChecksum (true)
39 {
40 }
42 {
43  m_sourcePort = 0xfffe;
44  m_destinationPort = 0xfffe;
45  m_payloadSize = 0xfffe;
46 }
47 
48 void
50 {
51  m_calcChecksum = true;
52 }
53 
54 void
56 {
58 }
59 void
61 {
63 }
64 uint16_t
66 {
67  return m_sourcePort;
68 }
69 uint16_t
71 {
72  return m_destinationPort;
73 }
74 void
76  Address destination,
77  uint8_t protocol)
78 {
79  m_source = source;
80  m_destination = destination;
81  m_protocol = protocol;
82 }
83 void
85  Ipv4Address destination,
86  uint8_t protocol)
87 {
88  m_source = source;
89  m_destination = destination;
90  m_protocol = protocol;
91 }
92 void
94  Ipv6Address destination,
95  uint8_t protocol)
96 {
97  m_source = source;
98  m_destination = destination;
99  m_protocol = protocol;
100 }
101 uint16_t
103 {
104  Buffer buf = Buffer ((2 * Address::MAX_SIZE) + 8);
105  buf.AddAtStart ((2 * Address::MAX_SIZE) + 8);
106  Buffer::Iterator it = buf.Begin ();
107  uint32_t hdrSize = 0;
108 
109  WriteTo (it, m_source);
110  WriteTo (it, m_destination);
112  {
113  it.WriteU8 (0); /* protocol */
114  it.WriteU8 (m_protocol); /* protocol */
115  it.WriteU8 (size >> 8); /* length */
116  it.WriteU8 (size & 0xff); /* length */
117  hdrSize = 12;
118  }
120  {
121  it.WriteU16 (0);
122  it.WriteU8 (size >> 8); /* length */
123  it.WriteU8 (size & 0xff); /* length */
124  it.WriteU16 (0);
125  it.WriteU8 (0);
126  it.WriteU8 (m_protocol); /* protocol */
127  hdrSize = 40;
128  }
129 
130  it = buf.Begin ();
131  /* we don't CompleteChecksum ( ~ ) now */
132  return ~(it.CalculateIpChecksum (hdrSize));
133 }
134 
135 bool
137 {
138  return m_goodChecksum;
139 }
140 
141 void
142 UdpHeader::ForceChecksum (uint16_t checksum)
143 {
144  m_checksum = checksum;
145 }
146 
147 void
148 UdpHeader::ForcePayloadSize (uint16_t payloadSize)
149 {
150  m_payloadSize = payloadSize;
151 }
152 
153 TypeId
155 {
156  static TypeId tid = TypeId ("ns3::UdpHeader")
157  .SetParent<Header> ()
158  .SetGroupName ("Internet")
159  .AddConstructor<UdpHeader> ()
160  ;
161  return tid;
162 }
163 TypeId
165 {
166  return GetTypeId ();
167 }
168 void
169 UdpHeader::Print (std::ostream &os) const
170 {
171  os << "length: " << m_payloadSize + GetSerializedSize ()
172  << " "
173  << m_sourcePort << " > " << m_destinationPort
174  ;
175 }
176 
177 uint32_t
179 {
180  return 8;
181 }
182 
183 void
185 {
187 
190  if (m_payloadSize == 0)
191  {
192  i.WriteHtonU16 (start.GetSize ());
193  }
194  else
195  {
197  }
198 
199  if ( m_checksum == 0)
200  {
201  i.WriteU16 (0);
202 
203  if (m_calcChecksum)
204  {
205  uint16_t headerChecksum = CalculateHeaderChecksum (start.GetSize ());
206  i = start;
207  uint16_t checksum = i.CalculateIpChecksum (start.GetSize (), headerChecksum);
208 
209  i = start;
210  i.Next (6);
211  i.WriteU16 (checksum);
212  }
213  }
214  else
215  {
216  i.WriteU16 (m_checksum);
217  }
218 }
219 uint32_t
221 {
223  m_sourcePort = i.ReadNtohU16 ();
226  m_checksum = i.ReadU16 ();
227 
228  if (m_calcChecksum)
229  {
230  uint16_t headerChecksum = CalculateHeaderChecksum (start.GetSize ());
231  i = start;
232  uint16_t checksum = i.CalculateIpChecksum (start.GetSize (), headerChecksum);
233 
234  m_goodChecksum = (checksum == 0);
235  }
236 
237  return GetSerializedSize ();
238 }
239 
240 uint16_t
242 {
243  return m_checksum;
244 }
245 
246 } // namespace ns3
a polymophic address class
Definition: address.h:91
iterator in a Buffer instance
Definition: buffer.h:99
uint16_t ReadNtohU16(void)
Definition: buffer.h:946
uint16_t CalculateIpChecksum(uint16_t size)
Calculate the checksum.
Definition: buffer.cc:1134
void WriteU8(uint8_t data)
Definition: buffer.h:869
void Next(void)
go forward by one byte
Definition: buffer.h:845
void WriteU16(uint16_t data)
Definition: buffer.cc:871
uint16_t ReadU16(void)
Definition: buffer.h:1029
void WriteHtonU16(uint16_t data)
Definition: buffer.h:905
automatically resized byte buffer
Definition: buffer.h:93
void AddAtStart(uint32_t start)
Definition: buffer.cc:309
Buffer::Iterator Begin(void) const
Definition: buffer.h:1069
Protocol header serialization and deserialization.
Definition: header.h:43
virtual uint32_t Deserialize(Buffer::Iterator start)=0
Deserialize the object from a buffer iterator.
Ipv4 addresses are stored in host order in this class.
Definition: ipv4-address.h:41
static bool IsMatchingType(const Address &address)
Describes an IPv6 address.
Definition: ipv6-address.h:50
static bool IsMatchingType(const Address &address)
If the Address matches the type.
a unique identifier for an interface.
Definition: type-id.h:59
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition: type-id.cc:922
Packet header for UDP packets.
Definition: udp-header.h:40
virtual void Serialize(Buffer::Iterator start) const
Definition: udp-header.cc:184
void EnableChecksums(void)
Enable checksum calculation for UDP.
Definition: udp-header.cc:49
Address m_destination
Destination IP address.
Definition: udp-header.h:181
uint16_t CalculateHeaderChecksum(uint16_t size) const
Calculate the header checksum.
Definition: udp-header.cc:102
virtual uint32_t GetSerializedSize(void) const
Definition: udp-header.cc:178
uint8_t m_protocol
Protocol number.
Definition: udp-header.h:182
uint16_t GetSourcePort(void) const
Definition: udp-header.cc:65
UdpHeader()
Constructor.
Definition: udp-header.cc:32
uint16_t m_destinationPort
Destination port.
Definition: udp-header.h:177
static TypeId GetTypeId(void)
Get the type ID.
Definition: udp-header.cc:154
Address m_source
Source IP address.
Definition: udp-header.h:180
uint16_t m_payloadSize
Payload size.
Definition: udp-header.h:178
void ForceChecksum(uint16_t checksum)
Force the UDP checksum to a given value.
Definition: udp-header.cc:142
bool IsChecksumOk(void) const
Is the UDP checksum correct ?
Definition: udp-header.cc:136
uint16_t m_sourcePort
Source port.
Definition: udp-header.h:176
bool m_calcChecksum
Flag to calculate checksum.
Definition: udp-header.h:184
void ForcePayloadSize(uint16_t payloadSize)
Force the UDP payload length to a given value.
Definition: udp-header.cc:148
uint16_t GetChecksum()
Return the checksum (only known after a Deserialize)
Definition: udp-header.cc:241
virtual void Print(std::ostream &os) const
Definition: udp-header.cc:169
uint16_t GetDestinationPort(void) const
Definition: udp-header.cc:70
uint16_t m_checksum
Forced Checksum value.
Definition: udp-header.h:183
void InitializeChecksum(Address source, Address destination, uint8_t protocol)
Definition: udp-header.cc:75
void SetSourcePort(uint16_t port)
Definition: udp-header.cc:60
bool m_goodChecksum
Flag to indicate that checksum is correct.
Definition: udp-header.h:185
void SetDestinationPort(uint16_t port)
Definition: udp-header.cc:55
virtual TypeId GetInstanceTypeId(void) const
Get the most derived TypeId for this Object.
Definition: udp-header.cc:164
uint16_t port
Definition: dsdv-manet.cc:45
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Definition: object-base.h:45
Every class exported by the ns3 library is enclosed in the ns3 namespace.
void WriteTo(Buffer::Iterator &i, Ipv4Address ad)
Write an Ipv4Address to a Buffer.
def start()
Definition: core.py:1853