Loading...
Searching...
No Matches
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
30using namespace ns3;
31
38
39NS_LOG_COMPONENT_DEFINE("sat-vhts-example");
40
41// TODO confirm that
42void
43EnableRA(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",
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
77static void
78SatCourseChange(std::string context, Ptr<const SatMobilityModel> position)
79{
80 auto tracedPosition = DynamicCast<const SatTracedMobilityModel>(position);
81 NS_ASSERT_MSG(tracedPosition != nullptr, "Course changed for a non-mobile UT");
82}
83
84int
85main(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;
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->LoadScenario("geo-33E");
257
258 simulationHelper->CreateSatScenario();
259
260 Ptr<SatHelper> satHelper = simulationHelper->GetSatelliteHelper();
261 Ptr<SatTrafficHelper> trafficHelper = simulationHelper->GetTrafficHelper();
262 trafficHelper->AddVoipTraffic(SatTrafficHelper::FWD_LINK,
264 Singleton<SatTopology>::Get()->GetGwUserNodes(),
265 Singleton<SatTopology>::Get()->GetUtUserNodes(),
266 appStartTime,
267 simLength,
268 Seconds(0.001));
269 trafficHelper->AddHttpTraffic(SatTrafficHelper::FWD_LINK,
270 Singleton<SatTopology>::Get()->GetGwUserNodes(),
271 Singleton<SatTopology>::Get()->GetUtUserNodes(),
272 appStartTime,
273 simLength,
274 Seconds(0.001));
275
276 // Link results
277 // Uncomment to use custom C/N0 traces or constants for some links
278 /*
279 Ptr<SatCnoHelper> satCnoHelper = simulationHelper->GetCnoHelper ();
280 satCnoHelper->UseTracesForDefault (false);
281 for (uint32_t i = 0; i < Singleton<SatTopology>::Get()->GetNUtNodes(); i++)
282 {
283 satCnoHelper->SetUtNodeCnoFile (Singleton<SatTopology>::Get()->GetUtNode(i),
284 SatEnums::FORWARD_USER_CH, "path_to_cno_file"); // For input trace file
285 // or
286 satCnoHelper->SetGwNodeCno (Singleton<SatTopology>::Get()->GetUtNode(i),
287 SatEnums::FORWARD_USER_CH, 1e10); // For constant value
288 }
289 */
290
291 // Mobility
292 if (utMobility)
293 {
294 Ptr<SatMobilityModel> satMobility =
295 Singleton<SatTopology>::Get()->GetOrbiterNode(0)->GetObject<SatMobilityModel>();
296 Ptr<Node> node = satHelper->LoadMobileUtFromFile(0, mobilityPath);
297 node->GetObject<SatMobilityModel>()->TraceConnect("SatCourseChange",
298 "BeamTracer",
299 MakeCallback(SatCourseChange));
300 }
301
302 /*
303 * Outputs
304 * Note: some outputs are automatically generated by traffic helper
305 */
306 simulationHelper->EnableProgressLogs();
307
308 Config::SetDefault("ns3::ConfigStore::Filename", StringValue("output-attributes.xml"));
309 Config::SetDefault("ns3::ConfigStore::FileFormat", StringValue("Xml"));
310 Config::SetDefault("ns3::ConfigStore::Mode", StringValue("Save"));
311 ConfigStore outputConfig;
312 outputConfig.ConfigureDefaults();
313
314 Ptr<SatStatsHelperContainer> s = simulationHelper->GetStatisticsContainer();
315
316 // Capacity request
317 s->AddGlobalCapacityRequest(SatStatsHelper::OUTPUT_SCATTER_FILE);
318 s->AddPerGwCapacityRequest(SatStatsHelper::OUTPUT_SCATTER_FILE);
319 s->AddPerBeamCapacityRequest(SatStatsHelper::OUTPUT_SCATTER_FILE);
320 s->AddPerUtCapacityRequest(SatStatsHelper::OUTPUT_SCATTER_FILE);
321
322 // Granted resources
323 s->AddGlobalResourcesGranted(SatStatsHelper::OUTPUT_SCATTER_FILE);
324 s->AddGlobalResourcesGranted(SatStatsHelper::OUTPUT_SCALAR_FILE);
325 s->AddGlobalResourcesGranted(SatStatsHelper::OUTPUT_CDF_FILE);
326 s->AddPerBeamResourcesGranted(SatStatsHelper::OUTPUT_CDF_FILE);
327 s->AddPerBeamResourcesGranted(SatStatsHelper::OUTPUT_CDF_PLOT);
328 s->AddPerUtResourcesGranted(SatStatsHelper::OUTPUT_SCATTER_FILE);
329
330 // Link SINR
331 s->AddGlobalFwdFeederLinkSinr(SatStatsHelper::OUTPUT_SCATTER_FILE);
332 s->AddGlobalFwdUserLinkSinr(SatStatsHelper::OUTPUT_SCATTER_FILE);
333 s->AddGlobalRtnFeederLinkSinr(SatStatsHelper::OUTPUT_SCATTER_FILE);
334 s->AddGlobalRtnUserLinkSinr(SatStatsHelper::OUTPUT_SCATTER_FILE);
335
336 s->AddGlobalFwdFeederLinkSinr(SatStatsHelper::OUTPUT_SCALAR_FILE);
337 s->AddGlobalFwdUserLinkSinr(SatStatsHelper::OUTPUT_SCALAR_FILE);
338 s->AddGlobalRtnFeederLinkSinr(SatStatsHelper::OUTPUT_SCALAR_FILE);
339 s->AddGlobalRtnUserLinkSinr(SatStatsHelper::OUTPUT_SCALAR_FILE);
340
341 // SINR
342 s->AddGlobalFwdCompositeSinr(SatStatsHelper::OUTPUT_CDF_FILE);
343 s->AddGlobalFwdCompositeSinr(SatStatsHelper::OUTPUT_SCATTER_FILE);
344 s->AddPerUtFwdCompositeSinr(SatStatsHelper::OUTPUT_CDF_FILE);
345 s->AddPerUtFwdCompositeSinr(SatStatsHelper::OUTPUT_SCATTER_FILE);
346 s->AddPerUtFwdCompositeSinr(SatStatsHelper::OUTPUT_CDF_PLOT);
347 s->AddGlobalRtnCompositeSinr(SatStatsHelper::OUTPUT_CDF_FILE);
348 s->AddGlobalRtnCompositeSinr(SatStatsHelper::OUTPUT_SCATTER_FILE);
349 s->AddPerBeamRtnCompositeSinr(SatStatsHelper::OUTPUT_CDF_FILE);
350 s->AddPerBeamRtnCompositeSinr(SatStatsHelper::OUTPUT_CDF_PLOT);
351 s->AddPerUtRtnCompositeSinr(SatStatsHelper::OUTPUT_CDF_FILE);
352 s->AddPerUtRtnCompositeSinr(SatStatsHelper::OUTPUT_SCATTER_FILE);
353 s->AddPerUtRtnCompositeSinr(SatStatsHelper::OUTPUT_CDF_PLOT);
354
355 // Link RX Power
356 s->AddGlobalFwdFeederLinkRxPower(SatStatsHelper::OUTPUT_SCATTER_FILE);
357 s->AddGlobalFwdUserLinkRxPower(SatStatsHelper::OUTPUT_SCATTER_FILE);
358 s->AddGlobalRtnFeederLinkRxPower(SatStatsHelper::OUTPUT_SCATTER_FILE);
359 s->AddGlobalRtnUserLinkRxPower(SatStatsHelper::OUTPUT_SCATTER_FILE);
360
361 s->AddGlobalFwdFeederLinkRxPower(SatStatsHelper::OUTPUT_SCALAR_FILE);
362 s->AddGlobalFwdUserLinkRxPower(SatStatsHelper::OUTPUT_SCALAR_FILE);
363 s->AddGlobalRtnFeederLinkRxPower(SatStatsHelper::OUTPUT_SCALAR_FILE);
364 s->AddGlobalRtnUserLinkRxPower(SatStatsHelper::OUTPUT_SCALAR_FILE);
365
366 // Frame type usage
367 s->AddGlobalFrameTypeUsage(SatStatsHelper::OUTPUT_SCALAR_FILE);
368
369 if (raModel == "MARSALA")
370 {
371 s->AddPerBeamMarsalaCorrelation(SatStatsHelper::OUTPUT_SCALAR_FILE);
372 s->AddPerBeamMarsalaCorrelation(SatStatsHelper::OUTPUT_SCATTER_FILE);
373 }
374
375 simulationHelper->RunSimulation();
376 return 0;
377
378} // 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
static void SatCourseChange(std::string context, Ptr< const SatMobilityModel > position)
void EnableRA(std::string raModel, bool dynamicLoadControl)
static void SatCourseChange(std::string context, Ptr< const SatMobilityModel > position)