A Discrete-Event Network Simulator
Home
Tutorials ▼
English
Portuguese
Docs ▼
Wiki
Manual
Models
Develop ▼
API
Bugs
API
Main Page
Related Pages
Modules
Namespaces
Classes
Files
File List
File Members
All
Classes
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Properties
Friends
Macros
Groups
Pages
epc-gtpu-header.cc
Go to the documentation of this file.
1
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
2
/*
3
* Copyright (c) 2011 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
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: Jaume Nin <jnin@cttc.cat>
19
*/
20
21
#include "
epc-gtpu-header.h
"
22
#include "ns3/log.h"
23
#include "ns3/packet.h"
24
25
NS_LOG_COMPONENT_DEFINE
(
"GtpuHeader"
);
26
27
namespace
ns3 {
28
29
/********************************************************
30
* GTP-U-v1 Header
31
********************************************************/
32
33
NS_OBJECT_ENSURE_REGISTERED
(GtpuHeader);
34
35
TypeId
36
GtpuHeader::GetTypeId
(
void
)
37
{
38
static
TypeId
tid =
39
TypeId
(
"ns3::GtpuHeader"
)
40
.
SetParent
<
Header
> ()
41
.AddConstructor<GtpuHeader> ();
42
return
tid;
43
}
44
GtpuHeader::GtpuHeader
()
45
: m_version (1),
46
m_protocolType (true),
47
m_extensionHeaderFlag (false),
48
m_sequenceNumberFlag (true),
49
m_nPduNumberFlag (true),
50
m_messageType (255),
51
m_length (0),
52
m_teid (0),
53
m_sequenceNumber (0),
54
m_nPduNumber (0),
55
m_nextExtensionType (0)
56
{
57
58
}
59
60
GtpuHeader::~GtpuHeader
()
61
{
62
}
63
64
TypeId
65
GtpuHeader::GetInstanceTypeId
(
void
)
const
66
{
67
return
GetTypeId
();
68
}
69
70
uint32_t
71
GtpuHeader::GetSerializedSize
(
void
)
const
72
{
73
return
12;
74
}
75
void
76
GtpuHeader::Serialize
(
Buffer::Iterator
start
)
const
77
{
78
Buffer::Iterator
i =
start
;
79
uint8_t firstByte =
m_version
<< 5 |
m_protocolType
<< 4 | 0x1 << 3;
80
firstByte |=
m_extensionHeaderFlag
<< 2 |
m_sequenceNumberFlag
<< 1 |
m_nPduNumberFlag
;
81
i.
WriteU8
(firstByte);
82
i.
WriteU8
(
m_messageType
);
83
i.
WriteHtonU16
(
m_length
);
84
i.
WriteHtonU32
(
m_teid
);
85
i.
WriteHtonU16
(
m_sequenceNumber
);
86
i.
WriteU8
(
m_nPduNumber
);
87
i.
WriteU8
(
m_nextExtensionType
);
88
89
}
90
uint32_t
91
GtpuHeader::Deserialize
(
Buffer::Iterator
start
)
92
{
93
Buffer::Iterator
i =
start
;
94
uint8_t firstByte = i.
ReadU8
();
95
m_version
= firstByte >> 5 & 0x7;
96
m_protocolType
= firstByte >> 4 & 0x1;
97
m_extensionHeaderFlag
= firstByte >> 2 & 0x1;
98
m_sequenceNumberFlag
= firstByte >> 1 & 0x1;
99
m_nPduNumberFlag
= firstByte & 0x1;
100
m_messageType
= i.
ReadU8
();
101
m_length
= i.
ReadNtohU16
();
102
m_teid
= i.
ReadNtohU32
();
103
m_sequenceNumber
= i.
ReadNtohU16
();
104
m_nPduNumber
= i.
ReadU8
();
105
m_nextExtensionType
= i.
ReadU8
();
106
return
GetSerializedSize
();
107
}
108
void
109
GtpuHeader::Print
(std::ostream &os)
const
110
{
111
os <<
" version="
<< (uint32_t)
m_version
<<
" ["
;
112
if
(
m_protocolType
)
113
{
114
os <<
" PT "
;
115
}
116
if
(
m_extensionHeaderFlag
)
117
{
118
os <<
" E "
;
119
}
120
if
(
m_sequenceNumberFlag
)
121
{
122
os <<
" S "
;
123
}
124
if
(
m_nPduNumberFlag
)
125
{
126
os <<
" PN "
;
127
}
128
os <<
"], messageType="
<< (uint32_t)
m_messageType
<<
", length="
<< (uint32_t)
m_length
;
129
os <<
", teid="
<< (uint32_t)
m_teid
<<
", sequenceNumber="
<< (uint32_t)
m_sequenceNumber
;
130
os <<
", nPduNumber="
<< (uint32_t)
m_nPduNumber
<<
", nextExtensionType="
<< (uint32_t)
m_nextExtensionType
;
131
}
132
133
bool
134
GtpuHeader::GetExtensionHeaderFlag
()
const
135
{
136
return
m_extensionHeaderFlag
;
137
}
138
139
uint16_t
140
GtpuHeader::GetLength
()
const
141
{
142
return
m_length
;
143
}
144
145
uint8_t
146
GtpuHeader::GetMessageType
()
const
147
{
148
return
m_messageType
;
149
}
150
151
uint8_t
152
GtpuHeader::GetNPduNumber
()
const
153
{
154
return
m_nPduNumber
;
155
}
156
157
bool
158
GtpuHeader::GetNPduNumberFlag
()
const
159
{
160
return
m_nPduNumberFlag
;
161
}
162
163
uint8_t
164
GtpuHeader::GetNextExtensionType
()
const
165
{
166
return
m_nextExtensionType
;
167
}
168
169
bool
170
GtpuHeader::GetProtocolType
()
const
171
{
172
return
m_protocolType
;
173
}
174
175
uint16_t
176
GtpuHeader::GetSequenceNumber
()
const
177
{
178
return
m_sequenceNumber
;
179
}
180
181
bool
182
GtpuHeader::GetSequenceNumberFlag
()
const
183
{
184
return
m_sequenceNumberFlag
;
185
}
186
187
uint32_t
188
GtpuHeader::GetTeid
()
const
189
{
190
return
m_teid
;
191
}
192
193
uint8_t
194
GtpuHeader::GetVersion
()
const
195
{
196
return
m_version
;
197
}
198
199
void
200
GtpuHeader::SetExtensionHeaderFlag
(
bool
m_extensionHeaderFlag)
201
{
202
this->m_extensionHeaderFlag =
m_extensionHeaderFlag
;
203
}
204
205
void
206
GtpuHeader::SetLength
(uint16_t m_length)
207
{
208
this->m_length =
m_length
;
209
}
210
211
void
212
GtpuHeader::SetMessageType
(uint8_t m_messageType)
213
{
214
this->m_messageType =
m_messageType
;
215
}
216
217
void
218
GtpuHeader::SetNPduNumber
(uint8_t m_nPduNumber)
219
{
220
this->m_nPduNumber =
m_nPduNumber
;
221
}
222
223
void
224
GtpuHeader::SetNPduNumberFlag
(
bool
m_nPduNumberFlag)
225
{
226
this->m_nPduNumberFlag =
m_nPduNumberFlag
;
227
}
228
229
void
230
GtpuHeader::SetNextExtensionType
(uint8_t m_nextExtensionType)
231
{
232
this->m_nextExtensionType =
m_nextExtensionType
;
233
}
234
235
void
236
GtpuHeader::SetProtocolType
(
bool
m_protocolType)
237
{
238
this->m_protocolType =
m_protocolType
;
239
}
240
241
void
242
GtpuHeader::SetSequenceNumber
(uint16_t m_sequenceNumber)
243
{
244
this->m_sequenceNumber =
m_sequenceNumber
;
245
}
246
247
void
248
GtpuHeader::SetSequenceNumberFlag
(
bool
m_sequenceNumberFlag)
249
{
250
this->m_sequenceNumberFlag =
m_sequenceNumberFlag
;
251
}
252
253
void
254
GtpuHeader::SetTeid
(uint32_t m_teid)
255
{
256
this->m_teid =
m_teid
;
257
}
258
259
void
260
GtpuHeader::SetVersion
(uint8_t m_version)
261
{
262
// m_version is a uint3_t
263
this->m_version = m_version & 0x7;
264
}
265
266
bool
267
GtpuHeader::operator ==
(
const
GtpuHeader
& b)
const
268
{
269
if
(
m_version
== b.
m_version
270
&&
m_protocolType
== b.
m_protocolType
271
&&
m_extensionHeaderFlag
== b.
m_extensionHeaderFlag
272
&&
m_sequenceNumberFlag
== b.
m_sequenceNumberFlag
273
&&
m_nPduNumberFlag
== b.
m_nPduNumberFlag
274
&&
m_messageType
== b.
m_messageType
275
&&
m_length
== b.
m_length
276
&&
m_teid
== b.
m_teid
277
&&
m_sequenceNumber
== b.
m_sequenceNumber
278
&&
m_nPduNumber
== b.
m_nPduNumber
279
&&
m_nextExtensionType
== b.
m_nextExtensionType
280
)
281
{
282
return
true
;
283
}
284
return
false
;
285
}
286
287
}
// namespace ns3
288
src
lte
model
epc-gtpu-header.cc
Generated on Tue Nov 13 2012 10:32:16 for ns-3 by
1.8.1.2