author | Adrian S Tam <adrian.sw.tam@gmail.com> |
Wed, 07 Dec 2011 11:22:10 -0500 | |
changeset 7619 | b4dee6307aa7 |
parent 7385 | 10beb0e53130 |
child 9704 | 1db7690f8e8f |
permissions | -rw-r--r-- |
7385
10beb0e53130
standardize emacs c++ mode comments
Vedran Miletić <rivanvx@gmail.com>
parents:
7176
diff
changeset
|
1 |
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ |
4575
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
2 |
/* |
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
3 |
* Copyright (c) 2008 INRIA |
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
4 |
* |
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
5 |
* This program is free software; you can redistribute it and/or modify |
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
6 |
* it under the terms of the GNU General Public License version 2 as |
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
7 |
* published by the Free Software Foundation; |
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
8 |
* |
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
9 |
* This program is distributed in the hope that it will be useful, |
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
10 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
11 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
12 |
* GNU General Public License for more details. |
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
13 |
* |
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
14 |
* You should have received a copy of the GNU General Public License |
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
15 |
* along with this program; if not, write to the Free Software |
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
16 |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
17 |
* |
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
18 |
* Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr> |
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
19 |
*/ |
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
20 |
|
3820 | 21 |
#include "icmpv4.h" |
22 |
#include "ns3/packet.h" |
|
23 |
||
24 |
namespace ns3 { |
|
25 |
||
26 |
/******************************************************** |
|
27 |
* Icmpv4Header |
|
28 |
********************************************************/ |
|
29 |
||
6301 | 30 |
NS_OBJECT_ENSURE_REGISTERED (Icmpv4Header); |
31 |
||
3820 | 32 |
TypeId |
33 |
Icmpv4Header::GetTypeId (void) |
|
34 |
{ |
|
35 |
static TypeId tid = TypeId ("ns3::Icmpv4Header") |
|
36 |
.SetParent<Header> () |
|
37 |
.AddConstructor<Icmpv4Header> () |
|
7176
9f2663992e99
internet coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents:
7061
diff
changeset
|
38 |
; |
3820 | 39 |
return tid; |
40 |
} |
|
41 |
Icmpv4Header::Icmpv4Header () |
|
42 |
: m_type (0), |
|
43 |
m_code (0), |
|
44 |
m_calcChecksum (false) |
|
7176
9f2663992e99
internet coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents:
7061
diff
changeset
|
45 |
{ |
9f2663992e99
internet coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents:
7061
diff
changeset
|
46 |
} |
3820 | 47 |
Icmpv4Header::~Icmpv4Header () |
7176
9f2663992e99
internet coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents:
7061
diff
changeset
|
48 |
{ |
9f2663992e99
internet coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents:
7061
diff
changeset
|
49 |
} |
9f2663992e99
internet coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents:
7061
diff
changeset
|
50 |
void |
3820 | 51 |
Icmpv4Header::EnableChecksum (void) |
52 |
{ |
|
53 |
m_calcChecksum = true; |
|
54 |
} |
|
7176
9f2663992e99
internet coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents:
7061
diff
changeset
|
55 |
TypeId |
3820 | 56 |
Icmpv4Header::GetInstanceTypeId (void) const |
57 |
{ |
|
58 |
return GetTypeId (); |
|
59 |
} |
|
7176
9f2663992e99
internet coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents:
7061
diff
changeset
|
60 |
uint32_t |
3820 | 61 |
Icmpv4Header::GetSerializedSize (void) const |
62 |
{ |
|
63 |
return 4; |
|
64 |
} |
|
7176
9f2663992e99
internet coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents:
7061
diff
changeset
|
65 |
void |
3820 | 66 |
Icmpv4Header::Serialize (Buffer::Iterator start) const |
67 |
{ |
|
68 |
Buffer::Iterator i = start; |
|
69 |
i.WriteU8 (m_type); |
|
70 |
i.WriteU8 (m_code); |
|
71 |
i.WriteHtonU16 (0); |
|
72 |
if (m_calcChecksum) |
|
73 |
{ |
|
74 |
i = start; |
|
75 |
uint16_t checksum = i.CalculateIpChecksum (i.GetSize ()); |
|
76 |
i = start; |
|
77 |
i.Next (2); |
|
78 |
i.WriteU16 (checksum); |
|
79 |
} |
|
7176
9f2663992e99
internet coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents:
7061
diff
changeset
|
80 |
|
3820 | 81 |
} |
82 |
uint32_t |
|
83 |
Icmpv4Header::Deserialize (Buffer::Iterator start) |
|
84 |
{ |
|
85 |
m_type = start.ReadU8 (); |
|
86 |
m_code = start.ReadU8 (); |
|
7061 | 87 |
start.Next (2); // uint16_t checksum = start.ReadNtohU16 (); |
3820 | 88 |
return 4; |
89 |
} |
|
90 |
void |
|
91 |
Icmpv4Header::Print (std::ostream &os) const |
|
92 |
{ |
|
93 |
os << "type=" << (uint32_t)m_type << ", code=" << (uint32_t)m_code; |
|
94 |
} |
|
95 |
||
96 |
void |
|
97 |
Icmpv4Header::SetType (uint8_t type) |
|
98 |
{ |
|
99 |
m_type = type; |
|
100 |
} |
|
101 |
void |
|
102 |
Icmpv4Header::SetCode (uint8_t code) |
|
103 |
{ |
|
104 |
m_code = code; |
|
105 |
} |
|
106 |
uint8_t |
|
107 |
Icmpv4Header::GetType (void) const |
|
108 |
{ |
|
109 |
return m_type; |
|
110 |
} |
|
111 |
uint8_t |
|
112 |
Icmpv4Header::GetCode (void) const |
|
113 |
{ |
|
114 |
return m_code; |
|
115 |
} |
|
116 |
||
117 |
/******************************************************** |
|
118 |
* Icmpv4Echo |
|
119 |
********************************************************/ |
|
6301 | 120 |
|
121 |
NS_OBJECT_ENSURE_REGISTERED (Icmpv4Echo); |
|
122 |
||
3820 | 123 |
void |
124 |
Icmpv4Echo::SetIdentifier (uint16_t id) |
|
125 |
{ |
|
126 |
m_identifier = id; |
|
127 |
} |
|
128 |
void |
|
129 |
Icmpv4Echo::SetSequenceNumber (uint16_t seq) |
|
130 |
{ |
|
131 |
m_sequence = seq; |
|
132 |
} |
|
133 |
void |
|
134 |
Icmpv4Echo::SetData (Ptr<const Packet> data) |
|
135 |
{ |
|
4575
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
136 |
uint32_t size = data->GetSize (); |
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
137 |
// |
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
138 |
// All kinds of optimizations are possible, but let's not get carried away |
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
139 |
// since this is probably a very uncommon thing in the big picture. |
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
140 |
// |
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
141 |
// N.B. Zero is a legal size for the alloc below even though a hardcoded zero |
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
142 |
// would result in warning. |
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
143 |
// |
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
144 |
if (size != m_dataSize) |
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
145 |
{ |
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
146 |
delete [] m_data; |
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
147 |
m_data = new uint8_t[size]; |
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
148 |
m_dataSize = size; |
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
149 |
} |
4521
981e2f0b696b
no need to keep around a Ptr<Packet>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
3820
diff
changeset
|
150 |
data->CopyData (m_data, size); |
3820 | 151 |
} |
152 |
uint16_t |
|
153 |
Icmpv4Echo::GetIdentifier (void) const |
|
154 |
{ |
|
155 |
return m_identifier; |
|
156 |
} |
|
157 |
uint16_t |
|
158 |
Icmpv4Echo::GetSequenceNumber (void) const |
|
159 |
{ |
|
160 |
return m_sequence; |
|
161 |
} |
|
4521
981e2f0b696b
no need to keep around a Ptr<Packet>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
3820
diff
changeset
|
162 |
uint32_t |
4575
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
163 |
Icmpv4Echo::GetDataSize (void) const |
3820 | 164 |
{ |
4521
981e2f0b696b
no need to keep around a Ptr<Packet>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
3820
diff
changeset
|
165 |
return m_dataSize; |
3820 | 166 |
} |
4575
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
167 |
uint32_t |
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
168 |
Icmpv4Echo::GetData (uint8_t payload[]) const |
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
169 |
{ |
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
170 |
memcpy (payload, m_data, m_dataSize); |
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
171 |
return m_dataSize; |
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
172 |
} |
3820 | 173 |
TypeId |
174 |
Icmpv4Echo::GetTypeId (void) |
|
175 |
{ |
|
176 |
static TypeId tid = TypeId ("ns3::Icmpv4Echo") |
|
177 |
.SetParent<Header> () |
|
178 |
.AddConstructor<Icmpv4Echo> () |
|
7176
9f2663992e99
internet coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents:
7061
diff
changeset
|
179 |
; |
3820 | 180 |
return tid; |
181 |
} |
|
182 |
Icmpv4Echo::Icmpv4Echo () |
|
183 |
: m_identifier (0), |
|
184 |
m_sequence (0), |
|
4521
981e2f0b696b
no need to keep around a Ptr<Packet>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
3820
diff
changeset
|
185 |
m_dataSize (0) |
981e2f0b696b
no need to keep around a Ptr<Packet>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
3820
diff
changeset
|
186 |
{ |
4575
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
187 |
// |
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
188 |
// After construction, m_data is always valid until destruction. This is true |
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
189 |
// even if m_dataSize is zero. |
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
190 |
// |
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
191 |
m_data = new uint8_t[m_dataSize]; |
4521
981e2f0b696b
no need to keep around a Ptr<Packet>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
3820
diff
changeset
|
192 |
} |
3820 | 193 |
Icmpv4Echo::~Icmpv4Echo () |
4575
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
194 |
{ |
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
195 |
delete [] m_data; |
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
196 |
m_data = 0; |
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
197 |
m_dataSize = 0; |
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
198 |
} |
3820 | 199 |
TypeId |
200 |
Icmpv4Echo::GetInstanceTypeId (void) const |
|
201 |
{ |
|
202 |
return GetTypeId (); |
|
203 |
} |
|
204 |
uint32_t |
|
205 |
Icmpv4Echo::GetSerializedSize (void) const |
|
206 |
{ |
|
4521
981e2f0b696b
no need to keep around a Ptr<Packet>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
3820
diff
changeset
|
207 |
return 4 + m_dataSize; |
3820 | 208 |
} |
209 |
void |
|
210 |
Icmpv4Echo::Serialize (Buffer::Iterator start) const |
|
211 |
{ |
|
212 |
start.WriteHtonU16 (m_identifier); |
|
213 |
start.WriteHtonU16 (m_sequence); |
|
4521
981e2f0b696b
no need to keep around a Ptr<Packet>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
3820
diff
changeset
|
214 |
start.Write (m_data, m_dataSize); |
3820 | 215 |
} |
216 |
uint32_t |
|
217 |
Icmpv4Echo::Deserialize (Buffer::Iterator start) |
|
218 |
{ |
|
219 |
m_identifier = start.ReadNtohU16 (); |
|
220 |
m_sequence = start.ReadNtohU16 (); |
|
221 |
NS_ASSERT (start.GetSize () >= 4); |
|
4575
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
222 |
uint32_t size = start.GetSize () - 4; |
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
223 |
if (size != m_dataSize) |
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
224 |
{ |
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
225 |
delete [] m_data; |
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
226 |
m_data = new uint8_t[size]; |
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
227 |
m_dataSize = size; |
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
228 |
} |
4521
981e2f0b696b
no need to keep around a Ptr<Packet>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
3820
diff
changeset
|
229 |
start.Read (m_data, m_dataSize); |
4575
ee3191a0b560
variable size buffer for icmpv4 echo header
Craig Dowell <craigdo@ee.washington.edu>
parents:
4521
diff
changeset
|
230 |
return m_dataSize; |
3820 | 231 |
} |
232 |
void |
|
233 |
Icmpv4Echo::Print (std::ostream &os) const |
|
234 |
{ |
|
235 |
os << "identifier=" << m_identifier << ", sequence=" << m_sequence; |
|
236 |
} |
|
237 |
||
238 |
||
239 |
/******************************************************** |
|
240 |
* Icmpv4DestinationUnreachable |
|
241 |
********************************************************/ |
|
242 |
||
6301 | 243 |
NS_OBJECT_ENSURE_REGISTERED (Icmpv4DestinationUnreachable); |
244 |
||
3820 | 245 |
TypeId |
246 |
Icmpv4DestinationUnreachable::GetTypeId (void) |
|
247 |
{ |
|
248 |
static TypeId tid = TypeId ("ns3::Icmpv4DestinationUnreachable") |
|
249 |
.SetParent<Header> () |
|
250 |
.AddConstructor<Icmpv4DestinationUnreachable> () |
|
7176
9f2663992e99
internet coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents:
7061
diff
changeset
|
251 |
; |
3820 | 252 |
return tid; |
253 |
} |
|
254 |
Icmpv4DestinationUnreachable::Icmpv4DestinationUnreachable () |
|
255 |
{ |
|
256 |
// make sure that thing is initialized to get initialized bytes |
|
257 |
// when the ip payload's size is smaller than 8 bytes. |
|
258 |
for (uint8_t j = 0; j < 8; j++) |
|
259 |
{ |
|
260 |
m_data[j] = 0; |
|
261 |
} |
|
262 |
} |
|
263 |
||
264 |
void |
|
265 |
Icmpv4DestinationUnreachable::SetNextHopMtu (uint16_t mtu) |
|
266 |
{ |
|
267 |
m_nextHopMtu = mtu; |
|
268 |
} |
|
269 |
uint16_t |
|
270 |
Icmpv4DestinationUnreachable::GetNextHopMtu (void) const |
|
271 |
{ |
|
272 |
return m_nextHopMtu; |
|
273 |
} |
|
274 |
||
275 |
void |
|
276 |
Icmpv4DestinationUnreachable::SetData (Ptr<const Packet> data) |
|
277 |
{ |
|
278 |
data->CopyData (m_data, 8); |
|
279 |
} |
|
280 |
void |
|
281 |
Icmpv4DestinationUnreachable::SetHeader (Ipv4Header header) |
|
282 |
{ |
|
283 |
m_header = header; |
|
284 |
} |
|
285 |
void |
|
286 |
Icmpv4DestinationUnreachable::GetData (uint8_t payload[8]) const |
|
287 |
{ |
|
288 |
memcpy (payload, m_data, 8); |
|
289 |
} |
|
290 |
Ipv4Header |
|
291 |
Icmpv4DestinationUnreachable::GetHeader (void) const |
|
292 |
{ |
|
293 |
return m_header; |
|
294 |
} |
|
295 |
||
296 |
||
297 |
Icmpv4DestinationUnreachable::~Icmpv4DestinationUnreachable () |
|
7176
9f2663992e99
internet coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents:
7061
diff
changeset
|
298 |
{ |
9f2663992e99
internet coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents:
7061
diff
changeset
|
299 |
} |
9f2663992e99
internet coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents:
7061
diff
changeset
|
300 |
TypeId |
3820 | 301 |
Icmpv4DestinationUnreachable::GetInstanceTypeId (void) const |
302 |
{ |
|
303 |
return GetTypeId (); |
|
304 |
} |
|
7176
9f2663992e99
internet coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents:
7061
diff
changeset
|
305 |
uint32_t |
3820 | 306 |
Icmpv4DestinationUnreachable::GetSerializedSize (void) const |
307 |
{ |
|
308 |
return 4 + m_header.GetSerializedSize () + 8; |
|
309 |
} |
|
7176
9f2663992e99
internet coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents:
7061
diff
changeset
|
310 |
void |
3820 | 311 |
Icmpv4DestinationUnreachable::Serialize (Buffer::Iterator start) const |
312 |
{ |
|
313 |
start.WriteU16 (0); |
|
314 |
start.WriteHtonU16 (m_nextHopMtu); |
|
315 |
uint32_t size = m_header.GetSerializedSize (); |
|
316 |
m_header.Serialize (start); |
|
317 |
start.Next (size); |
|
318 |
start.Write (m_data, 8); |
|
319 |
} |
|
7176
9f2663992e99
internet coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents:
7061
diff
changeset
|
320 |
|
3820 | 321 |
uint32_t |
322 |
Icmpv4DestinationUnreachable::Deserialize (Buffer::Iterator start) |
|
323 |
{ |
|
324 |
Buffer::Iterator i = start; |
|
325 |
i.Next (2); |
|
326 |
m_nextHopMtu = i.ReadNtohU16 (); |
|
327 |
uint32_t read = m_header.Deserialize (i); |
|
328 |
i.Next (read); |
|
329 |
for (uint8_t j = 0; j < 8; j++) |
|
330 |
{ |
|
331 |
m_data[j] = i.ReadU8 (); |
|
332 |
} |
|
333 |
return i.GetDistanceFrom (start); |
|
334 |
} |
|
335 |
void |
|
336 |
Icmpv4DestinationUnreachable::Print (std::ostream &os) const |
|
337 |
{ |
|
338 |
m_header.Print (os); |
|
339 |
os << " org data="; |
|
340 |
for (uint8_t i = 0; i < 8; i++) |
|
341 |
{ |
|
342 |
os << (uint32_t) m_data[i]; |
|
343 |
if (i != 8) |
|
7176
9f2663992e99
internet coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents:
7061
diff
changeset
|
344 |
{ |
9f2663992e99
internet coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents:
7061
diff
changeset
|
345 |
os << " "; |
9f2663992e99
internet coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents:
7061
diff
changeset
|
346 |
} |
3820 | 347 |
} |
348 |
} |
|
349 |
||
350 |
/******************************************************** |
|
351 |
* Icmpv4TimeExceeded |
|
352 |
********************************************************/ |
|
353 |
||
6301 | 354 |
NS_OBJECT_ENSURE_REGISTERED (Icmpv4TimeExceeded); |
355 |
||
3820 | 356 |
TypeId |
357 |
Icmpv4TimeExceeded::GetTypeId (void) |
|
358 |
{ |
|
359 |
static TypeId tid = TypeId ("ns3::Icmpv4TimeExceeded") |
|
360 |
.SetParent<Header> () |
|
361 |
.AddConstructor<Icmpv4TimeExceeded> () |
|
7176
9f2663992e99
internet coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents:
7061
diff
changeset
|
362 |
; |
3820 | 363 |
return tid; |
364 |
} |
|
365 |
Icmpv4TimeExceeded::Icmpv4TimeExceeded () |
|
366 |
{ |
|
367 |
// make sure that thing is initialized to get initialized bytes |
|
368 |
// when the ip payload's size is smaller than 8 bytes. |
|
369 |
for (uint8_t j = 0; j < 8; j++) |
|
370 |
{ |
|
371 |
m_data[j] = 0; |
|
372 |
} |
|
373 |
} |
|
374 |
||
375 |
||
376 |
void |
|
377 |
Icmpv4TimeExceeded::SetData (Ptr<const Packet> data) |
|
378 |
{ |
|
379 |
data->CopyData (m_data, 8); |
|
380 |
} |
|
381 |
void |
|
382 |
Icmpv4TimeExceeded::SetHeader (Ipv4Header header) |
|
383 |
{ |
|
384 |
m_header = header; |
|
385 |
} |
|
386 |
void |
|
387 |
Icmpv4TimeExceeded::GetData (uint8_t payload[8]) const |
|
388 |
{ |
|
389 |
memcpy (payload, m_data, 8); |
|
390 |
} |
|
391 |
Ipv4Header |
|
392 |
Icmpv4TimeExceeded::GetHeader (void) const |
|
393 |
{ |
|
394 |
return m_header; |
|
395 |
} |
|
396 |
||
397 |
||
398 |
Icmpv4TimeExceeded::~Icmpv4TimeExceeded () |
|
7176
9f2663992e99
internet coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents:
7061
diff
changeset
|
399 |
{ |
9f2663992e99
internet coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents:
7061
diff
changeset
|
400 |
} |
9f2663992e99
internet coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents:
7061
diff
changeset
|
401 |
TypeId |
3820 | 402 |
Icmpv4TimeExceeded::GetInstanceTypeId (void) const |
403 |
{ |
|
404 |
return GetTypeId (); |
|
405 |
} |
|
7176
9f2663992e99
internet coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents:
7061
diff
changeset
|
406 |
uint32_t |
3820 | 407 |
Icmpv4TimeExceeded::GetSerializedSize (void) const |
408 |
{ |
|
409 |
return 4 + m_header.GetSerializedSize () + 8; |
|
410 |
} |
|
7176
9f2663992e99
internet coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents:
7061
diff
changeset
|
411 |
void |
3820 | 412 |
Icmpv4TimeExceeded::Serialize (Buffer::Iterator start) const |
413 |
{ |
|
414 |
start.WriteU32 (0); |
|
415 |
uint32_t size = m_header.GetSerializedSize (); |
|
416 |
m_header.Serialize (start); |
|
417 |
start.Next (size); |
|
418 |
start.Write (m_data, 8); |
|
419 |
} |
|
7176
9f2663992e99
internet coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents:
7061
diff
changeset
|
420 |
|
3820 | 421 |
uint32_t |
422 |
Icmpv4TimeExceeded::Deserialize (Buffer::Iterator start) |
|
423 |
{ |
|
424 |
Buffer::Iterator i = start; |
|
425 |
i.Next (4); |
|
426 |
uint32_t read = m_header.Deserialize (i); |
|
427 |
i.Next (read); |
|
428 |
for (uint8_t j = 0; j < 8; j++) |
|
429 |
{ |
|
430 |
m_data[j] = i.ReadU8 (); |
|
431 |
} |
|
432 |
return i.GetDistanceFrom (start); |
|
433 |
} |
|
434 |
void |
|
435 |
Icmpv4TimeExceeded::Print (std::ostream &os) const |
|
436 |
{ |
|
437 |
m_header.Print (os); |
|
438 |
os << " org data="; |
|
439 |
for (uint8_t i = 0; i < 8; i++) |
|
440 |
{ |
|
441 |
os << (uint32_t) m_data[i]; |
|
442 |
if (i != 8) |
|
7176
9f2663992e99
internet coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents:
7061
diff
changeset
|
443 |
{ |
9f2663992e99
internet coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents:
7061
diff
changeset
|
444 |
os << " "; |
9f2663992e99
internet coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents:
7061
diff
changeset
|
445 |
} |
3820 | 446 |
} |
447 |
} |
|
448 |
||
449 |
} // namespace ns3 |