23 #include "ns3/satellite-geo-helper.h"
25 #include "ns3/config.h"
26 #include "ns3/double.h"
29 #include "ns3/names.h"
30 #include "ns3/packet.h"
31 #include "ns3/pointer.h"
32 #include "ns3/satellite-channel-estimation-error-container.h"
33 #include "ns3/satellite-const-variables.h"
34 #include "ns3/satellite-geo-feeder-llc.h"
35 #include "ns3/satellite-geo-feeder-mac.h"
36 #include "ns3/satellite-geo-feeder-phy.h"
37 #include "ns3/satellite-geo-net-device.h"
38 #include "ns3/satellite-geo-user-llc.h"
39 #include "ns3/satellite-geo-user-mac.h"
40 #include "ns3/satellite-geo-user-phy.h"
41 #include "ns3/satellite-helper.h"
42 #include "ns3/satellite-id-mapper.h"
43 #include "ns3/satellite-isl-arbiter-unicast-helper.h"
44 #include "ns3/satellite-phy-rx-carrier-conf.h"
45 #include "ns3/satellite-phy-rx.h"
46 #include "ns3/satellite-phy-tx.h"
47 #include "ns3/satellite-typedefs.h"
48 #include "ns3/satellite-utils.h"
49 #include "ns3/singleton.h"
50 #include "ns3/uinteger.h"
52 NS_LOG_COMPONENT_DEFINE(
"SatGeoHelper");
57 NS_OBJECT_ENSURE_REGISTERED(SatGeoHelper);
63 TypeId(
"ns3::SatGeoHelper")
65 .AddConstructor<SatGeoHelper>()
66 .AddAttribute(
"DaFwdLinkInterferenceModel",
67 "Forward link interference model for dedicated access",
78 .AddAttribute(
"DaRtnLinkInterferenceModel",
79 "Return link interference model for dedicated access",
90 .AddAttribute(
"FwdLinkErrorModel",
91 "Forward feeder link error model",
100 .AddAttribute(
"FwdLinkConstantErrorRate",
101 "Constant error rate on forward feeder link",
104 MakeDoubleChecker<double>())
105 .AddAttribute(
"RtnLinkErrorModel",
106 "Return user link error model",
115 .AddAttribute(
"RtnLinkConstantErrorRate",
116 "Constant error rate on return user link",
119 MakeDoubleChecker<double>())
120 .AddAttribute(
"IslArbiterType",
121 "Arbiter in use to route packets on ISLs",
125 .AddTraceSource(
"Creation",
128 "ns3::SatTypedefs::CreationCallback");
135 NS_LOG_FUNCTION(
this);
141 : m_carrierBandwidthConverter(),
142 m_fwdLinkCarrierCount(),
143 m_rtnLinkCarrierCount(),
151 m_islArbiterType(
SatEnums::UNICAST),
155 NS_LOG_FUNCTION(
this);
162 uint32_t rtnLinkCarrierCount,
163 uint32_t fwdLinkCarrierCount,
164 Ptr<SatSuperframeSeq> seq,
168 : m_carrierBandwidthConverter(bandwidthConverterCb),
169 m_fwdLinkCarrierCount(fwdLinkCarrierCount),
170 m_rtnLinkCarrierCount(rtnLinkCarrierCount),
175 m_superframeSeq(seq),
176 m_raSettings(randomAccessSettings),
179 m_fwdReadCtrlCb(fwdReadCb),
180 m_rtnReadCtrlCb(rtnReadCb)
182 NS_LOG_FUNCTION(
this << rtnLinkCarrierCount << fwdLinkCarrierCount);
190 NS_LOG_FUNCTION(
this);
226 NS_LOG_FUNCTION(
this << n1);
234 NS_LOG_FUNCTION(
this << n1);
236 Config::SetDefault(
"ns3::SatGeoUserPhy::" + n1, v1);
242 NS_LOG_FUNCTION(
this << n1);
244 Config::SetDefault(
"ns3::SatGeoFeederPhy::" + n1, v1);
250 NS_LOG_FUNCTION(
this);
252 NetDeviceContainer devs;
254 for (NodeContainer::Iterator i = c.Begin(); i != c.End(); i++)
265 NS_LOG_FUNCTION(
this << n);
273 n->AddDevice(satDev);
277 Singleton<SatIdMapper>::Get()->AttachMacToTraceId(satDev->GetAddress());
278 Singleton<SatIdMapper>::Get()->AttachMacToSatId(satDev->GetAddress(),
m_nodeIds.size());
286 NS_LOG_FUNCTION(
this << aName);
288 Ptr<Node> n = Names::Find<Node>(aName);
299 Ptr<SatAntennaGainPattern> userAgp,
300 Ptr<SatAntennaGainPattern> feederAgp,
307 NS_LOG_FUNCTION(
this << d << ff << fr << uf << ur << userAgp << feederAgp << satId << gwId
310 Ptr<SatGeoNetDevice> dev = DynamicCast<SatGeoNetDevice>(d);
312 dev->SetForwardLinkRegenerationMode(forwardLinkRegenerationMode);
313 dev->SetReturnLinkRegenerationMode(returnLinkRegenerationMode);
314 dev->SetNodeId(satId);
323 forwardLinkRegenerationMode,
324 returnLinkRegenerationMode);
331 forwardLinkRegenerationMode,
332 returnLinkRegenerationMode);
339 Ptr<SatAntennaGainPattern> feederAgp,
346 NS_LOG_FUNCTION(
this << dev << ff << fr << feederAgp << satId << gwId << userBeamId
347 << forwardLinkRegenerationMode << returnLinkRegenerationMode);
358 Ptr<SatChannelEstimationErrorContainer> cec =
359 Create<SatSimpleChannelEstimationErrorContainer>();
361 SatPhyRxCarrierConf::RxCarrierCreateParams_s parametersFeeder =
362 SatPhyRxCarrierConf::RxCarrierCreateParams_s();
368 parametersFeeder.m_linkRegenerationMode = forwardLinkRegenerationMode;
371 parametersFeeder.m_cec = cec;
378 Ptr<SatGeoFeederPhy> fPhy = CreateObject<SatGeoFeederPhy>(
383 forwardLinkRegenerationMode,
384 returnLinkRegenerationMode);
389 fPhy->SetTxAntennaGainPattern(feederAgp, dev->GetNode()->GetObject<
SatMobilityModel>());
390 fPhy->SetRxAntennaGainPattern(feederAgp, dev->GetNode()->GetObject<
SatMobilityModel>());
392 dev->AddFeederPhy(fPhy, userBeamId);
396 Ptr<SatGeoFeederMac> fMac;
398 bool startScheduler =
false;
401 fMac = CreateObject<SatGeoFeederMac>(satId,
403 forwardLinkRegenerationMode,
404 returnLinkRegenerationMode);
406 Mac48Address feederAddress;
409 switch (std::max(forwardLinkRegenerationMode, returnLinkRegenerationMode))
414 Ptr<SatNodeInfo> niPhyFeeder =
417 Mac48Address::ConvertFrom(dev->GetAddress()));
418 fPhy->SetNodeInfo(niPhyFeeder);
419 fMac->SetNodeInfo(niPhyFeeder);
425 fLlc = CreateObject<SatGeoLlc>(forwardLinkRegenerationMode, returnLinkRegenerationMode);
427 if (
m_gwMacMap.count(std::make_pair(satId, gwId)))
430 dev->AddFeederMac(fMac,
m_gwMacMap[std::make_pair(satId, gwId)], userBeamId);
435 dev->AddFeederMac(fMac, fMac, userBeamId);
436 m_gwMacMap[std::make_pair(satId, gwId)] = fMac;
437 startScheduler =
true;
444 feederAddress = Mac48Address::Allocate();
445 Ptr<SatNodeInfo> niFeeder =
447 fPhy->SetNodeInfo(niFeeder);
448 fMac->SetNodeInfo(niFeeder);
449 fLlc->SetNodeInfo(niFeeder);
451 dev->AddFeederPair(userBeamId, feederAddress);
458 CreateObject<SatGeoFeederLlc>(forwardLinkRegenerationMode, returnLinkRegenerationMode);
460 if (
m_gwMacMap.count(std::make_pair(satId, gwId)))
463 dev->AddFeederMac(fMac,
m_gwMacMap[std::make_pair(satId, gwId)], userBeamId);
468 dev->AddFeederMac(fMac, fMac, userBeamId);
469 m_gwMacMap[std::make_pair(satId, gwId)] = fMac;
470 startScheduler =
true;
477 feederAddress = Mac48Address::Allocate();
478 Ptr<SatNodeInfo> niFeeder =
480 fPhy->SetNodeInfo(niFeeder);
481 fMac->SetNodeInfo(niFeeder);
482 fLlc->SetNodeInfo(niFeeder);
484 dev->AddFeederPair(userBeamId, feederAddress);
489 NS_FATAL_ERROR(
"Forward or return link regeneration mode unknown");
493 switch (forwardLinkRegenerationMode)
498 fPhy->SetAttribute(
"ReceiveCb", CallbackValue(fCb));
506 fPhy->SetAttribute(
"ReceiveCb", CallbackValue(fCb));
515 NS_FATAL_ERROR(
"Forward link regeneration mode unknown");
519 switch (returnLinkRegenerationMode)
533 Ptr<SatScpcScheduler> scpcScheduler =
534 CreateObject<SatScpcScheduler>(
m_bbFrameConfRtn, feederAddress, carrierBandwidth);
535 fMac->SetFwdScheduler(scpcScheduler);
539 fMac->StartPeriodicTransmissions();
544 scpcScheduler->SetTxOpportunityCallback(
551 NS_FATAL_ERROR(
"Return link regeneration mode unknown");
559 Ptr<SatAntennaGainPattern> userAgp,
565 NS_LOG_FUNCTION(
this << dev << uf << ur << userAgp << satId << userBeamId
566 << forwardLinkRegenerationMode << returnLinkRegenerationMode);
577 Ptr<SatChannelEstimationErrorContainer> cec =
578 Create<SatSimpleChannelEstimationErrorContainer>();
580 SatPhyRxCarrierConf::RxCarrierCreateParams_s parametersUser =
581 SatPhyRxCarrierConf::RxCarrierCreateParams_s();
587 parametersUser.m_linkRegenerationMode = returnLinkRegenerationMode;
590 parametersUser.m_cec = cec;
597 Ptr<SatGeoUserPhy> uPhy = CreateObject<SatGeoUserPhy>(
602 forwardLinkRegenerationMode,
603 returnLinkRegenerationMode);
608 uPhy->SetTxAntennaGainPattern(userAgp, dev->GetNode()->GetObject<
SatMobilityModel>());
609 uPhy->SetRxAntennaGainPattern(userAgp, dev->GetNode()->GetObject<
SatMobilityModel>());
611 dev->AddUserPhy(uPhy, userBeamId);
615 Ptr<SatGeoUserMac> uMac;
618 uMac = CreateObject<SatGeoUserMac>(satId,
620 forwardLinkRegenerationMode,
621 returnLinkRegenerationMode);
623 Mac48Address userAddress;
626 switch (std::max(forwardLinkRegenerationMode, returnLinkRegenerationMode))
631 Ptr<SatNodeInfo> niPhyUser =
634 Mac48Address::ConvertFrom(dev->GetAddress()));
635 uPhy->SetNodeInfo(niPhyUser);
636 uMac->SetNodeInfo(niPhyUser);
642 uLlc = CreateObject<SatGeoLlc>(forwardLinkRegenerationMode, returnLinkRegenerationMode);
644 dev->AddUserMac(uMac, userBeamId);
650 userAddress = Mac48Address::Allocate();
651 Ptr<SatNodeInfo> niUser =
653 uPhy->SetNodeInfo(niUser);
654 uMac->SetNodeInfo(niUser);
655 uLlc->SetNodeInfo(niUser);
661 uLlc = CreateObject<SatGeoUserLlc>(forwardLinkRegenerationMode, returnLinkRegenerationMode);
663 dev->AddUserMac(uMac, userBeamId);
669 userAddress = Mac48Address::Allocate();
670 Ptr<SatNodeInfo> niUser =
672 uPhy->SetNodeInfo(niUser);
673 uMac->SetNodeInfo(niUser);
674 uLlc->SetNodeInfo(niUser);
679 NS_FATAL_ERROR(
"Forward or return link regeneration mode unknown");
683 switch (forwardLinkRegenerationMode)
696 Ptr<SatFwdLinkScheduler> fwdScheduler =
697 CreateObject<SatScpcScheduler>(
m_bbFrameConfFwd, userAddress, carrierBandwidth);
698 uMac->SetFwdScheduler(fwdScheduler);
700 uMac->StartPeriodicTransmissions();
710 NS_FATAL_ERROR(
"Forward link regeneration mode unknown");
714 switch (returnLinkRegenerationMode)
719 uPhy->SetAttribute(
"ReceiveCb", CallbackValue(uCb));
727 uPhy->SetAttribute(
"ReceiveCb", CallbackValue(uCb));
735 uPhy->SetAttribute(
"ReceiveCb", CallbackValue(uCb));
744 NS_FATAL_ERROR(
"Return link regeneration mode unknown");
749 uPhy->BeginEndScheduling();
750 uPhy->SetSendControlMsgToFeederCallback(
758 NS_LOG_FUNCTION(
this);
760 TraceConnect(
"Creation",
"SatGeoHelper", cb);
766 NS_LOG_FUNCTION(
this);
771 Ptr<SatIslArbiterUnicastHelper> satIslArbiterHelper =
772 CreateObject<SatIslArbiterUnicastHelper>(geoNodes, isls);
773 satIslArbiterHelper->InstallArbiters();
777 NS_FATAL_ERROR(
"ISL Arbiter ECMP not implemented yet");
780 NS_FATAL_ERROR(
"Unknown ISL arbiter");
SatEnums class is for simplifying the use of enumerators in the satellite module.
RegenerationMode_t
The regeneration mode used in satellites.
void Receive(SatPhy::PacketContainer_t packets, Ptr< SatSignalParameters > rxParams)
Receive packet from lower layer.
virtual void SendPduWithParams(Ptr< SatSignalParameters > rxParams)
Send Pdu to the PHY tx module (for GEO satellite switch packet forwarding)
uint32_t m_rtnLinkCarrierCount
SatPhy::InterferenceModel m_daFwdLinkInterferenceModel
void SetIslRoutes(NodeContainer geoNodes, std::vector< std::pair< uint32_t, uint32_t >> isls)
Set ISL routes.
std::vector< uint32_t > m_nodeIds
GEO satellites node id.
ObjectFactory m_deviceFactory
SatGeoHelper()
Default constructor.
double m_rtnDaConstantErrorRate
RandomAccessSettings_s m_raSettings
The used random access model settings.
NetDeviceContainer Install(NodeContainer c)
void AttachChannelsUser(Ptr< SatGeoNetDevice > dev, Ptr< SatChannel > uf, Ptr< SatChannel > ur, Ptr< SatAntennaGainPattern > userAgp, uint32_t satId, uint32_t userBeamId, SatEnums::RegenerationMode_t forwardLinkRegenerationMode, SatEnums::RegenerationMode_t returnLinkRegenerationMode)
SatPhy::InterferenceModel m_daRtnLinkInterferenceModel
std::map< uint32_t, uint16_t > m_deviceCount
void SetDeviceAttribute(std::string name, const AttributeValue &value)
Set an attribute value to be propagated to each NetDevice created by the helper.
SatMac::ReadCtrlMsgCallback m_fwdReadCtrlCb
Control forward link messages callback.
Ptr< SatLinkResults > m_rtnLinkResults
Return channel link results (DVB-RCS2) are created if ErrorModel is configured to be AVI.
SatPhy::ErrorModel m_rtnErrorModel
Ptr< SatSuperframeSeq > m_superframeSeq
Superframe sequence.
void EnableCreationTraces(Ptr< OutputStreamWrapper > stream, CallbackBase &cb)
Enables creation traces to be written in given file.
SatTypedefs::CarrierBandwidthConverter_t m_carrierBandwidthConverter
Ptr< SatLinkResults > m_fwdLinkResults
Forward channel link results (DVB-S2) are created if ErrorModel is configured to be AVI.
void Initialize(Ptr< SatLinkResultsFwd > lrFwd, Ptr< SatLinkResultsRtn > lrRcs2)
void SetFeederPhyAttribute(std::string name, const AttributeValue &value)
Set an attribute value to be propagated to each Feeder Phy created by the helper.
std::map< std::pair< uint32_t, uint32_t >, Ptr< SatGeoFeederMac > > m_gwMacMap
Map used in regenerative mode to store if MAC already created for a given pair SAT ID / GW ID.
void SetUserPhyAttribute(std::string name, const AttributeValue &value)
Set an attribute value to be propagated to each User Phy created by the helper.
SatMac::ReadCtrlMsgCallback m_rtnReadCtrlCb
Control return link messages callback.
SatEnums::IslArbiterType_t m_islArbiterType
Arbiter in use to route packets on ISLs.
TracedCallback< std::string > m_creationTrace
Trace callback for creation traces.
void AttachChannelsFeeder(Ptr< SatGeoNetDevice > dev, Ptr< SatChannel > ff, Ptr< SatChannel > fr, Ptr< SatAntennaGainPattern > feederAgp, uint32_t satId, uint32_t gwId, uint32_t userBeamId, SatEnums::RegenerationMode_t forwardLinkRegenerationMode, SatEnums::RegenerationMode_t returnLinkRegenerationMode)
SatPhy::ErrorModel m_fwdErrorModel
Ptr< SatBbFrameConf > m_bbFrameConfFwd
uint32_t m_fwdLinkCarrierCount
Ptr< SatBbFrameConf > m_bbFrameConfRtn
void AttachChannels(Ptr< NetDevice > dev, Ptr< SatChannel > ff, Ptr< SatChannel > fr, Ptr< SatChannel > uf, Ptr< SatChannel > ur, Ptr< SatAntennaGainPattern > userAgp, Ptr< SatAntennaGainPattern > feederAgp, uint32_t satId, uint32_t gwId, uint32_t userBeamId, SatEnums::RegenerationMode_t forwardLinkRegenerationMode, SatEnums::RegenerationMode_t returnLinkRegenerationMode)
double m_fwdDaConstantErrorRate
TypeId GetInstanceTypeId(void) const
static TypeId GetTypeId(void)
Get the type ID.
virtual Ptr< Packet > NotifyTxOpportunity(uint32_t bytes, Mac48Address utAddr, uint8_t flowId, uint32_t &bytesLeft, uint32_t &nextMinTxO)
Called from lower layer (MAC) to inform a Tx opportunity of certain amount of bytes.
SatGeoNetDevice to be utilized in geostationary satellite.
virtual void SetAddress(Address address)
void ReceivePacketFeeder(Ptr< Packet > packet, const Address &feederAddress)
Receive the packet from the lower layers, in network regeneration on forward link.
bool SendControlMsgToFeeder(Ptr< SatControlMessage > msg, const Address &dest, Ptr< SatSignalParameters > rxParams)
Send a control packet on the feeder link.
void ReceiveUser(SatPhy::PacketContainer_t packets, Ptr< SatSignalParameters > rxParams)
Receive the packet from the lower layers.
void ReceivePacketUser(Ptr< Packet > packet, const Address &userAddress)
Receive the packet from the lower layers, in network regeneration on return link.
void ReceiveFeeder(SatPhy::PacketContainer_t packets, Ptr< SatSignalParameters > rxParams)
Receive the packet from the lower layers.
void Receive(SatPhy::PacketContainer_t packets, Ptr< SatSignalParameters > txParams)
Receive packet from lower layer.
virtual void SendPduWithParams(Ptr< SatSignalParameters > rxParams)
Send Pdu to the PHY tx module (for GEO satellite switch packet forwarding)
virtual void GetSchedulingContexts(std::vector< Ptr< SatSchedulingObject >> &output) const =0
Create and fill the scheduling objects based on LLC layer information.
virtual void Receive(Ptr< Packet > packet, Mac48Address source, Mac48Address dest)
Receive user data packet from lower layer.
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.
Callback< void, PacketContainer_t, Ptr< SatSignalParameters > > ReceiveCallback
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 uint8_t SUPERFRAME_SEQUENCE
Used superframe sequence in the RTN link.
SatArqSequenceNumber is handling the sequence numbers for the ARQ process.
Random access setting options.
SatPhyRxCarrierConf::RandomAccessCollisionModel m_raCollisionModel
SatPhyRxCarrierConf::InterferenceEliminationModel m_raInterferenceEliminationModel
SatPhyRxCarrierConf::InterferenceModel m_raRtnInterferenceModel
SatPhyRxCarrierConf::InterferenceModel m_raFwdInterferenceModel
SatEnums::RandomAccessModel_t m_randomAccessModel
Creation parameters for base PHY object.
Ptr< NetDevice > m_device
SatEnums::SatLoraNodeType_t m_standard