26#include "Satellite_MAC.h"
27#include "Satellite_PHY.h"
28#include "Satellite_Frame.h"
30#pragma region SATELLITE_DEFAULT_CONFIG
32#define SATELLITE_DEVICE_TYPE_DEFAULT _strdup("USER_TERMINAL")
33#define SATELLITE_GATEWAY_DEFAULT NULL
34#define SATELLITE_BUFFER_SIZE_DEFAULT (1024*1024*8)
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("")
45#define SATELLITE_CODING_RATE_DEFAULT _strdup("1/2")
46#define SATELLITE_MODULATION_DEFAULT _strdup("QPSK")
47#define SATELLITE_SYMBOL_PER_SLOT_DEFAULT 90
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
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
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
72#pragma region SATELLITE_MAC_CONFIG
74static void SATELLITE_ConfigureSatelliteMacLayer(ptrSATELLITE_PROTODATA pd,
void* xmlNetSimNode)
77 ptrSATELLITE_MAC mac = satellite_mac_alloc(pd);
81static void SATELLITE_ConfigureGatewayMacLayer(ptrSATELLITE_PROTODATA pd,
void* xmlNetSimNode)
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");
88static void SATELLITE_ConfigureUTMacLayer(ptrSATELLITE_PROTODATA pd,
void* xmlNetSimNode)
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");
96static void SATELLITE_ConfigureMacLayer(ptrSATELLITE_PROTODATA pd,
void* xmlNetSimNode)
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);
106 fnNetSimError(
"Unknown satellite device type %d in function %s\n",
107 pd->deviceType, __FUNCTION__);
113#pragma region SATELLITE_PHY_CONFIG
114static BERMODEL get_ber_model_from_str(
char* s)
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;
121 fnNetSimError(
"Unknown BER model %s.\n", s);
122 return BERMODEL_Fixed;
126static double getCodingRate(
char* s)
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;
142static void satellite_configure_carrier(ptrCARRIERCONF cf,
void* xmlNetSimNode)
145 getXmlVar(&cf->rollOffFactor, ROLLOFF_FACTOR, xmlNetSimNode, 1, _DOUBLE, SATELLITE);
146 if (cf->rollOffFactor > 1.0 || cf->rollOffFactor < 0.0)
148 fnNetSimError(
"Roll factor must be [0.0,1.0]\n");
149 cf->rollOffFactor = 1.0;
152 getXmlVar(&cf->spacingFactor, SPACING_FACTOR, xmlNetSimNode, 1, _DOUBLE, SATELLITE);
153 if (cf->spacingFactor > 1.0 || cf->spacingFactor < 0.0)
155 fnNetSimError(
"Spacing factor must be [0.0,1.0]\n");
156 cf->spacingFactor = 1.0;
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));
164 getXmlVar(&szVal, BER_MODEL, xmlNetSimNode, 1, _STRING, SATELLITE);
165 cf->berModel = get_ber_model_from_str(szVal);
168 if (cf->berModel == BERMODEL_Fixed)
170 getXmlVar(&cf->berValue, BER, xmlNetSimNode, 1, _DOUBLE, SATELLITE);
172 else if (cf->berModel == BERMODEL_File)
174 getXmlVar(&cf->berFile, BER_FILE, xmlNetSimNode, 1, _STRING, SATELLITE);
175 cf->berTable = read_ber_file(cf->berFile, &cf->berTableLen);
178 getXmlVar(&szVal, CODING_RATE, xmlNetSimNode, 1, _STRING, SATELLITE);
179 cf->codingRate = getCodingRate(szVal);
182 cf->modulation = ConfigReadEnum(xmlNetSimNode,
"MODULATION", PHY_MODULATION,
true);
185static void satellite_configure_frame(ptrFRAMECONF frConf,
void* xmlNetSimNode)
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;
200 getXmlVar(&frConf->framesPerSuperframe, FRAME_COUNT_IN_SUPERFRAME, xmlNetSimNode, 1, _UINT, SATELLITE);
203static void satellite_configure_slot(ptrSLOTCONF sc,
void* xmlNetSimNode)
205 getXmlVar(&sc->symbolPerSlot, SYMBOL_PER_SLOT, xmlNetSimNode, 1, _UINT, SATELLITE);
208static void satellite_configure_forward_link(ptrSATELLITE_PHY phy,
void* xmlNetSimNode)
210 ptrSUPERFRAME sf = superframe_alloc(LINKTYPE_FORWARD, phy->d, phy->in);
212 satellite_configure_carrier(sf->carrierConfig, xmlNetSimNode);
214 satellite_configure_frame(sf->frameConfig, xmlNetSimNode);
216 satellite_configure_slot(sf->slotConfig, xmlNetSimNode);
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);
223static void satellite_configure_return_link(ptrSATELLITE_PHY phy,
void* xmlNetSimNode)
225 ptrSUPERFRAME sf = superframe_alloc(LINKTYPE_RETURN, phy->d, phy->in);
227 satellite_configure_carrier(sf->carrierConfig, xmlNetSimNode);
229 satellite_configure_frame(sf->frameConfig, xmlNetSimNode);
231 satellite_configure_slot(sf->slotConfig, xmlNetSimNode);
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);
238static void satellite_configure_phy(ptrSATELLITE_PROTODATA pd,
void* xmlNetSimNode)
240 ptrSATELLITE_PHY phy = satellite_phy_alloc(pd->deviceId, pd->interfaceId);
242 void* xmlChild = fn_NetSim_xmlGetChildElement(xmlNetSimNode,
"FORWARD", 0);
243 satellite_configure_forward_link(phy, xmlChild);
245 xmlChild = fn_NetSim_xmlGetChildElement(xmlNetSimNode,
"RETURN", 0);
246 satellite_configure_return_link(phy, xmlChild);
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);
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);
257static void satellite_configure_gw_phy(ptrSATELLITE_PROTODATA pd,
void* xmlNetSimNode)
259 ptrSATELLITE_GW_PHY phy = satellite_gw_phy_alloc(pd->deviceId, pd->interfaceId);
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);
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);
270static void satellite_configure_ut_phy(ptrSATELLITE_PROTODATA pd,
void* xmlNetSimNode)
272 ptrSATELLITE_UT_PHY phy = satellite_ut_phy_alloc(pd->deviceId, pd->interfaceId);
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);
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);
283static void SATELLITE_ConfigurePhyLayer(ptrSATELLITE_PROTODATA pd,
void* xmlNetSimNode)
285 switch (pd->deviceType)
287 case SATELLITE_DEVICETYPE_SATELLITE:
288 satellite_configure_phy(pd, xmlNetSimNode);
290 case SATELLITE_DEVICETYPE_SATELLITE_GATEWAY:
291 satellite_configure_gw_phy(pd, xmlNetSimNode);
293 case SATELLITE_DEVICETYPE_USER_TERMINAL:
294 satellite_configure_ut_phy(pd, xmlNetSimNode);
297 fnNetSimError(
"Unknown device type %d in function %s\n",
298 pd->deviceType, __FUNCTION__);
305void fn_NetSim_SATELLITE_Configure_F(
void** var)
311 NETSIM_ID nInterfaceId;
312 LAYER_TYPE nLayerType;
315 xmlNetSimNode = var[2];
316 if (!strcmp(tag,
"PROTOCOL_PROPERTY"))
319 nDeviceId = *((NETSIM_ID*)var[3]);
320 nInterfaceId = *((NETSIM_ID*)var[4]);
321 nLayerType = *((LAYER_TYPE*)var[5]);
323 ptrSATELLITE_PROTODATA pd = SATELLITE_PROTOCOLDATA_ALLOC(nDeviceId, nInterfaceId);
325 getXmlVar(&szVal, DEVICE_TYPE, xmlNetSimNode, 1, _STRING, SATELLITE);
326 pd->deviceType = SATELLITE_DEVICETYPE_FROM_STR(szVal);
329 if (nLayerType == MAC_LAYER)
330 SATELLITE_ConfigureMacLayer(pd, xmlNetSimNode);
331 else if (nLayerType == PHYSICAL_LAYER)
332 SATELLITE_ConfigurePhyLayer(pd, xmlNetSimNode);