25#include "Application.h"
28void encryptBlock(uint8_t* data, uint32_t* len, uint32_t* key);
34_declspec(dllexport)
int fn_NetSim_Application_Init(
struct stru_NetSim_Network *NETWORK_Formal,
35 NetSim_EVENTDETAILS *pstruEventDetails_Formal,
36 char *pszAppPath_Formal,
37 char *pszWritePath_Formal,
41 init_application_generation_log();
42 init_application_log();
44 return fn_NetSim_Application_Init_F();
48_declspec(dllexport)
int fn_NetSim_Application_Configure(
void** var)
50 return fn_NetSim_Application_Configure_F(var);
58_declspec (dllexport)
int fn_NetSim_Application_Run()
60 switch(pstruEventDetails->nEventType)
62 case APPLICATION_OUT_EVENT:
65 case APPLICATION_IN_EVENT:
67 NetSim_PACKET* pstruPacket=pstruEventDetails->pPacket;
68 if(pstruPacket->nPacketType != PacketType_Control && pstruPacket->pstruAppData->nApplicationId &&
69 pstruPacket->nControlDataType/100 != PROTOCOL_APPLICATION)
71 ptrAPPLICATION_INFO pstruappinfo;
72 fnValidatePacket(pstruPacket);
73 pstruappinfo=applicationInfo[pstruPacket->pstruAppData->nApplicationId-1];
74 pstruPacket->pstruAppData->dEndTime = pstruEventDetails->dEventTime;
75 fn_NetSim_Application_Plot(pstruPacket);
76 appmetrics_dest_add(pstruappinfo, pstruPacket, pstruEventDetails->nDeviceId);
77 print_application_log(pstruappinfo, pstruPacket);
78 if(pstruappinfo->nAppType==TRAFFIC_PEER_TO_PEER && pstruPacket->pstruAppData->nAppEndFlag==1)
80 fn_NetSim_Application_P2P_MarkReceivedPacket(pstruappinfo,pstruPacket);
81 fn_NetSim_Application_P2P_SendNextPiece(pstruappinfo,get_first_dest_from_packet(pstruPacket),pstruEventDetails->dEventTime);
83 if(pstruappinfo->nAppType == TRAFFIC_EMULATION && pstruPacket->szPayload)
85 fn_NetSim_Dispatch_to_emulator(pstruPacket);
87 if (pstruappinfo->nAppType == TRAFFIC_BSM_APP)
89 process_saej2735_packet(pstruPacket);
92 fn_NetSim_Packet_FreePacket(pstruPacket);
95 else if (pstruPacket->nControlDataType == packet_COAP_REQUEST)
97 ptrAPPLICATION_INFO pstruappinfo;
98 fnValidatePacket(pstruPacket);
99 pstruappinfo = applicationInfo[pstruPacket->pstruAppData->nApplicationId - 1];
100 pstruPacket->pstruAppData->dEndTime = pstruEventDetails->dEventTime;
102 appmetrics_dest_add(pstruappinfo, pstruPacket, pstruEventDetails->nDeviceId);
103 fn_NetSim_Application_Plot(pstruPacket);
104 fn_NetSim_Application_COAP_AppIn(pstruappinfo, pstruPacket);
106 fn_NetSim_Packet_FreePacket(pstruPacket);
109 else if(pstruPacket->nControlDataType == packet_HTTP_REQUEST)
111 ptrAPPLICATION_INFO pstruappinfo;
112 fnValidatePacket(pstruPacket);
113 pstruappinfo=applicationInfo[pstruPacket->pstruAppData->nApplicationId-1];
114 pstruPacket->pstruAppData->dEndTime = pstruEventDetails->dEventTime;
115 appmetrics_dest_add(pstruappinfo, pstruPacket, pstruEventDetails->nDeviceId);
116 fn_NetSim_Application_HTTP_ProcessRequest(pstruappinfo,pstruPacket);
122 switch(pstruEventDetails->nSubEventType)
124 case event_APP_START:
126 switch(pstruEventDetails->pPacket->pstruAppData->nAppType)
128 case TRAFFIC_DATABASE:
135 case TRAFFIC_INTERACTIVE_GAMING:
138 case TRAFFIC_SENSING:
139 case TRAFFIC_BSM_APP:
140 pstruEventDetails->nEventType=APPLICATION_OUT_EVENT;
141 pstruEventDetails->nSubEventType=0;
142 fnpAddEvent(pstruEventDetails);
147 ptrAPPLICATION_INFO appInfo = (ptrAPPLICATION_INFO)pstruEventDetails->szOtherDetails;
148 APP_COAP_INFO* info = appInfo->appData;
150 pstruEventDetails->nEventType = APPLICATION_OUT_EVENT;
151 pstruEventDetails->nSubEventType = 0;
153 if (info->pCOAPData->_RETRANSMIT < info->maxRetransmit && info->pCOAPData->Response_Received == 0) {
155 fnpAddEvent(pstruEventDetails);
156 info->pCOAPData->Response_Received = 0;
157 info->pCOAPData->RequestACK_Received = 0;
158 double temp = pstruEventDetails->dEventTime;
159 fn_NetSim_Application_StartCOAPAPP(appInfo, temp);
160 info->pCOAPData->_RETRANSMIT += 1;
165 info->pCOAPData->_RETRANSMIT = 1;
166 info->pCOAPData->Response_Received = 0;
171 pstruEventDetails->szOtherDetails = appInfo;
174 case TRAFFIC_ERLANG_CALL:
176 ptrAPPLICATION_INFO appInfo=(ptrAPPLICATION_INFO)pstruEventDetails->szOtherDetails;
177 pstruEventDetails->nEventType=APPLICATION_OUT_EVENT;
178 pstruEventDetails->nSubEventType=0;
179 fnpAddEvent(pstruEventDetails);
180 pstruEventDetails->szOtherDetails=appInfo;
181 fn_NetSim_Application_ErlangCall_StartCall(pstruEventDetails);
186 fnNetSimError(
"Unknown application type %d in application_run.\n",pstruEventDetails->pPacket->pstruAppData->nAppType);
190 case event_APP_RESTART:
191 fn_NetSim_App_RestartApplication();
194 switch(applicationInfo[pstruEventDetails->nApplicationId-1]->nAppType)
196 case TRAFFIC_ERLANG_CALL:
197 fn_NetSim_Application_ErlangCall_EndCall(pstruEventDetails);
205 fnNetSimError(
"Unknown event type for Application");
214_declspec (dllexport)
char *fn_NetSim_Application_Trace(
int nSubEvent)
218 case event_APP_START:
220 case event_APP_RESTART:
221 return "APP_RESTART";
225 return "APP_UNKNOWN_SUBEVENT";
231_declspec(dllexport)
int fn_NetSim_Application_FreePacket(NetSim_PACKET* pstruPacket)
239_declspec(dllexport)
int fn_NetSim_Application_CopyPacket(NetSim_PACKET* pstruDestPacket,NetSim_PACKET* pstruSrcPacket)
246_declspec(dllexport)
int fn_NetSim_Application_Metrics(PMETRICSWRITER metricsWriter)
248 return fn_NetSim_Application_Metrics_F(metricsWriter);
254_declspec(dllexport)
char* fn_NetSim_Application_ConfigPacketTrace()
261_declspec(dllexport)
int fn_NetSim_Application_WritePacketTrace(NetSim_PACKET* pstruPacket,
char** ppszTrace)
269_declspec(dllexport)
int fn_NetSim_Application_Finish()
272 for(loop=0;loop<nApplicationCount;loop++)
274 free(applicationInfo[loop]->sourceList);
275 free(applicationInfo[loop]->destList);
276 if (applicationInfo[loop]->nAppType == TRAFFIC_VIDEO)
278 APP_VIDEO_INFO* info = applicationInfo[loop]->appData;
279 free(info->dPacketSizeArgs);
281 free((
char*)(applicationInfo[loop]->appData));
282 free_app_metrics(applicationInfo[loop]);
284 while(applicationInfo[loop]->socketInfo)
285 LIST_FREE((
void**)&applicationInfo[loop]->socketInfo, applicationInfo[loop]->socketInfo);
286 free(applicationInfo[loop]);
288 close_application_log();
289 close_application_generation_log();
290 free(applicationInfo);
294static PACKET_PRIORITY get_priority_based_on_qos(QUALITY_OF_SERVICE qos)
300 return Priority_High;
302 return Priority_Medium;
304 return Priority_Normal;
317NetSim_PACKET* fn_NetSim_Application_GeneratePacket(ptrAPPLICATION_INFO info,
318 double ldArrivalTime,
321 NETSIM_ID* nDestination,
322 unsigned long long int nPacketId,
323 APPLICATION_TYPE nAppType,
324 QUALITY_OF_SERVICE nQOS,
325 unsigned int sourcePort,
326 unsigned int destPort)
328 NetSim_PACKET* pstruPacket;
329 pstruPacket = fn_NetSim_Packet_CreatePacket(5);
330 pstruPacket->dEventTime = ldArrivalTime;
332 add_destlist_to_packet(pstruPacket, nDestination, destCount);
334 pstruPacket->nPacketId = nPacketId;
335 pstruPacket->nPacketStatus = PacketStatus_NoError;
336 pstruPacket->nPacketType = fn_NetSim_Application_GetPacketTypeBasedOnApplicationType(nAppType);
337 pstruPacket->pstruAppData->nAppType = nAppType;
338 pstruPacket->nPacketPriority = get_priority_based_on_qos(nQOS);
339 pstruPacket->nQOS = nQOS;
340 pstruPacket->nSourceId = nSourceId;
341 pstruPacket->pstruTransportData->nSourcePort = sourcePort;
342 pstruPacket->pstruTransportData->nDestinationPort = destPort;
343 pstruPacket->pstruAppData->nApplicationProtocol = PROTOCOL_APPLICATION;
345 if (NETWORK->ppstruDeviceList[nSourceId - 1]->pstruNetworkLayer && NETWORK->ppstruDeviceList[nSourceId - 1]->pstruNetworkLayer->ipVar)
348 pstruPacket->pstruNetworkData->szSourceIP = IP_COPY(fn_NetSim_Stack_GetFirstIPAddressAsId(nSourceId, 0));
351 if (info->nTransmissionType == MULTICAST)
354 pstruPacket->pstruNetworkData->szDestIP = IP_COPY(info->multicastDestIP);
356 else if (info->nTransmissionType == UNICAST)
359 pstruPacket->pstruNetworkData->szDestIP = IP_COPY(DNS_QUERY(nSourceId, nDestination[0]));
361 else if (info->nTransmissionType == BROADCAST)
364 NETSIM_IPAddress ip = pstruPacket->pstruNetworkData->szSourceIP;
366 pstruPacket->pstruNetworkData->szDestIP = STR_TO_IP(
"255.255.255.255", 4);
368 pstruPacket->pstruNetworkData->szDestIP = STR_TO_IP(
"FF00:0:0:0:0:0:0:0", 6);
372 fnNetSimError(
"Unknown transmission type %d\n", info->nTransmissionType);
376 pstruPacket->pstruNetworkData->nTTL = MAX_TTL;
383int fn_NetSim_Application_GenerateNextPacket(ptrAPPLICATION_INFO appInfo,
386 NETSIM_ID* nDestination,
389 if (appInfo->dEndTime <= time)
392 if (appInfo->nAppState != appState_Started)
395 switch (appInfo->nAppType)
401 case TRAFFIC_SENSING:
403 double arrivalTime = 0;
404 double packetSize = 0;
405 fn_NetSim_TrafficGenerator_Custom((APP_DATA_INFO*)appInfo->appData,
408 &(NETWORK->ppstruDeviceList[nSource - 1]->ulSeed[0]),
409 &(NETWORK->ppstruDeviceList[nSource - 1]->ulSeed[1]),
410 &(NETWORK->ppstruDeviceList[nSource - 1]->ulSeed[0]),
411 &(NETWORK->ppstruDeviceList[nSource - 1]->ulSeed[1]));
413 if (appInfo->dEndTime <= time + arrivalTime)
416 pstruEventDetails->dEventTime = time + arrivalTime;
417 pstruEventDetails->dPacketSize = (double)((
int)packetSize);
418 pstruEventDetails->nApplicationId = appInfo->id;
419 pstruEventDetails->nDeviceId = nSource;
420 pstruEventDetails->nDeviceType = DEVICE_TYPE(nSource);
421 pstruEventDetails->nEventType = APPLICATION_OUT_EVENT;
422 pstruEventDetails->nInterfaceId = 0;
423 pstruEventDetails->nProtocolId = PROTOCOL_APPLICATION;
424 pstruEventDetails->nSegmentId = 0;
425 pstruEventDetails->nSubEventType = 0;
426 pstruEventDetails->pPacket =
427 fn_NetSim_Application_GeneratePacket(appInfo,
428 pstruEventDetails->dEventTime,
432 ++appInfo->nPacketId,
437 pstruEventDetails->nPacketId = appInfo->nPacketId;
438 pstruEventDetails->szOtherDetails = appInfo;
439 fnpAddEvent(pstruEventDetails);
442 case TRAFFIC_DATABASE:
446 case TRAFFIC_INTERACTIVE_GAMING:
450 double arrivalTime = 0;
451 double packetSize = 0;
452 fn_NetSim_TrafficGenerator_Video((APP_VIDEO_INFO*)appInfo->appData,
455 &(NETWORK->ppstruDeviceList[nSource - 1]->ulSeed[0]),
456 &(NETWORK->ppstruDeviceList[nSource - 1]->ulSeed[1]));
457 if (appInfo->dEndTime <= time + arrivalTime)
460 pstruEventDetails->dEventTime = time + arrivalTime;
461 pstruEventDetails->dPacketSize = (double)((
int)packetSize);
462 pstruEventDetails->nApplicationId = appInfo->id;
463 pstruEventDetails->nDeviceId = nSource;
464 pstruEventDetails->nDeviceType = DEVICE_TYPE(nSource);
465 pstruEventDetails->nEventType = APPLICATION_OUT_EVENT;
466 pstruEventDetails->nInterfaceId = 0;
467 pstruEventDetails->nProtocolId = PROTOCOL_APPLICATION;
468 pstruEventDetails->nSegmentId = 0;
469 pstruEventDetails->nSubEventType = 0;
470 pstruEventDetails->pPacket =
471 fn_NetSim_Application_GeneratePacket(appInfo,
472 pstruEventDetails->dEventTime,
476 ++appInfo->nPacketId,
481 pstruEventDetails->nPacketId = appInfo->nPacketId;
482 pstruEventDetails->szOtherDetails = appInfo;
483 fnpAddEvent(pstruEventDetails);
488 double arrivalTime = 0;
489 double packetSize = 0;
490 fn_NetSim_TrafficGenerator_Voice((APP_VOICE_INFO*)appInfo->appData,
493 &(NETWORK->ppstruDeviceList[nSource - 1]->ulSeed[0]),
494 &(NETWORK->ppstruDeviceList[nSource - 1]->ulSeed[1]));
496 if (appInfo->dEndTime <= time + arrivalTime)
499 pstruEventDetails->dEventTime = time + arrivalTime;
500 pstruEventDetails->dPacketSize = (double)((
int)packetSize);
501 pstruEventDetails->nApplicationId = appInfo->id;
502 pstruEventDetails->nDeviceId = nSource;
503 pstruEventDetails->nDeviceType = DEVICE_TYPE(nSource);
504 pstruEventDetails->nEventType = APPLICATION_OUT_EVENT;
505 pstruEventDetails->nInterfaceId = 0;
506 pstruEventDetails->nProtocolId = PROTOCOL_APPLICATION;
507 pstruEventDetails->nSegmentId = 0;
508 pstruEventDetails->nSubEventType = 0;
509 pstruEventDetails->pPacket =
510 fn_NetSim_Application_GeneratePacket(appInfo,
511 pstruEventDetails->dEventTime,
515 ++appInfo->nPacketId,
520 pstruEventDetails->nPacketId = appInfo->nPacketId;
521 pstruEventDetails->szOtherDetails = appInfo;
522 fnpAddEvent(pstruEventDetails);
525 case TRAFFIC_ERLANG_CALL:
527 APP_CALL_INFO* info = (APP_CALL_INFO*)appInfo->appData;
528 NetSim_PACKET* packet = info->nextPacket[nSource - 1][nDestination[0] - 1];
529 double arrivalTime = 0;
530 double packetSize = 0;
531 if (info->nCallStatus[nSource - 1][nDestination[0] - 1] == 0 || packet == NULL)
533 pstruEventDetails->dEventTime = packet->dEventTime;
534 pstruEventDetails->dPacketSize = fnGetPacketSize(packet);
535 pstruEventDetails->nApplicationId = appInfo->id;
536 pstruEventDetails->nDeviceId = nSource;
537 pstruEventDetails->nDeviceType = DEVICE_TYPE(nSource);
538 pstruEventDetails->nEventType = APPLICATION_OUT_EVENT;
539 pstruEventDetails->nInterfaceId = 0;
540 pstruEventDetails->nProtocolId = PROTOCOL_APPLICATION;
541 pstruEventDetails->nSegmentId = 0;
542 pstruEventDetails->nSubEventType = 0;
543 pstruEventDetails->pPacket = packet;
544 pstruEventDetails->nPacketId = packet->nPacketId;
545 pstruEventDetails->szOtherDetails = appInfo;
546 if (info->nAppoutevent == NULL)
549 info->nAppoutevent = (
unsigned long long**)calloc(NETWORK->nDeviceCount,
sizeof* info->nAppoutevent);
550 for (i = 0; i < NETWORK->nDeviceCount; i++)
551 info->nAppoutevent[i] = (
unsigned long long*)calloc(NETWORK->nDeviceCount,
sizeof* info->nAppoutevent[i]);
553 info->nAppoutevent[nSource - 1][nDestination[0] - 1] = fnpAddEvent(pstruEventDetails);
555 fn_NetSim_TrafficGenerator_Voice(&(info->VoiceInfo), &packetSize, &arrivalTime,
556 &(NETWORK->ppstruDeviceList[nSource - 1]->ulSeed[0]),
557 &(NETWORK->ppstruDeviceList[nSource - 1]->ulSeed[1]));
558 if (info->dCallEndTime[nSource - 1][nDestination[0] - 1] <= time + arrivalTime)
560 info->nextPacket[nSource - 1][nDestination[0] - 1] = NULL;
561 packet->pstruAppData->nAppEndFlag = 1;
564 info->nextPacket[nSource - 1][nDestination[0] - 1] =
565 fn_NetSim_Application_GeneratePacket(appInfo,
566 pstruEventDetails->dEventTime + arrivalTime,
570 ++appInfo->nPacketId,
575 info->nextPacket[nSource - 1][nDestination[0] - 1]->pstruAppData->dPacketSize = packetSize;
576 info->nextPacket[nSource - 1][nDestination[0] - 1]->pstruAppData->dPayload = packetSize;
579 case TRAFFIC_BSM_APP:
581 double arrivalTime = 0;
582 double packetSize = 0;
583 fn_NetSim_Application_BSM((PAPP_BSM_INFO)appInfo->appData,
586 &(NETWORK->ppstruDeviceList[nSource - 1]->ulSeed[0]),
587 &(NETWORK->ppstruDeviceList[nSource - 1]->ulSeed[1]),
588 &(NETWORK->ppstruDeviceList[nSource - 1]->ulSeed[0]),
589 &(NETWORK->ppstruDeviceList[nSource - 1]->ulSeed[1]));
591 if (appInfo->dEndTime <= time + arrivalTime)
594 pstruEventDetails->dEventTime = time + arrivalTime;
595 pstruEventDetails->dPacketSize = (double)((
int)packetSize);
596 pstruEventDetails->nApplicationId = appInfo->id;
597 pstruEventDetails->nDeviceId = nSource;
598 pstruEventDetails->nDeviceType = DEVICE_TYPE(nSource);
599 pstruEventDetails->nEventType = APPLICATION_OUT_EVENT;
600 pstruEventDetails->nInterfaceId = 0;
601 pstruEventDetails->nProtocolId = PROTOCOL_APPLICATION;
602 pstruEventDetails->nSegmentId = 0;
603 pstruEventDetails->nSubEventType = 0;
604 pstruEventDetails->pPacket =
605 fn_NetSim_Application_GeneratePacket(appInfo,
606 pstruEventDetails->dEventTime,
610 ++appInfo->nPacketId,
615 pstruEventDetails->nPacketId = appInfo->nPacketId;
616 pstruEventDetails->szOtherDetails = appInfo;
617 fnpAddEvent(pstruEventDetails);
621 fnNetSimError(
"Unknown application type %d in Generate_next_packet.\n", appInfo->nAppType);
627void copy_payload(UINT8 real[],NetSim_PACKET* packet,
unsigned int* payload, ptrAPPLICATION_INFO info)
633 for (i = 0; i < *payload; i++)
635 if (info->encryption == Encryption_XOR)
636 real[i] = xor_encrypt(
'a' + i % 26, 16);
638 real[i] =
'a' + i % 26;
640 if (info->encryption == Encryption_TEA)
641 encryptBlock(real, payload, &key);
642 else if (info->encryption == Encryption_AES)
643 aes256(real,payload);
644 else if(info->encryption==Encryption_DES)
649int fn_NetSim_Add_DummyPayload(NetSim_PACKET* packet, ptrAPPLICATION_INFO info)
651 if (add_sae_j2735_payload(packet,info))
656 if(!packet->szPayload &&
657 packet->pstruAppData &&
658 packet->pstruAppData->dPacketSize &&
659 packet->pstruAppData->nAppType != TRAFFIC_EMULATION &&
662 unsigned int size=(
unsigned int)packet->pstruAppData->dPacketSize;
663 packet->szPayload = (PPACKET_INFO)calloc(1,
sizeof* packet->szPayload);
664 copy_payload(packet->szPayload->packet,packet,&size,info);
665 packet->szPayload->packet_len = size;
666 packet->pstruAppData->dPacketSize = (double)size;
668 packet=packet->pstruNextPacket;
673double get_random_startupdelay()
675 return RANDOM_STARTUP_DELAY*NETSIM_RAND_01();
680 for (
int i = 0; i < NETWORK->nApplicationCount; i++)
682 applicationInfo[i]->uplink.prevPacketLatency = -1;
683 applicationInfo[i]->downlink.prevPacketLatency = -1;
685 applicationInfo[i]->ul.lastPacketSize = -1;
686 applicationInfo[i]->ul.lastPacketTime = -1;
687 applicationInfo[i]->ul.prevLastPacketTime = -1;
688 applicationInfo[i]->dl.lastPacketSize = -1;
689 applicationInfo[i]->dl.lastPacketTime = -1;
690 applicationInfo[i]->dl.prevLastPacketTime = -1;