26#include "TCP_Header.h"
28#include "NetSim_Plot.h"
29#include "NetSim_utility.h"
30#include "../Application/Application.h"
32char* GetStringTCP_Subevent(NETSIM_ID);
33static FILE* fpTCP_CWlog = NULL;
35#pragma comment(lib,"TCP.lib")
38int fn_NetSim_TCP_Configure_F(
void **var);
40 NetSim_EVENTDETAILS* pevent,
45int fn_NetSim_TCP_CopyPacket_F(NetSim_PACKET* dst,
47int fn_NetSim_TCP_FreePacket_F(NetSim_PACKET* packet);
48int fn_NetSim_TCP_Finish_F();
49int fn_NetSim_TCP_Metrics_F(PMETRICSWRITER metricsWriter);
50char* fn_NetSim_TCP_ConfigPacketTrace_F(
const void* xmlNetSimNode);
51int fn_NetSim_TCP_WritePacketTrace_F(NetSim_PACKET* pstruPacket,
char** ppszTrace);
53static int fn_NetSim_TCP_HandleTransportOut();
54static int fn_NetSim_TCP_HandleTransportIn();
55static int fn_NetSim_TCP_HandleTimer();
56static void handle_time_wait_timeout();
63_declspec (dllexport)
int fn_NetSim_TCP_Run()
65 switch (pstruEventDetails->nEventType)
67 case TRANSPORT_OUT_EVENT:
68 return fn_NetSim_TCP_HandleTransportOut();
70 case TRANSPORT_IN_EVENT:
71 return fn_NetSim_TCP_HandleTransportIn();
74 return fn_NetSim_TCP_HandleTimer();
77 fnNetSimError(
"Unknown event %d for TCP protocol in %s\n",
78 pstruEventDetails->nEventType,
88_declspec(dllexport)
int fn_NetSim_TCP_Configure(
void** var)
90 return fn_NetSim_TCP_Configure_F(var);
97 NetSim_EVENTDETAILS *pstruEventDetails_Formal,
98 char *pszAppPath_Formal,
99 char *pszWritePath_Formal,
103 init_TCP_congestion_log();
104 return fn_NetSim_TCP_Init_F(NETWORK_Formal,
105 pstruEventDetails_Formal,
116_declspec(dllexport)
int fn_NetSim_TCP_Finish()
118 close_TCP_congestion_log();
119 return fn_NetSim_TCP_Finish_F();
126_declspec (dllexport)
char *fn_NetSim_TCP_Trace(
int nSubEvent)
128 return (GetStringTCP_Subevent(nSubEvent));
135_declspec(dllexport)
int fn_NetSim_TCP_FreePacket(NetSim_PACKET* pstruPacket)
137 return fn_NetSim_TCP_FreePacket_F(pstruPacket);
144_declspec(dllexport)
int fn_NetSim_TCP_CopyPacket(NetSim_PACKET* pstruDestPacket, NetSim_PACKET* pstruSrcPacket)
146 return fn_NetSim_TCP_CopyPacket_F(pstruDestPacket, pstruSrcPacket);
152_declspec(dllexport)
int fn_NetSim_TCP_Metrics(PMETRICSWRITER metricsWriter)
154 return fn_NetSim_TCP_Metrics_F(metricsWriter);
160_declspec(dllexport)
char* fn_NetSim_TCP_ConfigPacketTrace(
const void* xmlNetSimNode)
162 return fn_NetSim_TCP_ConfigPacketTrace_F(xmlNetSimNode);
168_declspec(dllexport)
int fn_NetSim_TCP_WritePacketTrace(NetSim_PACKET* pstruPacket,
char** ppszTrace)
170 return fn_NetSim_TCP_WritePacketTrace_F(pstruPacket, ppszTrace);
173static int fn_NetSim_TCP_HandleTransportOut()
175 switch (pstruEventDetails->nSubEventType)
178 return packet_arrive_from_application_layer();
181 fnNetSimError(
"Unknown sub-event %d for TCP in %s",
182 pstruEventDetails->nSubEventType,
188static int fn_NetSim_TCP_HandleTransportIn()
190 switch (pstruEventDetails->nSubEventType)
193 packet_arrive_from_network_layer();
196 fnNetSimError(
"Unknown sub-event %d for TCP transport in event\n",
197 pstruEventDetails->nSubEventType);
203static int fn_NetSim_TCP_HandleTimer()
205 switch (pstruEventDetails->nSubEventType)
207 case TCP_RTO_TIMEOUT:
210 case TCP_TIME_WAIT_TIMEOUT:
211 handle_time_wait_timeout();
214 fnNetSimError(
"Unknown sub-event %d in %s\n",
215 pstruEventDetails->nSubEventType,
222TCPVARIANT get_tcp_variant_from_str(
char* szVal)
224 if (!_stricmp(szVal,
"OLD_TAHOE"))
225 return TCPVariant_OLDTAHOE;
226 if (!_stricmp(szVal,
"TAHOE"))
227 return TCPVariant_TAHOE;
228 if (!_stricmp(szVal,
"RENO"))
229 return TCPVariant_RENO;
230 if (!_stricmp(szVal,
"NEW_RENO"))
231 return TCPVariant_NEWRENO;
232 if (!_stricmp(szVal,
"BIC"))
233 return TCPVariant_BIC;
234 if (!_stricmp(szVal,
"CUBIC"))
235 return TCPVariant_CUBIC;
237 fnNetSimError(
"Unknown TCP Variant %s\n",szVal);
238 return TCPVariant_TAHOE;
241TCPACKTYPE get_tcp_ack_type_from_str(
char* szVal)
243 if (!_stricmp(szVal,
"Delayed"))
244 return TCPACKTYPE_DELAYED;
245 if (!_stricmp(szVal,
"Undelayed"))
246 return TCPACKTYPE_UNDELAYED;
247 fnNetSimError(
"Unknown TCP ack type %s\n", szVal);
248 return TCPACKTYPE_UNDELAYED;
251void start_timewait_timer(PNETSIM_SOCKET s)
253 NetSim_EVENTDETAILS pevent;
254 memcpy(&pevent, pstruEventDetails,
sizeof pevent);
255 pevent.dEventTime += s->tcb->timeWaitTimer;
256 pevent.dPacketSize = 0;
257 pevent.nEventType = TIMER_EVENT;
258 pevent.nPacketId = 0;
259 pevent.nProtocolId = TX_PROTOCOL_TCP;
260 pevent.nSegmentId = 0;
261 pevent.nSubEventType = TCP_TIME_WAIT_TIMEOUT;
262 pevent.pPacket = NULL;
263 pevent.szOtherDetails = s;
264 fnpAddEvent(&pevent);
266 print_tcp_log(
"Adding Time-wait_timer at %0.2lf",
268 print_tcp_log(
"Canceling all other timer.");
270 s->tcb->isOtherTimerCancel =
true;
273static void handle_time_wait_timeout()
275 PNETSIM_SOCKET s = pstruEventDetails->szOtherDetails;
276 tcp_change_state(s, TCPCONNECTION_CLOSED);
278 tcp_close_socket(s, pstruEventDetails->nDeviceId);
282void init_TCP_congestion_log()
284 if (get_protocol_log_status(
"TCP_Congestion_Log"))
287 sprintf(s,
"%s\\%s", pszIOLogPath,
"TCP_Congestion_Window_Log.csv");
288 fpTCP_CWlog = fopen(s,
"w");
291 fnSystemError(
"Unable to open %s file", s);
296 fprintf(fpTCP_CWlog,
"%s,%s,%s,%s,%s,%s,%s,",
297 "Time (Microseconds)",
"Application ID",
"Application Name",
"Source Device Name",
"Source ID",
"Destination Device Name",
"Destination ID");
299 fprintf(fpTCP_CWlog,
"%s,%s,%s,",
300 "Source Socket Address",
"Destination Socket Address",
"Sender Window Size(Bytes)");
302 fprintf(fpTCP_CWlog,
"\n");
303 if (nDbgFlag) fflush(fpTCP_CWlog);
308void write_congestion_plot(PNETSIM_SOCKET s, NetSim_PACKET* packet)
310 UINT win = get_cwnd_print(s);
312 if (fpTCP_CWlog == NULL || !packet->nPacketId)
return;
314 ptrAPPLICATION_INFO pstruappinfo = ((ptrAPPLICATION_INFO*)NETWORK->appInfo)[packet->pstruAppData->nApplicationId - 1];
316 fprintf(fpTCP_CWlog,
"%lf,%d,%s,%s,%d,%s,%d,", pstruEventDetails->dEventTime,pstruappinfo->id,pstruappinfo->name,
317 DEVICE_NAME(s->localDeviceId),s->localDeviceId,DEVICE_NAME(s->remoteDeviceId),s->remoteDeviceId);
319 fprintf(fpTCP_CWlog,
"%s,%s,%d,", s->tcpMetrics->localAddr, s->tcpMetrics->remoteAddr,s->tcpMetrics->prevWindowSize);
321 fprintf(fpTCP_CWlog,
"\n");
323 fprintf(fpTCP_CWlog,
"%lf,%d,%s,%s,%d,%s,%d,", pstruEventDetails->dEventTime, pstruappinfo->id, pstruappinfo->name,
324 DEVICE_NAME(s->localDeviceId), s->localDeviceId, DEVICE_NAME(s->remoteDeviceId), s->remoteDeviceId);
326 fprintf(fpTCP_CWlog,
"%s,%s,%d,", s->tcpMetrics->localAddr, s->tcpMetrics->remoteAddr, win);
328 fprintf(fpTCP_CWlog,
"\n");
330 s->tcpMetrics->prevWindowSize = win;
334void close_TCP_congestion_log()
342 if (get_protocol_log_status(
"TCP_LOG"))
348bool get_protocol_log_status(
char* logname)
354 sprintf(str,
"%s/%s", pszIOPath,
"ProtocolLogsConfig.txt");
355 fp = fopen(str,
"r");
359 sprintf(str,
"%s=true", logname);
361 while (fgets(data, BUFSIZ, fp))
364 if (!_strnicmp(data, str, strlen(str)))