25#include "Application.h"
26static FILE* fpGenerationLogs = NULL;
28static void add_app_info_to_packet(NetSim_PACKET* packet,
double time,
double size, UINT appId)
30 packet->pstruAppData->dArrivalTime = time;
31 packet->pstruAppData->dEndTime = time;
32 if (packet->nPacketType != PacketType_Control)
34 packet->pstruAppData->dOverhead = 0;
35 packet->pstruAppData->dPayload = size;
39 packet->pstruAppData->dPayload = 0;
40 packet->pstruAppData->dOverhead = size;
42 packet->pstruAppData->dPacketSize = packet->pstruAppData->dOverhead + packet->pstruAppData->dPayload;
43 packet->pstruAppData->dStartTime = ldEventTime;
44 packet->pstruAppData->nApplicationId = appId;
47static void set_app_end_and_generate_next_packet(NetSim_PACKET* pstruPacket, ptrAPPLICATION_INFO appInfo,
48 UINT destCount, NETSIM_ID* dest)
50 APPLICATION_TYPE nappType = pstruPacket->pstruAppData->nAppType;
52 if (nappType == TRAFFIC_FTP || nappType == TRAFFIC_DATABASE)
54 NetSim_PACKET* packet = pstruPacket;
55 while (packet->pstruNextPacket)
56 packet = packet->pstruNextPacket;
57 packet->pstruAppData->nAppEndFlag = 1;
58 fn_NetSim_Application_StartDataAPP(appInfo, pstruEventDetails->dEventTime);
60 else if (nappType == TRAFFIC_HTTP)
63 NetSim_PACKET* packet = pstruPacket;
64 if (pstruPacket->pstruAppData->nAppEndFlag)
66 while (packet->pstruNextPacket)
68 packet->pstruAppData->nAppEndFlag = 0;
69 packet = packet->pstruNextPacket;
71 packet->pstruAppData->nAppEndFlag = 1;
74 else if (nappType == TRAFFIC_INTERACTIVE_GAMING)
76 if (get_first_dest_from_packet(pstruPacket) == appInfo->sourceList[0])
78 strcpy(pstruPacket->szPacketType, appInfo->name);
79 strcat(pstruPacket->szPacketType,
"_UL");
80 fn_NetSim_Application_InteractiveGamingUL_GenerateNextPacket(appInfo, pstruPacket, ldEventTime);
84 strcpy(pstruPacket->szPacketType, appInfo->name);
85 strcat(pstruPacket->szPacketType,
"_DL");
86 fn_NetSim_Application_InteractiveGamingDL_GenerateNextPacket(appInfo, pstruPacket, ldEventTime);
89 else if (nappType == TRAFFIC_COAP)
93 else if (nappType == TRAFFIC_EMAIL)
95 appInfo = fn_NetSim_Application_Email_GenerateNextPacket((DETAIL*)appInfo,
96 pstruPacket->nSourceId,
97 get_first_dest_from_packet(pstruPacket),
98 pstruEventDetails->dEventTime);
100 else if (nappType == TRAFFIC_PEER_TO_PEER)
102 NetSim_PACKET* packet = pstruPacket;
103 while (packet->pstruNextPacket)
104 packet = packet->pstruNextPacket;
105 packet->pstruAppData->nAppEndFlag = 1;
107 else if (nappType == TRAFFIC_EMULATION)
113 fn_NetSim_Application_GenerateNextPacket(appInfo,
114 pstruPacket->nSourceId,
117 pstruEventDetails->dEventTime);
121static void send_to_transport_layer(ptrSOCKETINTERFACE s, ptrAPPLICATION_INFO appInfo,
122 NetSim_PACKET* packet, NETSIM_ID nDeviceId)
124 packet->pstruTransportData->nTransportProtocol = appInfo->trxProtocol;
125 if (!fn_NetSim_Socket_GetBufferStatus(s))
129 pstruEventDetails->dEventTime = ldEventTime;
130 pstruEventDetails->nEventType = TRANSPORT_OUT_EVENT;
131 pstruEventDetails->pPacket = NULL;
132 pstruEventDetails->nProtocolId = appInfo->trxProtocol;
133 pstruEventDetails->nSubEventType = 0;
134#pragma warning(disable:4312)
135 pstruEventDetails->szOtherDetails = (
void*)s;
136#pragma warning(default:4312)
138 fnpAddEvent(pstruEventDetails);
142 fn_NetSim_Socket_PassPacketToInterface(nDeviceId, packet, s);
145static void send_to_next_protocol(ptrSOCKETINTERFACE s, ptrAPPLICATION_INFO appInfo,
146 NetSim_PACKET* packet, NETSIM_ID nDeviceId)
148 NetSim_EVENTDETAILS pevent;
151 memset(&pevent, 0,
sizeof pevent);
152 pevent.dEventTime = ldEventTime;
153 pevent.dPacketSize = packet->pstruAppData->dPacketSize;
154 pevent.nApplicationId = packet->pstruAppData->nApplicationId;
155 pevent.nDeviceId = nDeviceId;
156 pevent.nDeviceType = DEVICE_TYPE(nDeviceId);
157 pevent.nEventType = APPLICATION_OUT_EVENT;
158 pevent.nPacketId = packet->nPacketId;
159 pevent.nProtocolId = appInfo->protocol;
160 pevent.nSegmentId = packet->pstruAppData->nSegmentId;
161 pevent.pPacket = packet;
162 pevent.szOtherDetails = (
void*)s;
163 packet = packet->pstruNextPacket;
164 pevent.pPacket->pstruNextPacket = NULL;
165 fnpAddEvent(&pevent);
169static void appout_send_packet(ptrSOCKETINTERFACE s, ptrAPPLICATION_INFO appInfo,
170 NetSim_PACKET* packet, NETSIM_ID nDeviceId)
172 if (appInfo->protocol == APP_PROTOCOL_NULL)
173 send_to_transport_layer(s, appInfo, packet, nDeviceId);
175 send_to_next_protocol(s, appInfo, packet, nDeviceId);
178static ptrAPPLICATION_INFO get_app_info(
void* detail, APPLICATION_TYPE type)
180 if (type == TRAFFIC_EMAIL)
181 return get_email_app_info(detail);
188 void* otherDetails = pstruEventDetails->szOtherDetails;
189 double ldEventTime = pstruEventDetails->dEventTime;
190 NETSIM_ID nDeviceId = pstruEventDetails->nDeviceId;
192 NetSim_PACKET* pstruPacket = pstruEventDetails->pPacket;
193 if (!pstruPacket)
return;
195 APPLICATION_TYPE nappType = pstruPacket->pstruAppData->nAppType;
198 NETSIM_ID* dest = get_dest_from_packet(pstruPacket, &destCount);
200 ptrSOCKETINTERFACE s;
201 s = fnGetSocket(pstruEventDetails->nApplicationId,
202 pstruPacket->nSourceId,
203 pstruPacket->pstruTransportData->nSourcePort,
204 pstruPacket->pstruTransportData->nDestinationPort);
207 fnNetSimError(
"Socket is NULL for application %d.\n",
208 pstruEventDetails->nApplicationId);
213 add_app_info_to_packet(pstruPacket, ldEventTime,
214 pstruEventDetails->dPacketSize, pstruEventDetails->nApplicationId);
220 ptrAPPLICATION_INFO appInfo = get_app_info(pstruEventDetails->szOtherDetails, nappType);
223 fnNetSimError(
"Application info is NULL in application out event id = %lld\n", pstruEventDetails->nEventId);
227 pstruPacket->pstruTransportData->nTransportProtocol = appInfo->trxProtocol;
230 int nSegmentCount = 0;
231 double segmentsize = fn_NetSim_Stack_GetMSS(pstruPacket);
232 print_application_generation_log(appInfo, pstruPacket);
233 nSegmentCount = fn_NetSim_Stack_FragmentPacket(pstruPacket, (
int)fn_NetSim_Stack_GetMSS(pstruPacket));
237 fn_NetSim_Add_DummyPayload(pstruPacket, appInfo);
239 appmetrics_src_add(appInfo, pstruPacket);
241 appout_send_packet(s, appInfo, pstruPacket, nDeviceId);
243 set_app_end_and_generate_next_packet(pstruPacket, otherDetails, destCount, dest);
248void init_application_generation_log()
250 if (get_protocol_log_status(
"APPLICATION_GENERATION_LOG"))
253 sprintf(s,
"%s\\%s", pszIOLogPath,
"Application_Generation_Log.csv");
254 fpGenerationLogs = fopen(s,
"w");
255 if (!fpGenerationLogs)
257 fnSystemError(
"Unable to open %s file", s);
262 fprintf(fpGenerationLogs,
"%s,%s,%s,%s,%s,%s,%s,",
263 "Time(ms)",
"Application Name",
"Application ID",
"Source",
"Destination",
"Packet ID",
"Generation Rate(Mbps)");
265 fprintf(fpGenerationLogs,
"\n");
271void print_application_generation_log(ptrAPPLICATION_INFO pstruappinfo, NetSim_PACKET* packet)
273 if (fpGenerationLogs == NULL)
275 double dPacketSize = packet->pstruAppData->dPacketSize;
276 NETSIM_ID nDestinationId = get_first_dest_from_packet(packet);
277 double generationRate = calculate_generation_rate(pstruappinfo, packet);
278 char DestinationName[BUFSIZ];
279 char Appname[BUFSIZ];
280 strcpy(Appname, pstruappinfo->name);
282 if (pstruappinfo->nAppType == TRAFFIC_EMAIL || pstruappinfo->nAppType == TRAFFIC_INTERACTIVE_GAMING || pstruappinfo->nAppType == TRAFFIC_HTTP)
284 if (get_first_dest_from_packet(packet) == pstruappinfo->sourceList[0])
286 strcat(Appname,
"_Send");
289 strcat(Appname,
"_Receive");
293 strcpy(DestinationName, DEVICE_NAME(nDestinationId));
295 strcpy(DestinationName,
"BROADCAST");
297 fprintf(fpGenerationLogs,
"%lf,%s,%d,%s,",
298 ldEventTime/MILLISECOND,Appname, pstruappinfo->nConfigId, DEVICE_NAME(packet->nSourceId));
300 fprintf(fpGenerationLogs,
"%s,%lld,%lf,",
301 DestinationName, packet->nPacketId, generationRate);
303 fprintf(fpGenerationLogs,
"\n");
306void close_application_generation_log()
308 if (fpGenerationLogs)
309 fclose(fpGenerationLogs);
312double calculate_generation_rate(ptrAPPLICATION_INFO pstruappinfo, NetSim_PACKET* packet)
315 double dPacketSize = packet->pstruAppData->dPacketSize;
317 if (get_first_dest_from_packet(packet) == pstruappinfo->sourceList[0])
319 if (pstruappinfo->dl.lastPacketTime == -1 && ldEventTime == 0)
322 pstruappinfo->dl.lastPacketTime = ldEventTime;
323 pstruappinfo->dl.lastPacketSize = dPacketSize;
325 else if (pstruappinfo->dl.lastPacketTime == -1 && ldEventTime >= 0)
327 genRate = dPacketSize * 8 / (ldEventTime);
328 pstruappinfo->dl.lastPacketTime = ldEventTime;
329 pstruappinfo->dl.lastPacketSize = dPacketSize;
332 else if (ldEventTime > pstruappinfo->dl.lastPacketTime)
334 genRate = dPacketSize * 8 / (ldEventTime - pstruappinfo->dl.lastPacketTime);
335 pstruappinfo->dl.prevLastPacketTime = pstruappinfo->dl.lastPacketTime;
336 pstruappinfo->dl.lastPacketTime = ldEventTime;
337 pstruappinfo->dl.lastPacketSize = dPacketSize;
340 else if (ldEventTime == pstruappinfo->dl.lastPacketTime && ldEventTime != 0)
342 if (pstruappinfo->dl.prevLastPacketTime == -1)
344 pstruappinfo->dl.lastPacketSize += dPacketSize;
345 genRate = pstruappinfo->dl.lastPacketSize * 8 / (ldEventTime);
349 pstruappinfo->dl.lastPacketSize += dPacketSize;
350 genRate = pstruappinfo->dl.lastPacketSize * 8 / (ldEventTime - pstruappinfo->dl.lastPacketTime);
360 if (pstruappinfo->ul.lastPacketTime == -1 && ldEventTime == 0)
363 pstruappinfo->ul.lastPacketTime = ldEventTime;
364 pstruappinfo->ul.lastPacketSize = dPacketSize;
366 else if (pstruappinfo->ul.lastPacketTime == -1 && ldEventTime >= 0)
368 genRate = dPacketSize * 8 / (ldEventTime);
369 pstruappinfo->ul.lastPacketTime = ldEventTime;
370 pstruappinfo->ul.lastPacketSize = dPacketSize;
373 else if (ldEventTime > pstruappinfo->ul.lastPacketTime)
375 genRate = dPacketSize * 8 / (ldEventTime - pstruappinfo->ul.lastPacketTime);
376 pstruappinfo->ul.prevLastPacketTime = pstruappinfo->ul.lastPacketTime;
377 pstruappinfo->ul.lastPacketTime = ldEventTime;
378 pstruappinfo->ul.lastPacketSize = dPacketSize;
381 else if (ldEventTime == pstruappinfo->ul.lastPacketTime && ldEventTime != 0 )
383 if (pstruappinfo->ul.prevLastPacketTime == -1)
385 pstruappinfo->ul.lastPacketSize += dPacketSize;
386 genRate = pstruappinfo->ul.lastPacketSize * 8 / (ldEventTime);
390 pstruappinfo->ul.lastPacketSize += dPacketSize;
391 genRate = pstruappinfo->ul.lastPacketSize * 8 / (ldEventTime - pstruappinfo->ul.prevLastPacketTime);