A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
epc-gtpu-header.cc
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
66 {
67  return GetTypeId ();
68 }
69 
70 uint32_t
72 {
73  return 12;
74 }
75 void
77 {
78  Buffer::Iterator i = start;
79  uint8_t firstByte = m_version << 5 | m_protocolType << 4 | 0x1 << 3;
81  i.WriteU8 (firstByte);
84  i.WriteHtonU32 (m_teid);
88 
89 }
90 uint32_t
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 ();
104  m_nPduNumber = 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  }
117  {
118  os << " E ";
119  }
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 
virtual void Serialize(Buffer::Iterator start) const
#define NS_LOG_COMPONENT_DEFINE(name)
Definition: log.h:122
uint32_t ReadNtohU32(void)
Definition: buffer.h:791
iterator in a Buffer instance
Definition: buffer.h:98
virtual uint32_t GetSerializedSize(void) const
void WriteHtonU16(uint16_t data)
Definition: buffer.h:726
virtual void Print(std::ostream &os) const
uint16_t m_sequenceNumber
uint8_t m_nextExtensionType
void WriteHtonU32(uint32_t data)
Definition: buffer.h:745
virtual TypeId GetInstanceTypeId(void) const
void WriteU8(uint8_t data)
Definition: buffer.h:690
uint8_t ReadU8(void)
Definition: buffer.h:819
uint16_t ReadNtohU16(void)
Definition: buffer.h:767
virtual uint32_t Deserialize(Buffer::Iterator start)