Loading...
Searching...
No Matches
satellite-beam-helper.cc
Go to the documentation of this file.
1/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/*
3 * Copyright (c) 2013 Magister Solutions Ltd
4 * Copyright (c) 2018 CNES
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation;
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 *
19 * Author: Sami Rantanen <sami.rantanen@magister.fi>
20 * Author: Mathias Ettinger <mettinger@viveris.toulouse.fr>
21 */
22
24
32
33#include "ns3/config.h"
34#include "ns3/enum.h"
35#include "ns3/internet-stack-helper.h"
36#include "ns3/ipv4-interface.h"
37#include "ns3/ipv4-static-routing-helper.h"
38#include "ns3/log.h"
39#include "ns3/mobility-helper.h"
40#include "ns3/pointer.h"
41#include "ns3/satellite-antenna-gain-pattern-container.h"
42#include "ns3/satellite-arp-cache.h"
43#include "ns3/satellite-bstp-controller.h"
44#include "ns3/satellite-channel.h"
45#include "ns3/satellite-const-variables.h"
46#include "ns3/satellite-enums.h"
47#include "ns3/satellite-fading-input-trace-container.h"
48#include "ns3/satellite-fading-input-trace.h"
49#include "ns3/satellite-gw-llc.h"
50#include "ns3/satellite-gw-mac.h"
51#include "ns3/satellite-id-mapper.h"
52#include "ns3/satellite-lorawan-net-device.h"
53#include "ns3/satellite-mobility-model.h"
54#include "ns3/satellite-orbiter-net-device.h"
55#include "ns3/satellite-packet-trace.h"
56#include "ns3/satellite-phy-rx.h"
57#include "ns3/satellite-phy-tx.h"
58#include "ns3/satellite-phy.h"
59#include "ns3/satellite-propagation-delay-model.h"
60#include "ns3/satellite-sgp4-mobility-model.h"
61#include "ns3/satellite-topology.h"
62#include "ns3/satellite-typedefs.h"
63#include "ns3/satellite-ut-llc.h"
64#include "ns3/satellite-ut-mac.h"
65#include "ns3/satellite-utils.h"
66#include "ns3/singleton.h"
67#include "ns3/string.h"
68#include "ns3/traffic-control-helper.h"
69
70#include <algorithm>
71#include <ios>
72#include <iostream>
73#include <list>
74#include <map>
75#include <set>
76#include <sstream>
77#include <string>
78#include <utility>
79#include <vector>
80
81NS_LOG_COMPONENT_DEFINE("SatBeamHelper");
82
83namespace ns3
84{
85
86NS_OBJECT_ENSURE_REGISTERED(SatBeamHelper);
87
88TypeId
90{
91 static TypeId tid =
92 TypeId("ns3::SatBeamHelper")
93 .SetParent<Object>()
94 .AddConstructor<SatBeamHelper>()
95 .AddAttribute("CarrierFrequencyConverter",
96 "Callback to convert carrier id to generate frequency.",
97 CallbackValue(),
98 MakeCallbackAccessor(&SatBeamHelper::m_carrierFreqConverter),
99 MakeCallbackChecker())
100 .AddAttribute("FadingModel",
101 "Fading model",
102 EnumValue(SatEnums::FADING_OFF),
103 MakeEnumAccessor<SatEnums::FadingModel_t>(&SatBeamHelper::m_fadingModel),
104 MakeEnumChecker(SatEnums::FADING_OFF,
105 "FadingOff",
107 "FadingTrace",
109 "FadingMarkov"))
110 .AddAttribute("RandomAccessModel",
111 "Random Access Model",
112 EnumValue(SatEnums::RA_MODEL_OFF),
113 MakeEnumAccessor<SatEnums::RandomAccessModel_t>(
115 MakeEnumChecker(SatEnums::RA_MODEL_OFF,
116 "RaOff",
118 "RaSlottedAloha",
120 "RaCrdsa",
122 "RaRcs2Specification",
124 "RaMarsala",
126 "RaEssa"))
127 .AddAttribute("RaInterferenceModel",
128 "Interference model for random access",
130 MakeEnumAccessor<SatPhyRxCarrierConf::InterferenceModel>(
132 MakeEnumChecker(SatPhyRxCarrierConf::IF_CONSTANT,
133 "Constant",
135 "Trace",
137 "PerPacket",
139 "PerFragment"))
140 .AddAttribute("RaInterferenceEliminationModel",
141 "Interference elimination model for random access",
143 MakeEnumAccessor<SatPhyRxCarrierConf::InterferenceEliminationModel>(
145 MakeEnumChecker(SatPhyRxCarrierConf::SIC_PERFECT,
146 "Perfect",
148 "Residual"))
149 .AddAttribute(
150 "RaCollisionModel",
151 "Collision model for random access",
153 MakeEnumAccessor<SatPhyRxCarrierConf::RandomAccessCollisionModel>(
156 "RaCollisionNotDefined",
158 "RaCollisionAlwaysDropCollidingPackets",
160 "RaCollisionCheckAgainstSinr",
162 "RaCollisionConstantErrorProbability"))
163 .AddAttribute("RaConstantErrorRate",
164 "Constant error rate for random access",
165 DoubleValue(0.0),
166 MakeDoubleAccessor(&SatBeamHelper::m_raConstantErrorRate),
167 MakeDoubleChecker<double>())
168 .AddAttribute("PropagationDelayModel",
169 "Propagation delay model",
171 MakeEnumAccessor<SatEnums::PropagationDelayModel_t>(
173 MakeEnumChecker(SatEnums::PD_CONSTANT_SPEED,
174 "ConstantSpeed",
176 "Constant"))
177 .AddAttribute("ConstantPropagationDelay",
178 "Constant propagation delay",
179 TimeValue(Seconds(0.13)),
181 MakeTimeChecker())
182 .AddAttribute(
183 "PrintDetailedInformationToCreationTraces",
184 "Print detailed information to creation traces",
185 BooleanValue(true),
187 MakeBooleanChecker())
188 .AddAttribute("CtrlMsgStoreTimeInFwdLink",
189 "Time to store a control message in container for forward link.",
190 TimeValue(MilliSeconds(10000)),
192 MakeTimeChecker())
193 .AddAttribute("CtrlMsgStoreTimeInRtnLink",
194 "Time to store a control message in container for return link.",
195 TimeValue(MilliSeconds(10000)),
197 MakeTimeChecker())
198 .AddAttribute("EnableFwdLinkBeamHopping",
199 "Enable beam hopping in forward link.",
200 BooleanValue(false),
201 MakeBooleanAccessor(&SatBeamHelper::m_enableFwdLinkBeamHopping),
202 MakeBooleanChecker())
203 .AddAttribute("EnableTracesOnUserReturnLink",
204 "Use traces files on the user return channel only",
205 BooleanValue(false),
206 MakeBooleanAccessor(&SatBeamHelper::m_enableTracesOnReturnLink),
207 MakeBooleanChecker())
208 .AddAttribute("DvbVersion",
209 "Indicates if using DVB-S2 or DVB-S2X",
210 EnumValue(SatEnums::DVB_S2),
211 MakeEnumAccessor<SatEnums::DvbVersion_t>(&SatBeamHelper::m_dvbVersion),
212 MakeEnumChecker(SatEnums::DVB_S2, "DVB_S2", SatEnums::DVB_S2X, "DVB_S2X"))
213 .AddAttribute(
214 "ReturnLinkLinkResults",
215 "Protocol used for the return link link results.",
216 EnumValue(SatEnums::LR_RCS2),
217 MakeEnumAccessor<SatEnums::LinkResults_t>(&SatBeamHelper::m_rlLinkResultsType),
218 MakeEnumChecker(SatEnums::LR_RCS2,
219 "RCS2",
221 "FSIM",
223 "LORA"))
224 .AddTraceSource("Creation",
225 "Creation traces",
226 MakeTraceSourceAccessor(&SatBeamHelper::m_creationTrace),
227 "ns3::SatTypedefs::CreationCallback");
228 return tid;
229}
230
234 m_propagationDelayModel(SatEnums::PD_CONSTANT_SPEED),
235 m_constantPropagationDelay(Seconds(0.13)),
236 m_randomAccessModel(SatEnums::RA_MODEL_OFF),
239 m_raCollisionModel(SatPhyRxCarrierConf::RA_COLLISION_NOT_DEFINED),
243{
244 NS_LOG_FUNCTION(this);
245
246 // this default constructor should not be called...
247 NS_FATAL_ERROR("SatBeamHelper::SatBeamHelper - Constructor not in use");
248}
249
250SatBeamHelper::SatBeamHelper(std::vector<std::pair<uint32_t, uint32_t>> isls,
251 SatTypedefs::CarrierBandwidthConverter_t bandwidthConverterCb,
252 uint32_t rtnLinkCarrierCount,
253 uint32_t fwdLinkCarrierCount,
254 Ptr<SatSuperframeSeq> seq)
255 : m_carrierBandwidthConverter(bandwidthConverterCb),
256 m_rtnLinkCarrierCount(rtnLinkCarrierCount),
257 m_fwdLinkCarrierCount(fwdLinkCarrierCount),
258 m_superframeSeq(seq),
260 m_fadingModel(SatEnums::FADING_MARKOV),
261 m_propagationDelayModel(SatEnums::PD_CONSTANT_SPEED),
262 m_constantPropagationDelay(Seconds(0.13)),
263 m_randomAccessModel(SatEnums::RA_MODEL_OFF),
266 m_raCollisionModel(SatPhyRxCarrierConf::RA_COLLISION_CHECK_AGAINST_SINR),
270 m_isls(isls)
271{
272 NS_LOG_FUNCTION(this << rtnLinkCarrierCount << fwdLinkCarrierCount << seq);
273}
274
275void
277{
278 NS_LOG_FUNCTION(this);
279
280 Object::NotifyConstructionCompleted();
281
282 m_channelFactory.SetTypeId("ns3::SatChannel");
283
284 // create SatChannel containers
285 m_ulChannels = CreateObject<SatChannelPair>();
286 m_flChannels = CreateObject<SatChannelPair>();
287
288 // create link specific control message containers
289 Ptr<SatControlMsgContainer> rtnCtrlMsgContainer =
290 Create<SatControlMsgContainer>(m_ctrlMsgStoreTimeRtnLink, true);
291 Ptr<SatControlMsgContainer> fwdCtrlMsgContainer =
292 Create<SatControlMsgContainer>(m_ctrlMsgStoreTimeFwdLink, false);
293
294 SatMac::ReadCtrlMsgCallback rtnReadCtrlCb =
295 MakeCallback(&SatControlMsgContainer::Read, rtnCtrlMsgContainer);
296 SatMac::ReserveCtrlMsgCallback rtnReserveCtrlCb =
297 MakeCallback(&SatControlMsgContainer::ReserveIdAndStore, rtnCtrlMsgContainer);
298 SatMac::SendCtrlMsgCallback rtnSendCtrlCb =
299 MakeCallback(&SatControlMsgContainer::Send, rtnCtrlMsgContainer);
300
301 SatMac::ReadCtrlMsgCallback fwdReadCtrlCb =
302 MakeCallback(&SatControlMsgContainer::Read, fwdCtrlMsgContainer);
303 SatMac::ReserveCtrlMsgCallback fwdReserveCtrlCb =
304 MakeCallback(&SatControlMsgContainer::ReserveIdAndStore, fwdCtrlMsgContainer);
305 SatMac::SendCtrlMsgCallback fwdSendCtrlCb =
306 MakeCallback(&SatControlMsgContainer::Send, fwdCtrlMsgContainer);
307
312 orbiterRaSettings.m_randomAccessModel = m_randomAccessModel;
313 orbiterRaSettings.m_raCollisionModel = m_raCollisionModel;
314
320
321 // Error rate is valid only at the GW for random access
323
329
331 {
334 Config::SetDefault("ns3::SatOrbiterHelper::DaRtnLinkInterferenceModel",
335 StringValue("Trace"));
336 Config::SetDefault("ns3::SatGwHelper::DaRtnLinkInterferenceModel", StringValue("Trace"));
337 }
338
339 // create needed low level satellite helpers
340 switch (Singleton<SatTopology>::Get()->GetStandard())
341 {
342 case SatEnums::DVB: {
343 m_gwHelper = CreateObject<SatGwHelperDvb>(m_carrierBandwidthConverter,
346 rtnReadCtrlCb,
347 fwdReserveCtrlCb,
348 fwdSendCtrlCb,
349 gwRaSettings);
350 m_utHelper = CreateObject<SatUtHelperDvb>(m_carrierBandwidthConverter,
353 fwdReadCtrlCb,
354 rtnReserveCtrlCb,
355 rtnSendCtrlCb,
356 utRaSettings);
357 m_orbiterHelper = CreateObject<SatOrbiterHelperDvb>(m_carrierBandwidthConverter,
361 fwdReadCtrlCb,
362 rtnReadCtrlCb,
363 orbiterRaSettings);
364 break;
365 }
366 case SatEnums::LORA: {
367 if (Singleton<SatTopology>::Get()->GetForwardLinkRegenerationMode() ==
369 {
370 m_gwHelper = CreateObject<SatGwHelperLora>(m_carrierBandwidthConverter,
373 rtnReadCtrlCb,
374 fwdReserveCtrlCb,
375 fwdSendCtrlCb,
376 gwRaSettings);
377 }
378 else
379 {
380 Config::SetDefault("ns3::SatGwMac::SendNcrBroadcast", BooleanValue(false));
381 m_gwHelper = CreateObject<SatGwHelperDvb>(m_carrierBandwidthConverter,
384 rtnReadCtrlCb,
385 fwdReserveCtrlCb,
386 fwdSendCtrlCb,
387 gwRaSettings);
388 }
389 m_utHelper = CreateObject<SatUtHelperLora>(m_carrierBandwidthConverter,
392 fwdReadCtrlCb,
393 rtnReserveCtrlCb,
394 rtnSendCtrlCb,
395 utRaSettings);
396 m_orbiterHelper = CreateObject<SatOrbiterHelperLora>(m_carrierBandwidthConverter,
400 fwdReadCtrlCb,
401 rtnReadCtrlCb,
402 orbiterRaSettings);
403 break;
404 }
405 default:
406 NS_FATAL_ERROR("Unknown standard");
407 }
408
409 // Two usage of link results is two-fold: on the other hand they are needed in the
410 // packet reception for packet decoding, but on the other hand they are utilized in
411 // transmission side in ACM for deciding the best MODCOD.
412 //
413 // Return link results:
414 // - Packet reception at the GW
415 // - RTN link packet scheduling at the NCC
416 // DVB-S2 link results:
417 // - Packet reception at the UT
418 // - FWD link packet scheduling at the GW
419 //
420 Ptr<SatLinkResultsFwd> linkResultsFwd;
421 switch (m_dvbVersion)
422 {
423 case SatEnums::DVB_S2:
424 linkResultsFwd = CreateObject<SatLinkResultsDvbS2>();
425 break;
427 linkResultsFwd = CreateObject<SatLinkResultsDvbS2X>();
428 break;
429 default:
430 NS_FATAL_ERROR("The DVB version does not exist");
431 }
432
433 Ptr<SatLinkResultsRtn> linkResultsReturnLink;
434 switch (m_rlLinkResultsType)
435 {
436 case SatEnums::LR_RCS2: {
437 linkResultsReturnLink = CreateObject<SatLinkResultsDvbRcs2>();
438 break;
439 }
440 case SatEnums::LR_FSIM: {
441 linkResultsReturnLink = CreateObject<SatLinkResultsFSim>();
442 break;
443 }
444 case SatEnums::LR_LORA: {
445 linkResultsReturnLink = CreateObject<SatLinkResultsLora>();
446 break;
447 }
448 default: {
449 NS_FATAL_ERROR("Invalid address for multicast group");
450 break;
451 }
452 }
453
454 linkResultsFwd->Initialize();
455 linkResultsReturnLink->Initialize();
456
457 bool useScpc = (Singleton<SatTopology>::Get()->GetReturnLinkRegenerationMode() ==
459 Singleton<SatTopology>::Get()->GetReturnLinkRegenerationMode() ==
461
462 // DVB-S2 link results for packet decoding at the UT
463 m_utHelper->Initialize(linkResultsFwd);
464 // DVB-RCS2 link results for packet decoding at the GW +
465 // DVB-S2 link results for FWD link RRM
466 m_gwHelper->Initialize(linkResultsReturnLink, linkResultsFwd, m_dvbVersion, useScpc);
467 // link results on satellite, to use if regeneration
468 m_orbiterHelper->Initialize(linkResultsFwd, linkResultsReturnLink);
469 // DVB-RCS2 link results for RTN link waveform configurations
470 m_superframeSeq->GetWaveformConf()->InitializeEbNoRequirements(linkResultsReturnLink);
471
472 m_orbiterHelper->InstallAllOrbiters();
473
474 m_ncc = CreateObject<SatNcc>();
475
476 if (Singleton<SatTopology>::Get()->GetStandard() == SatEnums::LORA)
477 {
478 m_ncc->SetUseLora(true);
479 }
480
482 {
483 PointerValue llsConf;
484 m_utHelper->GetAttribute("LowerLayerServiceConf", llsConf);
485 uint8_t allocationChannelCount =
486 llsConf.Get<SatLowerLayerServiceConf>()->GetRaServiceCount();
487
489 for (uint8_t i = 0; i < allocationChannelCount; i++)
490 {
491 m_ncc->SetRandomAccessLowLoadBackoffProbability(
492 i,
494 m_ncc->SetRandomAccessHighLoadBackoffProbability(
495 i,
497 m_ncc->SetRandomAccessLowLoadBackoffTime(
498 i,
500 m_ncc->SetRandomAccessHighLoadBackoffTime(
501 i,
503 m_ncc->SetRandomAccessAverageNormalizedOfferedLoadThreshold(
504 i,
506 i));
507 }
508 }
509
510 switch (m_fadingModel)
511 {
514 m_markovConf = CreateObject<SatMarkovConf>();
515 break;
516 }
519 default: {
520 m_markovConf = nullptr;
521 break;
522 }
523 }
524
526 {
527 m_bstpController = CreateObject<SatBstpController>();
528 }
529}
530
531void
533{
534 NS_LOG_FUNCTION(this);
535
536 m_beam.clear();
537 m_gwNode.clear();
538 m_ulChannels = nullptr;
539 m_flChannels = nullptr;
540 m_beamFreqs.clear();
541 m_markovConf = nullptr;
542 m_ncc = nullptr;
543 m_orbiterHelper = nullptr;
544 m_gwHelper = nullptr;
545 m_utHelper = nullptr;
546 m_antennaGainPatterns = nullptr;
547}
548
549void
551{
552 NS_LOG_FUNCTION(this);
553
555 {
556 m_bstpController->Initialize();
557 }
558}
559
560void
561SatBeamHelper::SetAntennaGainPatterns(Ptr<SatAntennaGainPatternContainer> antennaPatterns)
562{
563 NS_LOG_FUNCTION(this << antennaPatterns);
564
565 m_antennaGainPatterns = antennaPatterns;
566}
567
568void
569SatBeamHelper::SetDeviceAttribute(std::string n1, const AttributeValue& v1)
570{
571 NS_LOG_FUNCTION(this << n1);
572}
573
574void
575SatBeamHelper::SetChannelAttribute(std::string n1, const AttributeValue& v1)
576{
577 NS_LOG_FUNCTION(this << n1);
578
579 m_channelFactory.Set(n1, v1);
580}
581
582void
584{
585 NS_LOG_FUNCTION(this << &cb);
586
587 m_ncc->SetUpdateRoutingCallback(cb);
588}
589
590std::pair<Ptr<NetDevice>, NetDeviceContainer>
591SatBeamHelper::Install(NodeContainer ut,
592 Ptr<Node> gwNode,
593 uint32_t gwId,
594 uint32_t satId,
595 uint32_t beamId,
596 uint32_t rtnUlFreqId,
597 uint32_t rtnFlFreqId,
598 uint32_t fwdUlFreqId,
599 uint32_t fwdFlFreqId,
600 SatMac::RoutingUpdateCallback routingCallback)
601{
602 NS_LOG_FUNCTION(this << gwNode << gwId << satId << beamId << rtnUlFreqId << rtnFlFreqId
603 << fwdUlFreqId << fwdFlFreqId);
604
605 // add pair satId / beamId as key and gwId as value to beam map. In case it's there already,
606 // assertion failure is caused
607 std::pair<std::map<std::pair<uint32_t, uint32_t>, uint32_t>::iterator, bool> beam =
608 m_beam.insert(std::make_pair(std::make_pair(satId, beamId), gwId));
609 NS_ASSERT(beam.second == true);
610
611 // TODO: Update channels to store 4 frequency ID
612 // save frequency pair to map with beam ID
613 // FrequencyPair_t freqPair = FrequencyPair_t (ulFreqId, flFreqId);
614 // m_beamFreqs.insert (std::pair<uint32_t, FrequencyPair_t > (beamId, freqPair));
615
616 // next it is found feeder link channels and if not found channels are created and saved to map
618 GetChannelPair(satId, beamId, fwdFlFreqId, rtnFlFreqId, false);
619
620 // next it is found user link channels and if not found channels are created and saved to map
622 GetChannelPair(satId, beamId, fwdUlFreqId, rtnUlFreqId, true);
623
624 Ptr<Node> satNode = Singleton<SatTopology>::Get()->GetOrbiterNode(satId);
625
626 NS_ASSERT(satNode != nullptr);
627
628 // Get the position of the GW serving this beam, get the best beam based on antenna patterns
629 // for this position, and set the antenna patterns to the feeder PHY objects via
630 // AttachChannels method.
631 GeoCoordinate gwPos = gwNode->GetObject<SatMobilityModel>()->GetGeoPosition();
632 uint32_t feederSatId = Singleton<SatTopology>::Get()->GetClosestSat(gwPos);
633 uint32_t feederBeamId = m_antennaGainPatterns->GetBestBeamId(feederSatId, gwPos, true);
634 if (feederBeamId == 0)
635 {
636 feederBeamId = 1;
637 }
638
639 // attach channels to satellite device
640 m_orbiterHelper->AttachChannels(satNode->GetDevice(0),
641 feederLink.first,
642 feederLink.second,
643 userLink.first,
644 userLink.second,
645 m_antennaGainPatterns->GetAntennaGainPattern(beamId),
646 m_antennaGainPatterns->GetAntennaGainPattern(feederBeamId),
647 m_ncc,
648 satId,
649 gwId,
650 beamId);
651
652 Ptr<SatMobilityModel> gwMobility = gwNode->GetObject<SatMobilityModel>();
653 NS_ASSERT(gwMobility != nullptr);
654
655 // enable timing advance in observers of the UTs
656 for (NodeContainer::Iterator i = ut.Begin(); i != ut.End(); i++)
657 {
658 // enable timing advance observing in nodes.
659
660 Ptr<SatMobilityObserver> observer = (*i)->GetObject<SatMobilityObserver>();
661 NS_ASSERT(observer != nullptr);
662 observer->ObserveTimingAdvance(userLink.second->GetPropagationDelayModel(),
663 feederLink.second->GetPropagationDelayModel(),
664 gwMobility);
665
667 {
669 }
670
671 // save UT node pointer to multimap container
672 m_utNode.insert(std::make_pair(std::make_pair(satId, beamId), *i));
673 }
674
675 Ptr<NetDevice> gwNd = InstallFeeder(DynamicCast<SatOrbiterNetDevice>(satNode->GetDevice(0)),
676 gwNode,
677 gwId,
678 satId,
679 beamId,
680 feederSatId,
681 feederBeamId,
682 feederLink,
683 rtnFlFreqId,
684 fwdFlFreqId,
685 routingCallback);
686
687 NetDeviceContainer utNd;
688 if (Singleton<SatTopology>::Get()->GetReturnLinkRegenerationMode() ==
690 Singleton<SatTopology>::Get()->GetReturnLinkRegenerationMode() ==
692 {
693 if (m_gwNdMap.count(gwId) == 0)
694 {
695 // If first time we create a Net Device for this GW ID, store it
696 m_gwNdMap[gwId] = gwNd;
697 }
698 utNd = InstallUser(DynamicCast<SatOrbiterNetDevice>(satNode->GetDevice(0)),
699 ut,
700 m_gwNdMap[gwId],
701 satId,
702 beamId,
703 userLink,
704 rtnUlFreqId,
705 fwdUlFreqId,
706 routingCallback);
707 }
708 else
709 {
710 utNd = InstallUser(DynamicCast<SatOrbiterNetDevice>(satNode->GetDevice(0)),
711 ut,
712 gwNd,
713 satId,
714 beamId,
715 userLink,
716 rtnUlFreqId,
717 fwdUlFreqId,
718 routingCallback);
719 }
720
722 {
724 MakeCallback(&SatNetDevice::ToggleState, DynamicCast<SatNetDevice>(gwNd));
725
726 m_bstpController->AddNetDeviceCallback(beamId, fwdUlFreqId, fwdFlFreqId, gwId, gwNdCb);
727 }
728
729 return std::make_pair(gwNd, utNd);
730}
731
732Ptr<NetDevice>
733SatBeamHelper::InstallFeeder(Ptr<SatOrbiterNetDevice> orbiterNetDevice,
734 Ptr<Node> gwNode,
735 uint32_t gwId,
736 uint32_t satId,
737 uint32_t beamId,
738 uint32_t feederSatId,
739 uint32_t feederBeamId,
741 uint32_t rtnFlFreqId,
742 uint32_t fwdFlFreqId,
743 SatMac::RoutingUpdateCallback routingCallback)
744{
745 NS_LOG_FUNCTION(this << gwNode << gwId << satId << beamId << rtnFlFreqId << fwdFlFreqId);
746
747 // Set trace files if options ask for it
749 {
750 feederLink.second->SetAttribute("RxPowerCalculationMode",
752 }
753
754 // store GW node
755 bool storedOk = StoreGwNode(gwId, gwNode);
756 NS_ASSERT(storedOk);
757
758 // install fading container to GW
760 {
762 }
763
764 // install GW
765 PointerValue llsConf;
766 m_utHelper->GetAttribute("LowerLayerServiceConf", llsConf);
767 Ptr<NetDevice> gwNd =
768 m_gwHelper->Install(gwNode,
769 gwId,
770 satId,
771 beamId,
772 feederSatId,
773 feederBeamId,
774 feederLink.first,
775 feederLink.second,
777 m_ncc,
778 llsConf.Get<SatLowerLayerServiceConf>());
779
780 // calculate maximum size of the BB frame with the most robust MODCOD
781 Ptr<SatBbFrameConf> bbFrameConf = m_gwHelper->GetBbFrameConf();
782
784
785 if (bbFrameConf->GetBbFrameUsageMode() == SatEnums::SHORT_FRAMES)
786 {
787 frameType = SatEnums::SHORT_FRAME;
788 }
789
790 uint32_t maxBbFrameDataSizeInBytes =
791 (bbFrameConf->GetBbFramePayloadBits(bbFrameConf->GetMostRobustModcod(frameType),
792 frameType) /
794 bbFrameConf->GetBbFrameHeaderSizeInBytes();
795
796 Address satelliteUserAddress = Address();
797 if (Singleton<SatTopology>::Get()->GetReturnLinkRegenerationMode() ==
799 Singleton<SatTopology>::Get()->GetReturnLinkRegenerationMode() ==
801 {
802 satelliteUserAddress = orbiterNetDevice->GetSatelliteUserAddress(beamId);
803 }
804
805 switch (Singleton<SatTopology>::Get()->GetStandard())
806 {
807 case SatEnums::DVB:
808 m_ncc->AddBeam(
809 satId,
810 beamId,
811 DynamicCast<SatNetDevice>(gwNd),
812 orbiterNetDevice,
813 MakeCallback(&SatNetDevice::SendControlMsg, DynamicCast<SatNetDevice>(gwNd)),
814 MakeCallback(&SatGwMac::TbtpSent,
815 DynamicCast<SatGwMac>(DynamicCast<SatNetDevice>(gwNd)->GetMac())),
817 maxBbFrameDataSizeInBytes,
818 satelliteUserAddress,
819 gwNd->GetAddress());
820 break;
821 case SatEnums::LORA: {
822 if (Singleton<SatTopology>::Get()->GetForwardLinkRegenerationMode() ==
824 {
825 m_ncc->AddBeam(satId,
826 beamId,
827 DynamicCast<SatNetDevice>(gwNd),
828 orbiterNetDevice,
830 DynamicCast<SatLorawanNetDevice>(gwNd)),
831 MakeNullCallback<void, Ptr<SatTbtpMessage>>(),
833 maxBbFrameDataSizeInBytes,
834 satelliteUserAddress,
835 gwNd->GetAddress());
836 }
837 else
838 {
839 m_ncc->AddBeam(
840 satId,
841 beamId,
842 DynamicCast<SatNetDevice>(gwNd),
843 orbiterNetDevice,
844 MakeCallback(&SatNetDevice::SendControlMsg, DynamicCast<SatNetDevice>(gwNd)),
845 MakeCallback(&SatGwMac::TbtpSent,
846 DynamicCast<SatGwMac>(DynamicCast<SatNetDevice>(gwNd)->GetMac())),
848 maxBbFrameDataSizeInBytes,
849 satelliteUserAddress,
850 gwNd->GetAddress());
851 }
852 }
853
854 break;
855 default:
856 NS_FATAL_ERROR("Incorrect standard chosen");
857 }
858
859 // Add satellite addresses to GW MAC layers.
860 if (Singleton<SatTopology>::Get()->GetForwardLinkRegenerationMode() ==
862 Singleton<SatTopology>::Get()->GetForwardLinkRegenerationMode() ==
864 {
865 Ptr<SatGwMac> gwMac = DynamicCast<SatGwMac>(DynamicCast<SatNetDevice>(gwNd)->GetMac());
866 Mac48Address satFeederAddress = orbiterNetDevice->GetSatelliteFeederAddress(beamId);
867 gwMac->SetSatelliteAddress(satFeederAddress);
868 }
869
870 // Add satellite addresses to GW LLC layers.
871 if (Singleton<SatTopology>::Get()->GetForwardLinkRegenerationMode() ==
873 {
874 Ptr<SatGwMac> gwMac = DynamicCast<SatGwMac>(DynamicCast<SatNetDevice>(gwNd)->GetMac());
875 Ptr<SatGwLlc> gwLlc = DynamicCast<SatGwLlc>(DynamicCast<SatNetDevice>(gwNd)->GetLlc());
876 Mac48Address satFeederAddress = orbiterNetDevice->GetSatelliteFeederAddress(beamId);
877 gwLlc->SetSatelliteAddress(satFeederAddress);
878 }
879
880 return gwNd;
881}
882
883NetDeviceContainer
884SatBeamHelper::InstallUser(Ptr<SatOrbiterNetDevice> orbiterNetDevice,
885 NodeContainer ut,
886 Ptr<NetDevice> gwNd,
887 uint32_t satId,
888 uint32_t beamId,
890 uint32_t rtnUlFreqId,
891 uint32_t fwdUlFreqId,
892 SatMac::RoutingUpdateCallback routingCallback)
893{
894 NS_LOG_FUNCTION(this << beamId << rtnUlFreqId << fwdUlFreqId);
895
896 // Set trace files if options ask for it
898 {
899 userLink.second->SetAttribute("RxPowerCalculationMode",
901 }
902
903 Address satUserAddress = Address();
904 if (Singleton<SatTopology>::Get()->GetReturnLinkRegenerationMode() ==
906 Singleton<SatTopology>::Get()->GetReturnLinkRegenerationMode() ==
908 {
909 satUserAddress = orbiterNetDevice->GetUserMac(beamId)->GetAddress();
910 }
911
912 // install UTs
913 NetDeviceContainer utNd =
914 m_utHelper->Install(ut,
915 satId,
916 beamId,
917 userLink.first,
918 userLink.second,
919 DynamicCast<SatNetDevice>(gwNd),
920 m_ncc,
921 satUserAddress,
923 routingCallback);
924
925 // Add satellite addresses UT MAC layers.
926 if (Singleton<SatTopology>::Get()->GetReturnLinkRegenerationMode() ==
928 Singleton<SatTopology>::Get()->GetReturnLinkRegenerationMode() ==
930 {
931 for (NetDeviceContainer::Iterator i = utNd.Begin(); i != utNd.End(); i++)
932 {
933 Ptr<SatMac> mac = DynamicCast<SatNetDevice>(*i)->GetMac();
934 Ptr<SatUtMac> utMac = DynamicCast<SatUtMac>(mac);
935 if (utMac != nullptr)
936 {
937 utMac->SetSatelliteAddress(satUserAddress);
938 }
939 else
940 {
941 mac->SetSatelliteAddress(satUserAddress);
942 }
943 }
944 }
945
946 // Add satellite addresses UT LLC layers.
947 if (Singleton<SatTopology>::Get()->GetReturnLinkRegenerationMode() ==
949 {
950 for (NetDeviceContainer::Iterator i = utNd.Begin(); i != utNd.End(); i++)
951 {
952 Ptr<SatUtLlc> utLlc = DynamicCast<SatUtLlc>(DynamicCast<SatNetDevice>(*i)->GetLlc());
953 if (utLlc != nullptr)
954 {
955 utLlc->SetSatelliteAddress(Mac48Address::ConvertFrom(satUserAddress));
956 }
957 }
958 }
959
960 return utNd;
961}
962
963void
965{
966 NS_LOG_FUNCTION(this);
967
968 Ptr<PointToPointIslHelper> p2pIslHelper = CreateObject<PointToPointIslHelper>();
969 TrafficControlHelper tchIsl;
970
971 for (std::vector<std::pair<uint32_t, uint32_t>>::iterator it = m_isls.begin();
972 it != m_isls.end();
973 it++)
974 {
975 Ptr<Node> sat1 = Singleton<SatTopology>::Get()->GetOrbiterNode(it->first);
976 Ptr<Node> sat2 = Singleton<SatTopology>::Get()->GetOrbiterNode(it->second);
977
978 // Install a p2p ISL link between these two satellites
979 NetDeviceContainer netDevices = p2pIslHelper->Install(sat1, sat2);
980 Ptr<PointToPointIslNetDevice> islNdSat1 =
981 DynamicCast<PointToPointIslNetDevice>(netDevices.Get(0));
982 Ptr<PointToPointIslNetDevice> islNdSat2 =
983 DynamicCast<PointToPointIslNetDevice>(netDevices.Get(1));
984
985 Ptr<SatOrbiterNetDevice> satNdSat1 = DynamicCast<SatOrbiterNetDevice>(sat1->GetDevice(0));
986 Ptr<SatOrbiterNetDevice> satNdSat2 = DynamicCast<SatOrbiterNetDevice>(sat2->GetDevice(0));
987
988 satNdSat1->AddIslsNetDevice(islNdSat1);
989 satNdSat2->AddIslsNetDevice(islNdSat2);
990
991 islNdSat1->SetOrbiterNetDevice(satNdSat1);
992 islNdSat2->SetOrbiterNetDevice(satNdSat2);
993 }
994}
995
996void
998{
999 NS_LOG_FUNCTION(this);
1000
1001 m_orbiterHelper->SetIslRoutes(m_isls);
1002}
1003
1004uint32_t
1005SatBeamHelper::GetGwId(uint32_t satId, uint32_t beamId) const
1006{
1007 std::map<std::pair<uint32_t, uint32_t>, uint32_t>::const_iterator i =
1008 m_beam.find(std::make_pair(satId, beamId));
1009
1010 if (i == m_beam.end())
1011 {
1012 return 0;
1013 }
1014 else
1015 {
1016 return i->second;
1017 }
1018}
1019
1020Ptr<Node>
1021SatBeamHelper::GetGwNode(uint32_t gwId) const
1022{
1023 NS_LOG_FUNCTION(this << gwId);
1024
1025 std::map<uint32_t, Ptr<Node>>::const_iterator gwIterator = m_gwNode.find(gwId);
1026 Ptr<Node> node = nullptr;
1027
1028 if (gwIterator != m_gwNode.end())
1029 {
1030 node = gwIterator->second;
1031 }
1032
1033 return node;
1034}
1035
1036Ptr<SatUtHelper>
1038{
1039 NS_LOG_FUNCTION(this);
1040 return m_utHelper;
1041}
1042
1043Ptr<SatGwHelper>
1045{
1046 NS_LOG_FUNCTION(this);
1047 return m_gwHelper;
1048}
1049
1050Ptr<SatOrbiterHelper>
1052{
1053 NS_LOG_FUNCTION(this);
1054 return m_orbiterHelper;
1055}
1056
1057NodeContainer
1058SatBeamHelper::GetUtNodes(uint32_t satId, uint32_t beamId) const
1059{
1060 NS_LOG_FUNCTION(this << beamId);
1061
1062 NodeContainer utNodes;
1063
1064 // find all entries with the specified beamId
1065 std::pair<std::multimap<std::pair<uint32_t, uint32_t>, Ptr<Node>>::const_iterator,
1066 std::multimap<std::pair<uint32_t, uint32_t>, Ptr<Node>>::const_iterator>
1067 range;
1068 range = m_utNode.equal_range(std::make_pair(satId, beamId));
1069
1070 for (std::map<std::pair<uint32_t, uint32_t>, Ptr<Node>>::const_iterator i = range.first;
1071 i != range.second;
1072 ++i)
1073 {
1074 utNodes.Add(i->second);
1075 }
1076
1077 return utNodes;
1078}
1079
1080std::list<std::pair<uint32_t, uint32_t>>
1082{
1083 NS_LOG_FUNCTION(this);
1084
1085 std::list<std::pair<uint32_t, uint32_t>> ret;
1086
1087 for (std::map<std::pair<uint32_t, uint32_t>, uint32_t>::const_iterator it = m_beam.begin();
1088 it != m_beam.end();
1089 ++it)
1090 {
1091 ret.push_back(it->first);
1092 }
1093
1094 return ret;
1095}
1096
1097Ptr<SatNcc>
1099{
1100 NS_LOG_FUNCTION(this);
1101
1102 return m_ncc;
1103}
1104
1105uint32_t
1106SatBeamHelper::GetUtBeamId(Ptr<Node> utNode) const
1107{
1108 NS_LOG_FUNCTION(this);
1109
1110 uint32_t beamId = 0;
1111
1112 for (std::multimap<std::pair<uint32_t, uint32_t>, Ptr<Node>>::const_iterator it =
1113 m_utNode.begin();
1114 ((it != m_utNode.end()) && (beamId == 0));
1115 it++)
1116 {
1117 if (it->second == utNode)
1118 {
1119 beamId = it->first.second;
1120 }
1121 }
1122
1123 return beamId;
1124}
1125
1126NetDeviceContainer
1128 Ptr<Node> sourceUtNode,
1129 Ipv4Address sourceAddress,
1130 Ipv4Address groupAddress,
1131 bool routeToGwUsers,
1132 Ptr<NetDevice>& gwOutputDev)
1133{
1134 NS_LOG_FUNCTION(this);
1135
1136 Mac48Address groupMacAddress;
1137 Ipv4StaticRoutingHelper multicast;
1138 NetDeviceContainer gwInputDevices;
1139 NetDeviceContainer routerGwOutputDevices;
1140 Ptr<NetDevice> routerDev = nullptr;
1141
1142 uint32_t sourceBeamId = GetUtBeamId(sourceUtNode);
1143 gwOutputDev = nullptr;
1144
1145 // Check the address sanity
1146 if (groupAddress.IsMulticast())
1147 {
1148 groupMacAddress = Mac48Address::GetMulticast(groupAddress);
1149 NS_LOG_INFO("IP address for multicast group: "
1150 << groupAddress << ", MAC address for multicast group: " << groupMacAddress);
1151 }
1152 else
1153 {
1154 NS_FATAL_ERROR("Invalid address for multicast group");
1155 }
1156
1157 NodeContainer gwNodes = Singleton<SatTopology>::Get()->GetGwNodes();
1158
1159 // go through all GW nodes and devices in them
1160 for (NodeContainer::Iterator it = gwNodes.Begin(); it != gwNodes.End(); it++)
1161 {
1162 bool routerGw = false;
1163 NetDeviceContainer gwOutputDevices;
1164 Ptr<NetDevice> gwInputDev = nullptr;
1165
1166 // go through devices in GW node
1167 for (uint32_t i = 1; i < (*it)->GetNDevices(); i++)
1168 {
1169 Ptr<NetDevice> dev = (*it)->GetDevice(i);
1170 int32_t beamId = Singleton<SatIdMapper>::Get()->GetBeamIdWithMac(dev->GetAddress());
1171 MulticastBeamInfo_t::iterator beamIt = beamInfo.find(beamId);
1172
1173 // device is device serving source UT. (UT source is in question)
1174 if (beamId == (int32_t)sourceBeamId)
1175 {
1176 routerGw = true; // GW node is routing GW
1177 routerDev = dev; // save device routing multicast traffic from UT
1178 }
1179
1180 // device needs to serve multicast receiving UT(s) in the beam (beam is among of the
1181 // multicast group)
1182 if (beamIt != beamInfo.end())
1183 {
1184 // device must be also SatNetDevice, just sanity check it
1185 if (dev->GetInstanceTypeId().GetName() == "ns3::SatNetDevice")
1186 {
1187 // add device to GW's output list (container) to route multicast traffic to
1188 // beam's UTs
1189 gwOutputDevices.Add(dev);
1190
1191 // go through UTs receiving multicast traffic in the beam
1192 // to route multicast traffic toward public network (UT users)
1193 for (std::set<Ptr<Node>>::iterator utIt = beamIt->second.begin();
1194 utIt != beamIt->second.end();
1195 utIt++)
1196 {
1197 AddMulticastRouteToUt(*utIt, sourceAddress, groupAddress, false);
1198 }
1199 }
1200 else
1201 {
1202 NS_FATAL_ERROR("Not a satellite net device!!!");
1203 }
1204 }
1205 else if (dev->GetInstanceTypeId().GetName() != "ns3::SatNetDevice")
1206 {
1207 // save device receiving traffic from IP router
1208 gwInputDev = dev;
1209 }
1210 }
1211
1212 if (routerGw)
1213 {
1214 // in case that GW is source beam serving (routing) GW
1215 // traffic is going to IP router, so input is output
1216 gwOutputDev = gwInputDev;
1217
1218 // GW output devices to satellite network UTs are saved here to set later.
1219 // In router case it is needed to check later that if traffic is needed to route
1220 // IP router too. (GW user or some other beam behind another GW is receiving traffic)
1221 routerGwOutputDevices = gwOutputDevices;
1222 }
1223 else if (gwOutputDevices.GetN() >
1224 0) // no router GW some device in GW belong to beam receiving multicast traffic
1225 {
1226 // route traffic from source beam to receiving beams
1227 multicast.AddMulticastRoute(*it,
1228 sourceAddress,
1229 groupAddress,
1230 gwInputDev,
1231 gwOutputDevices);
1232
1233 // save devices receiving traffic from IP router (backbone network)
1234 gwInputDevices.Add(gwInputDev);
1235 }
1236 }
1237
1238 // source is UT and traffic is needed to route toward backbone network
1239 // add output device to routing GW's output container (list)
1240 if (sourceUtNode && ((gwInputDevices.GetN() > 0) || routeToGwUsers))
1241 {
1242 if (!routerDev)
1243 {
1244 NS_FATAL_ERROR("Router device shall exist!!!");
1245 }
1246
1247 routerGwOutputDevices.Add(gwOutputDev);
1248 }
1249 else
1250 {
1251 gwOutputDev = nullptr;
1252 }
1253
1254 // route traffic from source beam satellite net device to satellite net devices forwarding
1255 // traffic to receiving beams inside router GW and/or to backbone network (GW users). add also
1256 // route to UT from public network to satellite network
1257 if (routerDev && (routerGwOutputDevices.GetN() > 0))
1258 {
1259 multicast.AddMulticastRoute(routerDev->GetNode(),
1260 sourceAddress,
1261 groupAddress,
1262 routerDev,
1263 routerGwOutputDevices);
1264 AddMulticastRouteToUt(sourceUtNode, sourceAddress, groupAddress, true);
1265 }
1266
1267 // return list of GW net devices receiving traffic from IP router (backbone network)
1268 return gwInputDevices;
1269}
1270
1271void
1272SatBeamHelper::EnableCreationTraces(Ptr<OutputStreamWrapper> stream, CallbackBase& cb)
1273{
1274 NS_LOG_FUNCTION(this);
1275
1276 TraceConnect("Creation", "SatBeamHelper", cb);
1277 m_orbiterHelper->EnableCreationTraces(stream, cb);
1278 m_gwHelper->EnableCreationTraces(stream, cb);
1279 m_utHelper->EnableCreationTraces(stream, cb);
1280}
1281
1282void
1284{
1285 // Create packet trace instance
1286 m_packetTrace = CreateObject<SatPacketTrace>();
1287
1296
1297 SatEnums::RegenerationMode_t maxRegeneration =
1298 std::max(Singleton<SatTopology>::Get()->GetForwardLinkRegenerationMode(),
1299 Singleton<SatTopology>::Get()->GetReturnLinkRegenerationMode());
1300
1306 Config::ConnectWithoutContext("/NodeList/*/DeviceList/*/PacketTrace",
1308 Config::ConnectWithoutContext("/NodeList/*/DeviceList/*/SatPhy/PacketTrace",
1310 Config::ConnectWithoutContext("/NodeList/*/DeviceList/*/UserPhy/*/PacketTrace",
1312 Config::ConnectWithoutContext("/NodeList/*/DeviceList/*/FeederPhy/*/PacketTrace",
1314 Config::ConnectWithoutContext("/NodeList/*/DeviceList/*/SatMac/PacketTrace",
1316 if (maxRegeneration == SatEnums::REGENERATION_LINK ||
1317 maxRegeneration == SatEnums::REGENERATION_NETWORK)
1318 {
1319 Config::ConnectWithoutContext("/NodeList/*/DeviceList/*/UserMac/*/PacketTrace",
1321
1322 for (std::pair<uint32_t, uint32_t> p : GetBeams())
1323 {
1324 Ptr<Node> orbiter = Singleton<SatTopology>::Get()->GetOrbiterNode(p.first);
1325 Ptr<SatOrbiterFeederMac> feederMac =
1326 Singleton<SatTopology>::Get()->GetOrbiterFeederMac(orbiter, p.second);
1327 feederMac->TraceConnectWithoutContext(
1328 "PacketTrace",
1330 }
1331 }
1332 if (Singleton<SatTopology>::Get()->GetStandard() == SatEnums::DVB)
1333 {
1334 Config::ConnectWithoutContext("/NodeList/*/DeviceList/*/SatLlc/PacketTrace",
1336 }
1337}
1338
1339std::string
1341{
1342 NS_LOG_FUNCTION(this);
1343
1344 std::ostringstream oss;
1345 oss << "--- Beam Info, " << "number of created beams: " << m_beam.size() << " ---" << std::endl;
1346
1347 if (m_beam.size() > 0)
1348 {
1349 oss << CreateBeamInfo();
1350 }
1351
1352 return oss.str();
1353}
1354
1355std::string
1357{
1358 NS_LOG_FUNCTION(this);
1359
1360 std::ostringstream oss;
1361
1362 for (std::multimap<std::pair<uint32_t, uint32_t>, Ptr<Node>>::const_iterator i =
1363 m_utNode.begin();
1364 i != m_utNode.end();
1365 ++i)
1366 {
1367 Ptr<SatMobilityModel> model = i->second->GetObject<SatMobilityModel>();
1368 GeoCoordinate pos = model->GetGeoPosition();
1369
1370 Address devAddress;
1371 Ptr<Ipv4> ipv4 = i->second->GetObject<Ipv4>(); // Get Ipv4 instance of the node
1372
1373 std::vector<Ipv4Address> IPAddressVector;
1374 std::vector<std::string> devNameVector;
1375 std::vector<Address> devAddressVector;
1376
1377 for (uint32_t j = 0; j < i->second->GetNDevices(); j++)
1378 {
1379 Ptr<NetDevice> device = i->second->GetDevice(j);
1380
1381 if (device->GetInstanceTypeId().GetName() == "ns3::SatNetDevice")
1382 {
1383 devAddress = device->GetAddress();
1384 }
1385 IPAddressVector.push_back(
1386 ipv4->GetAddress(j, 0).GetLocal()); // Get Ipv4InterfaceAddress of interface
1387 devNameVector.push_back(device->GetInstanceTypeId().GetName());
1388 devAddressVector.push_back(device->GetAddress());
1389 }
1390
1392 {
1393 oss << i->first.second << " "
1394 << Singleton<SatIdMapper>::Get()->GetUtIdWithMac(devAddress) << " "
1395 << pos.GetLatitude() << " " << pos.GetLongitude() << " " << pos.GetAltitude()
1396 << " ";
1397
1398 for (uint32_t j = 0; j < i->second->GetNDevices(); j++)
1399 {
1400 oss << devNameVector[j] << " " << devAddressVector[j] << " " << IPAddressVector[j]
1401 << " ";
1402 }
1403
1404 oss << std::endl;
1405 }
1406 else
1407 {
1408 oss << i->first.second << " "
1409 << Singleton<SatIdMapper>::Get()->GetUtIdWithMac(devAddress) << " "
1410 << pos.GetLatitude() << " " << pos.GetLongitude() << " " << pos.GetAltitude()
1411 << std::endl;
1412 }
1413 }
1414
1415 return oss.str();
1416}
1417
1418std::string
1420{
1421 NS_LOG_FUNCTION(this);
1422
1423 std::ostringstream oss;
1424
1425 oss << std::endl << " -- Beam details --";
1426
1427 for (std::map<std::pair<uint32_t, uint32_t>, uint32_t>::const_iterator i = m_beam.begin();
1428 i != m_beam.end();
1429 ++i)
1430 {
1431 uint32_t satId = i->first.first;
1432 uint32_t beamId = i->first.second;
1433
1434 oss << std::endl << "Sat ID: " << satId << " ";
1435 oss << "Beam ID: " << beamId << " ";
1436
1437 std::map<std::pair<uint32_t, uint32_t>, FrequencyPair_t>::const_iterator freqIds =
1438 m_beamFreqs.find(std::make_pair(satId, beamId));
1439
1440 if (freqIds != m_beamFreqs.end())
1441 {
1442 oss << "user link frequency ID: " << (*freqIds).second.first << ", ";
1443 oss << "feeder link frequency ID: " << (*freqIds).second.second;
1444 }
1445
1446 oss << ", GW ID: " << (*i).second;
1447 }
1448
1449 oss << std::endl << std::endl << " -- GW details --" << std::endl;
1450
1451 oss.precision(8);
1452 oss.setf(std::ios::fixed, std::ios::floatfield);
1453
1454 for (std::map<uint32_t, Ptr<Node>>::const_iterator i = m_gwNode.begin(); i != m_gwNode.end();
1455 ++i)
1456 {
1457 Ptr<SatMobilityModel> model = i->second->GetObject<SatMobilityModel>();
1458 GeoCoordinate pos = model->GetGeoPosition();
1459
1460 Address devAddress;
1461 Ptr<Ipv4> ipv4 = i->second->GetObject<Ipv4>(); // Get Ipv4 instance of the node
1462
1463 std::vector<Ipv4Address> IPAddressVector;
1464 std::vector<std::string> devNameVector;
1465 std::vector<Address> devAddressVector;
1466
1467 for (uint32_t j = 0; j < i->second->GetNDevices(); j++)
1468 {
1469 Ptr<NetDevice> device = i->second->GetDevice(j);
1470
1471 if (device->GetInstanceTypeId().GetName() == "ns3::SatNetDevice")
1472 {
1473 devAddress = device->GetAddress();
1474 }
1475
1476 IPAddressVector.push_back(
1477 ipv4->GetAddress(j, 0).GetLocal()); // Get Ipv4InterfaceAddress of interface
1478 devNameVector.push_back(device->GetInstanceTypeId().GetName());
1479 devAddressVector.push_back(device->GetAddress());
1480 }
1481
1483 {
1484 oss << "GW=" << i->first << " "
1485 << Singleton<SatIdMapper>::Get()->GetUtIdWithMac(devAddress) << " "
1486 << " latitude=" << pos.GetLatitude() << " longitude=" << pos.GetLongitude()
1487 << " altitude=" << pos.GetAltitude() << " ";
1488
1489 for (uint32_t j = 0; j < i->second->GetNDevices(); j++)
1490 {
1491 oss << devNameVector[j] << " " << devAddressVector[j] << " " << IPAddressVector[j]
1492 << " ";
1493 }
1494
1495 oss << std::endl;
1496 }
1497 else
1498 {
1499 oss << "GW=" << i->first << " "
1500 << Singleton<SatIdMapper>::Get()->GetUtIdWithMac(devAddress) << " "
1501 << " latitude=" << pos.GetLatitude() << " longitude=" << pos.GetLongitude()
1502 << " altitude=" << pos.GetAltitude() << std::endl;
1503 }
1504 }
1505
1506 oss << std::endl << " -- Satellite positions --" << std::endl;
1507
1508 NodeContainer orbiters = Singleton<SatTopology>::Get()->GetOrbiterNodes();
1509 for (NodeContainer::Iterator it = orbiters.Begin(); it != orbiters.End(); it++)
1510 {
1511 Ptr<SatMobilityModel> model = (*it)->GetObject<SatMobilityModel>();
1512 GeoCoordinate pos = model->GetGeoPosition();
1513 oss << "latitude=" << pos.GetLatitude() << ", longitude=" << pos.GetLongitude()
1514 << ", altitude=" << pos.GetAltitude() << std::endl;
1515 }
1516
1517 return oss.str();
1518}
1519
1522 uint32_t beamId,
1523 uint32_t fwdFrequencyId,
1524 uint32_t rtnFrequencyId,
1525 bool isUserLink)
1526{
1527 NS_LOG_FUNCTION(this << satId << beamId << fwdFrequencyId << rtnFrequencyId << isUserLink);
1528
1529 Ptr<SatChannelPair> chPairs = isUserLink ? m_ulChannels : m_flChannels;
1530
1531 bool hasFwdChannel = chPairs->HasFwdChannel(satId, fwdFrequencyId);
1532 bool hasRtnChannel = chPairs->HasRtnChannel(satId, rtnFrequencyId);
1533
1534 if (hasFwdChannel && hasRtnChannel)
1535 {
1536 chPairs->UpdateBeamsForFrequency(satId, beamId, fwdFrequencyId, rtnFrequencyId);
1537 }
1538 else
1539 {
1540 Ptr<SatFreeSpaceLoss> pFsl;
1541 Ptr<PropagationDelayModel> pDelay;
1542 Ptr<SatChannel> forwardCh;
1543 Ptr<SatChannel> returnCh;
1544
1545 if (hasFwdChannel)
1546 {
1547 forwardCh = chPairs->GetForwardChannel(satId, fwdFrequencyId);
1548 pDelay = forwardCh->GetPropagationDelayModel();
1549 pFsl = forwardCh->GetFreeSpaceLoss();
1550 }
1551 else if (hasRtnChannel)
1552 {
1553 returnCh = chPairs->GetReturnChannel(satId, rtnFrequencyId);
1554 pDelay = returnCh->GetPropagationDelayModel();
1555 pFsl = returnCh->GetFreeSpaceLoss();
1556 }
1557 else
1558 {
1560 {
1561 // Signal propagates at the speed of light
1562 pDelay = CreateObject<ConstantSpeedPropagationDelayModel>();
1563 DynamicCast<ConstantSpeedPropagationDelayModel>(pDelay)->SetSpeed(
1565 }
1567 {
1568 pDelay = CreateObject<SatConstantPropagationDelayModel>();
1569 DynamicCast<SatConstantPropagationDelayModel>(pDelay)->SetDelay(
1571 }
1572 else
1573 {
1574 NS_FATAL_ERROR("Unsupported propagation delay model!");
1575 }
1576
1577 pFsl = CreateObject<SatFreeSpaceLoss>();
1578 }
1579
1580 if (!hasFwdChannel)
1581 {
1582 forwardCh = m_channelFactory.Create<SatChannel>();
1583 forwardCh->SetChannelType(isUserLink ? SatEnums::FORWARD_USER_CH
1585 forwardCh->SetFrequencyConverter(m_carrierFreqConverter);
1586 forwardCh->SetBandwidthConverter(m_carrierBandwidthConverter);
1587 forwardCh->SetFrequencyId(fwdFrequencyId);
1588 forwardCh->SetPropagationDelayModel(pDelay);
1589 forwardCh->SetFreeSpaceLoss(pFsl);
1590 }
1591
1592 if (!hasRtnChannel)
1593 {
1594 returnCh = m_channelFactory.Create<SatChannel>();
1595 returnCh->SetChannelType(isUserLink ? SatEnums::RETURN_USER_CH
1597 returnCh->SetFrequencyConverter(m_carrierFreqConverter);
1598 returnCh->SetBandwidthConverter(m_carrierBandwidthConverter);
1599 returnCh->SetFrequencyId(rtnFrequencyId);
1600 returnCh->SetPropagationDelayModel(pDelay);
1601 returnCh->SetFreeSpaceLoss(pFsl);
1602 }
1603
1604 chPairs
1605 ->StoreChannelPair(satId, beamId, fwdFrequencyId, forwardCh, rtnFrequencyId, returnCh);
1606 }
1607
1608 return chPairs->GetChannelPair(satId, beamId);
1609}
1610
1611bool
1612SatBeamHelper::StoreGwNode(uint32_t id, Ptr<Node> node)
1613{
1614 NS_LOG_FUNCTION(this << id << node);
1615
1616 bool storingSuccess = false;
1617
1618 Ptr<Node> storedNode = GetGwNode(id);
1619
1620 if (storedNode != nullptr) // nGW node with id already stored
1621 {
1622 if (storedNode == node) // check that node is same
1623 {
1624 storingSuccess = true;
1625 }
1626 }
1627 else // try to store if not stored
1628 {
1629 std::pair<std::map<uint32_t, Ptr<Node>>::iterator, bool> result =
1630 m_gwNode.insert(std::make_pair(id, node));
1631 storingSuccess = result.second;
1632 Singleton<SatTopology>::Get()->AddGwNode(id, node);
1633 }
1634
1635 return storingSuccess;
1636}
1637
1638Ptr<SatBaseFading>
1640{
1641 NS_LOG_FUNCTION(this << node);
1642
1643 Ptr<SatBaseFading> fadingContainer = node->GetObject<SatBaseFading>();
1644
1645 if (fadingContainer == nullptr)
1646 {
1647 switch (m_fadingModel)
1648 {
1650 Ptr<SatMobilityObserver> observer = node->GetObject<SatMobilityObserver>();
1651 NS_ASSERT(observer != nullptr);
1652
1654 MakeCallback(&SatMobilityObserver::GetElevationAngle, observer);
1656 MakeCallback(&SatMobilityObserver::GetVelocity, observer);
1657
1659 fadingContainer =
1660 CreateObject<SatMarkovContainer>(m_markovConf, elevationCb, velocityCb);
1661 node->AggregateObject(fadingContainer);
1662 break;
1663 }
1666
1667 fadingContainer =
1668 CreateObject<SatFadingInputTrace>(Singleton<SatFadingInputTraceContainer>::Get());
1669
1670 node->AggregateObject(fadingContainer);
1671 break;
1672 }
1675 default: {
1676 NS_FATAL_ERROR("SatBeamHelper::InstallFadingContainer - Incorrect fading model");
1677 break;
1678 }
1679 }
1680 }
1681 return fadingContainer;
1682}
1683
1684void
1686 Ipv4Address sourceAddress,
1687 Ipv4Address groupAddress,
1688 bool routeToSatellite)
1689{
1690 NS_LOG_FUNCTION(this);
1691
1692 Ptr<NetDevice> satDev = nullptr;
1693 Ptr<NetDevice> publicDev = nullptr;
1694
1695 for (uint32_t i = 1; i < utNode->GetNDevices(); i++)
1696 {
1697 Ptr<NetDevice> dev = utNode->GetDevice(i);
1698
1699 // in UT SatNetDevice is routing traffic to public network NetDevice e.g. CSMA
1700 if (dev->GetInstanceTypeId().GetName() == "ns3::SatNetDevice")
1701 {
1702 satDev = dev;
1703 }
1704 else
1705 {
1706 // just save last non SatNetDevice (in practice there should be only one)
1707 publicDev = dev;
1708 }
1709 }
1710
1711 if (satDev && publicDev)
1712 {
1713 Ipv4StaticRoutingHelper multicast;
1714
1715 if (routeToSatellite)
1716 {
1717 multicast.AddMulticastRoute(utNode, sourceAddress, groupAddress, publicDev, satDev);
1718 }
1719 else
1720 {
1721 multicast.AddMulticastRoute(utNode, sourceAddress, groupAddress, satDev, publicDev);
1722 }
1723
1724 // Add multicast route to UT
1725 }
1726 else
1727 {
1728 NS_FATAL_ERROR("Input of output device not found in UT node!!!");
1729 }
1730}
1731
1732Ptr<PropagationDelayModel>
1734 uint32_t beamId,
1735 SatEnums::ChannelType_t channelType)
1736{
1737 Ptr<SatChannel> channel = nullptr;
1738 switch (channelType)
1739 {
1741 channel = m_flChannels->GetChannelPair(satId, beamId).first;
1742 break;
1743 }
1745 channel = m_ulChannels->GetChannelPair(satId, beamId).first;
1746 break;
1747 }
1749 channel = m_ulChannels->GetChannelPair(satId, beamId).second;
1750 break;
1751 }
1753 channel = m_flChannels->GetChannelPair(satId, beamId).second;
1754 break;
1755 }
1756 default: {
1757 return nullptr;
1758 }
1759 }
1760
1761 return channel->GetPropagationDelayModel();
1762}
1763
1769
1770} // namespace ns3
GeoCoordinate class is used to store and operate with geodetic coordinates.
Base class for fading models such as Markov-based fading or fading trace.
Callback< double > VelocityCallback
Gets velocity in m/s.
Callback< double > ElevationCallback
Gets elevation angle in degrees.
SatBeamHelper builds a set Satellite beams with needed objects and configuration.
void SetAntennaGainPatterns(Ptr< SatAntennaGainPatternContainer > antennaPatterns)
Set the antenna gain patterns to be used when configuring the beams to the satellite.
NetDeviceContainer AddMulticastGroupRoutes(MulticastBeamInfo_t beamInfo, Ptr< Node > sourceUtNode, Ipv4Address sourceAddress, Ipv4Address groupAddress, bool routeToGwUsers, Ptr< NetDevice > &gwOutputDev)
std::map< std::pair< uint32_t, uint32_t >, uint32_t > m_beam
SatEnums::DvbVersion_t m_dvbVersion
Indicates if using DVB-S2 or DVB-S2X.
Time m_constantPropagationDelay
Constant propagation delay.
bool m_printDetailedInformationToCreationTraces
Flag indicating whether to print detailed information to the creation traces.
void SetChannelAttribute(std::string name, const AttributeValue &value)
Set an attribute value to be propagated to each Channel created by the helper.
Ptr< SatChannelPair > m_flChannels
virtual void NotifyConstructionCompleted() override
Notifier called once the ObjectBase is fully constructed.
void SetIslRoutes()
Set ISL routes.
Ptr< SatSuperframeSeq > m_superframeSeq
bool StoreGwNode(uint32_t id, Ptr< Node > node)
Creates GW node according to given id and stores GW to map.
Ptr< SatBstpController > m_bstpController
Beam Switching Time Plan controller, which is created if FWD link beam hopping is enabled (m_enableFw...
void SetDeviceAttribute(std::string name, const AttributeValue &value)
Set an attribute value to be propagated to each NetDevice created by the helper.
void InstallIsls()
Create all the ISLs.
Ptr< SatGwHelper > GetGwHelper() const
SatEnums::PropagationDelayModel_t GetPropagationDelayModelEnum()
Ptr< SatAntennaGainPatternContainer > m_antennaGainPatterns
SatTypedefs::CarrierBandwidthConverter_t m_carrierBandwidthConverter
CarrierFreqConverter m_carrierFreqConverter
bool m_enableFwdLinkBeamHopping
Flag indicating whether beam hopping is enabled in FWD link.
Ptr< SatUtHelper > GetUtHelper() const
void EnableCreationTraces(Ptr< OutputStreamWrapper > stream, CallbackBase &cb)
Enables creation traces to be written in given file.
uint32_t GetGwId(uint32_t satId, uint32_t beamId) const
std::map< uint32_t, Ptr< NetDevice > > m_gwNdMap
Map used in regenerative mode to store GW Net device (we need only one per GW).
NodeContainer GetUtNodes(uint32_t satId, uint32_t beamId) const
virtual void DoDispose()
Dispose of this class instance.
Ptr< PropagationDelayModel > GetPropagationDelayModel(uint32_t satId, uint32_t beamId, SatEnums::ChannelType_t channelType)
TracedCallback< std::string > m_creationTrace
Trace callback for creation traces.
std::pair< Ptr< NetDevice >, NetDeviceContainer > Install(NodeContainer ut, Ptr< Node > gwNode, uint32_t gwId, uint32_t satId, uint32_t beamId, uint32_t rtnUlFreqId, uint32_t rtnFlFreqId, uint32_t fwdUlFreqId, uint32_t fwdFlFreqId, SatMac::RoutingUpdateCallback routingCallback)
NetDeviceContainer InstallUser(Ptr< SatOrbiterNetDevice > orbiterNetDevice, NodeContainer ut, Ptr< NetDevice > gwNd, uint32_t satId, uint32_t beamId, SatChannelPair::ChannelPair_t userLink, uint32_t rtnUlFreqId, uint32_t fwdUlFreqId, SatMac::RoutingUpdateCallback routingCallback)
SatBeamHelper()
Default constructor for SatBeamHelper (should not be used).
SatEnums::LinkResults_t m_rlLinkResultsType
Type of Return channel link results.
std::string GetBeamInfo() const
uint32_t GetUtBeamId(Ptr< Node > utNode) const
Get beam Id of the given UT.
Ptr< SatNcc > GetNcc() const
Ptr< SatBaseFading > InstallFadingContainer(Ptr< Node > node) const
Install fading model to node, if fading model doesn't exist already in node.
Time m_ctrlMsgStoreTimeFwdLink
Control message store time in container for forward link.
SatPhyRxCarrierConf::RandomAccessCollisionModel m_raCollisionModel
The used collision model for random access.
std::pair< uint32_t, uint32_t > FrequencyPair_t
std::map< std::pair< uint32_t, uint32_t >, FrequencyPair_t > m_beamFreqs
std::map< uint32_t, Ptr< Node > > m_gwNode
std::list< std::pair< uint32_t, uint32_t > > GetBeams() const
Ptr< SatMarkovConf > m_markovConf
Common configuration for Markov model.
Ptr< SatUtHelper > m_utHelper
void AddMulticastRouteToUt(Ptr< Node > utNode, Ipv4Address sourceAddress, Ipv4Address groupAddress, bool routeToSatellite)
Add multicast route to UT node.
Ptr< SatOrbiterHelper > GetOrbiterHelper() const
Ptr< NetDevice > InstallFeeder(Ptr< SatOrbiterNetDevice > orbiterNetDevice, Ptr< Node > gwNode, uint32_t gwId, uint32_t satId, uint32_t beamId, uint32_t feederSatId, uint32_t feederBeamId, SatChannelPair::ChannelPair_t feederLink, uint32_t rtnFlFreqId, uint32_t fwdFlFreqId, SatMac::RoutingUpdateCallback routingCallback)
Ptr< SatOrbiterHelper > m_orbiterHelper
static TypeId GetTypeId(void)
Get the type ID.
std::string GetUtInfo() const
std::string CreateBeamInfo() const
Creates info of the beam.
SatEnums::PropagationDelayModel_t m_propagationDelayModel
Propagation delay model.
void EnablePacketTrace()
Enable packet traces.
void Init()
Init method is called after all the initial configurations have been done by the SatHelper and SatBea...
SatPhyRxCarrierConf::InterferenceEliminationModel m_raInterferenceEliminationModel
The used interference model for random access.
Ptr< SatPacketTrace > m_packetTrace
Packet trace.
SatEnums::FadingModel_t m_fadingModel
Configured fading model.
Ptr< Node > GetGwNode(uint32_t gwId) const
Gets GW node according to given id.
SatChannelPair::ChannelPair_t GetChannelPair(uint32_t satId, uint32_t beamId, uint32_t fwdFrequencyId, uint32_t rtnFrequencyId, bool isUserLink)
Gets satellite channel pair from requested map.
std::vector< std::pair< uint32_t, uint32_t > > m_isls
Vector constaining all the ISLs of the topology.
SatEnums::RandomAccessModel_t m_randomAccessModel
The used random access model.
Time m_ctrlMsgStoreTimeRtnLink
Control message store in container for return link.
Ptr< SatChannelPair > m_ulChannels
Ptr< SatGwHelper > m_gwHelper
std::map< uint32_t, std::set< Ptr< Node > > > MulticastBeamInfo_t
SatPhyRxCarrierConf::InterferenceModel m_raInterferenceModel
The used interference model for random access.
double m_raConstantErrorRate
Constant error rate for random access.
void SetNccRoutingCallback(SatNcc::UpdateRoutingCallback cb)
Attach an update routing callback to the NCC of this simulation.
std::multimap< std::pair< uint32_t, uint32_t >, Ptr< Node > > m_utNode
bool m_enableTracesOnReturnLink
Helper flag to activate packet traces on the return link only.
Callback< void, bool > ToggleCallback
Callback to fetch queue statistics.
Satellite channel implementation.
virtual void SetChannelType(SatEnums::ChannelType_t chType)
Set the type of the channel.
std::pair< Ptr< SatChannel >, Ptr< SatChannel > > ChannelPair_t
ChannelPair_t GetChannelPair(uint32_t satId, uint32_t beamId) const
Retrieve the channel pair associated to a beam.
Ptr< SatControlMessage > Read(uint32_t recvId)
Read a control message.
uint32_t Send(uint32_t sendId)
Add a control message.
uint32_t ReserveIdAndStore(Ptr< SatControlMessage > controlMsg)
Reserve an id and store a control message.
SatEnums class is for simplifying the use of enumerators in the satellite module.
SatBbFrameType_t
BB frame type used in DVB-S2 FWD link.
ChannelType_t
Types of channel.
PropagationDelayModel_t
Propagation delay model.
@ SHORT_FRAMES
SHORT_FRAMES.
RegenerationMode_t
The regeneration mode used in satellites.
void TbtpSent(Ptr< SatTbtpMessage > tbtp)
Function called when a TBTP has been sent by the SatBeamScheduler.
bool SendControlMsg(Ptr< SatControlMessage > msg, const Address &dest)
The SatLowerLayerServiceConf class holds information of all configures lower layer service entries.
uint16_t GetRaHighLoadBackOffProbability(uint8_t index) const
Get high load back off probability.
uint16_t GetRaHighLoadBackOffTimeInMilliSeconds(uint8_t index) const
Get high load back off time in milliseconds.
double GetRaAverageNormalizedOfferedLoadThreshold(uint8_t index) const
Get average normalized offeredLoad Threshold.
uint16_t GetRaBackOffProbability(uint8_t index) const
Get back off probability.
uint16_t GetRaBackOffTimeInMilliSeconds(uint8_t index) const
Get back off time in milliseconds.
Callback< uint32_t, Ptr< SatControlMessage > > ReserveCtrlMsgCallback
Callback to reserve an id and initially store the control message.
Callback< void, Address, Address > RoutingUpdateCallback
Callback to update routing and ARP tables after handover.
Callback< uint32_t, uint32_t > SendCtrlMsgCallback
Callback to send a control message and allocate a recv ID for it.
Callback< Ptr< SatControlMessage >, uint32_t > ReadCtrlMsgCallback
Callback to read control messages from container storing control messages.
Keep track of the current position and velocity of an object in satellite network.
Observes given mobilities and keeps track of certain wanted properties.
double GetVelocity(void)
Get velocity of own movement (speed).
double GetElevationAngle(void)
Get elevation angle.
Callback< void, Address, Address, Address > UpdateRoutingCallback
Update routes and ARP tables on gateways after a terminal handover.
void ToggleState(bool enabled)
Toggle the state of the device.
bool SendControlMsg(Ptr< SatControlMessage > msg, const Address &dest)
void AddTraceEntry(Time now, SatEnums::SatPacketEvent_t packetEvent, SatEnums::SatNodeType_t nodeType, uint32_t nodeId, Mac48Address macAddress, SatEnums::SatLogLevel_t logLevel, SatEnums::SatLinkDir_t linkDir, std::string packetInfo)
Add a packet trace entry to the log.
Information of beam users liken UTs and their users.
Callback< double, SatEnums::ChannelType_t, uint32_t, SatEnums::CarrierBandwidthType_t > CarrierBandwidthConverter_t
Callback for carrier bandwidths.
constexpr double SPEED_OF_LIGHT
Constant definition for the speed of light in m/s.
constexpr uint32_t BITS_PER_BYTE
Number of bits in a byte.
SatArqSequenceNumber is handling the sequence numbers for the ARQ process.
SatPhyRxCarrierConf::InterferenceModel m_raInterferenceModel
SatPhyRxCarrierConf::InterferenceEliminationModel m_raInterferenceEliminationModel
SatEnums::RandomAccessModel_t m_randomAccessModel
SatPhyRxCarrierConf::RandomAccessCollisionModel m_raCollisionModel
SatPhyRxCarrierConf::InterferenceModel m_raFwdInterferenceModel
SatPhyRxCarrierConf::InterferenceModel m_raRtnInterferenceModel
SatPhyRxCarrierConf::RandomAccessCollisionModel m_raCollisionModel
SatPhyRxCarrierConf::InterferenceEliminationModel m_raInterferenceEliminationModel
Define RandomAccessSettings as a struct.
SatEnums::RandomAccessModel_t m_randomAccessModel
SatPhyRxCarrierConf::RandomAccessCollisionModel m_raCollisionModel
SatPhyRxCarrierConf::InterferenceEliminationModel m_raInterferenceEliminationModel
SatPhyRxCarrierConf::InterferenceModel m_raInterferenceModel