NetSim Source Code Help
Loading...
Searching...
No Matches
TCP.c
Go to the documentation of this file.
1/************************************************************************************
2* Copyright (C) 2022 *
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 "TCP.h"
26#include "TCP_Header.h"
27#include "TCP_enum.h"
28#include "NetSim_Plot.h"
29
31
32#pragma comment(lib,"TCP.lib")
33
34//Function prototype
37 NetSim_EVENTDETAILS* pevent,
38 char* appPath,
39 char* iopath,
40 int version,
41 void** fnPointer);
43 NetSim_PACKET* src);
47char* fn_NetSim_TCP_ConfigPacketTrace_F(const void* xmlNetSimNode);
48int fn_NetSim_TCP_WritePacketTrace_F(NetSim_PACKET* pstruPacket, char** ppszTrace);
49
52static int fn_NetSim_TCP_HandleTimer();
53static void handle_time_wait_timeout();
54
55/**
56This function is called by NetworkStack.dll, whenever the event gets triggered
57inside the NetworkStack.dll for the Transport layer TCP protocol
58It includes TRANSPORT_OUT,TRANSPORT_IN and TIMER_EVENT.
59*/
61{
63 {
66 break;
69 break;
70 case TIMER_EVENT:
72 break;
73 default:
74 fnNetSimError("Unknown event %d for TCP protocol in %s\n",
76 __FUNCTION__);
77 return -1;
78 }
79}
80
81/**
82This function is called by NetworkStack.dll, while configuring the device
83TRANSPORT layer for TCP protocol.
84*/
85_declspec(dllexport) int fn_NetSim_TCP_Configure(void** var)
86{
87 return fn_NetSim_TCP_Configure_F(var);
88}
89
90/**
91This function initializes the TCP parameters.
92*/
93_declspec (dllexport) int fn_NetSim_TCP_Init(struct stru_NetSim_Network *NETWORK_Formal,
97 int nVersion_Type,
98 void **fnPointer)
99{
100 return fn_NetSim_TCP_Init_F(NETWORK_Formal,
105 fnPointer);
106}
107
108/**
109This function is called by NetworkStack.dll, once simulation end to free the
110allocated memory for the network.
111*/
113{
114 return fn_NetSim_TCP_Finish_F();
115}
116
117/**
118This function is called by NetworkStack.dll, while writing the event trace
119to get the sub event as a string.
120*/
121_declspec (dllexport) char *fn_NetSim_TCP_Trace(int nSubEvent)
122{
123 return (GetStringTCP_Subevent(nSubEvent));
124}
125
126/**
127This function is called by NetworkStack.dll, to free the TCP protocol
128pstruTransportData->Packet_TransportProtocol.
129*/
131{
132 return fn_NetSim_TCP_FreePacket_F(pstruPacket);
133}
134
135/**
136This function is called by NetworkStack.dll, to copy the TCP protocol
137pstruTransportData->Packet_TransportProtocol from source packet to destination.
138*/
139_declspec(dllexport) int fn_NetSim_TCP_CopyPacket(NetSim_PACKET* pstruDestPacket, NetSim_PACKET* pstruSrcPacket)
140{
141 return fn_NetSim_TCP_CopyPacket_F(pstruDestPacket, pstruSrcPacket);
142}
143
144/**
145This function write the Metrics in Metrics.txt
146*/
147_declspec(dllexport) int fn_NetSim_TCP_Metrics(PMETRICSWRITER metricsWriter)
148{
149 return fn_NetSim_TCP_Metrics_F(metricsWriter);
150}
151
152/**
153This function will return the string to write packet trace heading.
154*/
155_declspec(dllexport) char* fn_NetSim_TCP_ConfigPacketTrace(const void* xmlNetSimNode)
156{
157 return fn_NetSim_TCP_ConfigPacketTrace_F(xmlNetSimNode);
158}
159
160/**
161This function will return the string to write packet trace.
162*/
163_declspec(dllexport) int fn_NetSim_TCP_WritePacketTrace(NetSim_PACKET* pstruPacket, char** ppszTrace)
164{
165 return fn_NetSim_TCP_WritePacketTrace_F(pstruPacket, ppszTrace);
166}
167
169{
171 {
172 case 0:
174 break;
175 default:
176 fnNetSimError("Unknown sub-event %d for TCP in %s",
178 __FUNCTION__);
179 return -1;
180 }
181}
182
184{
186 {
187 case 0:
189 break;
190 default:
191 fnNetSimError("Unknown sub-event %d for TCP transport in event\n",
193 break;
194 }
195 return 0;
196}
197
199{
201 {
202 case TCP_RTO_TIMEOUT:
204 break;
205 case TCP_TIME_WAIT_TIMEOUT:
207 break;
208 default:
209 fnNetSimError("Unknown sub-event %d in %s\n",
211 __FUNCTION__);
212 break;
213 }
214 return 0;
215}
216
218{
219 if (!_stricmp(szVal, "OLD_TAHOE"))
220 return TCPVariant_OLDTAHOE;
221 if (!_stricmp(szVal, "TAHOE"))
222 return TCPVariant_TAHOE;
223 if (!_stricmp(szVal, "RENO"))
224 return TCPVariant_RENO;
225 if (!_stricmp(szVal, "NEW_RENO"))
226 return TCPVariant_NEWRENO;
227 if (!_stricmp(szVal, "BIC"))
228 return TCPVariant_BIC;
229 if (!_stricmp(szVal, "CUBIC"))
230 return TCPVariant_CUBIC;
231 else
232 fnNetSimError("Unknown TCP Variant %s\n",szVal);
233 return TCPVariant_TAHOE;
234}
235
237{
238 if (!_stricmp(szVal, "Delayed"))
239 return TCPACKTYPE_DELAYED;
240 if (!_stricmp(szVal, "Undelayed"))
242 fnNetSimError("Unknown TCP ack type %s\n", szVal);
244}
245
247{
248 NetSim_EVENTDETAILS pevent;
249 memcpy(&pevent, pstruEventDetails, sizeof pevent);
250 pevent.dEventTime += s->tcb->timeWaitTimer;
251 pevent.dPacketSize = 0;
252 pevent.nEventType = TIMER_EVENT;
253 pevent.nPacketId = 0;
255 pevent.nSegmentId = 0;
256 pevent.nSubEventType = TCP_TIME_WAIT_TIMEOUT;
257 pevent.pPacket = NULL;
258 pevent.szOtherDetails = s;
259 fnpAddEvent(&pevent);
260
261 print_tcp_log("Adding Time-wait_timer at %0.2lf",
262 pevent.dEventTime);
263 print_tcp_log("Canceling all other timer.");
264
265 s->tcb->isOtherTimerCancel = true;
266}
267
269{
272 delete_tcb(s);
274}
275
277{
279 {
280 UINT win = get_cwnd_print(s);
284
288 win);
289 s->tcpMetrics->prevWindowSize = win;
290 }
291}
293{
294 return false;
295 //return true;
296}
unsigned int NETSIM_ID
Definition: Animation.h:45
UINT32 get_cwnd_print(PNETSIM_SOCKET s)
Definition: Congestion.c:200
static int packet_arrive_from_network_layer()
Definition: Ethernet_Mac.c:76
#define _stricmp
Definition: Linux.h:127
#define UINT
Definition: Linux.h:38
#define _declspec(dllexport)
This function is used to trigger the update.
Definition: Linux.h:41
#define fnNetSimError(x,...)
Definition: Linux.h:56
void * PMETRICSWRITER
Definition: MetricsWriter.h:27
void add_plot_data_formatted(PNETSIMPLOT g, char *format,...)
NetSim_EVENTDETAILS * pstruEventDetails_Formal
Definition: RIP.h:178
NetSim_EVENTDETAILS char * pszAppPath_Formal
Definition: RIP.h:178
NetSim_EVENTDETAILS char char int nVersion_Type
Definition: RIP.h:178
NetSim_EVENTDETAILS char char * pszWritePath_Formal
Definition: RIP.h:178
NetSim_EVENTDETAILS char char int void ** fnPointer
Definition: RIP.h:178
void handle_rto_timer()
Definition: RTO.c:101
@ TX_PROTOCOL_TCP
Definition: Stack.h:180
@ TIMER_EVENT
Definition: Stack.h:114
@ TRANSPORT_IN_EVENT
Definition: Stack.h:111
@ TRANSPORT_OUT_EVENT
Definition: Stack.h:110
EXPORTED struct stru_NetSim_EventDetails * pstruEventDetails
Definition: Stack.h:837
void tcp_change_state(PNETSIM_SOCKET s, TCP_CONNECTION_STATE state)
Definition: TCB.c:138
void delete_tcb(PNETSIM_SOCKET s)
Definition: TCB.c:132
char * fn_NetSim_TCP_ConfigPacketTrace(const void *xmlNetSimNode)
Definition: TCP.c:155
int fn_NetSim_TCP_CopyPacket(NetSim_PACKET *pstruDestPacket, NetSim_PACKET *pstruSrcPacket)
Definition: TCP.c:139
TCPVARIANT get_tcp_variant_from_str(char *szVal)
Definition: TCP.c:217
int fn_NetSim_TCP_FreePacket_F(NetSim_PACKET *packet)
int fn_NetSim_TCP_WritePacketTrace(NetSim_PACKET *pstruPacket, char **ppszTrace)
Definition: TCP.c:163
static void handle_time_wait_timeout()
Definition: TCP.c:268
int fn_NetSim_TCP_WritePacketTrace_F(NetSim_PACKET *pstruPacket, char **ppszTrace)
static int fn_NetSim_TCP_HandleTimer()
Definition: TCP.c:198
char * fn_NetSim_TCP_Trace(int nSubEvent)
Definition: TCP.c:121
TCPACKTYPE get_tcp_ack_type_from_str(char *szVal)
Definition: TCP.c:236
bool isTCPlog()
Definition: TCP.c:292
void start_timewait_timer(PNETSIM_SOCKET s)
Definition: TCP.c:246
int fn_NetSim_TCP_Metrics(PMETRICSWRITER metricsWriter)
Definition: TCP.c:147
int fn_NetSim_TCP_CopyPacket_F(NetSim_PACKET *dst, NetSim_PACKET *src)
int fn_NetSim_TCP_Metrics_F(PMETRICSWRITER metricsWriter)
int fn_NetSim_TCP_Configure(void **var)
Definition: TCP.c:85
void write_congestion_plot(PNETSIM_SOCKET s, NetSim_PACKET *packet)
Definition: TCP.c:276
char * GetStringTCP_Subevent(NETSIM_ID)
static int fn_NetSim_TCP_HandleTransportIn()
Definition: TCP.c:183
int fn_NetSim_TCP_Init(struct stru_NetSim_Network *NETWORK_Formal, NetSim_EVENTDETAILS *pstruEventDetails_Formal, char *pszAppPath_Formal, char *pszWritePath_Formal, int nVersion_Type, void **fnPointer)
Definition: TCP.c:93
char * fn_NetSim_TCP_ConfigPacketTrace_F(const void *xmlNetSimNode)
int fn_NetSim_TCP_Run()
Definition: TCP.c:60
int fn_NetSim_TCP_Finish_F()
int fn_NetSim_TCP_FreePacket(NetSim_PACKET *pstruPacket)
Definition: TCP.c:130
int fn_NetSim_TCP_Init_F(struct stru_NetSim_Network *net, NetSim_EVENTDETAILS *pevent, char *appPath, char *iopath, int version, void **fnPointer)
int fn_NetSim_TCP_Configure_F(void **var)
int fn_NetSim_TCP_Finish()
Definition: TCP.c:112
static int fn_NetSim_TCP_HandleTransportOut()
Definition: TCP.c:168
@ TCPCONNECTION_CLOSED
Definition: TCP.h:58
void print_tcp_log(char *format,...)
enum enum_tcp_variant TCPVARIANT
int packet_arrive_from_application_layer()
@ TCPACKTYPE_DELAYED
Definition: TCP.h:84
@ TCPACKTYPE_UNDELAYED
Definition: TCP.h:83
enum enum_tcp_ack_type TCPACKTYPE
@ TCPVariant_CUBIC
Definition: TCP.h:78
@ TCPVariant_OLDTAHOE
Definition: TCP.h:73
@ TCPVariant_RENO
Definition: TCP.h:75
@ TCPVariant_BIC
Definition: TCP.h:77
@ TCPVariant_TAHOE
Definition: TCP.h:74
@ TCPVariant_NEWRENO
Definition: TCP.h:76
void tcp_close_socket(PNETSIM_SOCKET s, NETSIM_ID devId)
Definition: TCP_Socket.c:187
#define fnpAddEvent(pstruEvent)
Definition: main.h:191
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 nSubEventType
Definition: Stack.h:757
NETSIM_ID nDeviceId
Definition: Stack.h:750
long long int nPacketId
Definition: Stack.h:755
struct stru_NetSim_Packet_TransportLayer * pstruTransportData
Definition: Packet.h:274
PTCB tcb
Definition: TCP.h:132
PTCP_METRICS tcpMetrics
Definition: TCP.h:140
UINT prevWindowSize
Definition: TCP.h:108
void * congestionPlot
Definition: TCP.h:107