NetSim Source Code Help
Loading...
Searching...
No Matches
Satellite_PHY.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_PHY.h"
27#include "Satellite_MAC.h"
28#include "Satellite_HDR.h"
30
31#pragma region FUNCTION_PROTOTYPE
32#pragma endregion
33
34#pragma region SATELLITE_PHY_INIT
36{
37 ptrSATELLITE_PHY phy = calloc(1, sizeof * phy);
38 phy->d = d;
39 phy->in = in;
40 SATELLITE_PHY_SET(d, in, phy);
41 return phy;
42}
43
45{
46 ptrSATELLITE_GW_PHY phy = calloc(1, sizeof * phy);
47 phy->d = d;
48 phy->in = in;
49 SATELLITE_GWPHY_SET(d, in, phy);
50 return phy;
51}
52
54{
55 ptrSATELLITE_UT_PHY phy = calloc(1, sizeof * phy);
56 phy->d = d;
57 phy->in = in;
58 SATELLITE_UTPHY_SET(d, in, phy);
59 return phy;
60}
61
63{
66}
67
69{
72}
73#pragma endregion
74
75#pragma region HELPER_FUNCTION
76#define SPEED_OF_LIGHT 299792458.0 // m/s
78{
79 assert(d);
80 assert(r);
81 double distance = DEVICE_DISTANCE(d, r);
82 return (distance / SPEED_OF_LIGHT) * SECOND;
83}
84
86 NETSIM_ID d, NETSIM_ID in,
87 NETSIM_ID r, NETSIM_ID rin)
88{
89 double propagationDelay = calculate_propagation_delay(d, r);
90 packet->pstruPhyData->dEndTime = packet->pstruPhyData->dStartTime + propagationDelay;
91 packet->nTransmitterId = d;
92 packet->nReceiverId = r;
93
95 memset(&pevent, 0, sizeof pevent);
96 pevent.dEventTime = packet->pstruPhyData->dEndTime;
97 pevent.dPacketSize = packet->pstruPhyData->dPacketSize;
98 if (packet->pstruAppData)
99 {
101 pevent.nSegmentId = packet->pstruAppData->nSegmentId;
102 }
103 pevent.nDeviceId = r;
104 pevent.nDeviceType = DEVICE_TYPE(r);
106 pevent.nInterfaceId = rin;
107 pevent.nPacketId = packet->nPacketId;
109 pevent.pPacket = packet;
110 fnpAddEvent(&pevent);
111}
112
113static void write_trace(NetSim_PACKET* packet)
114{
116 fn_NetSim_Metrics_Add(packet);
117}
118
119static void send_to_mac(NETSIM_ID d, NETSIM_ID in, NetSim_PACKET* packet, double time)
120{
121 NetSim_EVENTDETAILS pevent;
122 memset(&pevent, 0, sizeof pevent);
123 pevent.dEventTime = time;
124 pevent.dPacketSize = packet->pstruMacData->dPacketSize;
125 if (packet->pstruAppData)
126 {
128 pevent.nSegmentId = packet->pstruAppData->nSegmentId;
129 }
130 pevent.nDeviceId = d;
131 pevent.nInterfaceId = in;
132 pevent.nDeviceType = DEVICE_TYPE(d);
133 pevent.nEventType = MAC_IN_EVENT;
134 pevent.nPacketId = packet->nPacketId;
136 pevent.pPacket = packet;
137 fnpAddEvent(&pevent);
138}
139#pragma endregion
140
141#pragma region UTPHY_PACKET_PROCESSING
143{
148 satellite_send_packet(packet, d, in, hdr->satelliteId, hdr->satelliteIf);
149}
150
152{
156 double time = pstruEventDetails->dEventTime;
157 NETSIM_ID t = packet->nTransmitterId;
159
160 if (packet->nPacketStatus != PacketStatus_NoError)
161 {
162 write_trace(packet);
164 return;
165 }
166
167 satellite_check_for_packet_error(t, ti, d, in, packet);
168 if (packet->nPacketStatus != PacketStatus_NoError)
169 {
170 write_trace(packet);
172 return;
173 }
174
175 write_trace(packet);
176 send_to_mac(d, in, packet, time);
177}
178#pragma endregion
179
180#pragma region GWPHY_PACKET_PROCESSING
182{
187 satellite_send_packet(packet, d, in, hdr->satelliteId, hdr->satelliteIf);
188}
189
191{
195 double time = pstruEventDetails->dEventTime;
196 NETSIM_ID t = packet->nTransmitterId;
198
199 if (packet->nPacketStatus != PacketStatus_NoError)
200 {
201 write_trace(packet);
203 return;
204 }
205
206 satellite_check_for_packet_error(t, ti, d, in, packet);
207 if (packet->nPacketStatus != PacketStatus_NoError)
208 {
209 write_trace(packet);
211 return;
212 }
213
214 write_trace(packet);
215 send_to_mac(d, in, packet, time);
216}
217#pragma endregion
218
219#pragma region SATELLITE_PACKET_PROCESSING
220static void forward_to_phyout()
221{
222 NetSim_EVENTDETAILS pevent;
223 memcpy(&pevent, pstruEventDetails, sizeof pevent);
225 fnpAddEvent(&pevent);
226}
227
229{
233 NETSIM_ID t = packet->nTransmitterId;
235
236 if (packet->nPacketStatus != PacketStatus_NoError)
237 {
238 write_trace(packet);
240 return;
241 }
242
243 satellite_check_for_packet_error(t, ti, d, in, packet);
244 if (packet->nPacketStatus != PacketStatus_NoError)
245 {
246 write_trace(packet);
248 return;
249 }
250
251 write_trace(packet);
252 forward_to_phyout(); //Bend Pipe. So no Mac layer forwarding
253}
254
256 NetSim_PACKET* packet, double time,
257 NETSIM_ID r, NETSIM_ID rin)
258{
259 if (!r || !rin)
260 {
261 fnNetSimError("Receiver Id is 0 for packet %d in device %d:%d\n"
262 "Make sure static route has been configured correctly\n",
263 packet->nPacketId, d, in);
264 }
265 double txTime = packet->pstruPhyData->dStartTime - packet->pstruPhyData->dArrivalTime;
266 double propDelay = calculate_propagation_delay(d, r);
267
268 packet->pstruPhyData->dArrivalTime = time;
269 packet->pstruPhyData->dStartTime = time + txTime;
270 packet->pstruPhyData->dEndTime = time + txTime + propDelay;
271 packet->nTransmitterId = d;
272 packet->nReceiverId = r;
273
274 NetSim_EVENTDETAILS pevent;
275 memset(&pevent, 0, sizeof pevent);
276
277 pevent.dEventTime = packet->pstruPhyData->dEndTime;
278 pevent.dPacketSize = packet->pstruPhyData->dPacketSize;
279 if (packet->pstruAppData)
280 {
282 pevent.nSegmentId = packet->pstruAppData->nSegmentId;
283 }
284
285 pevent.nDeviceId = r;
286 pevent.nDeviceType = DEVICE_TYPE(r);
288 pevent.nInterfaceId = rin;
289 pevent.nPacketId = packet->nPacketId;
291 pevent.pPacket = packet;
292 fnpAddEvent(&pevent);
293}
294
296{
300 double time = pstruEventDetails->dEventTime;
301
303 if (hdr->linkType == LINKTYPE_FORWARD)
304 satellite_forward_packet(d, in, packet, time, hdr->utId, hdr->utIf);
305 else if (hdr->linkType == LINKTYPE_RETURN)
306 satellite_forward_packet(d, in, packet, time, hdr->gwId, hdr->gwIf);
307}
308#pragma endregion
309
310#pragma region PACKET_PROCESSING
312{
316 switch (type)
317 {
320 break;
323 break;
326 break;
327 default:
328 fnNetSimError("Unknown device type %s for device %d:%d is passed to function %s",
329 strSATELLITE_DEVICETYPE[type], d, in, __FUNCTION__);
330 break;
331 }
332}
333
335{
339 switch (type)
340 {
343 break;
346 break;
349 break;
350 default:
351 fnNetSimError("Unknwon device type %s for %d:%d in function %s\n",
352 strSATELLITE_DEVICETYPE[type], d, in, __FUNCTION__);
353 break;
354 }
355}
356#pragma endregion
357
unsigned int NETSIM_ID
Definition: Animation.h:45
#define fnNetSimError(x,...)
Definition: Linux.h:56
#define calloc(c, s)
Definition: Memory.h:29
@ PacketStatus_NoError
Definition: Packet.h:101
enum enum_SATELLITE_DEVICE_TYPE SATELLITE_DEVICETYPE
#define SATELLITE_PHY_SET(d, i, data)
Definition: Satellite.h:114
@ LINKTYPE_FORWARD
Definition: Satellite.h:61
@ LINKTYPE_RETURN
Definition: Satellite.h:62
#define SATELLITE_GWPHY_SET(d, i, data)
Definition: Satellite.h:118
static const char * strSATELLITE_DEVICETYPE[]
Definition: Satellite.h:55
@ 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_GET(NETSIM_ID d, NETSIM_ID in)
#define SATELLITE_UTPHY_SET(d, i, data)
Definition: Satellite.h:116
ptrSATELLITE_HDR SATELLITE_HDR_GET(NetSim_PACKET *packet)
Definition: Satellite_HDR.c:65
static void send_to_mac(NETSIM_ID d, NETSIM_ID in, NetSim_PACKET *packet, double time)
static void satellite_handle_PhyOut()
static double calculate_propagation_delay(NETSIM_ID d, NETSIM_ID r)
Definition: Satellite_PHY.c:77
static void satellite_gw_handle_phyIn()
static void satellite_ut_handle_phyIn()
void satellite_handle_phy_in()
void satellite_ut_phy_init(NETSIM_ID d, NETSIM_ID in)
Definition: Satellite_PHY.c:62
static void satellite_utphy_handle_phy_out()
static void forward_to_phyout()
static void satellite_handle_PhyIn()
#define SPEED_OF_LIGHT
Definition: Satellite_PHY.c:76
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
static void write_trace(NetSim_PACKET *packet)
void satellite_gw_phy_init(NETSIM_ID d, NETSIM_ID in)
Definition: Satellite_PHY.c:68
static void satellite_gwphy_handle_phy_out()
static void satellite_forward_packet(NETSIM_ID d, NETSIM_ID in, NetSim_PACKET *packet, double time, NETSIM_ID r, NETSIM_ID rin)
void satellite_handle_phy_out()
ptrSATELLITE_GW_PHY satellite_gw_phy_alloc(NETSIM_ID d, NETSIM_ID in)
Definition: Satellite_PHY.c:44
static void satellite_send_packet(NetSim_PACKET *packet, NETSIM_ID d, NETSIM_ID in, NETSIM_ID r, NETSIM_ID rin)
Definition: Satellite_PHY.c:85
void satellite_check_for_packet_error(NETSIM_ID t, NETSIM_ID ti, NETSIM_ID r, NETSIM_ID ri, NetSim_PACKET *packet)
void satellite_propagation_ut_calculate_rxpower(NETSIM_ID d, NETSIM_ID in, double time)
void satellite_propagation_gw_calculate_rxpower(NETSIM_ID d, NETSIM_ID in, double time)
void satellite_propgation_gw_init(NETSIM_ID d, NETSIM_ID in)
void satellite_propgation_ut_init(NETSIM_ID d, NETSIM_ID in)
#define DEVICE_TYPE(DeviceId)
Definition: Stack.h:773
@ MAC_PROTOCOL_SATELLITE
Definition: Stack.h:234
#define DEVICE_DISTANCE(d1, d2)
Definition: Stack.h:814
#define SECOND
Definition: Stack.h:60
@ PHYSICAL_OUT_EVENT
Definition: Stack.h:104
@ MAC_IN_EVENT
Definition: Stack.h:107
@ PHYSICAL_IN_EVENT
Definition: Stack.h:105
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 fn_NetSim_Metrics_Add(packet)
Definition: Stack.h:998
#define fn_NetSim_Packet_FreePacket(pstruPacket)
Definition: main.h:177
#define fn_NetSim_WritePacketTrace(pstruPacket)
Definition: main.h:188
#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 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
PACKET_STATUS nPacketStatus
Definition: Packet.h:272
struct stru_NetSim_Packet_PhyLayer * pstruPhyData
Definition: Packet.h:277
NETSIM_ID nReceiverId
Definition: Packet.h:266
NETSIM_ID nTransmitterId
Definition: Packet.h:265
struct stru_NetSim_Packet_MACLayer * pstruMacData
Definition: Packet.h:276
NETSIM_ID satelliteId
Definition: Satellite_HDR.h:43
NETSIM_ID satelliteIf
Definition: Satellite_HDR.h:44