5G-LENA nr-v3.3-120-gdac69c56
The 5G/NR module for the ns-3 simulator
Loading...
Searching...
No Matches
nr-epc-gtpu-header.cc
1// Copyright (c) 2011 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
2//
3// SPDX-License-Identifier: GPL-2.0-only
4//
5// Author: Jaume Nin <jnin@cttc.cat>
6
7#include "nr-epc-gtpu-header.h"
8
9#include "ns3/log.h"
10#include "ns3/packet.h"
11
12namespace ns3
13{
14
15NS_LOG_COMPONENT_DEFINE("NrGtpuHeader");
16
17/********************************************************
18 * GTP-U-v1 Header
19 ********************************************************/
20
21NS_OBJECT_ENSURE_REGISTERED(NrGtpuHeader);
22
23TypeId
25{
26 static TypeId tid = TypeId("ns3::NrGtpuHeader")
27 .SetParent<Header>()
28 .SetGroupName("Nr")
29 .AddConstructor<NrGtpuHeader>();
30 return tid;
31}
32
33NrGtpuHeader::NrGtpuHeader()
34 : m_version(1),
35 m_protocolType(true),
36 m_extensionHeaderFlag(false),
37 m_sequenceNumberFlag(true),
38 m_nPduNumberFlag(true),
39 m_messageType(255),
40 m_length(0),
41 m_teid(0),
42 m_sequenceNumber(0),
43 m_nPduNumber(0),
44 m_nextExtensionType(0)
45{
46}
47
48NrGtpuHeader::~NrGtpuHeader()
49{
50}
51
52TypeId
53NrGtpuHeader::GetInstanceTypeId() const
54{
55 return GetTypeId();
56}
57
58uint32_t
59NrGtpuHeader::GetSerializedSize() const
60{
61 return 12;
62}
63
64void
65NrGtpuHeader::Serialize(Buffer::Iterator start) const
66{
67 Buffer::Iterator i = start;
68 uint8_t firstByte = m_version << 5 | m_protocolType << 4 | 0x1 << 3;
69 firstByte |= m_extensionHeaderFlag << 2 | m_sequenceNumberFlag << 1 | m_nPduNumberFlag;
70 i.WriteU8(firstByte);
71 i.WriteU8(m_messageType);
72 i.WriteHtonU16(m_length);
73 i.WriteHtonU32(m_teid);
74 i.WriteHtonU16(m_sequenceNumber);
75 i.WriteU8(m_nPduNumber);
76 i.WriteU8(m_nextExtensionType);
77}
78
79uint32_t
80NrGtpuHeader::Deserialize(Buffer::Iterator start)
81{
82 Buffer::Iterator i = start;
83 uint8_t firstByte = i.ReadU8();
84 m_version = firstByte >> 5 & 0x7;
85 m_protocolType = firstByte >> 4 & 0x1;
86 m_extensionHeaderFlag = firstByte >> 2 & 0x1;
87 m_sequenceNumberFlag = firstByte >> 1 & 0x1;
88 m_nPduNumberFlag = firstByte & 0x1;
89 m_messageType = i.ReadU8();
90 m_length = i.ReadNtohU16();
91 m_teid = i.ReadNtohU32();
92 m_sequenceNumber = i.ReadNtohU16();
93 m_nPduNumber = i.ReadU8();
94 m_nextExtensionType = i.ReadU8();
95 return GetSerializedSize();
96}
97
98void
99NrGtpuHeader::Print(std::ostream& os) const
100{
101 os << " version=" << (uint32_t)m_version << " [";
102 if (m_protocolType)
103 {
104 os << " PT ";
105 }
106 if (m_extensionHeaderFlag)
107 {
108 os << " E ";
109 }
110 if (m_sequenceNumberFlag)
111 {
112 os << " S ";
113 }
114 if (m_nPduNumberFlag)
115 {
116 os << " PN ";
117 }
118 os << "], messageType=" << (uint32_t)m_messageType << ", length=" << (uint32_t)m_length;
119 os << ", teid=" << (uint32_t)m_teid << ", sequenceNumber=" << (uint32_t)m_sequenceNumber;
120 os << ", nPduNumber=" << (uint32_t)m_nPduNumber
121 << ", nextExtensionType=" << (uint32_t)m_nextExtensionType;
122}
123
124bool
126{
127 return m_extensionHeaderFlag;
128}
129
130uint16_t
132{
133 return m_length;
134}
135
136uint8_t
138{
139 return m_messageType;
140}
141
142uint8_t
144{
145 return m_nPduNumber;
146}
147
148bool
150{
151 return m_nPduNumberFlag;
152}
153
154uint8_t
156{
157 return m_nextExtensionType;
158}
159
160bool
162{
163 return m_protocolType;
164}
165
166uint16_t
168{
169 return m_sequenceNumber;
170}
171
172bool
174{
175 return m_sequenceNumberFlag;
176}
177
178uint32_t
180{
181 return m_teid;
182}
183
184uint8_t
186{
187 return m_version;
188}
189
190void
191NrGtpuHeader::SetExtensionHeaderFlag(bool m_extensionHeaderFlag)
192{
193 this->m_extensionHeaderFlag = m_extensionHeaderFlag;
194}
195
196void
197NrGtpuHeader::SetLength(uint16_t m_length)
198{
199 this->m_length = m_length;
200}
201
202void
203NrGtpuHeader::SetMessageType(uint8_t m_messageType)
204{
205 this->m_messageType = m_messageType;
206}
207
208void
209NrGtpuHeader::SetNPduNumber(uint8_t m_nPduNumber)
210{
211 this->m_nPduNumber = m_nPduNumber;
212}
213
214void
216{
217 this->m_nPduNumberFlag = m_nPduNumberFlag;
218}
219
220void
221NrGtpuHeader::SetNextExtensionType(uint8_t m_nextExtensionType)
222{
223 this->m_nextExtensionType = m_nextExtensionType;
224}
225
226void
228{
229 this->m_protocolType = m_protocolType;
230}
231
232void
233NrGtpuHeader::SetSequenceNumber(uint16_t m_sequenceNumber)
234{
235 this->m_sequenceNumber = m_sequenceNumber;
236}
237
238void
239NrGtpuHeader::SetSequenceNumberFlag(bool m_sequenceNumberFlag)
240{
241 this->m_sequenceNumberFlag = m_sequenceNumberFlag;
242}
243
244void
245NrGtpuHeader::SetTeid(uint32_t m_teid)
246{
247 this->m_teid = m_teid;
248}
249
250void
251NrGtpuHeader::SetVersion(uint8_t m_version)
252{
253 // m_version is a uint3_t
254 this->m_version = m_version & 0x7;
255}
256
257bool
259{
260 return m_version == b.m_version && m_protocolType == b.m_protocolType &&
261 m_extensionHeaderFlag == b.m_extensionHeaderFlag &&
262 m_sequenceNumberFlag == b.m_sequenceNumberFlag &&
263 m_nPduNumberFlag == b.m_nPduNumberFlag && m_messageType == b.m_messageType &&
264 m_length == b.m_length && m_teid == b.m_teid && m_sequenceNumber == b.m_sequenceNumber &&
265 m_nPduNumber == b.m_nPduNumber && m_nextExtensionType == b.m_nextExtensionType;
266}
267
268} // namespace ns3
bool operator==(const NrGtpuHeader &b) const
bool GetExtensionHeaderFlag() const
void SetMessageType(uint8_t messageType)
void SetLength(uint16_t length)
void SetExtensionHeaderFlag(bool extensionHeaderFlag)
void SetSequenceNumberFlag(bool sequenceNumberFlag)
bool GetNPduNumberFlag() const
uint16_t GetSequenceNumber() const
void SetTeid(uint32_t teid)
void SetNextExtensionType(uint8_t nextExtensionType)
uint8_t GetNextExtensionType() const
bool GetSequenceNumberFlag() const
void SetNPduNumber(uint8_t nPduNumber)
void SetSequenceNumber(uint16_t sequenceNumber)
uint16_t GetLength() const
void SetNPduNumberFlag(bool nPduNumberFlag)
void SetProtocolType(bool protocolType)
uint8_t GetVersion() const
uint8_t GetNPduNumber() const
void SetVersion(uint8_t version)
static TypeId GetTypeId()
Get the type ID.
uint8_t GetMessageType() const
uint32_t GetTeid() const