Loading...
Searching...
No Matches
satellite-orbiter-helper-dvb.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
25#include "satellite-helper.h"
27
28#include "ns3/config.h"
29#include "ns3/double.h"
30#include "ns3/enum.h"
31#include "ns3/log.h"
32#include "ns3/names.h"
33#include "ns3/packet.h"
34#include "ns3/pointer.h"
35#include "ns3/satellite-channel-estimation-error-container.h"
36#include "ns3/satellite-const-variables.h"
37#include "ns3/satellite-id-mapper.h"
38#include "ns3/satellite-orbiter-feeder-llc.h"
39#include "ns3/satellite-orbiter-feeder-mac.h"
40#include "ns3/satellite-orbiter-feeder-phy.h"
41#include "ns3/satellite-orbiter-net-device-dvb.h"
42#include "ns3/satellite-orbiter-user-llc.h"
43#include "ns3/satellite-orbiter-user-mac.h"
44#include "ns3/satellite-orbiter-user-phy.h"
45#include "ns3/satellite-phy-rx-carrier-conf.h"
46#include "ns3/satellite-phy-rx.h"
47#include "ns3/satellite-phy-tx.h"
48#include "ns3/satellite-topology.h"
49#include "ns3/satellite-typedefs.h"
50#include "ns3/satellite-utils.h"
51#include "ns3/singleton.h"
52#include "ns3/uinteger.h"
53
54#include <algorithm>
55#include <string>
56#include <utility>
57#include <vector>
58
59NS_LOG_COMPONENT_DEFINE("SatOrbiterHelperDvb");
60
61namespace ns3
62{
63
64NS_OBJECT_ENSURE_REGISTERED(SatOrbiterHelperDvb);
65
66TypeId
68{
69 static TypeId tid = TypeId("ns3::SatOrbiterHelperDvb")
70 .SetParent<SatOrbiterHelper>()
71 .AddConstructor<SatOrbiterHelperDvb>();
72 return tid;
73}
74
77{
78 NS_LOG_FUNCTION(this);
79
80 // this default constructor should be never called
81 NS_ASSERT(false);
82}
83
86 uint32_t rtnLinkCarrierCount,
87 uint32_t fwdLinkCarrierCount,
88 Ptr<SatSuperframeSeq> seq,
91 RandomAccessSettings_s randomAccessSettings)
92 : SatOrbiterHelper(bandwidthConverterCb,
93 rtnLinkCarrierCount,
94 fwdLinkCarrierCount,
95 seq,
96 fwdReadCb,
97 rtnReadCb,
98 randomAccessSettings)
99{
100 NS_LOG_FUNCTION(this << rtnLinkCarrierCount << fwdLinkCarrierCount);
101
102 m_deviceFactory.SetTypeId("ns3::SatOrbiterNetDeviceDvb");
103}
104
105Ptr<SatOrbiterNetDevice>
107{
108 NS_LOG_FUNCTION(this);
109
111}
112
113void
114SatOrbiterHelperDvb::AttachChannelsUser(Ptr<SatOrbiterNetDevice> dev,
115 Ptr<SatChannel> uf,
116 Ptr<SatChannel> ur,
117 Ptr<SatAntennaGainPattern> userAgp,
118 Ptr<SatNcc> ncc,
119 uint32_t satId,
120 uint32_t userBeamId)
121{
122 NS_LOG_FUNCTION(this << dev << uf << ur << userAgp << satId << userBeamId);
123
125 params.m_satId = satId;
126 params.m_beamId = userBeamId;
127 params.m_device = dev;
129
133 Ptr<SatChannelEstimationErrorContainer> cec =
134 Create<SatSimpleChannelEstimationErrorContainer>();
135
136 SatPhyRxCarrierConf::RxCarrierCreateParams_s parametersUser =
137 SatPhyRxCarrierConf::RxCarrierCreateParams_s();
138 parametersUser.m_errorModel = m_rtnErrorModel;
139 parametersUser.m_daConstantErrorRate = m_rtnDaConstantErrorRate;
140 parametersUser.m_daIfModel = m_daRtnLinkInterferenceModel;
141 parametersUser.m_raIfModel = m_raSettings.m_raRtnInterferenceModel;
142 parametersUser.m_raIfEliminateModel = m_raSettings.m_raInterferenceEliminationModel;
143 parametersUser.m_linkRegenerationMode =
144 Singleton<SatTopology>::Get()->GetReturnLinkRegenerationMode();
145 parametersUser.m_bwConverter = m_carrierBandwidthConverter;
146 parametersUser.m_carrierCount = m_rtnLinkCarrierCount;
147 parametersUser.m_cec = cec;
148 parametersUser.m_raCollisionModel = m_raSettings.m_raCollisionModel;
149 parametersUser.m_randomAccessModel = m_raSettings.m_randomAccessModel;
150
151 params.m_txCh = uf;
152 params.m_rxCh = ur;
153
154 Ptr<SatOrbiterUserPhy> uPhy = CreateObject<SatOrbiterUserPhy>(
155 params,
157 parametersUser,
159
160 // Note, that currently we have only one set of antenna patterns,
161 // which are utilized in both in user link and feeder link, and
162 // in both uplink and downlink directions.
163 uPhy->SetTxAntennaGainPattern(userAgp, dev->GetNode()->GetObject<SatMobilityModel>());
164 uPhy->SetRxAntennaGainPattern(userAgp, dev->GetNode()->GetObject<SatMobilityModel>());
165
166 dev->AddUserPhy(uPhy, userBeamId);
167
168 uPhy->Initialize();
169
170 Ptr<SatOrbiterUserMac> uMac;
171 Ptr<SatOrbiterUserLlc> uLlc;
172
173 uMac = CreateObject<SatOrbiterUserMac>(satId, userBeamId);
174
175 Mac48Address userAddress;
176
177 // Create layers needed depending on max regeneration mode
178 switch (std::max(Singleton<SatTopology>::Get()->GetForwardLinkRegenerationMode(),
179 Singleton<SatTopology>::Get()->GetReturnLinkRegenerationMode()))
180 {
183 // Create a node info to PHY layers
184 Ptr<SatNodeInfo> niPhyUser =
185 Create<SatNodeInfo>(SatEnums::NT_SAT,
186 m_nodeIds[satId],
187 Mac48Address::ConvertFrom(dev->GetAddress()));
188 uPhy->SetNodeInfo(niPhyUser);
189 uMac->SetNodeInfo(niPhyUser);
190
191 break;
192 }
194 // Create LLC layer
195 uLlc = CreateObject<SatOrbiterUserLlc>();
196
197 dev->AddUserMac(uMac, userBeamId);
198
199 uMac->SetReadCtrlCallback(m_rtnReadCtrlCb);
200 uLlc->SetReadCtrlCallback(m_rtnReadCtrlCb);
201
202 // Create a node info to PHY and MAC layers
203 userAddress = Mac48Address::Allocate();
204 Ptr<SatNodeInfo> niUser =
205 Create<SatNodeInfo>(SatEnums::NT_SAT, m_nodeIds[satId], userAddress);
206 uPhy->SetNodeInfo(niUser);
207 uMac->SetNodeInfo(niUser);
208 uLlc->SetNodeInfo(niUser);
209
210 dev->AddUserPair(userBeamId, userAddress);
211
212 break;
213 }
215 // Create LLC layer
216 uLlc = CreateObject<SatOrbiterUserLlc>();
217
218 dev->AddUserMac(uMac, userBeamId);
219
220 uMac->SetReadCtrlCallback(m_rtnReadCtrlCb);
221 uLlc->SetReadCtrlCallback(m_rtnReadCtrlCb);
222
223 // Create a node info to PHY and MAC layers
224 userAddress = Mac48Address::Allocate();
225 Ptr<SatNodeInfo> niUser =
226 Create<SatNodeInfo>(SatEnums::NT_SAT, m_nodeIds[satId], userAddress);
227 uPhy->SetNodeInfo(niUser);
228 uMac->SetNodeInfo(niUser);
229 uLlc->SetNodeInfo(niUser);
230
231 dev->AddUserPair(userBeamId, userAddress);
232
233 break;
234 }
235 default:
236 NS_FATAL_ERROR("Forward or return link regeneration mode unknown");
237 }
238
239 // Connect callbacks on forward link
240 switch (Singleton<SatTopology>::Get()->GetForwardLinkRegenerationMode())
241 {
244 // Nothing to do on user side
245 break;
246 }
248 uMac->SetTransmitCallback(MakeCallback(&SatOrbiterUserPhy::SendPduWithParams, uPhy));
249
251 0,
253 Ptr<SatFwdLinkScheduler> fwdScheduler =
254 CreateObject<SatScpcScheduler>(m_bbFrameConfFwd, userAddress, carrierBandwidth);
255 uMac->SetFwdScheduler(fwdScheduler);
256 uMac->SetLlc(uLlc);
257 uMac->StartPeriodicTransmissions();
258
259 // Attach the LLC Tx opportunity and scheduling context getter callbacks to
260 // SatFwdLinkScheduler
261 fwdScheduler->SetTxOpportunityCallback(
262 MakeCallback(&SatOrbiterLlc::NotifyTxOpportunity, uLlc));
263 fwdScheduler->SetSchedContextCallback(MakeCallback(&SatLlc::GetSchedulingContexts, uLlc));
264
265 break;
266 }
267 default:
268 NS_FATAL_ERROR("Forward link regeneration mode unknown");
269 }
270
271 // Connect callbacks on return link
272 switch (Singleton<SatTopology>::Get()->GetReturnLinkRegenerationMode())
273 {
277 uPhy->SetAttribute("ReceiveCb", CallbackValue(uCb));
278
279 uMac->SetReceiveNetDeviceCallback(MakeCallback(&SatOrbiterNetDevice::ReceiveUser, dev));
280
281 break;
282 }
284 SatPhy::ReceiveCallback uCb = MakeCallback(&SatOrbiterUserMac::Receive, uMac);
285 uPhy->SetAttribute("ReceiveCb", CallbackValue(uCb));
286
287 uMac->SetReceiveNetDeviceCallback(MakeCallback(&SatOrbiterNetDevice::ReceiveUser, dev));
288
289 break;
290 }
292 SatPhy::ReceiveCallback uCb = MakeCallback(&SatOrbiterUserMac::Receive, uMac);
293 uPhy->SetAttribute("ReceiveCb", CallbackValue(uCb));
294
295 uMac->SetReceiveCallback(MakeCallback(&SatOrbiterUserLlc::Receive, uLlc));
296
297 uLlc->SetReceiveSatelliteCallback(
298 MakeCallback(&SatOrbiterNetDevice::ReceivePacketUser, dev));
299
300 break;
301 }
302 default:
303 NS_FATAL_ERROR("Return link regeneration mode unknown");
304 }
305
306 if (Singleton<SatTopology>::Get()->GetReturnLinkRegenerationMode() != SatEnums::TRANSPARENT)
307 {
308 uPhy->BeginEndScheduling();
309 uPhy->SetSendControlMsgToFeederCallback(
311 }
312
313 Singleton<SatTopology>::Get()
314 ->AddOrbiterUserLayersDvb(dev->GetNode(), satId, userBeamId, dev, uLlc, uMac, uPhy);
315}
316
317} // namespace ns3
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.
Creates needed objects for Satellite node like SatorbiterNetDevice objects.
static TypeId GetTypeId(void)
Get the type ID.
virtual Ptr< SatOrbiterNetDevice > CreateOrbiterNetDevice()
Create a SatOrbiterNetDevice instance, with correct type infered from child classes.
virtual void AttachChannelsUser(Ptr< SatOrbiterNetDevice > dev, Ptr< SatChannel > uf, Ptr< SatChannel > ur, Ptr< SatAntennaGainPattern > userAgp, Ptr< SatNcc > ncc, uint32_t satId, uint32_t userBeamId)
Ptr< SatLinkResults > m_rtnLinkResults
Return channel link results (DVB-RCS2) are created if ErrorModel is configured to be AVI.
RandomAccessSettings_s m_raSettings
The used random access model settings.
std::vector< uint32_t > m_nodeIds
Satellites node id.
Ptr< SatBbFrameConf > m_bbFrameConfFwd
Ptr< SatSuperframeSeq > m_superframeSeq
Superframe sequence.
SatPhy::InterferenceModel m_daRtnLinkInterferenceModel
SatTypedefs::CarrierBandwidthConverter_t m_carrierBandwidthConverter
SatOrbiterHelper()
Default constructor.
SatMac::ReadCtrlMsgCallback m_rtnReadCtrlCb
Control return link messages callback.
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.
SatOrbiterNetDeviceDvb to be utilized in geostationary satellite.
virtual bool SendControlMsgToFeeder(Ptr< SatControlMessage > msg, const Address &dest, Ptr< SatSignalParameters > rxParams)=0
Send a control packet on the feeder link.
void ReceiveUser(SatPhy::PacketContainer_t packets, Ptr< SatSignalParameters > rxParams)
Receive the packet from the lower layers.
virtual void ReceivePacketUser(Ptr< Packet > packet, const Address &userAddress)=0
Receive the packet from the lower layers, in network regeneration on return link.
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 satellite switch packet forwarding).
Callback< void, PacketContainer_t, Ptr< SatSignalParameters > > ReceiveCallback
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