NetSim Source Code Help v14.4
All 13 Components
 
Loading...
Searching...
No Matches
Component 11/Satellite/Satellite_Config.c
1/************************************************************************************
2* Copyright (C) 2023 *
3* TETCOS, Bangalore. India *
4* *
5* Tetcos owns the intellectual property rights in the Product and its content. *
6* The copying, redistribution, reselling or publication of any or all of the *
7* Product or its content without express prior written consent of Tetcos is *
8* prohibited. Ownership and / or any other right relating to the software and all *
9* intellectual property rights therein shall remain at all times with Tetcos. *
10* *
11* This source code is licensed per the NetSim license agreement. *
12* *
13* No portion of this source code may be used as the basis for a derivative work, *
14* or used, for any purpose other than its intended use per the NetSim license *
15* agreement. *
16* *
17* This source code and the algorithms contained within it are confidential trade *
18* secrets of TETCOS and may not be used as the basis for any other software, *
19* hardware, product or service. *
20* *
21* Author: Shashi Kant Suman *
22* *
23* ----------------------------------------------------------------------------------*/
24#include "main.h"
25#include "SATELLITE.h"
26#include "Satellite_MAC.h"
27#include "Satellite_PHY.h"
28#include "Satellite_Frame.h"
29
30#pragma region SATELLITE_DEFAULT_CONFIG
31//Default config parameter
32#define SATELLITE_DEVICE_TYPE_DEFAULT _strdup("USER_TERMINAL")
33#define SATELLITE_GATEWAY_DEFAULT NULL
34#define SATELLITE_BUFFER_SIZE_DEFAULT (1024*1024*8) //1 MB
35
36//Carrier config
37#define SATELLITE_ROLLOFF_FACTOR_DEFAULT 1
38#define SATELLITE_SPACING_FACTOR_DEFAULT 1
39#define SATELLITE_CARRIER_BANDWIDTH_HZ_DEFAULT 1000000
40#define SATELLITE_BER_MODEL_DEFAULT _strdup("FIXED")
41#define SATELLITE_BER_DEFAULT 1e-7
42#define SATELLITE_BER_FILE_DEFAULT _strdup("")
43
44//Slot config
45#define SATELLITE_CODING_RATE_DEFAULT _strdup("1/2")
46#define SATELLITE_MODULATION_DEFAULT _strdup("QPSK")
47#define SATELLITE_SYMBOL_PER_SLOT_DEFAULT 90
48
49//Frame config
50#define SATELLITE_SLOT_COUNT_IN_FRAME_DEFAULT 10
51#define SATELLITE_FRAME_BANDWIDTH_HZ_DEFAULT 1000000
52#define SATELLITE_PILOT_BLOCK_SIZE_symbols_DEFAULT 36
53#define SATELLITE_PILOT_BLOCK_INTERVAL_slots_DEFAULT 16
54#define SATELLITE_PLHEARDER_slots_DEFAULT 1
55#define SATELLITE_BB_FRAME_HEADER_LEN_bytes_DEFAULT 1
56#define SATELLITE_BB_FRAME_USAGE_MODE_DEFAULT _strdup("Normal")
57#define SATELLITE_FRAME_COUNT_IN_SUPERFRAME_DEFAULT 10
58
59//Superframe config
60#define SATELLITE_FRAME_COUNT_IN_SUPERFRAME_DEFAULT 10
61#define SATELLITE_BAND_DEFAULT _strdup("KA")
62#define SATELLITE_ACCESS_PROTOCOL_DEFAULT _strdup("TDMA")
63#define SATELLITE_BASE_FREQUENCY_HZ_DEFAULT 12000000000
64
65//PHY config
66#define SATELLITE_TX_ANTENNA_GAIN_DB_DEFAULT 48
67#define SATELLITE_RX_ANTENNA_GAIN_DB_DEFAULT 48
68#define SATELLITE_TX_POWER_DBM_DEFAULT -23
69#define SATELLITE_ANTENNA_GAIN_TO_NOISE_TEMPERATURE_DBK_DEFAULT 28.4
70#pragma endregion
71
72#pragma region SATELLITE_MAC_CONFIG
73
74static void SATELLITE_ConfigureSatelliteMacLayer(ptrSATELLITE_PROTODATA pd, void* xmlNetSimNode)
75{
76 xmlNetSimNode;
77 ptrSATELLITE_MAC mac = satellite_mac_alloc(pd);
78 mac;
79}
80
81static void SATELLITE_ConfigureGatewayMacLayer(ptrSATELLITE_PROTODATA pd, void* xmlNetSimNode)
82{
83 ptrSATELLITE_GW_MAC mac = satellite_gw_mac_alloc(pd);
84 mac->bufferSize_bits = (UINT)fn_NetSim_Config_read_dataLen(xmlNetSimNode, "Buffer_Size",
85 SATELLITE_BUFFER_SIZE_DEFAULT, "bits");
86}
87
88static void SATELLITE_ConfigureUTMacLayer(ptrSATELLITE_PROTODATA pd, void* xmlNetSimNode)
89{
90 ptrSATELLITE_UT_MAC mac = satellite_ut_mac_alloc(pd);
91 getXmlVar(&mac->szGatewayName, GATEWAY, xmlNetSimNode, 1, _STRING, SATELLITE);
92 mac->bufferSize_bits = (UINT)fn_NetSim_Config_read_dataLen(xmlNetSimNode, "Buffer_Size",
93 SATELLITE_BUFFER_SIZE_DEFAULT, "bits");
94}
95
96static void SATELLITE_ConfigureMacLayer(ptrSATELLITE_PROTODATA pd, void* xmlNetSimNode)
97{
98 if (pd->deviceType == SATELLITE_DEVICETYPE_SATELLITE)
99 SATELLITE_ConfigureSatelliteMacLayer(pd, xmlNetSimNode);
100 else if(pd->deviceType == SATELLITE_DEVICETYPE_SATELLITE_GATEWAY)
101 SATELLITE_ConfigureGatewayMacLayer(pd, xmlNetSimNode);
102 else if(pd->deviceType == SATELLITE_DEVICETYPE_USER_TERMINAL)
103 SATELLITE_ConfigureUTMacLayer(pd, xmlNetSimNode);
104 else
105 {
106 fnNetSimError("Unknown satellite device type %d in function %s\n",
107 pd->deviceType, __FUNCTION__);
108 }
109}
110
111#pragma endregion
112
113#pragma region SATELLITE_PHY_CONFIG
114static BERMODEL get_ber_model_from_str(char* s)
115{
116 if (!_stricmp(s, "Fixed")) return BERMODEL_Fixed;
117 else if (!_stricmp(s, "FILE_BASED")) return BERMODEL_File;
118 else if (!_stricmp(s, "Model_based")) return BERMODEL_Model;
119 else
120 {
121 fnNetSimError("Unknown BER model %s.\n", s);
122 return BERMODEL_Fixed;
123 }
124}
125
126static double getCodingRate(char* s)
127{
128 if (!_stricmp(s, "1/3")) return 1.0 / 3.0;
129 else if (!_stricmp(s, "1/2")) return 1.0 / 2.0;
130 else if (!_stricmp(s, "1/4")) return 1.0 / 4.0;
131 else if (!_stricmp(s, "2/5")) return 2.0 / 5.0;
132 else if (!_stricmp(s, "3/5")) return 3.0 / 5.0;
133 else if (!_stricmp(s, "2/3")) return 2.0 / 3.0;
134 else if (!_stricmp(s, "3/4")) return 3.0 / 4.0;
135 else if (!_stricmp(s, "4/5")) return 4.0 / 5.0;
136 else if (!_stricmp(s, "5/6")) return 5.0 / 6.0;
137 else if (!_stricmp(s, "8/9")) return 8.0 / 9.0;
138 else if (!_stricmp(s, "9/10")) return 9.0 / 10.0;
139 else return 0.0;
140}
141
142static void satellite_configure_carrier(ptrCARRIERCONF cf, void* xmlNetSimNode)
143{
144 char* szVal;
145 getXmlVar(&cf->rollOffFactor, ROLLOFF_FACTOR, xmlNetSimNode, 1, _DOUBLE, SATELLITE);
146 if (cf->rollOffFactor > 1.0 || cf->rollOffFactor < 0.0)
147 {
148 fnNetSimError("Roll factor must be [0.0,1.0]\n");
149 cf->rollOffFactor = 1.0;
150 }
151
152 getXmlVar(&cf->spacingFactor, SPACING_FACTOR, xmlNetSimNode, 1, _DOUBLE, SATELLITE);
153 if (cf->spacingFactor > 1.0 || cf->spacingFactor < 0.0)
154 {
155 fnNetSimError("Spacing factor must be [0.0,1.0]\n");
156 cf->spacingFactor = 1.0;
157 }
158
159 cf->allocatedBandwidth_Hz = fn_NetSim_Config_read_Frequency(xmlNetSimNode, "CARRIER_BANDWIDTH",
160 SATELLITE_CARRIER_BANDWIDTH_HZ_DEFAULT, "Hz");
161 cf->occupiedBandwidth_Hz = cf->allocatedBandwidth_Hz / (cf->rollOffFactor + 1.0);
162 cf->effectiveBandwidth_Hz = cf->allocatedBandwidth_Hz / ((cf->rollOffFactor + 1.0) * (cf->spacingFactor + 1.0));
163
164 getXmlVar(&szVal, BER_MODEL, xmlNetSimNode, 1, _STRING, SATELLITE);
165 cf->berModel = get_ber_model_from_str(szVal);
166 free(szVal);
167
168 if (cf->berModel == BERMODEL_Fixed)
169 {
170 getXmlVar(&cf->berValue, BER, xmlNetSimNode, 1, _DOUBLE, SATELLITE);
171 }
172 else if (cf->berModel == BERMODEL_File)
173 {
174 getXmlVar(&cf->berFile, BER_FILE, xmlNetSimNode, 1, _STRING, SATELLITE);
175 cf->berTable = read_ber_file(cf->berFile, &cf->berTableLen);
176 }
177
178 getXmlVar(&szVal, CODING_RATE, xmlNetSimNode, 1, _STRING, SATELLITE);
179 cf->codingRate = getCodingRate(szVal);
180 free(szVal);
181
182 cf->modulation = ConfigReadEnum(xmlNetSimNode, "MODULATION", PHY_MODULATION, true);
183}
184
185static void satellite_configure_frame(ptrFRAMECONF frConf, void* xmlNetSimNode)
186{
187 char* szVal;
188 getXmlVar(&frConf->slotCountInFrame, SLOT_COUNT_IN_FRAME, xmlNetSimNode, 1, _UINT, SATELLITE);
189 frConf->frameBandwidth_Hz = fn_NetSim_Config_read_Frequency(xmlNetSimNode, "FRAME_BANDWIDTH",
190 SATELLITE_FRAME_BANDWIDTH_HZ_DEFAULT, "Hz");
191 getXmlVar(&frConf->pilotBlockSize_inSymbols, PILOT_BLOCK_SIZE_symbols, xmlNetSimNode, 1, _UINT, SATELLITE);
192 getXmlVar(&frConf->pilotBlockInterval_inSlots, PILOT_BLOCK_INTERVAL_slots, xmlNetSimNode, 1, _UINT, SATELLITE);
193 getXmlVar(&frConf->plHdrSize_inSlots, PLHEARDER_slots, xmlNetSimNode, 1, _UINT, SATELLITE);
194 getXmlVar(&frConf->frameHdrLength_inBytes, BB_FRAME_HEADER_LEN_bytes, xmlNetSimNode, 1, _UINT, SATELLITE);
195 getXmlVar(&szVal, BB_FRAME_USAGE_MODE, xmlNetSimNode, 1, _STRING, SATELLITE);
196 if (!_stricmp(szVal, "Normal")) frConf->usageMode = FRUSAGE_NORMAL;
197 else frConf->usageMode = FRUSAGE_SHORT;
198 free(szVal);
199
200 getXmlVar(&frConf->framesPerSuperframe, FRAME_COUNT_IN_SUPERFRAME, xmlNetSimNode, 1, _UINT, SATELLITE);
201}
202
203static void satellite_configure_slot(ptrSLOTCONF sc, void* xmlNetSimNode)
204{
205 getXmlVar(&sc->symbolPerSlot, SYMBOL_PER_SLOT, xmlNetSimNode, 1, _UINT, SATELLITE);
206}
207
208static void satellite_configure_forward_link(ptrSATELLITE_PHY phy, void* xmlNetSimNode)
209{
210 ptrSUPERFRAME sf = superframe_alloc(LINKTYPE_FORWARD, phy->d, phy->in);
211
212 satellite_configure_carrier(sf->carrierConfig, xmlNetSimNode);
213
214 satellite_configure_frame(sf->frameConfig, xmlNetSimNode);
215
216 satellite_configure_slot(sf->slotConfig, xmlNetSimNode);
217
218 sf->baseFreqnecy_Hz = fn_NetSim_Config_read_Frequency(xmlNetSimNode, "BASE_FREQUENCY", SATELLITE_BASE_FREQUENCY_HZ_DEFAULT, "HZ");
219 getXmlVar(&sf->accessProtocol, ACCESS_PROTOCOL, xmlNetSimNode, 1, _STRING, SATELLITE);
220 getXmlVar(&sf->band, BAND, xmlNetSimNode, 1, _STRING, SATELLITE);
221}
222
223static void satellite_configure_return_link(ptrSATELLITE_PHY phy, void* xmlNetSimNode)
224{
225 ptrSUPERFRAME sf = superframe_alloc(LINKTYPE_RETURN, phy->d, phy->in);
226
227 satellite_configure_carrier(sf->carrierConfig, xmlNetSimNode);
228
229 satellite_configure_frame(sf->frameConfig, xmlNetSimNode);
230
231 satellite_configure_slot(sf->slotConfig, xmlNetSimNode);
232
233 sf->baseFreqnecy_Hz = fn_NetSim_Config_read_Frequency(xmlNetSimNode, "BASE_FREQUENCY", SATELLITE_BASE_FREQUENCY_HZ_DEFAULT, "HZ");
234 getXmlVar(&sf->accessProtocol, ACCESS_PROTOCOL, xmlNetSimNode, 1, _STRING, SATELLITE);
235 getXmlVar(&sf->band, BAND, xmlNetSimNode, 1, _STRING, SATELLITE);
236}
237
238static void satellite_configure_phy(ptrSATELLITE_PROTODATA pd, void* xmlNetSimNode)
239{
240 ptrSATELLITE_PHY phy = satellite_phy_alloc(pd->deviceId, pd->interfaceId);
241
242 void* xmlChild = fn_NetSim_xmlGetChildElement(xmlNetSimNode, "FORWARD", 0);
243 satellite_configure_forward_link(phy, xmlChild);
244
245 xmlChild = fn_NetSim_xmlGetChildElement(xmlNetSimNode, "RETURN", 0);
246 satellite_configure_return_link(phy, xmlChild);
247
248 phy->txPower_dbm = fn_NetSim_Config_read_txPower(xmlNetSimNode, "TX_POWER", SATELLITE_TX_POWER_DBM_DEFAULT, "dBm");
249 phy->txPower_mw = DBM_TO_MW(phy->txPower_dbm);
250
251 getXmlVar(&phy->txAntennaGain_db, TX_ANTENNA_GAIN_DB, xmlNetSimNode, 1, _DOUBLE, SATELLITE);
252 getXmlVar(&phy->rxAntennaGain_db, RX_ANTENNA_GAIN_DB, xmlNetSimNode, 1, _DOUBLE, SATELLITE);
253 getXmlVar(&phy->antennaGainToNoiseTemp_dBk, ANTENNA_GAIN_TO_NOISE_TEMPERATURE_DBK, xmlNetSimNode, 1, _DOUBLE, SATELLITE);
254 phy->tempeature_k = DBM_TO_MW(phy->antennaGainToNoiseTemp_dBk);
255}
256
257static void satellite_configure_gw_phy(ptrSATELLITE_PROTODATA pd, void* xmlNetSimNode)
258{
259 ptrSATELLITE_GW_PHY phy = satellite_gw_phy_alloc(pd->deviceId, pd->interfaceId);
260
261 getXmlVar(&phy->txAntennaGain_db, TX_ANTENNA_GAIN_DB, xmlNetSimNode, 1, _DOUBLE, SATELLITE);
262 getXmlVar(&phy->rxAntennaGain_db, RX_ANTENNA_GAIN_DB, xmlNetSimNode, 1, _DOUBLE, SATELLITE);
263 getXmlVar(&phy->antennaGainToNoiseTemp_dBk, ANTENNA_GAIN_TO_NOISE_TEMPERATURE_DBK, xmlNetSimNode, 1, _DOUBLE, SATELLITE);
264 phy->tempeature_k = DBM_TO_MW(phy->antennaGainToNoiseTemp_dBk);
265
266 phy->txPower_dbm = fn_NetSim_Config_read_txPower(xmlNetSimNode, "TX_POWER", SATELLITE_TX_POWER_DBM_DEFAULT, "dBm");
267 phy->txPower_mw = DBM_TO_MW(phy->txPower_dbm);
268}
269
270static void satellite_configure_ut_phy(ptrSATELLITE_PROTODATA pd, void* xmlNetSimNode)
271{
272 ptrSATELLITE_UT_PHY phy = satellite_ut_phy_alloc(pd->deviceId, pd->interfaceId);
273
274 getXmlVar(&phy->txAntennaGain_db, TX_ANTENNA_GAIN_DB, xmlNetSimNode, 1, _DOUBLE, SATELLITE);
275 getXmlVar(&phy->rxAntennaGain_db, RX_ANTENNA_GAIN_DB, xmlNetSimNode, 1, _DOUBLE, SATELLITE);
276 getXmlVar(&phy->antennaGainToNoiseTemp_dBk, ANTENNA_GAIN_TO_NOISE_TEMPERATURE_DBK, xmlNetSimNode, 1, _DOUBLE, SATELLITE);
277 phy->tempeature_k = DBM_TO_MW(phy->antennaGainToNoiseTemp_dBk);
278
279 phy->txPower_dbm = fn_NetSim_Config_read_txPower(xmlNetSimNode, "TX_POWER", SATELLITE_TX_POWER_DBM_DEFAULT, "dBm");
280 phy->txPower_mw = DBM_TO_MW(phy->txPower_dbm);
281}
282
283static void SATELLITE_ConfigurePhyLayer(ptrSATELLITE_PROTODATA pd, void* xmlNetSimNode)
284{
285 switch (pd->deviceType)
286 {
287 case SATELLITE_DEVICETYPE_SATELLITE:
288 satellite_configure_phy(pd, xmlNetSimNode);
289 break;
290 case SATELLITE_DEVICETYPE_SATELLITE_GATEWAY:
291 satellite_configure_gw_phy(pd, xmlNetSimNode);
292 break;
293 case SATELLITE_DEVICETYPE_USER_TERMINAL:
294 satellite_configure_ut_phy(pd, xmlNetSimNode);
295 break;
296 default:
297 fnNetSimError("Unknown device type %d in function %s\n",
298 pd->deviceType, __FUNCTION__);
299 break;
300 }
301}
302#pragma endregion
303
304
305void fn_NetSim_SATELLITE_Configure_F(void** var)
306{
307 char* szVal;
308 char* tag;
309 void* xmlNetSimNode;
310 NETSIM_ID nDeviceId;
311 NETSIM_ID nInterfaceId;
312 LAYER_TYPE nLayerType;
313
314 tag = (char*)var[0];
315 xmlNetSimNode = var[2];
316 if (!strcmp(tag, "PROTOCOL_PROPERTY"))
317 {
318 NETWORK = (struct stru_NetSim_Network*)var[1];
319 nDeviceId = *((NETSIM_ID*)var[3]);
320 nInterfaceId = *((NETSIM_ID*)var[4]);
321 nLayerType = *((LAYER_TYPE*)var[5]);
322
323 ptrSATELLITE_PROTODATA pd = SATELLITE_PROTOCOLDATA_ALLOC(nDeviceId, nInterfaceId);
324
325 getXmlVar(&szVal, DEVICE_TYPE, xmlNetSimNode, 1, _STRING, SATELLITE);
326 pd->deviceType = SATELLITE_DEVICETYPE_FROM_STR(szVal);
327 free(szVal);
328
329 if (nLayerType == MAC_LAYER)
330 SATELLITE_ConfigureMacLayer(pd, xmlNetSimNode);
331 else if (nLayerType == PHYSICAL_LAYER)
332 SATELLITE_ConfigurePhyLayer(pd, xmlNetSimNode);
333 }
334}