satellite-geo-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 
23 #include "ns3/satellite-geo-helper.h"
24 
25 #include "ns3/config.h"
26 #include "ns3/double.h"
27 #include "ns3/enum.h"
28 #include "ns3/log.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"
51 
52 NS_LOG_COMPONENT_DEFINE("SatGeoHelper");
53 
54 namespace ns3
55 {
56 
57 NS_OBJECT_ENSURE_REGISTERED(SatGeoHelper);
58 
59 TypeId
61 {
62  static TypeId tid =
63  TypeId("ns3::SatGeoHelper")
64  .SetParent<Object>()
65  .AddConstructor<SatGeoHelper>()
66  .AddAttribute("DaFwdLinkInterferenceModel",
67  "Forward link interference model for dedicated access",
70  MakeEnumChecker(SatPhyRxCarrierConf::IF_CONSTANT,
71  "Constant",
73  "Trace",
75  "PerPacket",
77  "PerFragment"))
78  .AddAttribute("DaRtnLinkInterferenceModel",
79  "Return link interference model for dedicated access",
82  MakeEnumChecker(SatPhyRxCarrierConf::IF_CONSTANT,
83  "Constant",
85  "Trace",
87  "PerPacket",
89  "PerFragment"))
90  .AddAttribute("FwdLinkErrorModel",
91  "Forward feeder link error model",
93  MakeEnumAccessor(&SatGeoHelper::m_fwdErrorModel),
94  MakeEnumChecker(SatPhyRxCarrierConf::EM_NONE,
95  "None",
97  "Constant",
99  "AVI"))
100  .AddAttribute("FwdLinkConstantErrorRate",
101  "Constant error rate on forward feeder link",
102  DoubleValue(0.0),
103  MakeDoubleAccessor(&SatGeoHelper::m_fwdDaConstantErrorRate),
104  MakeDoubleChecker<double>())
105  .AddAttribute("RtnLinkErrorModel",
106  "Return user link error model",
107  EnumValue(SatPhyRxCarrierConf::EM_NONE),
108  MakeEnumAccessor(&SatGeoHelper::m_rtnErrorModel),
109  MakeEnumChecker(SatPhyRxCarrierConf::EM_NONE,
110  "None",
112  "Constant",
114  "AVI"))
115  .AddAttribute("RtnLinkConstantErrorRate",
116  "Constant error rate on return user link",
117  DoubleValue(0.0),
118  MakeDoubleAccessor(&SatGeoHelper::m_rtnDaConstantErrorRate),
119  MakeDoubleChecker<double>())
120  .AddAttribute("IslArbiterType",
121  "Arbiter in use to route packets on ISLs",
122  EnumValue(SatEnums::UNICAST),
123  MakeEnumAccessor(&SatGeoHelper::m_islArbiterType),
124  MakeEnumChecker(SatEnums::UNICAST, "Unicast", SatEnums::ECMP, "ECMP"))
125  .AddTraceSource("Creation",
126  "Creation traces",
127  MakeTraceSourceAccessor(&SatGeoHelper::m_creationTrace),
128  "ns3::SatTypedefs::CreationCallback");
129  return tid;
130 }
131 
132 TypeId
134 {
135  NS_LOG_FUNCTION(this);
136 
137  return GetTypeId();
138 }
139 
141  : m_carrierBandwidthConverter(),
142  m_fwdLinkCarrierCount(),
143  m_rtnLinkCarrierCount(),
144  m_deviceCount(),
145  m_deviceFactory(),
146  m_daFwdLinkInterferenceModel(SatPhyRxCarrierConf::IF_CONSTANT),
147  m_daRtnLinkInterferenceModel(SatPhyRxCarrierConf::IF_CONSTANT),
148  m_raSettings(),
149  m_fwdLinkResults(),
150  m_rtnLinkResults(),
151  m_islArbiterType(SatEnums::UNICAST),
152  m_fwdReadCtrlCb(),
153  m_rtnReadCtrlCb()
154 {
155  NS_LOG_FUNCTION(this);
156 
157  // this default constructor should be never called
158  NS_ASSERT(false);
159 }
160 
162  uint32_t rtnLinkCarrierCount,
163  uint32_t fwdLinkCarrierCount,
164  Ptr<SatSuperframeSeq> seq,
165  SatMac::ReadCtrlMsgCallback fwdReadCb,
166  SatMac::ReadCtrlMsgCallback rtnReadCb,
167  RandomAccessSettings_s randomAccessSettings)
168  : m_carrierBandwidthConverter(bandwidthConverterCb),
169  m_fwdLinkCarrierCount(fwdLinkCarrierCount),
170  m_rtnLinkCarrierCount(rtnLinkCarrierCount),
171  m_deviceCount(),
172  m_deviceFactory(),
173  m_daFwdLinkInterferenceModel(SatPhyRxCarrierConf::IF_CONSTANT),
174  m_daRtnLinkInterferenceModel(SatPhyRxCarrierConf::IF_CONSTANT),
175  m_superframeSeq(seq),
176  m_raSettings(randomAccessSettings),
177  m_fwdLinkResults(),
178  m_rtnLinkResults(),
179  m_fwdReadCtrlCb(fwdReadCb),
180  m_rtnReadCtrlCb(rtnReadCb)
181 {
182  NS_LOG_FUNCTION(this << rtnLinkCarrierCount << fwdLinkCarrierCount);
183 
184  m_deviceFactory.SetTypeId("ns3::SatGeoNetDevice");
185 }
186 
187 void
188 SatGeoHelper::Initialize(Ptr<SatLinkResultsFwd> lrFwd, Ptr<SatLinkResultsRtn> lrRcs2)
189 {
190  NS_LOG_FUNCTION(this);
191 
192  /*
193  * Forward channel link results (DVB-S2 or DVB-S2X).
194  */
196  {
197  m_fwdLinkResults = lrFwd;
198  }
199 
200  /*
201  * Return channel link results (DVB-RCS2).
202  */
204  {
205  m_rtnLinkResults = lrRcs2;
206  }
207 
211  CreateObject<SatBbFrameConf>(m_symbolRateRtn,
212  SatEnums::DVB_S2); // TODO We should be able to switch to S2X ?
213  m_bbFrameConfRtn->InitializeCNoRequirements(lrFwd);
214 
218  CreateObject<SatBbFrameConf>(m_symbolRateFwd,
219  SatEnums::DVB_S2); // TODO We should be able to switch to S2X ?
220  m_bbFrameConfFwd->InitializeCNoRequirements(lrFwd);
221 }
222 
223 void
224 SatGeoHelper::SetDeviceAttribute(std::string n1, const AttributeValue& v1)
225 {
226  NS_LOG_FUNCTION(this << n1);
227 
228  m_deviceFactory.Set(n1, v1);
229 }
230 
231 void
232 SatGeoHelper::SetUserPhyAttribute(std::string n1, const AttributeValue& v1)
233 {
234  NS_LOG_FUNCTION(this << n1);
235 
236  Config::SetDefault("ns3::SatGeoUserPhy::" + n1, v1);
237 }
238 
239 void
240 SatGeoHelper::SetFeederPhyAttribute(std::string n1, const AttributeValue& v1)
241 {
242  NS_LOG_FUNCTION(this << n1);
243 
244  Config::SetDefault("ns3::SatGeoFeederPhy::" + n1, v1);
245 }
246 
247 NetDeviceContainer
248 SatGeoHelper::Install(NodeContainer c)
249 {
250  NS_LOG_FUNCTION(this);
251 
252  NetDeviceContainer devs;
253 
254  for (NodeContainer::Iterator i = c.Begin(); i != c.End(); i++)
255  {
256  devs.Add(Install(*i));
257  }
258 
259  return devs;
260 }
261 
262 Ptr<NetDevice>
264 {
265  NS_LOG_FUNCTION(this << n);
266 
267  NS_ASSERT(m_deviceCount[n->GetId()] == 0);
268 
269  // Create SatGeoNetDevice
270  Ptr<SatGeoNetDevice> satDev = m_deviceFactory.Create<SatGeoNetDevice>();
271 
272  satDev->SetAddress(Mac48Address::Allocate());
273  n->AddDevice(satDev);
274  m_deviceCount[n->GetId()]++;
275  m_nodeIds.push_back(n->GetId());
276 
277  Singleton<SatIdMapper>::Get()->AttachMacToTraceId(satDev->GetAddress());
278  Singleton<SatIdMapper>::Get()->AttachMacToSatId(satDev->GetAddress(), m_nodeIds.size());
279 
280  return satDev;
281 }
282 
283 Ptr<NetDevice>
284 SatGeoHelper::Install(std::string aName)
285 {
286  NS_LOG_FUNCTION(this << aName);
287 
288  Ptr<Node> n = Names::Find<Node>(aName);
289 
290  return Install(n);
291 }
292 
293 void
295  Ptr<SatChannel> ff,
296  Ptr<SatChannel> fr,
297  Ptr<SatChannel> uf,
298  Ptr<SatChannel> ur,
299  Ptr<SatAntennaGainPattern> userAgp,
300  Ptr<SatAntennaGainPattern> feederAgp,
301  uint32_t satId,
302  uint32_t gwId,
303  uint32_t userBeamId,
304  SatEnums::RegenerationMode_t forwardLinkRegenerationMode,
305  SatEnums::RegenerationMode_t returnLinkRegenerationMode)
306 {
307  NS_LOG_FUNCTION(this << d << ff << fr << uf << ur << userAgp << feederAgp << satId << gwId
308  << userBeamId);
309 
310  Ptr<SatGeoNetDevice> dev = DynamicCast<SatGeoNetDevice>(d);
311 
312  dev->SetForwardLinkRegenerationMode(forwardLinkRegenerationMode);
313  dev->SetReturnLinkRegenerationMode(returnLinkRegenerationMode);
314  dev->SetNodeId(satId);
315 
317  ff,
318  fr,
319  feederAgp,
320  satId,
321  gwId,
322  userBeamId,
323  forwardLinkRegenerationMode,
324  returnLinkRegenerationMode);
325  AttachChannelsUser(dev,
326  uf,
327  ur,
328  userAgp,
329  satId,
330  userBeamId,
331  forwardLinkRegenerationMode,
332  returnLinkRegenerationMode);
333 }
334 
335 void
336 SatGeoHelper::AttachChannelsFeeder(Ptr<SatGeoNetDevice> dev,
337  Ptr<SatChannel> ff,
338  Ptr<SatChannel> fr,
339  Ptr<SatAntennaGainPattern> feederAgp,
340  uint32_t satId,
341  uint32_t gwId,
342  uint32_t userBeamId,
343  SatEnums::RegenerationMode_t forwardLinkRegenerationMode,
344  SatEnums::RegenerationMode_t returnLinkRegenerationMode)
345 {
346  NS_LOG_FUNCTION(this << dev << ff << fr << feederAgp << satId << gwId << userBeamId
347  << forwardLinkRegenerationMode << returnLinkRegenerationMode);
348 
349  SatPhy::CreateParam_t params;
350  params.m_satId = satId;
351  params.m_beamId = userBeamId;
352  params.m_device = dev;
353  params.m_standard = SatEnums::GEO;
354 
358  Ptr<SatChannelEstimationErrorContainer> cec =
359  Create<SatSimpleChannelEstimationErrorContainer>();
360 
361  SatPhyRxCarrierConf::RxCarrierCreateParams_s parametersFeeder =
362  SatPhyRxCarrierConf::RxCarrierCreateParams_s();
363  parametersFeeder.m_errorModel = m_fwdErrorModel;
364  parametersFeeder.m_daConstantErrorRate = m_fwdDaConstantErrorRate;
365  parametersFeeder.m_daIfModel = m_daFwdLinkInterferenceModel;
366  parametersFeeder.m_raIfModel = m_raSettings.m_raFwdInterferenceModel;
367  parametersFeeder.m_raIfEliminateModel = m_raSettings.m_raInterferenceEliminationModel;
368  parametersFeeder.m_linkRegenerationMode = forwardLinkRegenerationMode;
369  parametersFeeder.m_bwConverter = m_carrierBandwidthConverter;
370  parametersFeeder.m_carrierCount = m_fwdLinkCarrierCount;
371  parametersFeeder.m_cec = cec;
372  parametersFeeder.m_raCollisionModel = m_raSettings.m_raCollisionModel;
373  parametersFeeder.m_randomAccessModel = m_raSettings.m_randomAccessModel;
374 
375  params.m_txCh = fr;
376  params.m_rxCh = ff;
377 
378  Ptr<SatGeoFeederPhy> fPhy = CreateObject<SatGeoFeederPhy>(
379  params,
381  parametersFeeder,
383  forwardLinkRegenerationMode,
384  returnLinkRegenerationMode);
385 
386  // Note, that currently we have only one set of antenna patterns,
387  // which are utilized in both in user link and feeder link, and
388  // in both uplink and downlink directions.
389  fPhy->SetTxAntennaGainPattern(feederAgp, dev->GetNode()->GetObject<SatMobilityModel>());
390  fPhy->SetRxAntennaGainPattern(feederAgp, dev->GetNode()->GetObject<SatMobilityModel>());
391 
392  dev->AddFeederPhy(fPhy, userBeamId);
393 
394  fPhy->Initialize();
395 
396  Ptr<SatGeoFeederMac> fMac;
397  Ptr<SatGeoLlc> fLlc;
398  bool startScheduler = false;
399 
400  // Create MAC layer
401  fMac = CreateObject<SatGeoFeederMac>(satId,
402  userBeamId,
403  forwardLinkRegenerationMode,
404  returnLinkRegenerationMode);
405 
406  Mac48Address feederAddress;
407 
408  // Create layers needed depending on max regeneration mode
409  switch (std::max(forwardLinkRegenerationMode, returnLinkRegenerationMode))
410  {
413  // Create a node info to PHY layers
414  Ptr<SatNodeInfo> niPhyFeeder =
415  Create<SatNodeInfo>(SatEnums::NT_SAT,
416  m_nodeIds[satId],
417  Mac48Address::ConvertFrom(dev->GetAddress()));
418  fPhy->SetNodeInfo(niPhyFeeder);
419  fMac->SetNodeInfo(niPhyFeeder);
420 
421  break;
422  }
424  // Create LLC layer
425  fLlc = CreateObject<SatGeoLlc>(forwardLinkRegenerationMode, returnLinkRegenerationMode);
426 
427  if (m_gwMacMap.count(std::make_pair(satId, gwId)))
428  {
429  // MAC already exists for this GW ID, reusing it, and disabling the other
430  dev->AddFeederMac(fMac, m_gwMacMap[std::make_pair(satId, gwId)], userBeamId);
431  }
432  else
433  {
434  // First MAC for this GW ID, storing it to the map
435  dev->AddFeederMac(fMac, fMac, userBeamId);
436  m_gwMacMap[std::make_pair(satId, gwId)] = fMac;
437  startScheduler = true;
438  }
439 
440  fMac->SetReadCtrlCallback(m_fwdReadCtrlCb);
441  fLlc->SetReadCtrlCallback(m_fwdReadCtrlCb);
442 
443  // Create a node info to PHY and MAC layers
444  feederAddress = Mac48Address::Allocate();
445  Ptr<SatNodeInfo> niFeeder =
446  Create<SatNodeInfo>(SatEnums::NT_SAT, m_nodeIds[satId], feederAddress);
447  fPhy->SetNodeInfo(niFeeder);
448  fMac->SetNodeInfo(niFeeder);
449  fLlc->SetNodeInfo(niFeeder);
450 
451  dev->AddFeederPair(userBeamId, feederAddress);
452 
453  break;
454  }
456  // Create LLC layer
457  fLlc =
458  CreateObject<SatGeoFeederLlc>(forwardLinkRegenerationMode, returnLinkRegenerationMode);
459 
460  if (m_gwMacMap.count(std::make_pair(satId, gwId)))
461  {
462  // MAC already exists for this GW ID, reusing it, and disabling the other
463  dev->AddFeederMac(fMac, m_gwMacMap[std::make_pair(satId, gwId)], userBeamId);
464  }
465  else
466  {
467  // First MAC for this GW ID, storing it to the map
468  dev->AddFeederMac(fMac, fMac, userBeamId);
469  m_gwMacMap[std::make_pair(satId, gwId)] = fMac;
470  startScheduler = true;
471  }
472 
473  fMac->SetReadCtrlCallback(m_fwdReadCtrlCb);
474  fLlc->SetReadCtrlCallback(m_fwdReadCtrlCb);
475 
476  // Create a node info to PHY and MAC layers
477  feederAddress = Mac48Address::Allocate();
478  Ptr<SatNodeInfo> niFeeder =
479  Create<SatNodeInfo>(SatEnums::NT_SAT, m_nodeIds[satId], feederAddress);
480  fPhy->SetNodeInfo(niFeeder);
481  fMac->SetNodeInfo(niFeeder);
482  fLlc->SetNodeInfo(niFeeder);
483 
484  dev->AddFeederPair(userBeamId, feederAddress);
485 
486  break;
487  }
488  default:
489  NS_FATAL_ERROR("Forward or return link regeneration mode unknown");
490  }
491 
492  // Connect callbacks on forward link
493  switch (forwardLinkRegenerationMode)
494  {
497  SatPhy::ReceiveCallback fCb = MakeCallback(&SatGeoFeederMac::Receive, fMac);
498  fPhy->SetAttribute("ReceiveCb", CallbackValue(fCb));
499 
500  fMac->SetReceiveNetDeviceCallback(MakeCallback(&SatGeoNetDevice::ReceiveFeeder, dev));
501 
502  break;
503  }
505  SatPhy::ReceiveCallback fCb = MakeCallback(&SatGeoFeederMac::Receive, fMac);
506  fPhy->SetAttribute("ReceiveCb", CallbackValue(fCb));
507 
508  fMac->SetReceiveCallback(MakeCallback(&SatGeoFeederLlc::Receive, fLlc));
509 
510  fLlc->SetReceiveSatelliteCallback(MakeCallback(&SatGeoNetDevice::ReceivePacketFeeder, dev));
511 
512  break;
513  }
514  default:
515  NS_FATAL_ERROR("Forward link regeneration mode unknown");
516  }
517 
518  // Connect callbacks on return link
519  switch (returnLinkRegenerationMode)
520  {
523  // Nothing to do on feeder side
524  break;
525  }
528  fMac->SetTransmitCallback(MakeCallback(&SatGeoFeederPhy::SendPduWithParams, fPhy));
529 
531  0,
533  Ptr<SatScpcScheduler> scpcScheduler =
534  CreateObject<SatScpcScheduler>(m_bbFrameConfRtn, feederAddress, carrierBandwidth);
535  fMac->SetFwdScheduler(scpcScheduler);
536  fMac->SetLlc(fLlc);
537  if (startScheduler)
538  {
539  fMac->StartPeriodicTransmissions();
540  }
541 
542  // Attach the LLC Tx opportunity and scheduling context getter callbacks to
543  // SatFwdLinkScheduler
544  scpcScheduler->SetTxOpportunityCallback(
545  MakeCallback(&SatGeoLlc::NotifyTxOpportunity, fLlc));
546  scpcScheduler->SetSchedContextCallback(MakeCallback(&SatLlc::GetSchedulingContexts, fLlc));
547 
548  break;
549  }
550  default:
551  NS_FATAL_ERROR("Return link regeneration mode unknown");
552  }
553 }
554 
555 void
556 SatGeoHelper::AttachChannelsUser(Ptr<SatGeoNetDevice> dev,
557  Ptr<SatChannel> uf,
558  Ptr<SatChannel> ur,
559  Ptr<SatAntennaGainPattern> userAgp,
560  uint32_t satId,
561  uint32_t userBeamId,
562  SatEnums::RegenerationMode_t forwardLinkRegenerationMode,
563  SatEnums::RegenerationMode_t returnLinkRegenerationMode)
564 {
565  NS_LOG_FUNCTION(this << dev << uf << ur << userAgp << satId << userBeamId
566  << forwardLinkRegenerationMode << returnLinkRegenerationMode);
567 
568  SatPhy::CreateParam_t params;
569  params.m_satId = satId;
570  params.m_beamId = userBeamId;
571  params.m_device = dev;
572  params.m_standard = SatEnums::GEO;
573 
577  Ptr<SatChannelEstimationErrorContainer> cec =
578  Create<SatSimpleChannelEstimationErrorContainer>();
579 
580  SatPhyRxCarrierConf::RxCarrierCreateParams_s parametersUser =
581  SatPhyRxCarrierConf::RxCarrierCreateParams_s();
582  parametersUser.m_errorModel = m_rtnErrorModel;
583  parametersUser.m_daConstantErrorRate = m_rtnDaConstantErrorRate;
584  parametersUser.m_daIfModel = m_daRtnLinkInterferenceModel;
585  parametersUser.m_raIfModel = m_raSettings.m_raRtnInterferenceModel;
586  parametersUser.m_raIfEliminateModel = m_raSettings.m_raInterferenceEliminationModel;
587  parametersUser.m_linkRegenerationMode = returnLinkRegenerationMode;
588  parametersUser.m_bwConverter = m_carrierBandwidthConverter;
589  parametersUser.m_carrierCount = m_rtnLinkCarrierCount;
590  parametersUser.m_cec = cec;
591  parametersUser.m_raCollisionModel = m_raSettings.m_raCollisionModel;
592  parametersUser.m_randomAccessModel = m_raSettings.m_randomAccessModel;
593 
594  params.m_txCh = uf;
595  params.m_rxCh = ur;
596 
597  Ptr<SatGeoUserPhy> uPhy = CreateObject<SatGeoUserPhy>(
598  params,
600  parametersUser,
602  forwardLinkRegenerationMode,
603  returnLinkRegenerationMode);
604 
605  // Note, that currently we have only one set of antenna patterns,
606  // which are utilized in both in user link and feeder link, and
607  // in both uplink and downlink directions.
608  uPhy->SetTxAntennaGainPattern(userAgp, dev->GetNode()->GetObject<SatMobilityModel>());
609  uPhy->SetRxAntennaGainPattern(userAgp, dev->GetNode()->GetObject<SatMobilityModel>());
610 
611  dev->AddUserPhy(uPhy, userBeamId);
612 
613  uPhy->Initialize();
614 
615  Ptr<SatGeoUserMac> uMac;
616  Ptr<SatGeoLlc> uLlc;
617 
618  uMac = CreateObject<SatGeoUserMac>(satId,
619  userBeamId,
620  forwardLinkRegenerationMode,
621  returnLinkRegenerationMode);
622 
623  Mac48Address userAddress;
624 
625  // Create layers needed depending on max regeneration mode
626  switch (std::max(forwardLinkRegenerationMode, returnLinkRegenerationMode))
627  {
630  // Create a node info to PHY layers
631  Ptr<SatNodeInfo> niPhyUser =
632  Create<SatNodeInfo>(SatEnums::NT_SAT,
633  m_nodeIds[satId],
634  Mac48Address::ConvertFrom(dev->GetAddress()));
635  uPhy->SetNodeInfo(niPhyUser);
636  uMac->SetNodeInfo(niPhyUser);
637 
638  break;
639  }
641  // Create LLC layer
642  uLlc = CreateObject<SatGeoLlc>(forwardLinkRegenerationMode, returnLinkRegenerationMode);
643 
644  dev->AddUserMac(uMac, userBeamId);
645 
646  uMac->SetReadCtrlCallback(m_rtnReadCtrlCb);
647  uLlc->SetReadCtrlCallback(m_rtnReadCtrlCb);
648 
649  // Create a node info to PHY and MAC layers
650  userAddress = Mac48Address::Allocate();
651  Ptr<SatNodeInfo> niUser =
652  Create<SatNodeInfo>(SatEnums::NT_SAT, m_nodeIds[satId], userAddress);
653  uPhy->SetNodeInfo(niUser);
654  uMac->SetNodeInfo(niUser);
655  uLlc->SetNodeInfo(niUser);
656 
657  break;
658  }
660  // Create LLC layer
661  uLlc = CreateObject<SatGeoUserLlc>(forwardLinkRegenerationMode, returnLinkRegenerationMode);
662 
663  dev->AddUserMac(uMac, userBeamId);
664 
665  uMac->SetReadCtrlCallback(m_rtnReadCtrlCb);
666  uLlc->SetReadCtrlCallback(m_rtnReadCtrlCb);
667 
668  // Create a node info to PHY and MAC layers
669  userAddress = Mac48Address::Allocate();
670  Ptr<SatNodeInfo> niUser =
671  Create<SatNodeInfo>(SatEnums::NT_SAT, m_nodeIds[satId], userAddress);
672  uPhy->SetNodeInfo(niUser);
673  uMac->SetNodeInfo(niUser);
674  uLlc->SetNodeInfo(niUser);
675 
676  break;
677  }
678  default:
679  NS_FATAL_ERROR("Forward or return link regeneration mode unknown");
680  }
681 
682  // Connect callbacks on forward link
683  switch (forwardLinkRegenerationMode)
684  {
687  // Nothing to do on user side
688  break;
689  }
691  uMac->SetTransmitCallback(MakeCallback(&SatGeoUserPhy::SendPduWithParams, uPhy));
692 
693  double carrierBandwidth = m_carrierBandwidthConverter(SatEnums::FORWARD_USER_CH,
694  0,
696  Ptr<SatFwdLinkScheduler> fwdScheduler =
697  CreateObject<SatScpcScheduler>(m_bbFrameConfFwd, userAddress, carrierBandwidth);
698  uMac->SetFwdScheduler(fwdScheduler);
699  uMac->SetLlc(uLlc);
700  uMac->StartPeriodicTransmissions();
701 
702  // Attach the LLC Tx opportunity and scheduling context getter callbacks to
703  // SatFwdLinkScheduler
704  fwdScheduler->SetTxOpportunityCallback(MakeCallback(&SatGeoLlc::NotifyTxOpportunity, uLlc));
705  fwdScheduler->SetSchedContextCallback(MakeCallback(&SatLlc::GetSchedulingContexts, uLlc));
706 
707  break;
708  }
709  default:
710  NS_FATAL_ERROR("Forward link regeneration mode unknown");
711  }
712 
713  // Connect callbacks on return link
714  switch (returnLinkRegenerationMode)
715  {
718  SatPhy::ReceiveCallback uCb = MakeCallback(&SatGeoNetDevice::ReceiveUser, dev);
719  uPhy->SetAttribute("ReceiveCb", CallbackValue(uCb));
720 
721  uMac->SetReceiveNetDeviceCallback(MakeCallback(&SatGeoNetDevice::ReceiveUser, dev));
722 
723  break;
724  }
726  SatPhy::ReceiveCallback uCb = MakeCallback(&SatGeoUserMac::Receive, uMac);
727  uPhy->SetAttribute("ReceiveCb", CallbackValue(uCb));
728 
729  uMac->SetReceiveNetDeviceCallback(MakeCallback(&SatGeoNetDevice::ReceiveUser, dev));
730 
731  break;
732  }
734  SatPhy::ReceiveCallback uCb = MakeCallback(&SatGeoUserMac::Receive, uMac);
735  uPhy->SetAttribute("ReceiveCb", CallbackValue(uCb));
736 
737  uMac->SetReceiveCallback(MakeCallback(&SatGeoUserLlc::Receive, uLlc));
738 
739  uLlc->SetReceiveSatelliteCallback(MakeCallback(&SatGeoNetDevice::ReceivePacketUser, dev));
740 
741  break;
742  }
743  default:
744  NS_FATAL_ERROR("Return link regeneration mode unknown");
745  }
746 
747  if (returnLinkRegenerationMode != SatEnums::TRANSPARENT)
748  {
749  uPhy->BeginEndScheduling();
750  uPhy->SetSendControlMsgToFeederCallback(
751  MakeCallback(&SatGeoNetDevice::SendControlMsgToFeeder, dev));
752  }
753 }
754 
755 void
756 SatGeoHelper::EnableCreationTraces(Ptr<OutputStreamWrapper> stream, CallbackBase& cb)
757 {
758  NS_LOG_FUNCTION(this);
759 
760  TraceConnect("Creation", "SatGeoHelper", cb);
761 }
762 
763 void
764 SatGeoHelper::SetIslRoutes(NodeContainer geoNodes, std::vector<std::pair<uint32_t, uint32_t>> isls)
765 {
766  NS_LOG_FUNCTION(this);
767 
768  switch (m_islArbiterType)
769  {
770  case SatEnums::UNICAST: {
771  Ptr<SatIslArbiterUnicastHelper> satIslArbiterHelper =
772  CreateObject<SatIslArbiterUnicastHelper>(geoNodes, isls);
773  satIslArbiterHelper->InstallArbiters();
774  break;
775  }
776  case SatEnums::ECMP: {
777  NS_FATAL_ERROR("ISL Arbiter ECMP not implemented yet");
778  }
779  default: {
780  NS_FATAL_ERROR("Unknown ISL arbiter");
781  }
782  }
783 }
784 
785 } // namespace ns3
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)
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.
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
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)
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
Definition: satellite-phy.h:84
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.
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< SatChannel > m_rxCh
Ptr< NetDevice > m_device
Ptr< SatChannel > m_txCh
SatEnums::SatLoraNodeType_t m_standard