NetSim Source Code Help
Loading...
Searching...
No Matches
Satellite_SuperFrame.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
29#pragma region EVENT_OTHER_DETAILS
30typedef struct stru_eventdetails
31{
36
38{
39 ptrEVENTDETAILS ev = calloc(1, sizeof * ev);
40 ev->fr = fr;
41 ev->sf = sf;
42 ev->carrier = carrier;
43 return ev;
44}
45
47{
48 free(ev);
49}
50
52{
54 return ev->sf;
55}
56
58{
60 return ev->fr;
61}
62
64{
66 return ev->carrier;
67}
68#pragma endregion
69
70#pragma region FUNCTION_PROTOTYPE
71static void add_superframe_event(NETSIM_ID d, NETSIM_ID in, double time, ptrSUPERFRAME sf);
72static void frame_send_packet(NETSIM_ID d, NETSIM_ID in,
74#pragma endregion
75
76#pragma region UTILITY
78{
80 return mac->returnLinkSuperFrame;
81}
82
84{
86 return mac->forwardFLinkSuperFrame;
87}
88#pragma endregion
89
90#pragma region SUPERFRAME_INIT
92 NETSIM_ID d, NETSIM_ID in)
93{
94 ptrSUPERFRAME sf = calloc(1, sizeof * sf);
95 sf->carrierConfig = calloc(1, sizeof * sf->carrierConfig);
96 sf->slotConfig = calloc(1, sizeof * sf->slotConfig);
97 sf->frameConfig = calloc(1, sizeof * sf->frameConfig);
98 sf->linkType = linkType;
99
102
103 if (linkType == LINKTYPE_FORWARD)
104 {
105 mac->forwardFLinkSuperFrame = sf;
106 phy->forwardLinkSuperFrame = sf;
107 }
108 else if (linkType == LINKTYPE_RETURN)
109 {
110 mac->returnLinkSuperFrame = sf;
111 phy->returnLinkSuperFrame = sf;
112 }
113
114 return sf;
115}
116
117static void form_frames(ptrSUPERFRAME sf, ptrCARRIER carrier)
118{
119 UINT i;
120
122 carrier->frames = calloc(carrier->frameCount, sizeof * carrier->frames);
123
124 double startTime = 0;
125 for (i = 0; i < carrier->frameCount; i++)
126 {
127 ptrFRAME fr = calloc(1, sizeof * fr);
128 carrier->frames[i] = fr;
129
130 fr->relativeFrameStartTime = startTime;
131
132 fr->relativeFrameEndTime = sf->frameConfig->frameLength_us + startTime;
133 fr->bandwidth_Hz = carrier->bandwidth_Hz;
134 fr->carrierId = carrier->carrierId;
135 fr->frameId = i + 1;
136 fr->isRandomAccess = false;
137
138 startTime = fr->relativeFrameEndTime;
139 }
140}
141
143{
144 return (UINT)floor((double)sf->slotConfig->symbolPerSlot *
145 (double)sf->slotConfig->modulationBits *
147}
148
150{
151 switch (modulation)
152 {
153 case Modulation_QPSK:
154 {
155 return 2;
156 break;
157 }
158 case Modulation_8PSK:
159 {
160 return 3;
161 break;
162 }
165 {
166 return 4;
167 break;
168 }
170 {
171 return 5;
172 break;
173 }
174 default:
175 {
176 fnNetSimError("Unsupported modulation %s for satellite network\n",
177 strPHY_MODULATION[modulation]);
178 return 0;
179 break;
180 }
181 }
182}
183
185{
186 UINT i;
187
189 sf->carriers = calloc(sf->carrierCount, sizeof * sf->carriers);
190 print_satellite_log("Carrier count = %d\n", sf->carrierCount);
192
193 for (i = 0; i < sf->carrierCount; i++)
194 {
195 print_satellite_log("Forming carrier %d\n", i + 1);
196
197 sf->carriers[i] = calloc(1, sizeof * sf->carriers[i]);
198 ptrCARRIER cr = sf->carriers[i];
200 cr->carrierId = i + 1;
201 cr->centerFrequency_Hz = sf->baseFreqnecy_Hz + cr->bandwidth_Hz * (i + 0.5);
202
203 print_satellite_log("Carrier Id = %d\n", i + 1);
204 print_satellite_log("carrier allocated bandwidth = %lf Hz\n", cr->bandwidth_Hz);
205 print_satellite_log("Central frequency = %lf Hz\n", cr->centerFrequency_Hz);
207 }
210}
211
213{
218
220 UINT dataSymbols = slots * sf->slotConfig->symbolPerSlot;
221 UINT pilotSlot = (UINT)floor((double)slots / sf->frameConfig->pilotBlockInterval_inSlots);
222 UINT pilotSymbol = pilotSlot * sf->frameConfig->pilotBlockSize_inSymbols;
223 UINT totalSymbol = pilotSymbol + dataSymbols;
224
225 sf->frameConfig->frameLength_us = (((double)totalSymbol) / sf->slotConfig->symbolRate) * SECOND;
231
232 print_satellite_log("Frame length = %lf us\n", sf->frameConfig->frameLength_us);
233 print_satellite_log("Pilot block length = %lf us\n", sf->frameConfig->pilotBlockLength_us);
234 print_satellite_log("Slot length = %lf us\n", sf->slotConfig->slotLength_us);
235 print_satellite_log("Superframe Duration = %lf us\n", sf->superFrameDuration_us);
236 print_satellite_log("Bits per slot = %d\n", sf->slotConfig->bitsPerSlot);
237 print_satellite_log("Bits per frame = %d\n", sf->frameConfig->bitsPerFrame);
238 print_satellite_log("Superframe duration = %0.3lf us\n", sf->superFrameDuration_us);
239 print_satellite_log("Superframe bandwidth = %lf Hz\n", sf->bandwidth_Hz);
240 print_satellite_log("Central frquency = %lf Hz\n", sf->centralFrequency_Hz);
241}
242
244{
245 UINT i;
246
248 form_carrier(sf);
249
250 for (i = 0; i < sf->carrierCount; i++)
251 form_frames(sf, sf->carriers[i]);
252}
253
255 UINT bits)
256{
257 UINT bytes = bits / 8;
258 NetSim_LINKS* link = DEVICE_PHYLAYER(d, in)->pstruNetSimLinks;
259 NETSIM_ID i;
260 for (i = 0; i < link->puniDevList.pstrup2MP.nConnectedDeviceCount - 1; i++)
261 {
264 DEVICE_MACLAYER(c, cin)->dFragmentSize = (double)bytes;
265 }
266}
267
268static void set_max_unit_size(ptrSUPERFRAME sf, UINT maxBitsCount)
269{
270 double maxBytes = floor(maxBitsCount / 8.0);
271 UINT i;
272 for (i = 0; i < sf->bufferCount; i++)
274}
275
277{
281
282 print_satellite_log("\n\nForming return superframe for satellite %d-%d.\n", d, in);
283 form_superframe(rsf);
284
285 print_satellite_log("\n\nForming forward superframe for satellite %d-%d.\n", d, in);
286 form_superframe(fsf);
287
291 add_superframe_event(d, in, 0, rsf);
292 add_superframe_event(d, in, 0, fsf);
293}
294#pragma endregion
295
296#pragma region SUPERFRAME_RESET
298{
299 UINT i;
300 for (i = 0; i < cr->frameCount; i++)
301 {
302 cr->frames[i]->frameStartTime = 0;
303 cr->frames[i]->frameEndTime = 0;
304 }
305}
306
308{
309 UINT i;
310 for (i = 0; i < sf->carrierCount; i++)
311 reset_carrier(sf, sf->carriers[i]);
312
313 sf->startTime_us = 0;
314 sf->endTime_us = 0;
315}
316#pragma endregion
317
318#pragma region FRAME_EVENT
321{
322 NetSim_EVENTDETAILS pevent;
323 memset(&pevent, 0, sizeof pevent);
324 pevent.dEventTime = fr->frameStartTime;
325 pevent.nDeviceId = d;
326 pevent.nDeviceType = DEVICE_TYPE(d);
327 pevent.nEventType = TIMER_EVENT;
328 pevent.nInterfaceId = in;
331 pevent.szOtherDetails = form_eventdetails(sf, fr, cr);
332 fnpAddEvent(&pevent);
333}
334
336{
339 double time = pstruEventDetails->dEventTime;
344
345 print_satellite_log("Satellite %d-%d, Time %0.3lf us. Starting Frame\n",
346 d, in, time);
348 print_satellite_log("Frame start time = %0.3lf us\n", fr->frameStartTime);
349 print_satellite_log("Frame end time = %0.3lf us\n", fr->frameEndTime);
350
351 satellite_allocate_slot(d, in, sf, fr);
352 frame_send_packet(d, in, sf, fr, cr);
354}
355#pragma endregion
356
357#pragma region SUPERFRAME_EVENT
358static void add_superframe_event(NETSIM_ID d, NETSIM_ID in, double time, ptrSUPERFRAME sf)
359{
360 NetSim_EVENTDETAILS pevent;
361 memset(&pevent, 0, sizeof pevent);
362 pevent.dEventTime = time;
363 pevent.nDeviceId = d;
364 pevent.nDeviceType = DEVICE_TYPE(d);
365 pevent.nEventType = TIMER_EVENT;
366 pevent.nInterfaceId = in;
369 pevent.szOtherDetails = form_eventdetails(sf, NULL, NULL);
370 fnpAddEvent(&pevent);
371}
372
373static void start_superframe(ptrSATELLITE_MAC mac, ptrSUPERFRAME sf, double time)
374{
375 sf->startTime_us = time;
376 sf->endTime_us = sf->superFrameDuration_us + time;
377 sf->superFrameId++;
378 print_satellite_log("Superframe Id = %d\n", sf->superFrameId);
379 print_satellite_log("Superframe start time = %0.3lf us\n", sf->startTime_us);
380 print_satellite_log("Superframe end time = %0.3lf us\n", sf->endTime_us);
381 print_satellite_log("Link Type = %s\n", strLINKTYPE[sf->linkType]);
382
383 UINT i, j;
384 for (i = 0; i < sf->carrierCount; i++)
385 {
386 ptrCARRIER carrier = sf->carriers[i];
387 for (j = 0; j < carrier->frameCount; j++)
388 {
389 ptrFRAME fr = carrier->frames[j];
390 fr->frameStartTime = fr->relativeFrameStartTime + time;
391 fr->frameEndTime = fr->relativeFrameEndTime + time;
392 print_satellite_log("Frame %d start time = %0.3lf us\n", i + 1, fr->frameStartTime);
393 print_satellite_log("Frame %d end time = %0.3lf us\n", i + 1, fr->frameEndTime);
394 print_satellite_log("Adding frame %d start event\n", i + 1);
395 add_frame_start_event(mac->satelliteId, mac->satelliteIf, sf, fr, carrier);
396 }
397 }
398}
399
401{
407
408 if (sf->bufferCount == 0)
409 satellite_form_bufferList(d, in, sf);
410
411 double time = pstruEventDetails->dEventTime;
412
413 print_satellite_log("Satellite %d-%d, Time %0.3lf us\n",
414 d, in, time);
416 print_satellite_log("Resetting previous superframe\n");
418 print_satellite_log("Starting new superframe\n");
419 start_superframe(mac, sf, time);
420
421 //Add next superframe start event
422 time += sf->superFrameDuration_us;
423 add_superframe_event(d, in, time, sf);
424 print_satellite_log("Adding next superframe start event at %0.3lf us\n", time);
426}
427#pragma endregion
428
429#pragma region FRAME_SEND
431 NETSIM_ID d, NETSIM_ID in)
432{
434 packet->pstruPhyData->dPayload = packet->pstruMacData->dPacketSize;
435 packet->pstruPhyData->dPacketSize = packet->pstruPhyData->dOverhead +
436 packet->pstruPhyData->dPayload;
437
438 NetSim_EVENTDETAILS pevent;
439 memset(&pevent, 0, sizeof pevent);
440 pevent.dEventTime = packet->pstruMacData->dEndTime;
441 pevent.dPacketSize = packet->pstruMacData->dPacketSize;
442
443 if (packet->pstruAppData)
444 {
446 pevent.nSegmentId = packet->pstruAppData->nSegmentId;
447 }
448
449 pevent.nDeviceId = packet->nTransmitterId;
450 pevent.nDeviceType = DEVICE_TYPE(packet->nTransmitterId);
453 pevent.nPacketId = packet->nPacketId;
455 pevent.pPacket = packet;
456 fnpAddEvent(&pevent);
457}
458
459static void update_time(NetSim_PACKET* packet, double* startTime,
460 UINT bitsPerFrame, double frameDuration)
461{
462 UINT bitsCount = (UINT)packet->pstruMacData->dPayload * 8;
463 double duration = ((bitsCount * 1.0) / bitsPerFrame) * frameDuration;
464
465 packet->pstruMacData->dEndTime = *startTime;
466 packet->pstruMacData->dStartTime = *startTime;
467
468 packet->pstruPhyData->dArrivalTime = *startTime;
469 packet->pstruPhyData->dStartTime = *startTime + duration;
470
471 *startTime += duration;
472}
473
476{
477 (void)cr;
478
479 double st = fr->frameStartTime;
480 double frDur = fr->frameEndTime - fr->frameStartTime;
481 NetSim_PACKET* packet;
482 while (fr->head)
483 {
484 packet = fr->head;
485 fr->head = packet->pstruNextPacket;
486 if (fr->head == NULL) fr->tail = NULL;
487 packet->pstruNextPacket = NULL;
488
489 update_time(packet, &st, sf->frameConfig->bitsPerFrame, frDur);
490
491 send_packet_to_phy(packet, d, in);
492
493 }
494}
495#pragma endregion
unsigned int NETSIM_ID
Definition: Animation.h:45
#define c
#define UINT
Definition: Linux.h:38
#define fnNetSimError(x,...)
Definition: Linux.h:56
#define min(a, b)
Definition: Linux.h:106
#define free(p)
Definition: Memory.h:31
#define calloc(c, s)
Definition: Memory.h:29
#define SATELLITE_PHY_GET(d, i)
Definition: Satellite.h:107
@ LINKTYPE_FORWARD
Definition: Satellite.h:61
@ LINKTYPE_RETURN
Definition: Satellite.h:62
void print_satellite_log(char *format,...)
#define SATELLITE_MAC_GET(d, i)
Definition: Satellite.h:108
void satellite_log_remove_tab()
void satellite_log_add_tab()
static char * strLINKTYPE[]
Definition: Satellite.h:64
@ SUBEVENT_SUPERFRAME_START
Definition: Satellite.h:77
@ SUBEVENT_FRAME_START
Definition: Satellite.h:78
enum enum_linktype LINKTYPE
void satellite_form_bufferList(NETSIM_ID d, NETSIM_ID in, ptrSUPERFRAME sf)
ptrSUPERFRAME satellite_get_return_superframe(NETSIM_ID d, NETSIM_ID in)
struct stru_eventdetails * ptrEVENTDETAILS
static void reset_carrier(ptrSUPERFRAME sf, ptrCARRIER cr)
static UINT calculate_bitsPerSlot(ptrSUPERFRAME sf)
static void reset_superframe(ptrSUPERFRAME sf)
static void add_superframe_event(NETSIM_ID d, NETSIM_ID in, double time, ptrSUPERFRAME sf)
static UINT getModulationBits(PHY_MODULATION modulation)
void satellite_frame_start()
static void configure_superframe(ptrSUPERFRAME sf)
static void form_carrier(ptrSUPERFRAME sf)
struct stru_eventdetails EVENTDETAILS
ptrSUPERFRAME satellite_get_forward_superframe(NETSIM_ID d, NETSIM_ID in)
ptrSUPERFRAME superframe_alloc(LINKTYPE linkType, NETSIM_ID d, NETSIM_ID in)
static void form_frames(ptrSUPERFRAME sf, ptrCARRIER carrier)
static void add_frame_start_event(NETSIM_ID d, NETSIM_ID in, ptrSUPERFRAME sf, ptrFRAME fr, ptrCARRIER cr)
static void clear_eventdetails(ptrEVENTDETAILS ev)
static void form_superframe(ptrSUPERFRAME sf)
void superframe_init(NETSIM_ID d, NETSIM_ID in)
static void start_superframe(ptrSATELLITE_MAC mac, ptrSUPERFRAME sf, double time)
static void set_max_payload_size(NETSIM_ID d, NETSIM_ID in, UINT bits)
static ptrEVENTDETAILS form_eventdetails(ptrSUPERFRAME sf, ptrFRAME fr, ptrCARRIER carrier)
static void frame_send_packet(NETSIM_ID d, NETSIM_ID in, ptrSUPERFRAME sf, ptrFRAME fr, ptrCARRIER cr)
void satellite_superframe_start()
static ptrSUPERFRAME get_curr_superframe()
static void set_max_unit_size(ptrSUPERFRAME sf, UINT maxBitsCount)
static void update_time(NetSim_PACKET *packet, double *startTime, UINT bitsPerFrame, double frameDuration)
static void send_packet_to_phy(NetSim_PACKET *packet, NETSIM_ID d, NETSIM_ID in)
static ptrFRAME get_curr_frame()
static ptrCARRIER get_curr_carrier()
void satellite_buffer_setMaxUnitSizeInBytes(ptrSATELLITE_BUFFER buffer, double maxUnitSizeInBytes)
void satellite_allocate_slot(NETSIM_ID d, NETSIM_ID in, ptrSUPERFRAME sf, ptrFRAME fr)
#define DEVICE_MACLAYER(DeviceId, InterfaceId)
Definition: Stack.h:786
#define DEVICE_TYPE(DeviceId)
Definition: Stack.h:773
@ MAC_PROTOCOL_SATELLITE
Definition: Stack.h:234
#define SECOND
Definition: Stack.h:60
@ TIMER_EVENT
Definition: Stack.h:114
@ PHYSICAL_OUT_EVENT
Definition: Stack.h:104
EXPORTED struct stru_NetSim_EventDetails * pstruEventDetails
Definition: Stack.h:837
NETSIM_ID fn_NetSim_Stack_GetConnectedInterface(NETSIM_ID devId, NETSIM_ID ifid, NETSIM_ID conId)
#define DEVICE_PHYLAYER(DeviceId, InterfaceId)
Definition: Stack.h:788
static const char * strPHY_MODULATION[]
Definition: Wireless.h:50
enum enum_Modulation PHY_MODULATION
@ Modulation_32APSK
Definition: Wireless.h:47
@ Modulation_QPSK
Definition: Wireless.h:36
@ Modulation_16APSK
Definition: Wireless.h:46
@ Modulation_8PSK
Definition: Wireless.h:45
@ Modulation_16_QAM
Definition: Wireless.h:38
#define fnpAddEvent(pstruEvent)
Definition: main.h:191
NETSIM_ID nApplicationId
Definition: Stack.h:752
EVENT_TYPE nEventType
Definition: Stack.h:747
NETSIM_ID nProtocolId
Definition: Stack.h:748
struct stru_NetSim_Packet * pPacket
Definition: Stack.h:754
NETSIM_ID nSubEventType
Definition: Stack.h:757
NETSIM_ID nDeviceId
Definition: Stack.h:750
long long int nPacketId
Definition: Stack.h:755
netsimDEVICE_TYPE nDeviceType
Definition: Stack.h:749
NETSIM_ID nInterfaceId
Definition: Stack.h:751
long long int nPacketId
Definition: Packet.h:256
struct stru_NetSim_Packet_AppLayer * pstruAppData
Definition: Packet.h:273
struct stru_NetSim_Packet_PhyLayer * pstruPhyData
Definition: Packet.h:277
struct stru_NetSim_Packet * pstruNextPacket
Definition: Packet.h:278
NETSIM_ID nTransmitterId
Definition: Packet.h:265
struct stru_NetSim_Packet_MACLayer * pstruMacData
Definition: Packet.h:276
ptrSUPERFRAME forwardFLinkSuperFrame
Definition: Satellite_MAC.h:88
NETSIM_ID satelliteIf
Definition: Satellite_MAC.h:85
NETSIM_ID satelliteId
Definition: Satellite_MAC.h:84
ptrSUPERFRAME returnLinkSuperFrame
Definition: Satellite_MAC.h:87
ptrSUPERFRAME returnLinkSuperFrame
Definition: Satellite_PHY.h:42
ptrSUPERFRAME forwardLinkSuperFrame
Definition: Satellite_PHY.h:43
PHY_MODULATION modulation
NetSim_PACKET * tail
NetSim_PACKET * head
double relativeFrameEndTime
double relativeFrameStartTime
ptrFRAMECONF frameConfig
ptrSATELLITE_BUFFER * buffers
ptrCARRIERCONF carrierConfig