5G-LENA nr-v3.3-161-gad18933f
The 5G/NR module for the ns-3 simulator
Loading...
Searching...
No Matches
nr-epc-gtpc-header.cc
1// Copyright (c) 2018 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
2//
3// SPDX-License-Identifier: GPL-2.0-only
4//
5// Author: Manuel Requena <manuel.requena@cttc.es>
6
7#include "nr-epc-gtpc-header.h"
8
9#include "ns3/log.h"
10
11namespace ns3
12{
13
14NS_LOG_COMPONENT_DEFINE("NrGtpcHeader");
15
16NS_OBJECT_ENSURE_REGISTERED(NrGtpcHeader);
17
19static const uint8_t VERSION = 2;
20
21TypeId
23{
24 static TypeId tid = TypeId("ns3::NrGtpcHeader")
25 .SetParent<Header>()
26 .SetGroupName("Nr")
27 .AddConstructor<NrGtpcHeader>();
28 return tid;
29}
30
31NrGtpcHeader::NrGtpcHeader()
32 : m_teidFlag(false),
33 m_messageType(0),
34 m_messageLength(4),
35 m_teid(0),
36 m_sequenceNumber(0)
37{
38}
39
40NrGtpcHeader::~NrGtpcHeader()
41{
42}
43
44TypeId
45NrGtpcHeader::GetInstanceTypeId() const
46{
47 return GetTypeId();
48}
49
50uint32_t
51NrGtpcHeader::GetSerializedSize() const
52{
53 return m_teidFlag ? 12 : 8;
54}
55
56void
57NrGtpcHeader::Serialize(Buffer::Iterator start) const
58{
59 NS_FATAL_ERROR("Serialize GTP-C header is forbidden");
60}
61
62void
63NrGtpcHeader::PreSerialize(Buffer::Iterator& i) const
64{
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);
72 i.WriteU8(0);
73}
74
75uint32_t
76NrGtpcHeader::Deserialize(Buffer::Iterator start)
77{
78 return PreDeserialize(start);
79}
80
81uint32_t
82NrGtpcHeader::PreDeserialize(Buffer::Iterator& i)
83{
84 uint8_t firstByte = i.ReadU8();
85 uint8_t version = (firstByte >> 5) & 0x07;
86 if (version != 2)
87 {
88 NS_FATAL_ERROR("GTP-C version not supported");
89 return 0;
90 }
91
92 m_teidFlag = ((firstByte >> 3) & 0x01) == 1;
93 if (!m_teidFlag)
94 {
95 NS_FATAL_ERROR("TEID is missing");
96 return 0;
97 }
98
99 m_messageType = i.ReadU8();
100 m_messageLength = i.ReadNtohU16();
101 if (m_teidFlag)
102 {
103 m_teid = i.ReadNtohU32();
104 }
105 m_sequenceNumber = i.ReadU8() << 16 | i.ReadU8() << 8 | i.ReadU8();
106 i.ReadU8();
107
108 return NrGtpcHeader::GetSerializedSize();
109}
110
111void
112NrGtpcHeader::Print(std::ostream& os) const
113{
114 os << " messageType " << (uint32_t)m_messageType << " messageLength " << m_messageLength;
115 os << " TEID " << m_teid << " sequenceNumber " << m_sequenceNumber;
116}
117
118uint32_t
120{
121 return 0;
122}
123
124uint8_t
126{
127 return m_messageType;
128}
129
130uint16_t
132{
133 return m_messageLength;
134}
135
136uint32_t
138{
139 return m_teid;
140}
141
142uint32_t
144{
145 return m_sequenceNumber;
146}
147
148void
150{
151 m_messageType = messageType;
152}
153
154void
155NrGtpcHeader::SetMessageLength(uint16_t messageLength)
156{
157 m_messageLength = messageLength;
158}
159
160void
162{
163 m_teidFlag = true;
164 m_teid = teid;
165 m_messageLength = m_teidFlag ? 8 : 4;
166}
167
168void
169NrGtpcHeader::SetSequenceNumber(uint32_t sequenceNumber)
170{
171 m_sequenceNumber = sequenceNumber;
172}
173
174void
175NrGtpcHeader::SetIesLength(uint16_t iesLength)
176{
177 m_messageLength = iesLength;
178 m_messageLength += (m_teidFlag) ? 8 : 4;
179}
180
181void
186
188
189void
190NrGtpcIes::SerializeImsi(Buffer::Iterator& i, uint64_t imsi) const
191{
192 i.WriteU8(1); // IE Type = IMSI
193 i.WriteHtonU16(8); // Length
194 i.WriteU8(0); // Spare + Instance
195 i.WriteHtonU64(imsi);
196}
197
198uint32_t
199NrGtpcIes::DeserializeImsi(Buffer::Iterator& i, uint64_t& imsi) const
200{
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();
208
209 return serializedSizeImsi;
210}
211
212void
213NrGtpcIes::SerializeCause(Buffer::Iterator& i, Cause_t cause) const
214{
215 i.WriteU8(2); // IE Type = Cause
216 i.WriteHtonU16(2); // Length
217 i.WriteU8(0); // Spare + Instance
218 i.WriteU8(cause); // Cause value
219 i.WriteU8(0); // Spare + CS
220}
221
222uint32_t
223NrGtpcIes::DeserializeCause(Buffer::Iterator& i, Cause_t& cause) const
224{
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");
231 cause = Cause_t(i.ReadU8());
232 i.ReadU8();
233
234 return serializedSizeCause;
235}
236
237void
238NrGtpcIes::SerializeEbi(Buffer::Iterator& i, uint8_t epsBearerId) const
239{
240 i.WriteU8(73); // IE Type = EPS Bearer ID (EBI)
241 i.WriteHtonU16(1); // Length
242 i.WriteU8(0); // Spare + Instance
243 i.WriteU8(epsBearerId & 0x0f);
244}
245
246uint32_t
247NrGtpcIes::DeserializeEbi(Buffer::Iterator& i, uint8_t& epsBearerId) const
248{
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;
256
257 return serializedSizeEbi;
258}
259
260void
261NrGtpcIes::WriteHtonU40(Buffer::Iterator& i, uint64_t data) const
262{
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);
268}
269
270uint64_t
271NrGtpcIes::ReadNtohU40(Buffer::Iterator& i)
272{
273 uint64_t retval = 0;
274 retval |= i.ReadU8();
275 retval <<= 8;
276 retval |= i.ReadU8();
277 retval <<= 8;
278 retval |= i.ReadU8();
279 retval <<= 8;
280 retval |= i.ReadU8();
281 retval <<= 8;
282 retval |= i.ReadU8();
283 return retval;
284}
285
286void
287NrGtpcIes::SerializeBearerQos(Buffer::Iterator& i, NrEpsBearer bearerQos) const
288{
289 i.WriteU8(80); // IE Type = Bearer QoS
290 i.WriteHtonU16(22); // Length
291 i.WriteU8(0); // Spare + Instance
292 i.WriteU8(0); // MRE TODO: bearerQos.arp
293 i.WriteU8(bearerQos.qci);
294 WriteHtonU40(i, bearerQos.gbrQosInfo.mbrUl);
295 WriteHtonU40(i, bearerQos.gbrQosInfo.mbrDl);
296 WriteHtonU40(i, bearerQos.gbrQosInfo.gbrUl);
297 WriteHtonU40(i, bearerQos.gbrQosInfo.gbrDl);
298}
299
300uint32_t
301NrGtpcIes::DeserializeBearerQos(Buffer::Iterator& i, NrEpsBearer& bearerQos)
302{
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");
309 i.ReadU8();
310 bearerQos.qci = NrEpsBearer::Qci(i.ReadU8());
311 bearerQos.gbrQosInfo.mbrUl = ReadNtohU40(i);
312 bearerQos.gbrQosInfo.mbrDl = ReadNtohU40(i);
313 bearerQos.gbrQosInfo.gbrUl = ReadNtohU40(i);
314 bearerQos.gbrQosInfo.gbrDl = ReadNtohU40(i);
316}
317
318void
320 std::list<NrEpcTft::PacketFilter> packetFilters) const
321{
322 i.WriteU8(84); // IE Type = EPS Bearer Level Fraffic Flow Template (Bearer TFT)
323 i.WriteHtonU16(1 + packetFilters.size() * serializedSizePacketFilter);
324 i.WriteU8(0); // Spare + Instance
325 i.WriteU8(0x20 + (packetFilters.size() & 0x0f)); // Create new TFT + Number of packet filters
326
327 for (auto& pf : packetFilters)
328 {
329 i.WriteU8((pf.direction << 4) & 0x30);
330 i.WriteU8(pf.precedence);
331 i.WriteU8(serializedSizePacketFilter - 3); // Length of Packet filter contents
332
333 i.WriteU8(0x10); // IPv4 remote address type
334 i.WriteHtonU32(pf.remoteAddress.Get());
335 i.WriteHtonU32(pf.remoteMask.Get());
336 i.WriteU8(0x11); // IPv4 local address type
337 i.WriteHtonU32(pf.localAddress.Get());
338 i.WriteHtonU32(pf.localMask.Get());
339 i.WriteU8(0x41); // Local port range type
340 i.WriteHtonU16(pf.localPortStart);
341 i.WriteHtonU16(pf.localPortEnd);
342 i.WriteU8(0x51); // Remote port range type
343 i.WriteHtonU16(pf.remotePortStart);
344 i.WriteHtonU16(pf.remotePortEnd);
345 i.WriteU8(0x70); // Type of service
346 i.WriteU8(pf.typeOfService);
347 i.WriteU8(pf.typeOfServiceMask);
348 }
349}
350
351uint32_t
352NrGtpcIes::DeserializeBearerTft(Buffer::Iterator& i, Ptr<NrEpcTft> epcTft) const
353{
354 uint8_t type = i.ReadU8();
355 NS_ASSERT_MSG(type == 84, "Wrong Bearer TFT IE type = " << (uint16_t)type);
356 i.ReadNtohU16();
357 i.ReadU8();
358 uint8_t numberOfPacketFilters = i.ReadU8() & 0x0f;
359
360 for (uint8_t pf = 0; pf < numberOfPacketFilters; ++pf)
361 {
362 NrEpcTft::PacketFilter packetFilter;
363 packetFilter.direction = NrEpcTft::Direction((i.ReadU8() & 0x30) >> 4);
364 packetFilter.precedence = i.ReadU8();
365 i.ReadU8(); // Length of Packet filter contents
366 i.ReadU8();
367 packetFilter.remoteAddress = Ipv4Address(i.ReadNtohU32());
368 packetFilter.remoteMask = Ipv4Mask(i.ReadNtohU32());
369 i.ReadU8();
370 packetFilter.localAddress = Ipv4Address(i.ReadNtohU32());
371 packetFilter.localMask = Ipv4Mask(i.ReadNtohU32());
372 i.ReadU8();
373 packetFilter.localPortStart = i.ReadNtohU16();
374 packetFilter.localPortEnd = i.ReadNtohU16();
375 i.ReadU8();
376 packetFilter.remotePortStart = i.ReadNtohU16();
377 packetFilter.remotePortEnd = i.ReadNtohU16();
378 i.ReadU8();
379 packetFilter.typeOfService = i.ReadU8();
380 packetFilter.typeOfServiceMask = i.ReadU8();
381 epcTft->Add(packetFilter);
382 }
383
384 return GetSerializedSizeBearerTft(epcTft->GetPacketFilters());
385}
386
387uint32_t
388NrGtpcIes::GetSerializedSizeBearerTft(std::list<NrEpcTft::PacketFilter> packetFilters) const
389{
390 return (5 + packetFilters.size() * serializedSizePacketFilter);
391}
392
393void
394NrGtpcIes::SerializeUliEcgi(Buffer::Iterator& i, uint32_t uliEcgi) const
395{
396 i.WriteU8(86); // IE Type = ULI (ECGI)
397 i.WriteHtonU16(8); // Length
398 i.WriteU8(0); // Spare + Instance
399 i.WriteU8(0x10); // ECGI flag
400 i.WriteU8(0); // Dummy MCC and MNC
401 i.WriteU8(0); // Dummy MCC and MNC
402 i.WriteU8(0); // Dummy MCC and MNC
403 i.WriteHtonU32(uliEcgi);
404}
405
406uint32_t
407NrGtpcIes::DeserializeUliEcgi(Buffer::Iterator& i, uint32_t& uliEcgi) const
408{
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");
415 i.Next(4);
416 uliEcgi = i.ReadNtohU32() & 0x0fffffff;
417
419}
420
421void
422NrGtpcIes::SerializeFteid(Buffer::Iterator& i, NrGtpcHeader::Fteid_t fteid) const
423{
424 i.WriteU8(87); // IE Type = Fully Qualified TEID (F-TEID)
425 i.WriteHtonU16(9); // Length
426 i.WriteU8(0); // Spare + Instance
427 i.WriteU8(0x80 | ((uint8_t)fteid.interfaceType & 0x1f)); // IP version flag + Iface type
428 i.WriteHtonU32(fteid.teid); // TEID
429 i.WriteHtonU32(fteid.addr.Get()); // IPv4 address
430}
431
432uint32_t
433NrGtpcIes::DeserializeFteid(Buffer::Iterator& i, NrGtpcHeader::Fteid_t& fteid) const
434{
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(); // IP version flag + Iface type
442 fteid.interfaceType = NrGtpcHeader::InterfaceType_t(flags & 0x1f);
443 fteid.teid = i.ReadNtohU32(); // TEID
444 fteid.addr.Set(i.ReadNtohU32()); // IPv4 address
445
446 return serializedSizeFteid;
447}
448
449void
450NrGtpcIes::SerializeBearerContextHeader(Buffer::Iterator& i, uint16_t length) const
451{
452 i.WriteU8(93); // IE Type = Bearer Context
453 i.WriteU16(length);
454 i.WriteU8(0); // Spare + Instance
455}
456
457uint32_t
458NrGtpcIes::DeserializeBearerContextHeader(Buffer::Iterator& i, uint16_t& length) const
459{
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");
465
467}
468
470
471TypeId
473{
474 static TypeId tid = TypeId("ns3::NrGtpcCreateSessionRequestMessage")
475 .SetParent<Header>()
476 .SetGroupName("Nr")
477 .AddConstructor<NrGtpcCreateSessionRequestMessage>();
478 return tid;
479}
480
481NrGtpcCreateSessionRequestMessage::NrGtpcCreateSessionRequestMessage()
482{
483 SetMessageType(NrGtpcHeader::CreateSessionRequest);
485 m_imsi = 0;
486 m_uliEcgi = 0;
487 m_senderCpFteid = {};
488}
489
490NrGtpcCreateSessionRequestMessage::~NrGtpcCreateSessionRequestMessage()
491{
492}
493
494TypeId
495NrGtpcCreateSessionRequestMessage::GetInstanceTypeId() const
496{
497 return GetTypeId();
498}
499
500uint32_t
502{
504 for (auto& bc : m_bearerContextsToBeCreated)
505 {
507 GetSerializedSizeBearerTft(bc.tft->GetPacketFilters()) +
509 }
510
511 return serializedSize;
512}
513
514uint32_t
515NrGtpcCreateSessionRequestMessage::GetSerializedSize() const
516{
517 return NrGtpcHeader::GetSerializedSize() + GetMessageSize();
518}
519
520void
521NrGtpcCreateSessionRequestMessage::Serialize(Buffer::Iterator start) const
522{
523 Buffer::Iterator i = start;
524
526 SerializeImsi(i, m_imsi);
527 SerializeUliEcgi(i, m_uliEcgi);
528 SerializeFteid(i, m_senderCpFteid);
529
530 for (auto& bc : m_bearerContextsToBeCreated)
531 {
532 std::list<NrEpcTft::PacketFilter> packetFilters = bc.tft->GetPacketFilters();
533
537
538 SerializeEbi(i, bc.epsBearerId);
539 SerializeBearerTft(i, packetFilters);
540 SerializeFteid(i, bc.sgwS5uFteid);
541 SerializeBearerQos(i, bc.bearerLevelQos);
542 }
543}
544
545uint32_t
546NrGtpcCreateSessionRequestMessage::Deserialize(Buffer::Iterator start)
547{
548 Buffer::Iterator i = start;
550
551 DeserializeImsi(i, m_imsi);
552 DeserializeUliEcgi(i, m_uliEcgi);
553 DeserializeFteid(i, m_senderCpFteid);
554
555 m_bearerContextsToBeCreated.clear();
556 while (i.GetRemainingSize() > 0)
557 {
558 uint16_t length;
560
561 BearerContextToBeCreated bearerContext;
562 DeserializeEbi(i, bearerContext.epsBearerId);
563
564 Ptr<NrEpcTft> epcTft = Create<NrEpcTft>();
565 DeserializeBearerTft(i, epcTft);
566 bearerContext.tft = epcTft;
567
568 DeserializeFteid(i, bearerContext.sgwS5uFteid);
569 DeserializeBearerQos(i, bearerContext.bearerLevelQos);
570
571 m_bearerContextsToBeCreated.push_back(bearerContext);
572 }
573
574 return GetSerializedSize();
575}
576
577void
578NrGtpcCreateSessionRequestMessage::Print(std::ostream& os) const
579{
580 os << " imsi " << m_imsi << " uliEcgi " << m_uliEcgi;
581}
582
583uint64_t
585{
586 return m_imsi;
587}
588
589void
591{
592 m_imsi = imsi;
593}
594
595uint32_t
597{
598 return m_uliEcgi;
599}
600
601void
603{
604 m_uliEcgi = uliEcgi;
605}
606
609{
610 return m_senderCpFteid;
611}
612
613void
618
619std::list<NrGtpcCreateSessionRequestMessage::BearerContextToBeCreated>
621{
622 return m_bearerContextsToBeCreated;
623}
624
625void
627 std::list<NrGtpcCreateSessionRequestMessage::BearerContextToBeCreated> bearerContexts)
628{
629 m_bearerContextsToBeCreated = bearerContexts;
630}
631
633
634TypeId
636{
637 static TypeId tid = TypeId("ns3::NrGtpcCreateSessionResponseMessage")
638 .SetParent<Header>()
639 .SetGroupName("Nr")
640 .AddConstructor<NrGtpcCreateSessionResponseMessage>();
641 return tid;
642}
643
644NrGtpcCreateSessionResponseMessage::NrGtpcCreateSessionResponseMessage()
645{
646 SetMessageType(NrGtpcHeader::CreateSessionResponse);
648 m_cause = Cause_t::RESERVED;
649 m_senderCpFteid = {};
650}
651
652NrGtpcCreateSessionResponseMessage::~NrGtpcCreateSessionResponseMessage()
653{
654}
655
656TypeId
657NrGtpcCreateSessionResponseMessage::GetInstanceTypeId() const
658{
659 return GetTypeId();
660}
661
662uint32_t
664{
665 uint32_t serializedSize = serializedSizeCause + serializedSizeFteid;
666 for (auto& bc : m_bearerContextsCreated)
667 {
669 GetSerializedSizeBearerTft(bc.tft->GetPacketFilters()) +
671 }
672
673 return serializedSize;
674}
675
676uint32_t
677NrGtpcCreateSessionResponseMessage::GetSerializedSize() const
678{
679 return NrGtpcHeader::GetSerializedSize() + GetMessageSize();
680}
681
682void
683NrGtpcCreateSessionResponseMessage::Serialize(Buffer::Iterator start) const
684{
685 Buffer::Iterator i = start;
686
688 SerializeCause(i, m_cause);
689 SerializeFteid(i, m_senderCpFteid);
690
691 for (auto& bc : m_bearerContextsCreated)
692 {
693 std::list<NrEpcTft::PacketFilter> packetFilters = bc.tft->GetPacketFilters();
694
698
699 SerializeEbi(i, bc.epsBearerId);
700 SerializeBearerTft(i, packetFilters);
701 SerializeFteid(i, bc.fteid);
702 SerializeBearerQos(i, bc.bearerLevelQos);
703 }
704}
705
706uint32_t
707NrGtpcCreateSessionResponseMessage::Deserialize(Buffer::Iterator start)
708{
709 Buffer::Iterator i = start;
711
712 DeserializeCause(i, m_cause);
713 DeserializeFteid(i, m_senderCpFteid);
714
715 m_bearerContextsCreated.clear();
716 while (i.GetRemainingSize() > 0)
717 {
718 BearerContextCreated bearerContext;
719 uint16_t length;
720
722 DeserializeEbi(i, bearerContext.epsBearerId);
723
724 Ptr<NrEpcTft> epcTft = Create<NrEpcTft>();
725 DeserializeBearerTft(i, epcTft);
726 bearerContext.tft = epcTft;
727
728 DeserializeFteid(i, bearerContext.fteid);
729 DeserializeBearerQos(i, bearerContext.bearerLevelQos);
730
731 m_bearerContextsCreated.push_back(bearerContext);
732 }
733
734 return GetSerializedSize();
735}
736
737void
738NrGtpcCreateSessionResponseMessage::Print(std::ostream& os) const
739{
740 os << " cause " << m_cause << " FTEID " << m_senderCpFteid.addr << "," << m_senderCpFteid.teid;
741}
742
745{
746 return m_cause;
747}
748
749void
754
757{
758 return m_senderCpFteid;
759}
760
761void
766
767std::list<NrGtpcCreateSessionResponseMessage::BearerContextCreated>
769{
770 return m_bearerContextsCreated;
771}
772
773void
775 std::list<NrGtpcCreateSessionResponseMessage::BearerContextCreated> bearerContexts)
776{
777 m_bearerContextsCreated = bearerContexts;
778}
779
781
782TypeId
784{
785 static TypeId tid = TypeId("ns3::NrGtpcModifyBearerRequestMessage")
786 .SetParent<Header>()
787 .SetGroupName("Nr")
788 .AddConstructor<NrGtpcModifyBearerRequestMessage>();
789 return tid;
790}
791
792NrGtpcModifyBearerRequestMessage::NrGtpcModifyBearerRequestMessage()
793{
794 SetMessageType(NrGtpcHeader::ModifyBearerRequest);
796 m_imsi = 0;
797 m_uliEcgi = 0;
798}
799
800NrGtpcModifyBearerRequestMessage::~NrGtpcModifyBearerRequestMessage()
801{
802}
803
804TypeId
805NrGtpcModifyBearerRequestMessage::GetInstanceTypeId() const
806{
807 return GetTypeId();
808}
809
810uint32_t
812{
813 uint32_t serializedSize =
815 m_bearerContextsToBeModified.size() *
817 return serializedSize;
818}
819
820uint32_t
821NrGtpcModifyBearerRequestMessage::GetSerializedSize() const
822{
823 return NrGtpcHeader::GetSerializedSize() + GetMessageSize();
824}
825
826void
827NrGtpcModifyBearerRequestMessage::Serialize(Buffer::Iterator start) const
828{
829 Buffer::Iterator i = start;
830
832 SerializeImsi(i, m_imsi);
833 SerializeUliEcgi(i, m_uliEcgi);
834
835 for (auto& bc : m_bearerContextsToBeModified)
836 {
838
839 SerializeEbi(i, bc.epsBearerId);
840 SerializeFteid(i, bc.fteid);
841 }
842}
843
844uint32_t
845NrGtpcModifyBearerRequestMessage::Deserialize(Buffer::Iterator start)
846{
847 Buffer::Iterator i = start;
849
850 DeserializeImsi(i, m_imsi);
851 DeserializeUliEcgi(i, m_uliEcgi);
852
853 while (i.GetRemainingSize() > 0)
854 {
855 BearerContextToBeModified bearerContext;
856 uint16_t length;
857
859
860 DeserializeEbi(i, bearerContext.epsBearerId);
861 DeserializeFteid(i, bearerContext.fteid);
862
863 m_bearerContextsToBeModified.push_back(bearerContext);
864 }
865
866 return GetSerializedSize();
867}
868
869void
870NrGtpcModifyBearerRequestMessage::Print(std::ostream& os) const
871{
872 os << " imsi " << m_imsi << " uliEcgi " << m_uliEcgi;
873}
874
875uint64_t
877{
878 return m_imsi;
879}
880
881void
883{
884 m_imsi = imsi;
885}
886
887uint32_t
889{
890 return m_uliEcgi;
891}
892
893void
895{
896 m_uliEcgi = uliEcgi;
897}
898
899std::list<NrGtpcModifyBearerRequestMessage::BearerContextToBeModified>
901{
902 return m_bearerContextsToBeModified;
903}
904
905void
907 std::list<NrGtpcModifyBearerRequestMessage::BearerContextToBeModified> bearerContexts)
908{
909 m_bearerContextsToBeModified = bearerContexts;
910}
911
913
914TypeId
916{
917 static TypeId tid = TypeId("ns3::NrGtpcModifyBearerResponseMessage")
918 .SetParent<Header>()
919 .SetGroupName("Nr")
920 .AddConstructor<NrGtpcModifyBearerResponseMessage>();
921 return tid;
922}
923
924NrGtpcModifyBearerResponseMessage::NrGtpcModifyBearerResponseMessage()
925{
926 SetMessageType(NrGtpcHeader::ModifyBearerResponse);
928 m_cause = Cause_t::RESERVED;
929}
930
931NrGtpcModifyBearerResponseMessage::~NrGtpcModifyBearerResponseMessage()
932{
933}
934
935TypeId
936NrGtpcModifyBearerResponseMessage::GetInstanceTypeId() const
937{
938 return GetTypeId();
939}
940
941uint32_t
946
947uint32_t
948NrGtpcModifyBearerResponseMessage::GetSerializedSize() const
949{
950 return NrGtpcHeader::GetSerializedSize() + GetMessageSize();
951}
952
953void
954NrGtpcModifyBearerResponseMessage::Serialize(Buffer::Iterator start) const
955{
956 Buffer::Iterator i = start;
957
959 SerializeCause(i, m_cause);
960}
961
962uint32_t
963NrGtpcModifyBearerResponseMessage::Deserialize(Buffer::Iterator start)
964{
965 Buffer::Iterator i = start;
967
968 DeserializeCause(i, m_cause);
969
970 return GetSerializedSize();
971}
972
973void
974NrGtpcModifyBearerResponseMessage::Print(std::ostream& os) const
975{
976 os << " cause " << (uint16_t)m_cause;
977}
978
981{
982 return m_cause;
983}
984
985void
990
992
993TypeId
995{
996 static TypeId tid = TypeId("ns3::NrGtpcDeleteBearerCommandMessage")
997 .SetParent<Header>()
998 .SetGroupName("Nr")
999 .AddConstructor<NrGtpcDeleteBearerCommandMessage>();
1000 return tid;
1001}
1002
1003NrGtpcDeleteBearerCommandMessage::NrGtpcDeleteBearerCommandMessage()
1004{
1005 SetMessageType(NrGtpcHeader::DeleteBearerCommand);
1007}
1008
1009NrGtpcDeleteBearerCommandMessage::~NrGtpcDeleteBearerCommandMessage()
1010{
1011}
1012
1013TypeId
1014NrGtpcDeleteBearerCommandMessage::GetInstanceTypeId() const
1015{
1016 return GetTypeId();
1017}
1018
1019uint32_t
1021{
1022 uint32_t serializedSize =
1023 m_bearerContexts.size() * (serializedSizeBearerContextHeader + serializedSizeEbi);
1024 return serializedSize;
1025}
1026
1027uint32_t
1028NrGtpcDeleteBearerCommandMessage::GetSerializedSize() const
1029{
1030 return NrGtpcHeader::GetSerializedSize() + GetMessageSize();
1031}
1032
1033void
1034NrGtpcDeleteBearerCommandMessage::Serialize(Buffer::Iterator start) const
1035{
1036 Buffer::Iterator i = start;
1037
1039 for (auto& bearerContext : m_bearerContexts)
1040 {
1042
1043 SerializeEbi(i, bearerContext.m_epsBearerId);
1044 }
1045}
1046
1047uint32_t
1048NrGtpcDeleteBearerCommandMessage::Deserialize(Buffer::Iterator start)
1049{
1050 Buffer::Iterator i = start;
1052
1053 while (i.GetRemainingSize() > 0)
1054 {
1055 uint16_t length;
1057
1058 BearerContext bearerContext;
1059 DeserializeEbi(i, bearerContext.m_epsBearerId);
1060 m_bearerContexts.push_back(bearerContext);
1061 }
1062
1063 return GetSerializedSize();
1064}
1065
1066void
1067NrGtpcDeleteBearerCommandMessage::Print(std::ostream& os) const
1068{
1069 os << " bearerContexts [";
1070 for (auto& bearerContext : m_bearerContexts)
1071 {
1072 os << (uint16_t)bearerContext.m_epsBearerId << " ";
1073 }
1074 os << "]";
1075}
1076
1077std::list<NrGtpcDeleteBearerCommandMessage::BearerContext>
1079{
1080 return m_bearerContexts;
1081}
1082
1083void
1085 std::list<NrGtpcDeleteBearerCommandMessage::BearerContext> bearerContexts)
1086{
1087 m_bearerContexts = bearerContexts;
1088}
1089
1091
1092TypeId
1094{
1095 static TypeId tid = TypeId("ns3::NrGtpcDeleteBearerRequestMessage")
1096 .SetParent<Header>()
1097 .SetGroupName("Nr")
1098 .AddConstructor<NrGtpcDeleteBearerRequestMessage>();
1099 return tid;
1100}
1101
1102NrGtpcDeleteBearerRequestMessage::NrGtpcDeleteBearerRequestMessage()
1103{
1104 SetMessageType(NrGtpcHeader::DeleteBearerRequest);
1106}
1107
1108NrGtpcDeleteBearerRequestMessage::~NrGtpcDeleteBearerRequestMessage()
1109{
1110}
1111
1112TypeId
1113NrGtpcDeleteBearerRequestMessage::GetInstanceTypeId() const
1114{
1115 return GetTypeId();
1116}
1117
1118uint32_t
1120{
1121 uint32_t serializedSize = m_epsBearerIds.size() * serializedSizeEbi;
1122 return serializedSize;
1123}
1124
1125uint32_t
1126NrGtpcDeleteBearerRequestMessage::GetSerializedSize() const
1127{
1128 return NrGtpcHeader::GetSerializedSize() + GetMessageSize();
1129}
1130
1131void
1132NrGtpcDeleteBearerRequestMessage::Serialize(Buffer::Iterator start) const
1133{
1134 Buffer::Iterator i = start;
1135
1137 for (auto& epsBearerId : m_epsBearerIds)
1138 {
1139 SerializeEbi(i, epsBearerId);
1140 }
1141}
1142
1143uint32_t
1144NrGtpcDeleteBearerRequestMessage::Deserialize(Buffer::Iterator start)
1145{
1146 Buffer::Iterator i = start;
1148
1149 while (i.GetRemainingSize() > 0)
1150 {
1151 uint8_t epsBearerId;
1152 DeserializeEbi(i, epsBearerId);
1153 m_epsBearerIds.push_back(epsBearerId);
1154 }
1155
1156 return GetSerializedSize();
1157}
1158
1159void
1160NrGtpcDeleteBearerRequestMessage::Print(std::ostream& os) const
1161{
1162 os << " epsBearerIds [";
1163 for (auto& epsBearerId : m_epsBearerIds)
1164 {
1165 os << (uint16_t)epsBearerId << " ";
1166 }
1167 os << "]";
1168}
1169
1170std::list<uint8_t>
1172{
1173 return m_epsBearerIds;
1174}
1175
1176void
1178{
1179 m_epsBearerIds = epsBearerId;
1180}
1181
1183
1184TypeId
1186{
1187 static TypeId tid = TypeId("ns3::NrGtpcDeleteBearerResponseMessage")
1188 .SetParent<Header>()
1189 .SetGroupName("Nr")
1190 .AddConstructor<NrGtpcDeleteBearerResponseMessage>();
1191 return tid;
1192}
1193
1194NrGtpcDeleteBearerResponseMessage::NrGtpcDeleteBearerResponseMessage()
1195{
1196 SetMessageType(NrGtpcHeader::DeleteBearerResponse);
1198 m_cause = Cause_t::RESERVED;
1199}
1200
1201NrGtpcDeleteBearerResponseMessage::~NrGtpcDeleteBearerResponseMessage()
1202{
1203}
1204
1205TypeId
1206NrGtpcDeleteBearerResponseMessage::GetInstanceTypeId() const
1207{
1208 return GetTypeId();
1209}
1210
1211uint32_t
1213{
1214 uint32_t serializedSize = serializedSizeCause + m_epsBearerIds.size() * serializedSizeEbi;
1215 return serializedSize;
1216}
1217
1218uint32_t
1219NrGtpcDeleteBearerResponseMessage::GetSerializedSize() const
1220{
1221 return NrGtpcHeader::GetSerializedSize() + GetMessageSize();
1222}
1223
1224void
1225NrGtpcDeleteBearerResponseMessage::Serialize(Buffer::Iterator start) const
1226{
1227 Buffer::Iterator i = start;
1228
1230 SerializeCause(i, m_cause);
1231
1232 for (auto& epsBearerId : m_epsBearerIds)
1233 {
1234 SerializeEbi(i, epsBearerId);
1235 }
1236}
1237
1238uint32_t
1239NrGtpcDeleteBearerResponseMessage::Deserialize(Buffer::Iterator start)
1240{
1241 Buffer::Iterator i = start;
1243
1244 DeserializeCause(i, m_cause);
1245
1246 while (i.GetRemainingSize() > 0)
1247 {
1248 uint8_t epsBearerId;
1249 DeserializeEbi(i, epsBearerId);
1250 m_epsBearerIds.push_back(epsBearerId);
1251 }
1252
1253 return GetSerializedSize();
1254}
1255
1256void
1257NrGtpcDeleteBearerResponseMessage::Print(std::ostream& os) const
1258{
1259 os << " cause " << (uint16_t)m_cause << " epsBearerIds [";
1260 for (auto& epsBearerId : m_epsBearerIds)
1261 {
1262 os << (uint16_t)epsBearerId << " ";
1263 }
1264 os << "]";
1265}
1266
1269{
1270 return m_cause;
1271}
1272
1273void
1278
1279std::list<uint8_t>
1281{
1282 return m_epsBearerIds;
1283}
1284
1285void
1287{
1288 m_epsBearerIds = epsBearerId;
1289}
1290
1291} // namespace ns3
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)
std::list< BearerContextToBeCreated > GetBearerContextsToBeCreated() const
void SetBearerContextsToBeCreated(std::list< BearerContextToBeCreated > bearerContexts)
static TypeId GetTypeId()
Get the type ID.
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)
static TypeId GetTypeId()
Get the type ID.
std::list< BearerContext > GetBearerContexts() const
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)
Header of the GTPv2-C protocol.
uint8_t GetMessageType() const
static TypeId GetTypeId()
Get the type ID.
void SetMessageType(uint8_t messageType)
uint32_t GetTeid() const
void SetIesLength(uint16_t iesLength)
uint16_t GetMessageLength() const
virtual uint32_t GetMessageSize() const
InterfaceType_t
Interface Type enumeration.
void SetMessageLength(uint16_t messageLength)
void PreSerialize(Buffer::Iterator &i) const
void SetTeid(uint32_t teid)
uint32_t PreDeserialize(Buffer::Iterator &i)
uint32_t GetSequenceNumber() const
void SetSequenceNumber(uint32_t sequenceNumber)
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
void SetBearerContextsToBeModified(std::list< BearerContextToBeModified > bearerContexts)
std::list< BearerContextToBeModified > GetBearerContextsToBeModified() const
static TypeId GetTypeId()
Get the type ID.
static TypeId GetTypeId()
Get the type ID.
Direction direction
Whether the filter needs to be applied to uplink / downlink only, or in both cases.
Definition nr-epc-tft.h:104
uint16_t remotePortEnd
end of the port number range of the remote host
Definition nr-epc-tft.h:117
uint16_t localPortStart
start of the port number range of the UE
Definition nr-epc-tft.h:118
Ipv4Mask localMask
IPv4 address mask of the UE.
Definition nr-epc-tft.h:109
Ipv4Address remoteAddress
IPv4 address of the remote host.
Definition nr-epc-tft.h:106
Ipv4Address localAddress
IPv4 address of the UE.
Definition nr-epc-tft.h:108
uint8_t typeOfServiceMask
type of service field mask
Definition nr-epc-tft.h:122
uint16_t remotePortStart
start of the port number range of the remote host
Definition nr-epc-tft.h:116
Ipv4Mask remoteMask
IPv4 address mask of the remote host.
Definition nr-epc-tft.h:107
uint8_t typeOfService
type of service field
Definition nr-epc-tft.h:121
uint16_t localPortEnd
end of the port number range of the UE
Definition nr-epc-tft.h:119
Ipv4Address addr
IPv4 address.
InterfaceType_t interfaceType
Interface type.