Loading...
Searching...
No Matches
satellite-gw-helper-lora.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: Bastien Tauran <bastien.tauran@viveris.fr>
20 */
21
23
24#include "satellite-lora-conf.h"
25
26#include "ns3/log.h"
27#include "ns3/lorawan-ground-mac-gateway.h"
28#include "ns3/lorawan-mac-gateway.h"
29#include "ns3/pointer.h"
30#include "ns3/satellite-channel-estimation-error-container.h"
31#include "ns3/satellite-channel.h"
32#include "ns3/satellite-const-variables.h"
33#include "ns3/satellite-enums.h"
34#include "ns3/satellite-gw-phy.h"
35#include "ns3/satellite-id-mapper.h"
36#include "ns3/satellite-link-results.h"
37#include "ns3/satellite-lorawan-net-device.h"
38#include "ns3/satellite-lower-layer-service.h"
39#include "ns3/satellite-net-device.h"
40#include "ns3/satellite-node-info.h"
41#include "ns3/satellite-orbiter-net-device.h"
42#include "ns3/satellite-phy-rx-carrier-conf.h"
43#include "ns3/satellite-topology.h"
44#include "ns3/satellite-typedefs.h"
45#include "ns3/singleton.h"
46
47NS_LOG_COMPONENT_DEFINE("SatGwHelperLora");
48
49namespace ns3
50{
51
52NS_OBJECT_ENSURE_REGISTERED(SatGwHelperLora);
53
54TypeId
56{
57 static TypeId tid =
58 TypeId("ns3::SatGwHelperLora").SetParent<SatGwHelper>().AddConstructor<SatGwHelperLora>();
59 return tid;
60}
61
63{
64 // this default constructor should be never called
65 NS_FATAL_ERROR("Default constructor not supported!!!");
66}
67
69 uint32_t rtnLinkCarrierCount,
70 Ptr<SatSuperframeSeq> seq,
74 RandomAccessSettings_s randomAccessSettings)
75 : SatGwHelper(carrierBandwidthConverter,
76 rtnLinkCarrierCount,
77 seq,
78 readCb,
79 reserveCb,
80 sendCb,
81 randomAccessSettings)
82{
83 NS_LOG_FUNCTION(this << rtnLinkCarrierCount << seq);
84}
85
86Ptr<NetDevice>
88 uint32_t gwId,
89 uint32_t satId,
90 uint32_t beamId,
91 uint32_t feederSatId,
92 uint32_t feederBeamId,
93 Ptr<SatChannel> fCh,
94 Ptr<SatChannel> rCh,
96 Ptr<SatNcc> ncc,
97 Ptr<SatLowerLayerServiceConf> llsConf)
98{
99 NS_LOG_FUNCTION(this << n << gwId << satId << beamId << fCh << rCh << ncc << llsConf);
100
101 NetDeviceContainer container;
102
103 // Create SatNetDevice
104 m_deviceFactory.SetTypeId("ns3::SatLorawanNetDevice");
105 Ptr<SatLorawanNetDevice> dev = m_deviceFactory.Create<SatLorawanNetDevice>();
106
107 // Attach the SatNetDevices to nodes
108 n->AddDevice(dev);
109
111 params.m_satId = satId;
112 params.m_beamId = beamId;
113 params.m_device = dev;
114 params.m_txCh = fCh;
115 params.m_rxCh = rCh;
117
121 Ptr<SatChannelEstimationErrorContainer> cec;
122 // Not enabled, create only base class
124 {
125 cec = Create<SatSimpleChannelEstimationErrorContainer>();
126 }
127 // Create SatFwdLinkChannelEstimationErrorContainer
128 else
129 {
130 uint32_t minWfId = m_superframeSeq->GetWaveformConf()->GetMinWfId();
131 uint32_t maxWfId = m_superframeSeq->GetWaveformConf()->GetMaxWfId();
132 if (Singleton<SatTopology>::Get()->GetReturnLinkRegenerationMode() ==
134 Singleton<SatTopology>::Get()->GetReturnLinkRegenerationMode() ==
136 {
137 cec = Create<SatRtnLinkChannelEstimationErrorContainer>(minWfId, maxWfId);
138 }
139 else
140 {
141 cec = Create<SatFwdLinkChannelEstimationErrorContainer>();
142 }
143 }
144
145 SatPhyRxCarrierConf::RxCarrierCreateParams_s parameters =
146 SatPhyRxCarrierConf::RxCarrierCreateParams_s();
147 parameters.m_errorModel = m_errorModel;
148 parameters.m_daConstantErrorRate = m_daConstantErrorRate;
149 parameters.m_daIfModel = m_daInterferenceModel;
150 parameters.m_raIfModel = m_raSettings.m_raInterferenceModel;
151 parameters.m_raIfEliminateModel = m_raSettings.m_raInterferenceEliminationModel;
152 parameters.m_linkRegenerationMode =
153 Singleton<SatTopology>::Get()->GetReturnLinkRegenerationMode();
154 parameters.m_bwConverter = m_carrierBandwidthConverter;
155 parameters.m_carrierCount = m_rtnLinkCarrierCount;
156 parameters.m_cec = cec;
157 parameters.m_raCollisionModel = m_raSettings.m_raCollisionModel;
158 parameters.m_raConstantErrorRate = m_raSettings.m_raConstantErrorRate;
159 parameters.m_randomAccessModel = m_raSettings.m_randomAccessModel;
160
161 Ptr<SatGwPhy> phy = CreateObject<SatGwPhy>(
162 params,
164 parameters,
166
167 // ncc->SetUseLora(true);
168
169 // Set fading
170 phy->SetTxFadingContainer(n->GetObject<SatBaseFading>());
171 phy->SetRxFadingContainer(n->GetObject<SatBaseFading>());
172
173 Ptr<LorawanMacGateway> mac = CreateObject<LorawanGroundMacGateway>(satId, beamId);
174
175 Ptr<SatLoraConf> satLoraConf = CreateObject<SatLoraConf>();
176 satLoraConf->SetConf(mac);
177
178 // Attach the Mac layer receiver to Phy
179 SatPhy::ReceiveCallback recCb = MakeCallback(&LorawanMac::Receive, mac);
180
181 // Attach the NCC C/N0 update to Phy
182 SatPhy::CnoCallback cnoCb = MakeCallback(&SatNcc::UtCnoUpdated, ncc);
183
184 // Attach the NCC random access load update to Phy
185 SatPhy::AverageNormalizedOfferedLoadCallback avgNormalizedOfferedLoadCb =
187
188 phy->SetAttribute("ReceiveCb", CallbackValue(recCb));
189 phy->SetAttribute("CnoCb", CallbackValue(cnoCb));
190 phy->SetAttribute("AverageNormalizedOfferedLoadCallback",
191 CallbackValue(avgNormalizedOfferedLoadCb));
192
193 // Attach the PHY layer to SatNetDevice
194 dev->SetPhy(phy);
195
196 // Attach the Mac layer to SatNetDevice
197 dev->SetMac(mac);
198 mac->SetDevice(dev);
199
200 mac->SetPhy(phy);
201
202 // Set the device address and pass it to MAC as well
203 Mac48Address addr = Mac48Address::Allocate();
204 dev->SetAddress(addr);
205
206 Singleton<SatIdMapper>::Get()->AttachMacToTraceId(dev->GetAddress());
207 Singleton<SatIdMapper>::Get()->AttachMacToGwId(dev->GetAddress(), gwId);
208 Singleton<SatIdMapper>::Get()->AttachMacToBeamId(dev->GetAddress(), beamId);
209 Singleton<SatIdMapper>::Get()->AttachMacToSatId(dev->GetAddress(), satId + 1);
210
211 phy->Initialize();
212
213 // Create a node info to all the protocol layers
214 Ptr<SatNodeInfo> nodeInfo = Create<SatNodeInfo>(SatEnums::NT_GW, n->GetId(), addr);
215 dev->SetNodeInfo(nodeInfo);
216 mac->SetNodeInfo(nodeInfo);
217 phy->SetNodeInfo(nodeInfo);
218
219 // Begin frame end scheduling for processes utilizing frame length as interval
220 // Node info needs to be set before the start in order to get the scheduling context correctly
221 // set
222 if (Singleton<SatTopology>::Get()->GetReturnLinkRegenerationMode() == SatEnums::TRANSPARENT)
223 {
224 phy->BeginEndScheduling();
225 }
226
227 Singleton<SatTopology>::Get()->AddGwLayersLora(n,
228 feederSatId,
229 feederBeamId,
230 satId,
231 beamId,
232 dev,
233 DynamicCast<LorawanGroundMacGateway>(mac),
234 phy);
235
236 return dev;
237}
238
239} // namespace ns3
virtual void Receive(SatPhy::PacketContainer_t packets, Ptr< SatSignalParameters >)=0
Receive a packet from the lower layer.
Base class for fading models such as Markov-based fading or fading trace.
Ptr< SatSuperframeSeq > m_superframeSeq
SatPhy::ErrorModel m_errorModel
RandomAccessSettings_s m_raSettings
The used random access model settings.
bool m_enableChannelEstimationError
Enable channel estimation error modeling at forward link receiver (= UT).
ObjectFactory m_deviceFactory
Ptr< SatLinkResults > m_linkResults
SatGwHelper()
Default constructor.
SatPhy::InterferenceModel m_daInterferenceModel
SatTypedefs::CarrierBandwidthConverter_t m_carrierBandwidthConverter
Creates needed objects for LORA GW nodes like SatorbiterNetDevice objects.
virtual Ptr< NetDevice > Install(Ptr< Node > n, uint32_t gwId, uint32_t satId, uint32_t beamId, uint32_t feederSatId, uint32_t feederBeamId, Ptr< SatChannel > fCh, Ptr< SatChannel > rCh, SatPhy::ChannelPairGetterCallback cbChannel, Ptr< SatNcc > ncc, Ptr< SatLowerLayerServiceConf > llsConf)
SatGwHelperLora()
Default constructor.
static TypeId GetTypeId(void)
Get the type ID.
SatLorawanNetDevice to be utilized in the UT and GW nodes for IoT configuration.
Callback< uint32_t, Ptr< SatControlMessage > > ReserveCtrlMsgCallback
Callback to reserve an id and initially store the control message.
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.
void DoRandomAccessDynamicLoadControl(uint32_t satId, uint32_t beamId, uint32_t carrierId, uint8_t allocationChannelId, double averageNormalizedOfferedLoad)
Function for adjusting the random access allocation channel specific load.
void UtCnoUpdated(uint32_t satId, uint32_t beamId, Address sourceMac, Address gwId, double cno, bool isSatelliteMac)
Update UT specific C/N0 information.
Callback< void, uint32_t, uint32_t, Address, Address, double, bool > CnoCallback
Callback< void, uint32_t, uint32_t, uint32_t, uint8_t, double > AverageNormalizedOfferedLoadCallback
Callback< void, PacketContainer_t, Ptr< SatSignalParameters > > ReceiveCallback
Callback< SatChannelPair::ChannelPair_t, uint32_t, uint32_t > ChannelPairGetterCallback
Callback for retrieving a pair of SatChannel associated to a beam.
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.
Creation parameters for base PHY object.
SatEnums::SatLoraNodeType_t m_standard