sat-vhts-example.cc
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2014 Magister Solutions
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  * Author: Bastien Tauran <bastien.tauran@viveris.fr>
19  *
20  */
21 
22 #include "ns3/applications-module.h"
23 #include "ns3/config-store-module.h"
24 #include "ns3/core-module.h"
25 #include "ns3/internet-module.h"
26 #include "ns3/network-module.h"
27 #include "ns3/satellite-module.h"
28 #include "ns3/traffic-module.h"
29 
30 using namespace ns3;
31 
39 NS_LOG_COMPONENT_DEFINE("sat-vhts-example");
40 
41 // TODO confirm that
42 void
43 EnableRA(std::string raModel, bool dynamicLoadControl)
44 {
45  // Enable Random Access with CRDSA or MARSALA
46  if (raModel == "CRDSA")
47  {
48  Config::SetDefault("ns3::SatBeamHelper::RandomAccessModel",
49  EnumValue(SatEnums::RA_MODEL_CRDSA));
50  }
51  else if (raModel == "MARSALA")
52  {
53  Config::SetDefault("ns3::SatBeamHelper::RandomAccessModel",
54  EnumValue(SatEnums::RA_MODEL_MARSALA));
55  }
56  else
57  {
58  NS_FATAL_ERROR("Incorrect RA model");
59  }
60 
61  // Set Random Access interference model
62  Config::SetDefault("ns3::SatBeamHelper::RaInterferenceModel",
64 
65  // Set Random Access collision model
66  Config::SetDefault("ns3::SatBeamHelper::RaCollisionModel",
68 
69  // Set dynamic load control parameters
70  Config::SetDefault("ns3::SatPhyRxCarrierConf::EnableRandomAccessDynamicLoadControl",
71  BooleanValue(dynamicLoadControl));
72  Config::SetDefault(
73  "ns3::SatPhyRxCarrierConf::RandomAccessAverageNormalizedOfferedLoadMeasurementWindowSize",
74  UintegerValue(10));
75 }
76 
77 static void
78 SatCourseChange(std::string context, Ptr<const SatMobilityModel> position)
79 {
80  auto tracedPosition = DynamicCast<const SatTracedMobilityModel>(position);
81  NS_ASSERT_MSG(tracedPosition != NULL, "Course changed for a non-mobile UT");
82 }
83 
84 int
85 main(int argc, char* argv[])
86 {
87  // Variables
88  std::string beams = "8";
89  uint32_t nbGw = 1;
90  uint32_t nbUtsPerBeam = 10;
91  uint32_t nbEndUsersPerUt = 1;
92 
93  Time appStartTime = Seconds(0.001);
94  Time simLength = Seconds(60.0);
95 
96  std::string raModel = "CRDSA";
97  bool dynamicLoadControl = true;
98  bool utMobility = false;
99  std::string mobilityPath = "contrib/satellite/data/utpositions/mobiles/scenario0/trajectory";
100  std::string burstLengthStr = "ShortBurst";
102 
103  uint32_t superFrameConfForSeq0Int = 0;
104  SatSuperframeConf::SuperFrameConfiguration_t superFrameConfForSeq0 =
106  uint32_t frameConfigTypeInt = 0;
108 
109  std::string modcodsUsed =
110  "QPSK_1_TO_2 QPSK_3_TO_5 QPSK_2_TO_3 QPSK_3_TO_4 QPSK_4_TO_5 QPSK_5_TO_6 QPSK_8_TO_9 "
111  "QPSK_9_TO_10 "
112  "8PSK_3_TO_5 8PSK_2_TO_3 8PSK_3_TO_4 8PSK_5_TO_6 8PSK_8_TO_9 8PSK_9_TO_10 "
113  "16APSK_2_TO_3 16APSK_3_TO_4 16APSK_4_TO_5 16APSK_5_TO_6 16APSK_8_TO_9 16APSK_9_TO_10 "
114  "32APSK_3_TO_4 32APSK_4_TO_5 32APSK_5_TO_6 32APSK_8_TO_9";
115 
116  Ptr<SimulationHelper> simulationHelper = CreateObject<SimulationHelper>("sat-vhts-example");
117 
118  // Read command line parameters given by user
119  CommandLine cmd;
120  cmd.AddValue("Beams", "Ids of beams used (each separated by _)", beams);
121  cmd.AddValue("NbGw", "Number of GWs", nbGw);
122  cmd.AddValue("NbUtsPerBeam", "Number of UTs per spot-beam", nbUtsPerBeam);
123  cmd.AddValue("NbEndUsersPerUt", "Number of end users per UT", nbEndUsersPerUt);
124  cmd.AddValue("AppStartTime", "Applications start time (in seconds, or add unit)", appStartTime);
125  cmd.AddValue("SimLength", "Simulation length (in seconds, or add unit)", simLength);
126  cmd.AddValue("RaModel", "Random Access model chosen (CRDSA or MARSALA)", raModel);
127  cmd.AddValue("DynamicLoadControl", "Set true to use dynamic load control", dynamicLoadControl);
128  cmd.AddValue("UtMobility", "Set true to use UT mobility", utMobility);
129  cmd.AddValue("mobilityPath",
130  "Path to the mobility file",
131  mobilityPath); // TODO works if only one UT ?
132  cmd.AddValue("BurstLength",
133  "Burst length (can be ShortBurst, LongBurst or ShortAndLongBurst)",
134  burstLengthStr);
135  cmd.AddValue("SuperFrameConfForSeq0",
136  "Super frame configuration used for super frame sequence 0",
137  superFrameConfForSeq0Int);
138  cmd.AddValue("FrameConfigType",
139  "The frame configuration type used for super frame",
140  frameConfigTypeInt);
141  simulationHelper->AddDefaultUiArguments(cmd);
142  cmd.Parse(argc, argv);
143 
144  std::replace(beams.begin(), beams.end(), '_', ' ');
145 
146  // Initialize enum values
147  if (burstLengthStr == "ShortBurst")
148  {
149  burstLength = SatEnums::SHORT_BURST;
150  }
151  else if (burstLengthStr == "LongBurst")
152  {
153  burstLength = SatEnums::LONG_BURST;
154  }
155  else if (burstLengthStr == "ShortAndLongBurst")
156  {
157  burstLength = SatEnums::SHORT_AND_LONG_BURST;
158  }
159  else
160  {
161  NS_FATAL_ERROR("Incorrect burst size");
162  }
163 
164  switch (superFrameConfForSeq0Int)
165  {
166  case 0:
167  superFrameConfForSeq0 = SatSuperframeConf::SUPER_FRAME_CONFIG_0;
168  break;
169  case 1:
170  superFrameConfForSeq0 = SatSuperframeConf::SUPER_FRAME_CONFIG_1;
171  break;
172  case 2:
173  superFrameConfForSeq0 = SatSuperframeConf::SUPER_FRAME_CONFIG_2;
174  break;
175  case 3:
176  superFrameConfForSeq0 = SatSuperframeConf::SUPER_FRAME_CONFIG_3;
177  break;
178  default:
179  NS_FATAL_ERROR("Incorrect super frame conf");
180  }
181 
182  switch (frameConfigTypeInt)
183  {
184  case 0:
185  frameConfigType = SatSuperframeConf::CONFIG_TYPE_0;
186  break;
187  case 1:
188  frameConfigType = SatSuperframeConf::CONFIG_TYPE_1;
189  break;
190  case 2:
191  frameConfigType = SatSuperframeConf::CONFIG_TYPE_2;
192  break;
193  case 3:
194  frameConfigType = SatSuperframeConf::CONFIG_TYPE_3;
195  break;
196  default:
197  NS_FATAL_ERROR("Incorrect frame type");
198  }
199 
200  Config::SetDefault("ns3::SatEnvVariables::EnableSimulationOutputOverwrite", BooleanValue(true));
201  Config::SetDefault("ns3::SatHelper::PacketTraceEnabled", BooleanValue(true));
202 
203  /*
204  * FWD link
205  */
206  // Set defaults
207  Config::SetDefault("ns3::SatConf::FwdUserLinkBandwidth", DoubleValue(2e+09));
208  Config::SetDefault("ns3::SatConf::FwdFeederLinkBandwidth", DoubleValue(8e+09));
209  Config::SetDefault("ns3::SatConf::FwdCarrierAllocatedBandwidth", DoubleValue(500e+06));
210  Config::SetDefault("ns3::SatConf::FwdCarrierRollOff", DoubleValue(0.05));
211 
212  // ModCods selection
213  Config::SetDefault("ns3::SatBeamHelper::DvbVersion", StringValue("DVB_S2"));
214  Config::SetDefault("ns3::SatBbFrameConf::ModCodsUsed", StringValue(modcodsUsed));
215  Config::SetDefault("ns3::SatBbFrameConf::DefaultModCod", StringValue("QPSK_1_TO_2"));
216 
217  /*
218  * RTN link
219  */
220  // Set defaults
221  Config::SetDefault("ns3::SatConf::RtnUserLinkBandwidth", DoubleValue(500e+06));
222  Config::SetDefault("ns3::SatConf::RtnFeederLinkBandwidth", DoubleValue(2e+09));
223  Config::SetDefault("ns3::SatWaveformConf::BurstLength", EnumValue(burstLength));
224 
225  EnableRA(raModel, dynamicLoadControl);
226 
227  Config::SetDefault("ns3::SatConf::SuperFrameConfForSeq0", EnumValue(superFrameConfForSeq0));
228  switch (superFrameConfForSeq0)
229  {
231  Config::SetDefault("ns3::SatSuperframeConf0::FrameConfigType", EnumValue(frameConfigType));
232  break;
234  Config::SetDefault("ns3::SatSuperframeConf1::FrameConfigType", EnumValue(frameConfigType));
235  break;
237  Config::SetDefault("ns3::SatSuperframeConf2::FrameConfigType", EnumValue(frameConfigType));
238  break;
240  Config::SetDefault("ns3::SatSuperframeConf3::FrameConfigType", EnumValue(frameConfigType));
241  break;
242  default:
243  NS_FATAL_ERROR("Impossible to reach here");
244  }
245 
246  /*
247  * Traffics
248  */
249  simulationHelper->SetSimulationTime(simLength);
250 
251  simulationHelper->SetGwUserCount(nbGw);
252  simulationHelper->SetUtCountPerBeam(nbUtsPerBeam);
253  simulationHelper->SetUserCountPerUt(nbEndUsersPerUt);
254  simulationHelper->SetBeams(beams);
255 
256  simulationHelper->CreateSatScenario();
257 
258  Ptr<SatHelper> satHelper = simulationHelper->GetSatelliteHelper();
259  Ptr<SatTrafficHelper> trafficHelper = simulationHelper->GetTrafficHelper();
260  trafficHelper->AddVoipTraffic(SatTrafficHelper::FWD_LINK,
262  satHelper->GetGwUsers(),
263  satHelper->GetUtUsers(),
264  appStartTime,
265  simLength,
266  Seconds(0.001));
267  trafficHelper->AddHttpTraffic(SatTrafficHelper::FWD_LINK,
268  satHelper->GetGwUsers(),
269  satHelper->GetUtUsers(),
270  appStartTime,
271  simLength,
272  Seconds(0.001));
273 
274  // Link results
275  // Uncomment to use custom C/N0 traces or constants for some links
276  /*
277  Ptr<SatCnoHelper> satCnoHelper = simulationHelper->GetCnoHelper ();
278  satCnoHelper->UseTracesForDefault (false);
279  for (uint32_t i = 0; i < satHelper->GetBeamHelper ()->GetUtNodes ().GetN (); i++)
280  {
281  satCnoHelper->SetUtNodeCnoFile (satHelper->GetBeamHelper ()->GetUtNodes ().Get (i),
282  SatEnums::FORWARD_USER_CH, "path_to_cno_file"); // For input trace file
283  // or
284  satCnoHelper->SetGwNodeCno (satHelper->GetBeamHelper ()->GetUtNodes ().Get (i),
285  SatEnums::FORWARD_USER_CH, 1e10); // For constant value
286  }
287  */
288 
289  // Mobility
290  if (utMobility)
291  {
292  Ptr<SatMobilityModel> satMobility =
293  satHelper->GetBeamHelper()->GetGeoSatNodes().Get(0)->GetObject<SatMobilityModel>();
294  Ptr<Node> node = satHelper->LoadMobileUtFromFile(0, mobilityPath);
295  node->GetObject<SatMobilityModel>()->TraceConnect("SatCourseChange",
296  "BeamTracer",
297  MakeCallback(SatCourseChange));
298  }
299 
300  /*
301  * Outputs
302  * Note: some outputs are automatically generated by traffic helper
303  */
304  simulationHelper->EnableProgressLogs();
305 
306  Config::SetDefault("ns3::ConfigStore::Filename", StringValue("output-attributes.xml"));
307  Config::SetDefault("ns3::ConfigStore::FileFormat", StringValue("Xml"));
308  Config::SetDefault("ns3::ConfigStore::Mode", StringValue("Save"));
309  ConfigStore outputConfig;
310  outputConfig.ConfigureDefaults();
311 
312  Ptr<SatStatsHelperContainer> s = simulationHelper->GetStatisticsContainer();
313 
314  // Capacity request
315  s->AddGlobalCapacityRequest(SatStatsHelper::OUTPUT_SCATTER_FILE);
316  s->AddPerGwCapacityRequest(SatStatsHelper::OUTPUT_SCATTER_FILE);
317  s->AddPerBeamCapacityRequest(SatStatsHelper::OUTPUT_SCATTER_FILE);
318  s->AddPerUtCapacityRequest(SatStatsHelper::OUTPUT_SCATTER_FILE);
319 
320  // Granted resources
321  s->AddGlobalResourcesGranted(SatStatsHelper::OUTPUT_SCATTER_FILE);
322  s->AddGlobalResourcesGranted(SatStatsHelper::OUTPUT_SCALAR_FILE);
323  s->AddGlobalResourcesGranted(SatStatsHelper::OUTPUT_CDF_FILE);
324  s->AddPerBeamResourcesGranted(SatStatsHelper::OUTPUT_CDF_FILE);
325  s->AddPerBeamResourcesGranted(SatStatsHelper::OUTPUT_CDF_PLOT);
326  s->AddPerUtResourcesGranted(SatStatsHelper::OUTPUT_SCATTER_FILE);
327 
328  // Link SINR
329  s->AddGlobalFwdFeederLinkSinr(SatStatsHelper::OUTPUT_SCATTER_FILE);
330  s->AddGlobalFwdUserLinkSinr(SatStatsHelper::OUTPUT_SCATTER_FILE);
331  s->AddGlobalRtnFeederLinkSinr(SatStatsHelper::OUTPUT_SCATTER_FILE);
332  s->AddGlobalRtnUserLinkSinr(SatStatsHelper::OUTPUT_SCATTER_FILE);
333 
334  s->AddGlobalFwdFeederLinkSinr(SatStatsHelper::OUTPUT_SCALAR_FILE);
335  s->AddGlobalFwdUserLinkSinr(SatStatsHelper::OUTPUT_SCALAR_FILE);
336  s->AddGlobalRtnFeederLinkSinr(SatStatsHelper::OUTPUT_SCALAR_FILE);
337  s->AddGlobalRtnUserLinkSinr(SatStatsHelper::OUTPUT_SCALAR_FILE);
338 
339  // SINR
340  s->AddGlobalFwdCompositeSinr(SatStatsHelper::OUTPUT_CDF_FILE);
341  s->AddGlobalFwdCompositeSinr(SatStatsHelper::OUTPUT_SCATTER_FILE);
342  s->AddPerUtFwdCompositeSinr(SatStatsHelper::OUTPUT_CDF_FILE);
343  s->AddPerUtFwdCompositeSinr(SatStatsHelper::OUTPUT_SCATTER_FILE);
344  s->AddPerUtFwdCompositeSinr(SatStatsHelper::OUTPUT_CDF_PLOT);
345  s->AddGlobalRtnCompositeSinr(SatStatsHelper::OUTPUT_CDF_FILE);
346  s->AddGlobalRtnCompositeSinr(SatStatsHelper::OUTPUT_SCATTER_FILE);
347  s->AddPerBeamRtnCompositeSinr(SatStatsHelper::OUTPUT_CDF_FILE);
348  s->AddPerBeamRtnCompositeSinr(SatStatsHelper::OUTPUT_CDF_PLOT);
349  s->AddPerUtRtnCompositeSinr(SatStatsHelper::OUTPUT_CDF_FILE);
350  s->AddPerUtRtnCompositeSinr(SatStatsHelper::OUTPUT_SCATTER_FILE);
351  s->AddPerUtRtnCompositeSinr(SatStatsHelper::OUTPUT_CDF_PLOT);
352 
353  // Link RX Power
354  s->AddGlobalFwdFeederLinkRxPower(SatStatsHelper::OUTPUT_SCATTER_FILE);
355  s->AddGlobalFwdUserLinkRxPower(SatStatsHelper::OUTPUT_SCATTER_FILE);
356  s->AddGlobalRtnFeederLinkRxPower(SatStatsHelper::OUTPUT_SCATTER_FILE);
357  s->AddGlobalRtnUserLinkRxPower(SatStatsHelper::OUTPUT_SCATTER_FILE);
358 
359  s->AddGlobalFwdFeederLinkRxPower(SatStatsHelper::OUTPUT_SCALAR_FILE);
360  s->AddGlobalFwdUserLinkRxPower(SatStatsHelper::OUTPUT_SCALAR_FILE);
361  s->AddGlobalRtnFeederLinkRxPower(SatStatsHelper::OUTPUT_SCALAR_FILE);
362  s->AddGlobalRtnUserLinkRxPower(SatStatsHelper::OUTPUT_SCALAR_FILE);
363 
364  // Frame type usage
365  s->AddGlobalFrameTypeUsage(SatStatsHelper::OUTPUT_SCALAR_FILE);
366 
367  if (raModel == "MARSALA")
368  {
369  s->AddPerBeamMarsalaCorrelation(SatStatsHelper::OUTPUT_SCALAR_FILE);
370  s->AddPerBeamMarsalaCorrelation(SatStatsHelper::OUTPUT_SCATTER_FILE);
371  }
372 
373  simulationHelper->RunSimulation();
374  return 0;
375 
376 } // end of `int main (int argc, char *argv[])`
SatWaveFormBurstLength_t
Definition for different types of Capacity Request (CR) messages.
Keep track of the current position and velocity of an object in satellite network.
SuperFrameConfiguration_t
Configurable Super Frames.
@ SUPER_FRAME_CONFIG_0
SUPER_FRAME_CONFIG_0.
@ SUPER_FRAME_CONFIG_3
SUPER_FRAME_CONFIG_3.
@ SUPER_FRAME_CONFIG_1
SUPER_FRAME_CONFIG_1.
@ SUPER_FRAME_CONFIG_2
SUPER_FRAME_CONFIG_2.
ConfigType_t
Enum for configuration types.
@ CONFIG_TYPE_2
Configuration type 2.
@ CONFIG_TYPE_1
Configuration type 1.
@ CONFIG_TYPE_0
Configuration type 0.
@ CONFIG_TYPE_3
Configuration type 3.
SatArqSequenceNumber is handling the sequence numbers for the ARQ process.
Ptr< SatMobilityModel > satMobility
void EnableRA(std::string raModel, bool dynamicLoadControl)
static void SatCourseChange(std::string context, Ptr< const SatMobilityModel > position)