7#include "nr-epc-gtpc-header.h"
14NS_LOG_COMPONENT_DEFINE(
"NrGtpcHeader");
16NS_OBJECT_ENSURE_REGISTERED(NrGtpcHeader);
19static const uint8_t VERSION = 2;
24 static TypeId tid = TypeId(
"ns3::NrGtpcHeader")
31NrGtpcHeader::NrGtpcHeader()
40NrGtpcHeader::~NrGtpcHeader()
45NrGtpcHeader::GetInstanceTypeId()
const
51NrGtpcHeader::GetSerializedSize()
const
53 return m_teidFlag ? 12 : 8;
57NrGtpcHeader::Serialize(Buffer::Iterator start)
const
59 NS_FATAL_ERROR(
"Serialize GTP-C header is forbidden");
65 i.WriteU8((VERSION << 5) | (1 << 3));
66 i.WriteU8(m_messageType);
67 i.WriteHtonU16(m_messageLength);
68 i.WriteHtonU32(m_teid);
69 i.WriteU8((m_sequenceNumber & 0x00ff0000) >> 16);
70 i.WriteU8((m_sequenceNumber & 0x0000ff00) >> 8);
71 i.WriteU8(m_sequenceNumber & 0x000000ff);
76NrGtpcHeader::Deserialize(Buffer::Iterator start)
84 uint8_t firstByte = i.ReadU8();
85 uint8_t version = (firstByte >> 5) & 0x07;
88 NS_FATAL_ERROR(
"GTP-C version not supported");
92 m_teidFlag = ((firstByte >> 3) & 0x01) == 1;
95 NS_FATAL_ERROR(
"TEID is missing");
99 m_messageType = i.ReadU8();
100 m_messageLength = i.ReadNtohU16();
103 m_teid = i.ReadNtohU32();
105 m_sequenceNumber = i.ReadU8() << 16 | i.ReadU8() << 8 | i.ReadU8();
108 return NrGtpcHeader::GetSerializedSize();
112NrGtpcHeader::Print(std::ostream& os)
const
114 os <<
" messageType " << (uint32_t)m_messageType <<
" messageLength " << m_messageLength;
115 os <<
" TEID " << m_teid <<
" sequenceNumber " << m_sequenceNumber;
127 return m_messageType;
133 return m_messageLength;
145 return m_sequenceNumber;
151 m_messageType = messageType;
157 m_messageLength = messageLength;
165 m_messageLength = m_teidFlag ? 8 : 4;
171 m_sequenceNumber = sequenceNumber;
177 m_messageLength = iesLength;
178 m_messageLength += (m_teidFlag) ? 8 : 4;
195 i.WriteHtonU64(imsi);
201 uint8_t type = i.ReadU8();
202 NS_ASSERT_MSG(type == 1,
"Wrong IMSI IE type = " << (uint16_t)type);
203 uint16_t length = i.ReadNtohU16();
204 NS_ASSERT_MSG(length == 8,
"Wrong IMSI IE length");
205 uint8_t instance = i.ReadU8() & 0x0f;
206 NS_ASSERT_MSG(instance == 0,
"Wrong IMSI IE instance");
207 imsi = i.ReadNtohU64();
225 uint8_t type = i.ReadU8();
226 NS_ASSERT_MSG(type == 2,
"Wrong Cause IE type = " << (uint16_t)type);
227 uint16_t length = i.ReadNtohU16();
228 NS_ASSERT_MSG(length == 2,
"Wrong Cause IE length");
229 uint8_t instance = i.ReadU8() & 0x0f;
230 NS_ASSERT_MSG(instance == 0,
"Wrong Cause IE instance");
243 i.WriteU8(epsBearerId & 0x0f);
249 uint8_t type = i.ReadU8();
250 NS_ASSERT_MSG(type == 73,
"Wrong EBI IE type = " << (uint16_t)type);
251 uint16_t length = i.ReadNtohU16();
252 NS_ASSERT_MSG(length == 1,
"Wrong EBI IE length");
253 uint8_t instance = i.ReadU8();
254 NS_ASSERT_MSG(instance == 0,
"Wrong EBI IE instance");
255 epsBearerId = i.ReadU8() & 0x0f;
263 i.WriteU8((data >> 32) & 0xff);
264 i.WriteU8((data >> 24) & 0xff);
265 i.WriteU8((data >> 16) & 0xff);
266 i.WriteU8((data >> 8) & 0xff);
267 i.WriteU8((data >> 0) & 0xff);
274 retval |= i.ReadU8();
276 retval |= i.ReadU8();
278 retval |= i.ReadU8();
280 retval |= i.ReadU8();
282 retval |= i.ReadU8();
293 i.WriteU8(bearerQos.
qci);
303 uint8_t type = i.ReadU8();
304 NS_ASSERT_MSG(type == 80,
"Wrong Bearer QoS IE type = " << (uint16_t)type);
305 uint16_t length = i.ReadNtohU16();
306 NS_ASSERT_MSG(length == 22,
"Wrong Bearer QoS IE length");
307 uint8_t instance = i.ReadU8();
308 NS_ASSERT_MSG(instance == 0,
"Wrong Bearer QoS IE instance");
320 std::list<NrEpcTft::PacketFilter> packetFilters)
const
325 i.WriteU8(0x20 + (packetFilters.size() & 0x0f));
327 for (
auto& pf : packetFilters)
329 i.WriteU8((pf.direction << 4) & 0x30);
330 i.WriteU8(pf.precedence);
334 i.WriteHtonU32(pf.remoteAddress.Get());
335 i.WriteHtonU32(pf.remoteMask.Get());
337 i.WriteHtonU32(pf.localAddress.Get());
338 i.WriteHtonU32(pf.localMask.Get());
340 i.WriteHtonU16(pf.localPortStart);
341 i.WriteHtonU16(pf.localPortEnd);
343 i.WriteHtonU16(pf.remotePortStart);
344 i.WriteHtonU16(pf.remotePortEnd);
346 i.WriteU8(pf.typeOfService);
347 i.WriteU8(pf.typeOfServiceMask);
354 uint8_t type = i.ReadU8();
355 NS_ASSERT_MSG(type == 84,
"Wrong Bearer TFT IE type = " << (uint16_t)type);
358 uint8_t numberOfPacketFilters = i.ReadU8() & 0x0f;
360 for (uint8_t pf = 0; pf < numberOfPacketFilters; ++pf)
368 packetFilter.
remoteMask = Ipv4Mask(i.ReadNtohU32());
370 packetFilter.
localAddress = Ipv4Address(i.ReadNtohU32());
371 packetFilter.
localMask = Ipv4Mask(i.ReadNtohU32());
381 epcTft->Add(packetFilter);
403 i.WriteHtonU32(uliEcgi);
409 uint8_t type = i.ReadU8();
410 NS_ASSERT_MSG(type == 86,
"Wrong ULI ECGI IE type = " << (uint16_t)type);
411 uint16_t length = i.ReadNtohU16();
412 NS_ASSERT_MSG(length == 8,
"Wrong ULI ECGI IE length");
413 uint8_t instance = i.ReadU8() & 0x0f;
414 NS_ASSERT_MSG(instance == 0,
"Wrong ULI ECGI IE instance");
416 uliEcgi = i.ReadNtohU32() & 0x0fffffff;
428 i.WriteHtonU32(fteid.
teid);
429 i.WriteHtonU32(fteid.
addr.Get());
435 uint8_t type = i.ReadU8();
436 NS_ASSERT_MSG(type == 87,
"Wrong FTEID IE type = " << (uint16_t)type);
437 uint16_t length = i.ReadNtohU16();
438 NS_ASSERT_MSG(length == 9,
"Wrong FTEID IE length");
439 uint8_t instance = i.ReadU8() & 0x0f;
440 NS_ASSERT_MSG(instance == 0,
"Wrong FTEID IE instance");
441 uint8_t flags = i.ReadU8();
443 fteid.
teid = i.ReadNtohU32();
444 fteid.
addr.Set(i.ReadNtohU32());
460 uint8_t type = i.ReadU8();
461 NS_ASSERT_MSG(type == 93,
"Wrong Bearer Context IE type = " << (uint16_t)type);
462 length = i.ReadNtohU16();
463 uint8_t instance = i.ReadU8() & 0x0f;
464 NS_ASSERT_MSG(instance == 0,
"Wrong Bearer Context IE instance");
474 static TypeId tid = TypeId(
"ns3::NrGtpcCreateSessionRequestMessage")
481NrGtpcCreateSessionRequestMessage::NrGtpcCreateSessionRequestMessage()
487 m_senderCpFteid = {};
490NrGtpcCreateSessionRequestMessage::~NrGtpcCreateSessionRequestMessage()
495NrGtpcCreateSessionRequestMessage::GetInstanceTypeId()
const
504 for (
auto& bc : m_bearerContextsToBeCreated)
511 return serializedSize;
515NrGtpcCreateSessionRequestMessage::GetSerializedSize()
const
521NrGtpcCreateSessionRequestMessage::Serialize(Buffer::Iterator start)
const
523 Buffer::Iterator i = start;
530 for (
auto& bc : m_bearerContextsToBeCreated)
532 std::list<NrEpcTft::PacketFilter> packetFilters = bc.tft->GetPacketFilters();
546NrGtpcCreateSessionRequestMessage::Deserialize(Buffer::Iterator start)
548 Buffer::Iterator i = start;
555 m_bearerContextsToBeCreated.clear();
556 while (i.GetRemainingSize() > 0)
561 BearerContextToBeCreated bearerContext;
564 Ptr<NrEpcTft> epcTft = Create<NrEpcTft>();
566 bearerContext.tft = epcTft;
571 m_bearerContextsToBeCreated.push_back(bearerContext);
574 return GetSerializedSize();
578NrGtpcCreateSessionRequestMessage::Print(std::ostream& os)
const
580 os <<
" imsi " << m_imsi <<
" uliEcgi " << m_uliEcgi;
610 return m_senderCpFteid;
616 m_senderCpFteid = fteid;
619std::list<NrGtpcCreateSessionRequestMessage::BearerContextToBeCreated>
622 return m_bearerContextsToBeCreated;
627 std::list<NrGtpcCreateSessionRequestMessage::BearerContextToBeCreated> bearerContexts)
629 m_bearerContextsToBeCreated = bearerContexts;
637 static TypeId tid = TypeId(
"ns3::NrGtpcCreateSessionResponseMessage")
644NrGtpcCreateSessionResponseMessage::NrGtpcCreateSessionResponseMessage()
648 m_cause = Cause_t::RESERVED;
649 m_senderCpFteid = {};
652NrGtpcCreateSessionResponseMessage::~NrGtpcCreateSessionResponseMessage()
657NrGtpcCreateSessionResponseMessage::GetInstanceTypeId()
const
666 for (
auto& bc : m_bearerContextsCreated)
673 return serializedSize;
677NrGtpcCreateSessionResponseMessage::GetSerializedSize()
const
683NrGtpcCreateSessionResponseMessage::Serialize(Buffer::Iterator start)
const
685 Buffer::Iterator i = start;
691 for (
auto& bc : m_bearerContextsCreated)
693 std::list<NrEpcTft::PacketFilter> packetFilters = bc.tft->GetPacketFilters();
707NrGtpcCreateSessionResponseMessage::Deserialize(Buffer::Iterator start)
709 Buffer::Iterator i = start;
715 m_bearerContextsCreated.clear();
716 while (i.GetRemainingSize() > 0)
718 BearerContextCreated bearerContext;
724 Ptr<NrEpcTft> epcTft = Create<NrEpcTft>();
726 bearerContext.tft = epcTft;
731 m_bearerContextsCreated.push_back(bearerContext);
734 return GetSerializedSize();
738NrGtpcCreateSessionResponseMessage::Print(std::ostream& os)
const
740 os <<
" cause " << m_cause <<
" FTEID " << m_senderCpFteid.
addr <<
"," << m_senderCpFteid.
teid;
758 return m_senderCpFteid;
764 m_senderCpFteid = fteid;
767std::list<NrGtpcCreateSessionResponseMessage::BearerContextCreated>
770 return m_bearerContextsCreated;
775 std::list<NrGtpcCreateSessionResponseMessage::BearerContextCreated> bearerContexts)
777 m_bearerContextsCreated = bearerContexts;
785 static TypeId tid = TypeId(
"ns3::NrGtpcModifyBearerRequestMessage")
792NrGtpcModifyBearerRequestMessage::NrGtpcModifyBearerRequestMessage()
800NrGtpcModifyBearerRequestMessage::~NrGtpcModifyBearerRequestMessage()
805NrGtpcModifyBearerRequestMessage::GetInstanceTypeId()
const
813 uint32_t serializedSize =
815 m_bearerContextsToBeModified.size() *
817 return serializedSize;
821NrGtpcModifyBearerRequestMessage::GetSerializedSize()
const
827NrGtpcModifyBearerRequestMessage::Serialize(Buffer::Iterator start)
const
829 Buffer::Iterator i = start;
835 for (
auto& bc : m_bearerContextsToBeModified)
845NrGtpcModifyBearerRequestMessage::Deserialize(Buffer::Iterator start)
847 Buffer::Iterator i = start;
853 while (i.GetRemainingSize() > 0)
855 BearerContextToBeModified bearerContext;
863 m_bearerContextsToBeModified.push_back(bearerContext);
866 return GetSerializedSize();
870NrGtpcModifyBearerRequestMessage::Print(std::ostream& os)
const
872 os <<
" imsi " << m_imsi <<
" uliEcgi " << m_uliEcgi;
899std::list<NrGtpcModifyBearerRequestMessage::BearerContextToBeModified>
902 return m_bearerContextsToBeModified;
907 std::list<NrGtpcModifyBearerRequestMessage::BearerContextToBeModified> bearerContexts)
909 m_bearerContextsToBeModified = bearerContexts;
917 static TypeId tid = TypeId(
"ns3::NrGtpcModifyBearerResponseMessage")
924NrGtpcModifyBearerResponseMessage::NrGtpcModifyBearerResponseMessage()
928 m_cause = Cause_t::RESERVED;
931NrGtpcModifyBearerResponseMessage::~NrGtpcModifyBearerResponseMessage()
936NrGtpcModifyBearerResponseMessage::GetInstanceTypeId()
const
948NrGtpcModifyBearerResponseMessage::GetSerializedSize()
const
954NrGtpcModifyBearerResponseMessage::Serialize(Buffer::Iterator start)
const
956 Buffer::Iterator i = start;
963NrGtpcModifyBearerResponseMessage::Deserialize(Buffer::Iterator start)
965 Buffer::Iterator i = start;
970 return GetSerializedSize();
974NrGtpcModifyBearerResponseMessage::Print(std::ostream& os)
const
976 os <<
" cause " << (uint16_t)m_cause;
996 static TypeId tid = TypeId(
"ns3::NrGtpcDeleteBearerCommandMessage")
1003NrGtpcDeleteBearerCommandMessage::NrGtpcDeleteBearerCommandMessage()
1009NrGtpcDeleteBearerCommandMessage::~NrGtpcDeleteBearerCommandMessage()
1014NrGtpcDeleteBearerCommandMessage::GetInstanceTypeId()
const
1022 uint32_t serializedSize =
1024 return serializedSize;
1028NrGtpcDeleteBearerCommandMessage::GetSerializedSize()
const
1034NrGtpcDeleteBearerCommandMessage::Serialize(Buffer::Iterator start)
const
1036 Buffer::Iterator i = start;
1039 for (
auto& bearerContext : m_bearerContexts)
1048NrGtpcDeleteBearerCommandMessage::Deserialize(Buffer::Iterator start)
1050 Buffer::Iterator i = start;
1053 while (i.GetRemainingSize() > 0)
1058 BearerContext bearerContext;
1060 m_bearerContexts.push_back(bearerContext);
1063 return GetSerializedSize();
1067NrGtpcDeleteBearerCommandMessage::Print(std::ostream& os)
const
1069 os <<
" bearerContexts [";
1070 for (
auto& bearerContext : m_bearerContexts)
1072 os << (uint16_t)bearerContext.m_epsBearerId <<
" ";
1077std::list<NrGtpcDeleteBearerCommandMessage::BearerContext>
1080 return m_bearerContexts;
1085 std::list<NrGtpcDeleteBearerCommandMessage::BearerContext> bearerContexts)
1087 m_bearerContexts = bearerContexts;
1095 static TypeId tid = TypeId(
"ns3::NrGtpcDeleteBearerRequestMessage")
1096 .SetParent<Header>()
1102NrGtpcDeleteBearerRequestMessage::NrGtpcDeleteBearerRequestMessage()
1108NrGtpcDeleteBearerRequestMessage::~NrGtpcDeleteBearerRequestMessage()
1113NrGtpcDeleteBearerRequestMessage::GetInstanceTypeId()
const
1122 return serializedSize;
1126NrGtpcDeleteBearerRequestMessage::GetSerializedSize()
const
1132NrGtpcDeleteBearerRequestMessage::Serialize(Buffer::Iterator start)
const
1134 Buffer::Iterator i = start;
1137 for (
auto& epsBearerId : m_epsBearerIds)
1144NrGtpcDeleteBearerRequestMessage::Deserialize(Buffer::Iterator start)
1146 Buffer::Iterator i = start;
1149 while (i.GetRemainingSize() > 0)
1151 uint8_t epsBearerId;
1153 m_epsBearerIds.push_back(epsBearerId);
1156 return GetSerializedSize();
1160NrGtpcDeleteBearerRequestMessage::Print(std::ostream& os)
const
1162 os <<
" epsBearerIds [";
1163 for (
auto& epsBearerId : m_epsBearerIds)
1165 os << (uint16_t)epsBearerId <<
" ";
1173 return m_epsBearerIds;
1179 m_epsBearerIds = epsBearerId;
1187 static TypeId tid = TypeId(
"ns3::NrGtpcDeleteBearerResponseMessage")
1188 .SetParent<Header>()
1194NrGtpcDeleteBearerResponseMessage::NrGtpcDeleteBearerResponseMessage()
1198 m_cause = Cause_t::RESERVED;
1201NrGtpcDeleteBearerResponseMessage::~NrGtpcDeleteBearerResponseMessage()
1206NrGtpcDeleteBearerResponseMessage::GetInstanceTypeId()
const
1215 return serializedSize;
1219NrGtpcDeleteBearerResponseMessage::GetSerializedSize()
const
1225NrGtpcDeleteBearerResponseMessage::Serialize(Buffer::Iterator start)
const
1227 Buffer::Iterator i = start;
1232 for (
auto& epsBearerId : m_epsBearerIds)
1239NrGtpcDeleteBearerResponseMessage::Deserialize(Buffer::Iterator start)
1241 Buffer::Iterator i = start;
1246 while (i.GetRemainingSize() > 0)
1248 uint8_t epsBearerId;
1250 m_epsBearerIds.push_back(epsBearerId);
1253 return GetSerializedSize();
1257NrGtpcDeleteBearerResponseMessage::Print(std::ostream& os)
const
1259 os <<
" cause " << (uint16_t)m_cause <<
" epsBearerIds [";
1260 for (
auto& epsBearerId : m_epsBearerIds)
1262 os << (uint16_t)epsBearerId <<
" ";
1282 return m_epsBearerIds;
1288 m_epsBearerIds = epsBearerId;
This class contains the specification of EPS Bearers.
Qci qci
Qos class indicator.
NrGbrQosInformation gbrQosInfo
GBR QOS information.
NrGtpcHeader::Fteid_t GetSenderCpFteid() const
void SetSenderCpFteid(NrGtpcHeader::Fteid_t fteid)
void SetImsi(uint64_t imsi)
void SetUliEcgi(uint32_t uliEcgi)
uint32_t GetMessageSize() const override
std::list< BearerContextToBeCreated > GetBearerContextsToBeCreated() const
void SetBearerContextsToBeCreated(std::list< BearerContextToBeCreated > bearerContexts)
uint32_t GetUliEcgi() const
static TypeId GetTypeId()
Get the type ID.
uint32_t GetMessageSize() const override
void SetCause(Cause_t cause)
static TypeId GetTypeId()
Get the type ID.
void SetBearerContextsCreated(std::list< BearerContextCreated > bearerContexts)
std::list< BearerContextCreated > GetBearerContextsCreated() const
void SetSenderCpFteid(NrGtpcHeader::Fteid_t fteid)
NrGtpcHeader::Fteid_t GetSenderCpFteid() const
void SetBearerContexts(std::list< BearerContext > bearerContexts)
uint32_t GetMessageSize() const override
static TypeId GetTypeId()
Get the type ID.
std::list< BearerContext > GetBearerContexts() const
uint32_t GetMessageSize() const override
void SetEpsBearerIds(std::list< uint8_t > epsBearerIds)
std::list< uint8_t > GetEpsBearerIds() const
static TypeId GetTypeId()
Get the type ID.
std::list< uint8_t > GetEpsBearerIds() const
static TypeId GetTypeId()
Get the type ID.
void SetEpsBearerIds(std::list< uint8_t > epsBearerIds)
void SetCause(Cause_t cause)
uint32_t GetMessageSize() const override
uint32_t DeserializeUliEcgi(Buffer::Iterator &i, uint32_t &uliEcgi) const
const uint32_t serializedSizeEbi
EBI serialized size.
void SerializeEbi(Buffer::Iterator &i, uint8_t epsBearerId) const
void SerializeUliEcgi(Buffer::Iterator &i, uint32_t uliEcgi) const
uint32_t DeserializeBearerQos(Buffer::Iterator &i, NrEpsBearer &bearerQos)
uint32_t DeserializeEbi(Buffer::Iterator &i, uint8_t &epsBearerId) const
uint32_t DeserializeImsi(Buffer::Iterator &i, uint64_t &imsi) const
const uint32_t serializedSizeCause
Cause serialized size.
void SerializeCause(Buffer::Iterator &i, Cause_t cause) const
const uint32_t serializedSizeFteid
Fteid serialized size.
void SerializeBearerTft(Buffer::Iterator &i, std::list< NrEpcTft::PacketFilter > packetFilters) const
uint64_t ReadNtohU40(Buffer::Iterator &i)
const uint32_t serializedSizeUliEcgi
UliEcgi serialized size.
uint32_t DeserializeCause(Buffer::Iterator &i, Cause_t &cause) const
void SerializeBearerQos(Buffer::Iterator &i, NrEpsBearer bearerQos) const
uint32_t DeserializeFteid(Buffer::Iterator &i, NrGtpcHeader::Fteid_t &fteid) const
void SerializeFteid(Buffer::Iterator &i, NrGtpcHeader::Fteid_t fteid) const
const uint32_t serializedSizePacketFilter
Packet filter serialized size.
const uint32_t serializedSizeBearerContextHeader
Fteid serialized size.
void SerializeImsi(Buffer::Iterator &i, uint64_t imsi) const
const uint32_t serializedSizeImsi
IMSI serialized size.
uint32_t GetSerializedSizeBearerTft(std::list< NrEpcTft::PacketFilter > packetFilters) const
void SerializeBearerContextHeader(Buffer::Iterator &i, uint16_t length) const
const uint32_t serializedSizeBearerQos
Bearer QoS serialized size.
uint32_t DeserializeBearerContextHeader(Buffer::Iterator &i, uint16_t &length) const
uint32_t DeserializeBearerTft(Buffer::Iterator &i, Ptr< NrEpcTft > epcTft) const
void WriteHtonU40(Buffer::Iterator &i, uint64_t data) const
uint32_t GetUliEcgi() const
void SetBearerContextsToBeModified(std::list< BearerContextToBeModified > bearerContexts)
std::list< BearerContextToBeModified > GetBearerContextsToBeModified() const
static TypeId GetTypeId()
Get the type ID.
void SetUliEcgi(uint32_t uliEcgi)
uint32_t GetMessageSize() const override
void SetImsi(uint64_t imsi)
void SetCause(Cause_t cause)
static TypeId GetTypeId()
Get the type ID.
uint32_t GetMessageSize() const override
Direction direction
Whether the filter needs to be applied to uplink / downlink only, or in both cases.
uint16_t remotePortEnd
end of the port number range of the remote host
uint16_t localPortStart
start of the port number range of the UE
Ipv4Mask localMask
IPv4 address mask of the UE.
Ipv4Address remoteAddress
IPv4 address of the remote host.
Ipv4Address localAddress
IPv4 address of the UE.
uint8_t typeOfServiceMask
type of service field mask
uint16_t remotePortStart
start of the port number range of the remote host
Ipv4Mask remoteMask
IPv4 address mask of the remote host.
uint8_t typeOfService
type of service field
uint16_t localPortEnd
end of the port number range of the UE