NetSim Source Code Help
Loading...
Searching...
No Matches
Satellite_Config.c
Go to the documentation of this file.
1/************************************************************************************
2* Copyright (C) 2021 *
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
75{
77}
78
80{
82 mac->bufferSize_bits = (UINT)fn_NetSim_Config_read_dataLen(xmlNetSimNode, "Buffer_Size",
84}
85
86static void SATELLITE_ConfigureUTMacLayer(ptrSATELLITE_PROTODATA pd, void* xmlNetSimNode)
87{
89 getXmlVar(&mac->szGatewayName, GATEWAY, xmlNetSimNode, 1, _STRING, SATELLITE);
90 mac->bufferSize_bits = (UINT)fn_NetSim_Config_read_dataLen(xmlNetSimNode, "Buffer_Size",
92}
93
94static void SATELLITE_ConfigureMacLayer(ptrSATELLITE_PROTODATA pd, void* xmlNetSimNode)
95{
97 SATELLITE_ConfigureSatelliteMacLayer(pd, xmlNetSimNode);
99 SATELLITE_ConfigureGatewayMacLayer(pd, xmlNetSimNode);
101 SATELLITE_ConfigureUTMacLayer(pd, xmlNetSimNode);
102 else
103 {
104 fnNetSimError("Unknown satellite device type %d in function %s\n",
105 pd->deviceType, __FUNCTION__);
106 }
107}
108
109#pragma endregion
110
111#pragma region SATELLITE_PHY_CONFIG
113{
114 if (!_stricmp(s, "Fixed")) return BERMODEL_Fixed;
115 else if (!_stricmp(s, "FILE_BASED")) return BERMODEL_File;
116 else if (!_stricmp(s, "Model_based")) return BERMODEL_Model;
117 else
118 {
119 fnNetSimError("Unknown BER model %s.\n", s);
120 return BERMODEL_Fixed;
121 }
122}
123
124static double getCodingRate(char* s)
125{
126 if (!_stricmp(s, "1/3")) return 1.0 / 3.0;
127 else if (!_stricmp(s, "1/2")) return 1.0 / 2.0;
128 else if (!_stricmp(s, "3/5")) return 3.0 / 5.0;
129 else if (!_stricmp(s, "2/3")) return 2.0 / 3.0;
130 else if (!_stricmp(s, "3/4")) return 3.0 / 4.0;
131 else if (!_stricmp(s, "4/5")) return 4.0 / 5.0;
132 else if (!_stricmp(s, "5/6")) return 5.0 / 6.0;
133 else if (!_stricmp(s, "8/9")) return 8.0 / 9.0;
134 else if (!_stricmp(s, "9/10")) return 9.0 / 10.0;
135 else return 0.0;
136}
137
138static void satellite_configure_carrier(ptrCARRIERCONF cf, void* xmlNetSimNode)
139{
140 char* szVal;
141 getXmlVar(&cf->rollOffFactor, ROLLOFF_FACTOR, xmlNetSimNode, 1, _DOUBLE, SATELLITE);
142 if (cf->rollOffFactor > 1.0 || cf->rollOffFactor < 0.0)
143 {
144 fnNetSimError("Roll factor must be [0.0,1.0]\n");
145 cf->rollOffFactor = 1.0;
146 }
147
148 getXmlVar(&cf->spacingFactor, SPACING_FACTOR, xmlNetSimNode, 1, _DOUBLE, SATELLITE);
149 if (cf->spacingFactor > 1.0 || cf->spacingFactor < 0.0)
150 {
151 fnNetSimError("Spacing factor must be [0.0,1.0]\n");
152 cf->spacingFactor = 1.0;
153 }
154
155 cf->allocatedBandwidth_Hz = fn_NetSim_Config_read_Frequency(xmlNetSimNode, "CARRIER_BANDWIDTH",
158 cf->effectiveBandwidth_Hz = cf->allocatedBandwidth_Hz / ((cf->rollOffFactor + 1.0) * (cf->spacingFactor + 1.0));
159
160 getXmlVar(&szVal, BER_MODEL, xmlNetSimNode, 1, _STRING, SATELLITE);
161 cf->berModel = get_ber_model_from_str(szVal);
162 free(szVal);
163
164 if (cf->berModel == BERMODEL_Fixed)
165 {
166 getXmlVar(&cf->berValue, BER, xmlNetSimNode, 1, _DOUBLE, SATELLITE);
167 }
168 else if (cf->berModel == BERMODEL_File)
169 {
170 getXmlVar(&cf->berFile, BER_FILE, xmlNetSimNode, 1, _STRING, SATELLITE);
171 cf->berTable = read_ber_file(cf->berFile, &cf->berTableLen);
172 }
173
174 getXmlVar(&szVal, CODING_RATE, xmlNetSimNode, 1, _STRING, SATELLITE);
175 cf->codingRate = getCodingRate(szVal);
176 free(szVal);
177
178 cf->modulation = ConfigReadEnum(xmlNetSimNode, "MODULATION", PHY_MODULATION, true);
179}
180
181static void satellite_configure_frame(ptrFRAMECONF frConf, void* xmlNetSimNode)
182{
183 char* szVal;
184 getXmlVar(&frConf->slotCountInFrame, SLOT_COUNT_IN_FRAME, xmlNetSimNode, 1, _UINT, SATELLITE);
185 frConf->frameBandwidth_Hz = fn_NetSim_Config_read_Frequency(xmlNetSimNode, "FRAME_BANDWIDTH",
187 getXmlVar(&frConf->pilotBlockSize_inSymbols, PILOT_BLOCK_SIZE_symbols, xmlNetSimNode, 1, _UINT, SATELLITE);
188 getXmlVar(&frConf->pilotBlockInterval_inSlots, PILOT_BLOCK_INTERVAL_slots, xmlNetSimNode, 1, _UINT, SATELLITE);
189 getXmlVar(&frConf->plHdrSize_inSlots, PLHEARDER_slots, xmlNetSimNode, 1, _UINT, SATELLITE);
190 getXmlVar(&frConf->frameHdrLength_inBytes, BB_FRAME_HEADER_LEN_bytes, xmlNetSimNode, 1, _UINT, SATELLITE);
191 getXmlVar(&szVal, BB_FRAME_USAGE_MODE, xmlNetSimNode, 1, _STRING, SATELLITE);
192 if (!_stricmp(szVal, "Normal")) frConf->usageMode = FRUSAGE_NORMAL;
193 else frConf->usageMode = FRUSAGE_SHORT;
194 free(szVal);
195
196 getXmlVar(&frConf->framesPerSuperframe, FRAME_COUNT_IN_SUPERFRAME, xmlNetSimNode, 1, _UINT, SATELLITE);
197}
198
199static void satellite_configure_slot(ptrSLOTCONF sc, void* xmlNetSimNode)
200{
201 getXmlVar(&sc->symbolPerSlot, SYMBOL_PER_SLOT, xmlNetSimNode, 1, _UINT, SATELLITE);
202}
203
204static void satellite_configure_forward_link(ptrSATELLITE_PHY phy, void* xmlNetSimNode)
205{
207
208 satellite_configure_carrier(sf->carrierConfig, xmlNetSimNode);
209
210 satellite_configure_frame(sf->frameConfig, xmlNetSimNode);
211
212 satellite_configure_slot(sf->slotConfig, xmlNetSimNode);
213
214 sf->baseFreqnecy_Hz = fn_NetSim_Config_read_Frequency(xmlNetSimNode, "BASE_FREQUENCY", SATELLITE_BASE_FREQUENCY_HZ_DEFAULT, "HZ");
215 getXmlVar(&sf->accessProtocol, ACCESS_PROTOCOL, xmlNetSimNode, 1, _STRING, SATELLITE);
216 getXmlVar(&sf->band, BAND, xmlNetSimNode, 1, _STRING, SATELLITE);
217}
218
219static void satellite_configure_return_link(ptrSATELLITE_PHY phy, void* xmlNetSimNode)
220{
222
223 satellite_configure_carrier(sf->carrierConfig, xmlNetSimNode);
224
225 satellite_configure_frame(sf->frameConfig, xmlNetSimNode);
226
227 satellite_configure_slot(sf->slotConfig, xmlNetSimNode);
228
229 sf->baseFreqnecy_Hz = fn_NetSim_Config_read_Frequency(xmlNetSimNode, "BASE_FREQUENCY", SATELLITE_BASE_FREQUENCY_HZ_DEFAULT, "HZ");
230 getXmlVar(&sf->accessProtocol, ACCESS_PROTOCOL, xmlNetSimNode, 1, _STRING, SATELLITE);
231 getXmlVar(&sf->band, BAND, xmlNetSimNode, 1, _STRING, SATELLITE);
232}
233
234static void satellite_configure_phy(ptrSATELLITE_PROTODATA pd, void* xmlNetSimNode)
235{
237
238 void* xmlChild = fn_NetSim_xmlGetChildElement(xmlNetSimNode, "FORWARD", 0);
240
241 xmlChild = fn_NetSim_xmlGetChildElement(xmlNetSimNode, "RETURN", 0);
242 satellite_configure_return_link(phy, xmlChild);
243
244 phy->txPower_dbm = fn_NetSim_Config_read_txPower(xmlNetSimNode, "TX_POWER", SATELLITE_TX_POWER_DBM_DEFAULT, "dBm");
245 phy->txPower_mw = DBM_TO_MW(phy->txPower_dbm);
246
247 getXmlVar(&phy->txAntennaGain_db, TX_ANTENNA_GAIN_DB, xmlNetSimNode, 1, _DOUBLE, SATELLITE);
248 getXmlVar(&phy->rxAntennaGain_db, RX_ANTENNA_GAIN_DB, xmlNetSimNode, 1, _DOUBLE, SATELLITE);
249 getXmlVar(&phy->antennaGainToNoiseTemp_dBk, ANTENNA_GAIN_TO_NOISE_TEMPERATURE_DBK, xmlNetSimNode, 1, _DOUBLE, SATELLITE);
251}
252
253static void satellite_configure_gw_phy(ptrSATELLITE_PROTODATA pd, void* xmlNetSimNode)
254{
256
257 getXmlVar(&phy->txAntennaGain_db, TX_ANTENNA_GAIN_DB, xmlNetSimNode, 1, _DOUBLE, SATELLITE);
258 getXmlVar(&phy->rxAntennaGain_db, RX_ANTENNA_GAIN_DB, xmlNetSimNode, 1, _DOUBLE, SATELLITE);
259 getXmlVar(&phy->antennaGainToNoiseTemp_dBk, ANTENNA_GAIN_TO_NOISE_TEMPERATURE_DBK, xmlNetSimNode, 1, _DOUBLE, SATELLITE);
261
262 phy->txPower_dbm = fn_NetSim_Config_read_txPower(xmlNetSimNode, "TX_POWER", SATELLITE_TX_POWER_DBM_DEFAULT, "dBm");
263 phy->txPower_mw = DBM_TO_MW(phy->txPower_dbm);
264}
265
266static void satellite_configure_ut_phy(ptrSATELLITE_PROTODATA pd, void* xmlNetSimNode)
267{
269
270 getXmlVar(&phy->txAntennaGain_db, TX_ANTENNA_GAIN_DB, xmlNetSimNode, 1, _DOUBLE, SATELLITE);
271 getXmlVar(&phy->rxAntennaGain_db, RX_ANTENNA_GAIN_DB, xmlNetSimNode, 1, _DOUBLE, SATELLITE);
272 getXmlVar(&phy->antennaGainToNoiseTemp_dBk, ANTENNA_GAIN_TO_NOISE_TEMPERATURE_DBK, xmlNetSimNode, 1, _DOUBLE, SATELLITE);
274
275 phy->txPower_dbm = fn_NetSim_Config_read_txPower(xmlNetSimNode, "TX_POWER", SATELLITE_TX_POWER_DBM_DEFAULT, "dBm");
276 phy->txPower_mw = DBM_TO_MW(phy->txPower_dbm);
277}
278
279static void SATELLITE_ConfigurePhyLayer(ptrSATELLITE_PROTODATA pd, void* xmlNetSimNode)
280{
281 switch (pd->deviceType)
282 {
284 satellite_configure_phy(pd, xmlNetSimNode);
285 break;
287 satellite_configure_gw_phy(pd, xmlNetSimNode);
288 break;
290 satellite_configure_ut_phy(pd, xmlNetSimNode);
291 break;
292 default:
293 fnNetSimError("Unknown device type %d in function %s\n",
294 pd->deviceType, __FUNCTION__);
295 break;
296 }
297}
298#pragma endregion
299
300
302{
303 char* szVal;
304 char* tag;
305 void* xmlNetSimNode;
306 NETSIM_ID nDeviceId;
307 NETSIM_ID nInterfaceId;
308 LAYER_TYPE nLayerType;
309
310 tag = (char*)var[0];
311 xmlNetSimNode = var[2];
312 if (!strcmp(tag, "PROTOCOL_PROPERTY"))
313 {
314 NETWORK = (struct stru_NetSim_Network*)var[1];
315 nDeviceId = *((NETSIM_ID*)var[3]);
316 nInterfaceId = *((NETSIM_ID*)var[4]);
317 nLayerType = *((LAYER_TYPE*)var[5]);
318
319 ptrSATELLITE_PROTODATA pd = SATELLITE_PROTOCOLDATA_ALLOC(nDeviceId, nInterfaceId);
320
321 getXmlVar(&szVal, DEVICE_TYPE, xmlNetSimNode, 1, _STRING, SATELLITE);
323 free(szVal);
324
325 if (nLayerType == MAC_LAYER)
326 SATELLITE_ConfigureMacLayer(pd, xmlNetSimNode);
327 else if (nLayerType == PHYSICAL_LAYER)
328 SATELLITE_ConfigurePhyLayer(pd, xmlNetSimNode);
329 }
330}
enum enum_802_22_CodingRate CODING_RATE
Definition: 802_22.h:114
unsigned int NETSIM_ID
Definition: Animation.h:45
ptrBER read_ber_file(char *file, size_t *len)
#define _stricmp
Definition: Linux.h:127
#define UINT
Definition: Linux.h:38
#define fnNetSimError(x,...)
Definition: Linux.h:56
#define free(p)
Definition: Memory.h:31
#define DBM_TO_MW(dbm)
@ LINKTYPE_FORWARD
Definition: Satellite.h:61
@ LINKTYPE_RETURN
Definition: Satellite.h:62
@ SATELLITE_DEVICETYPE_SATELLITE_GATEWAY
Definition: Satellite.h:52
@ SATELLITE_DEVICETYPE_USER_TERMINAL
Definition: Satellite.h:50
@ SATELLITE_DEVICETYPE_SATELLITE
Definition: Satellite.h:51
SATELLITE_DEVICETYPE SATELLITE_DEVICETYPE_FROM_STR(const char *type)
ptrSATELLITE_PROTODATA SATELLITE_PROTOCOLDATA_ALLOC(NETSIM_ID d, NETSIM_ID in)
static void satellite_configure_phy(ptrSATELLITE_PROTODATA pd, void *xmlNetSimNode)
static void SATELLITE_ConfigurePhyLayer(ptrSATELLITE_PROTODATA pd, void *xmlNetSimNode)
static void SATELLITE_ConfigureMacLayer(ptrSATELLITE_PROTODATA pd, void *xmlNetSimNode)
#define SATELLITE_FRAME_BANDWIDTH_HZ_DEFAULT
static void satellite_configure_frame(ptrFRAMECONF frConf, void *xmlNetSimNode)
#define SATELLITE_BASE_FREQUENCY_HZ_DEFAULT
static double getCodingRate(char *s)
static BERMODEL get_ber_model_from_str(char *s)
static void SATELLITE_ConfigureSatelliteMacLayer(ptrSATELLITE_PROTODATA pd, void *xmlNetSimNode)
#define SATELLITE_BUFFER_SIZE_DEFAULT
static void SATELLITE_ConfigureUTMacLayer(ptrSATELLITE_PROTODATA pd, void *xmlNetSimNode)
static void satellite_configure_forward_link(ptrSATELLITE_PHY phy, void *xmlNetSimNode)
#define SATELLITE_CARRIER_BANDWIDTH_HZ_DEFAULT
static void satellite_configure_carrier(ptrCARRIERCONF cf, void *xmlNetSimNode)
static void satellite_configure_slot(ptrSLOTCONF sc, void *xmlNetSimNode)
static void satellite_configure_ut_phy(ptrSATELLITE_PROTODATA pd, void *xmlNetSimNode)
#define SATELLITE_TX_POWER_DBM_DEFAULT
void fn_NetSim_SATELLITE_Configure_F(void **var)
static void satellite_configure_gw_phy(ptrSATELLITE_PROTODATA pd, void *xmlNetSimNode)
static void SATELLITE_ConfigureGatewayMacLayer(ptrSATELLITE_PROTODATA pd, void *xmlNetSimNode)
static void satellite_configure_return_link(ptrSATELLITE_PHY phy, void *xmlNetSimNode)
enum enum_ber_model BERMODEL
@ BERMODEL_Model
@ BERMODEL_File
@ BERMODEL_Fixed
ptrSUPERFRAME superframe_alloc(LINKTYPE linkType, NETSIM_ID d, NETSIM_ID in)
@ FRUSAGE_SHORT
@ FRUSAGE_NORMAL
ptrSATELLITE_GW_MAC satellite_gw_mac_alloc(ptrSATELLITE_PROTODATA pd)
ptrSATELLITE_UT_MAC satellite_ut_mac_alloc(ptrSATELLITE_PROTODATA pd)
Definition: Satellite_MAC.c:34
ptrSATELLITE_MAC satellite_mac_alloc(ptrSATELLITE_PROTODATA pd)
ptrSATELLITE_PHY satellite_phy_alloc(NETSIM_ID d, NETSIM_ID in)
Definition: Satellite_PHY.c:35
ptrSATELLITE_UT_PHY satellite_ut_phy_alloc(NETSIM_ID d, NETSIM_ID in)
Definition: Satellite_PHY.c:53
ptrSATELLITE_GW_PHY satellite_gw_phy_alloc(NETSIM_ID d, NETSIM_ID in)
Definition: Satellite_PHY.c:44
double fn_NetSim_Config_read_Frequency(void *xmlNetSimNode, const char *name, double defaultval, const char *returnUnit)
#define getXmlVar(var, name, xmlNode, flag, type, protocol)
Definition: Stack.h:1046
#define DEVICE_TYPE(DeviceId)
Definition: Stack.h:773
@ _UINT
Definition: Stack.h:1037
@ _STRING
Definition: Stack.h:1033
@ _DOUBLE
Definition: Stack.h:1031
@ SATELLITE
Definition: Stack.h:284
double fn_NetSim_Config_read_txPower(void *xmlNetSimNode, const char *name, double defaultTxPower, const char *returnUnit)
EXPORTED struct stru_NetSim_Network * NETWORK
Definition: Stack.h:742
@ PHYSICAL_LAYER
Definition: Stack.h:94
@ MAC_LAYER
Definition: Stack.h:95
double fn_NetSim_Config_read_dataLen(void *xmlNetSimNode, const char *name, double defaultDataLen, const char *returnUnit)
#define ConfigReadEnum(xmlNode, attriName, enumName, isErrorMsg)
Definition: Stack.h:1110
void * fn_NetSim_xmlGetChildElement(void *xmlNetSimNode, const char *childName, int count)
enum enum_Modulation PHY_MODULATION
enum enum_LayerType LAYER_TYPE
Definition: main.h:136
SATELLITE_DEVICETYPE deviceType
Definition: Satellite.h:85
double antennaGainToNoiseTemp_dBk
Definition: Satellite_PHY.h:84
double antennaGainToNoiseTemp_dBk
Definition: Satellite_PHY.h:50
double antennaGainToNoiseTemp_dBk
Definition: Satellite_PHY.h:65
PHY_MODULATION modulation
FRAMEUSAGEMODE usageMode
ptrFRAMECONF frameConfig
ptrCARRIERCONF carrierConfig