NetSim Source Code Help v14.4
All 13 Components
 
Loading...
Searching...
No Matches
Component 11/Satellite/Satellite_Utility.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
27#pragma region CONFIG_UTILITY
28SATELLITE_DEVICETYPE SATELLITE_DEVICETYPE_FROM_STR(const char* type)
29{
30 for (int i = 0; i < SATELLITE_DEVICETYPE_UNKNOWN; i++)
31 if (!_stricmp(type, strSATELLITE_DEVICETYPE[i])) return (SATELLITE_DEVICETYPE)i;
32 fnNetSimError("Unknown SATELLITE device type %s in function %s\n",
33 type, __FUNCTION__);
34 return SATELLITE_DEVICETYPE_UNKNOWN;
35}
36#pragma endregion
37
38#pragma region PROTOCOLDATA
39static ptrSATELLITE_PROTODATA check_for_data_alloc(NETSIM_ID d,
40 NETSIM_ID in)
41{
42 if (DEVICE_MACLAYER(d, in) &&
43 DEVICE_MACLAYER(d,in)->nMacProtocolId == MAC_PROTOCOL_SATELLITE &&
44 DEVICE_MACVAR(d, in))
45 return DEVICE_MACVAR(d, in);
46
47 if (DEVICE_PHYLAYER(d, in) &&
48 DEVICE_MACLAYER(d,in)->nMacProtocolId == MAC_PROTOCOL_SATELLITE &&
49 DEVICE_PHYVAR(d, in))
50 return DEVICE_PHYVAR(d, in);
51
52 return NULL;
53}
54
55static void set_protocol_data(NETSIM_ID d, NETSIM_ID in, void* data)
56{
57 if (DEVICE_MACLAYER(d, in))
58 {
59 DEVICE_MACLAYER(d, in)->nMacProtocolId = MAC_PROTOCOL_SATELLITE;
60 DEVICE_MACVAR(d, in) = data;
61 }
62
63 if (DEVICE_PHYLAYER(d, in))
64 {
65 DEVICE_PHYVAR(d, in) = data;
66 }
67}
68
69ptrSATELLITE_PROTODATA SATELLITE_PROTOCOLDATA_ALLOC(NETSIM_ID d,
70 NETSIM_ID in)
71{
72 ptrSATELLITE_PROTODATA data = check_for_data_alloc(d, in);
73 if (data)
74 {
75 set_protocol_data(d, in, data);
76 return data;
77 }
78
79 data = calloc(1, sizeof * data);
80 set_protocol_data(d, in, data);
81
82 data->deviceId = d;
83 data->interfaceId = in;
84
85 data->SATELLITE_LAYER_DATA = calloc(SATELLITE_DEVICETYPE_UNKNOWN, sizeof * data->SATELLITE_LAYER_DATA);
86 for (int i = 0; i < SATELLITE_DEVICETYPE_UNKNOWN; i++)
87 {
88 data->SATELLITE_LAYER_DATA[i] = calloc(SATELLITE_LAYER_UNKNOWN, sizeof * data->SATELLITE_LAYER_DATA[i]);
89 }
90 return data;
91}
92
93void SATELLITE_PROTOCOLDATA_FREE(NETSIM_ID d,
94 NETSIM_ID in)
95{
96 ptrSATELLITE_PROTODATA data = DEVICE_MACVAR(d, in);
97 free(data->SATELLITE_LAYER_DATA);
98 free(data);
99 DEVICE_MACVAR(d, in) = NULL;
100 DEVICE_PHYVAR(d, in) = NULL;
101}
102
103void* SATELLITE_LAYER_DATA_GET(NETSIM_ID d, NETSIM_ID in,
104 SATELLITE_DEVICETYPE devType,
105 SATELLITE_LAYER layer)
106{
107 ptrSATELLITE_PROTODATA data = check_for_data_alloc(d, in);
108 if (!data)
109 {
110 fnNetSimError("Device %d, Interface %d is not an SATELLITE interface\n", d, in);
111 return NULL;
112 }
113
114 if (data->deviceType != devType)
115 {
116 fnNetSimError("Device %d, Interface %d is not %s device\n",
117 d, in,
118 strSATELLITE_DEVICETYPE[devType]);
119 return NULL;
120 }
121
122 if (!data->SATELLITE_LAYER_DATA[devType][layer])
123 {
124 fnNetSimError("%s sublayer is not initialized for device %d, Interface %d\n",
125 strSATELLITE_LAYER[layer], d, in);
126 return NULL;
127 }
128
129 return data->SATELLITE_LAYER_DATA[devType][layer];
130}
131
132bool SATELLITE_LAYER_DATA_IsInitialized(NETSIM_ID d, NETSIM_ID in,
133 SATELLITE_DEVICETYPE devType,
134 SATELLITE_LAYER layer)
135{
136 ptrSATELLITE_PROTODATA data = check_for_data_alloc(d, in);
137 if (!data)
138 {
139 fnNetSimError("Device %d, Interface %d is not an SATELLITE interface\n", d, in);
140 return false;
141 }
142
143 if (data->deviceType != devType)
144 {
145 fnNetSimError("Device %d, Interface %d is not %s device\n",
146 d, in,
147 strSATELLITE_DEVICETYPE[devType]);
148 return false;
149 }
150
151 if (!data->SATELLITE_LAYER_DATA[devType][layer])
152 {
153 return false;
154 }
155
156 return true;
157}
158
159void SATELLITE_LAYER_DATA_SET(NETSIM_ID d, NETSIM_ID in,
160 SATELLITE_DEVICETYPE devType,
161 SATELLITE_LAYER layer,
162 void* data)
163{
164 ptrSATELLITE_PROTODATA PD = check_for_data_alloc(d, in);
165 if (!PD)
166 {
167 fnNetSimError("Device %d, Interface %d is not an SATELLITE interface\n", d, in);
168 return;
169 }
170
171 if (PD->deviceType != devType)
172 {
173 fnNetSimError("Device %d, Interface %d is not %s device\n",
174 d, in,
175 strSATELLITE_DEVICETYPE[devType]);
176 return;
177 }
178
179 PD->SATELLITE_LAYER_DATA[devType][layer] = data;
180}
181
182SATELLITE_DEVICETYPE SATELLITE_DEVICETYPE_GET(NETSIM_ID d, NETSIM_ID in)
183{
184 ptrSATELLITE_PROTODATA pd = check_for_data_alloc(d, in);
185 if (!pd)
186 {
187 fnNetSimError("Device %d, Interface %d is not an SATELLITE interface\n", d, in);
188 return SATELLITE_DEVICETYPE_UNKNOWN;
189 }
190
191 return pd->deviceType;
192}
193#pragma endregion
194
195#pragma region SATELLITE_LOG
196#define MAX_TAB_COUNT 100
197static FILE* fplog = NULL;
198static char tabs[MAX_TAB_COUNT];
199static int tabCount = 0;
200
201static bool get_satellite_log_status()
202{
203 if (get_protocol_log_status("SATELLITE_LOG"))
204 return true;
205 else
206 return false;
207}
208
209void init_satellite_log()
210{
211 if (get_satellite_log_status())
212 {
213 char str[BUFSIZ];
214 sprintf(str, "%s/%s", pszIOLogPath, "satellite.log");
215 fplog = fopen(str, "w");
216 if (!fplog)
217 {
218 perror(str);
219 fnSystemError("Unable to open satellite.log file");
220 }
221 }
222}
223
224void close_satellite_log()
225{
226 if(fplog)
227 fclose(fplog);
228}
229
230void print_satellite_log(char* format, ...)
231{
232 if (fplog)
233 {
234 fprintf(fplog, "%s", tabs);
235 va_list l;
236 va_start(l, format);
237 vfprintf(fplog, format, l);
238 fflush(fplog);
239 }
240}
241
242void satellite_log_add_tab()
243{
244 tabs[tabCount] = '\t';
245 tabCount++;
246 if (tabCount > 99) tabCount = 99;
247}
248
249void satellite_log_remove_tab()
250{
251 tabCount--;
252 tabs[tabCount] = 0;
253 if (tabCount < 0) tabCount = 0;
254}
255#pragma endregion