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
24namespace ns3 {
25
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
48void
50{
51 m_calcChecksum = true;
52}
53
54void
56{
58}
59void
61{
63}
64uint16_t
66{
67 return m_sourcePort;
68}
69uint16_t
71{
72 return m_destinationPort;
73}
74void
76 Address destination,
77 uint8_t protocol)
78{
79 m_source = source;
80 m_destination = destination;
81 m_protocol = protocol;
82}
83void
85 Ipv4Address destination,
86 uint8_t protocol)
87{
88 m_source = source;
89 m_destination = destination;
90 m_protocol = protocol;
91}
92void
94 Ipv6Address destination,
95 uint8_t protocol)
96{
97 m_source = source;
98 m_destination = destination;
99 m_protocol = protocol;
100}
101uint16_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);
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
135bool
137{
138 return m_goodChecksum;
139}
140
141void
142UdpHeader::ForceChecksum (uint16_t checksum)
143{
144 m_checksum = checksum;
145}
146
147void
148UdpHeader::ForcePayloadSize (uint16_t payloadSize)
149{
150 m_payloadSize = payloadSize;
151}
152
153TypeId
155{
156 static TypeId tid = TypeId ("ns3::UdpHeader")
157 .SetParent<Header> ()
158 .SetGroupName ("Internet")
159 .AddConstructor<UdpHeader> ()
160 ;
161 return tid;
162}
163TypeId
165{
166 return GetTypeId ();
167}
168void
169UdpHeader::Print (std::ostream &os) const
170{
171 os << "length: " << m_payloadSize + GetSerializedSize ()
172 << " "
173 << m_sourcePort << " > " << m_destinationPort
174 ;
175}
176
179{
180 return 8;
181}
182
183void
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 {
217 }
218}
221{
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
240uint16_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
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
virtual uint32_t Deserialize(Buffer::Iterator start)
Definition: udp-header.cc:220
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