NetSim Source Code Help
Loading...
Searching...
No Matches
TCP.h
Go to the documentation of this file.
1/************************************************************************************
2* Copyright (C) 2020 *
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* Author: Shashi Kant Suman *
12* *
13* ---------------------------------------------------------------------------------*/
14
15#ifndef _NETSIM_TCP_H_
16#define _NETSIM_TCP_H_
17#ifdef __cplusplus
18extern "C" {
19#endif
20
21 /* RFC List
22 * RFC 793 : TRANSMISSION CONTROL PROTOCOL
23 * RFC 1122 : Requirements for Internet Hosts -- Communication Layers
24 * RFC 5681 : TCP Congestion Control
25 * RFC 3390 : Increasing TCP's Initial Window
26 * RFC 6298 : Computing TCP's Retransmission Timer
27 * RFC 2018 : TCP Selective Acknowledgment Options
28 * RFC 6582 : The NewReno Modification to TCP's Fast Recovery Algorithm
29 * RFC 6675 : A Conservative Loss Recovery Algorithm Based on Selective Acknowledgment (SACK) for TCP
30 * RFC 7323 : TCP Extensions for High Performance
31 * RFC 8312 : CUBIC for Fast Long-Distance Network
32 * https://ieeexplore.ieee.org/document/1354672
33 * https://research.csc.ncsu.edu/netsrv/sites/default/files/hystart_techreport_2008.pdf
34 */
35
36//#define _TEST_TCP_ //Enable to test the TCP
37#ifdef _TEST_TCP_
38 static double dropProbability = 0.5;
39 static bool burstDrop = true;
40 static int burstDropSize = 10;
41 static bool isAckDrop = true;
42#endif
43
44#pragma comment (lib,"NetworkStack.lib")
45
46 //USEFUL MACRO
47#define isTCPConfigured(d) (DEVICE_TRXLayer(d) && DEVICE_TRXLayer(d)->isTCP)
48#define isTCPControl(p) (p->nControlDataType/100 == TX_PROTOCOL_TCP)
49
50 //Constant
51#define TCP_DupThresh 3
52
53 //Typedef
55
56 typedef enum enum_tcpstate
57 {
70
71 typedef enum enum_tcp_variant
72 {
73 TCPVariant_OLDTAHOE, //Slow Start and Congestion Avoidance
74 TCPVariant_TAHOE, //Fast Retransmit/Fast Recovery
80
81 typedef enum enum_tcp_ack_type
82 {
86
87#include "TCB.h"
88
89 typedef struct stru_tcp_metrics
90 {
91 char* source;
92 char* dest;
93 char* localAddr;
106
111
112 typedef struct stru_socket_addr
113 {
117
119 {
123
124 //For simulation
131
132 PTCB tcb; //Transmission control block
133
134 /* Callback function. This is required only for simulator
135 * As all TCP connection is under same system process so
136 * no lock function.
137 */
139
141 };
142
143 typedef struct stru_TCP_device_var
144 {
158
159 double beta;
168 {
169 if (isTCPConfigured(d))
170 return DEVICE_TRXLayer(d)->TCPVar;
171 else return NULL;
172 }
173#define GET_TCP_VARIANT(d) (GET_TCP_DEV_VAR(d)->tcpVariant)
174
175 //Function Prototype
176 //Socket
179 NETSIM_IPAddress srcIP,
180 NETSIM_IPAddress destIP,
181 UINT16 srcPort,
182 UINT16 destPort);
188 void(*listen_callback)(PNETSIM_SOCKET, NetSim_PACKET*));
190 PSOCKETADDRESS localAddr,
191 PSOCKETADDRESS remoteAddr);
193 NetSim_PACKET* p);
194 void close_all_socket(NETSIM_ID devId);
197
198 //Connection
201
202 //RTO
203 double get_RTT(PTCB tcb, UINT ackNo);
204 double calculate_RTO(double R,
205 double* srtt,
206 double* rtt_var);
208 NetSim_PACKET* packet);
209 void handle_rto_timer();
211
212 //Time wait Timer
214
215 //TCP Queue
216 bool isSegmentInQueue(PTCP_QUEUE queue, NetSim_PACKET* packet);
217 void add_packet_to_queue(PTCP_QUEUE queue, NetSim_PACKET* packet, double time);
219 NetSim_PACKET* get_copy_segment_from_queue(PTCP_QUEUE queue, UINT32 seqNo, bool* isSacked);
226
227 //TCP Control
228 //RST
230 //Syn
231 bool isSynPacket(NetSim_PACKET* packet);
232 bool isSynbitSet(NetSim_PACKET* packet);
234 double time);
237
238 //Syn-Ack
240 double time);
241
242 //Ack
244 double time,
245 UINT32 seqno,
246 UINT32 ackno);
247 void send_ack(PNETSIM_SOCKET s, double time, UINT32 seqNo, UINT32 ackNo);
248
249 //FIN
251 double time);
252 void send_fin(PNETSIM_SOCKET s);
253
254 //FIN-Ack
255 void send_fin_ack(PNETSIM_SOCKET s, double time, UINT32 seqNo, UINT32 ackNo);
256
257 //Rst
259 double time,
260 UINT c);
261
262 //Segment
265
266 //Segment Processing
271
272 //TCP Outgoing
276
277 //TCP Incoming
279 NetSim_PACKET* p);
280
281 //TCB
284 void free_tcb(PTCB tcb);
286
287 //Congestion Algo
290
291 //Delayed Ack
294
295 //SACK
297 void set_highRxt(PNETSIM_SOCKET s, UINT32 seq);
301 bool tcp_sack_isLost(PNETSIM_SOCKET s, UINT seqNum);
302
303 //Window scaling
308
309 //UTILITY Function
310 void print_tcp_log(char* format, ...);
317
318 //App Layer interface
319 void tcp_init(NETSIM_ID d);
323
324 //Network layer interface
327
328
329#ifdef __cplusplus
330}
331#endif
332#endif //_NETSIM_TCP_H_
unsigned int NETSIM_ID
Definition: Animation.h:45
#define c
#define UINT
Definition: Linux.h:38
#define UINT32
Definition: Linux.h:35
#define UINT16
Definition: Linux.h:33
#define UINT8
Definition: Linux.h:31
#define DEVICE_TRXLayer(DeviceId)
Definition: Stack.h:784
bool isAnySegmentInQueue(PTCP_QUEUE queue)
Definition: TCB.c:348
NetSim_PACKET * create_ack(PNETSIM_SOCKET s, double time, UINT32 seqno, UINT32 ackno)
Definition: TCP_Packet.c:297
void update_seq_num_on_receiving(PNETSIM_SOCKET s, NetSim_PACKET *p)
Definition: TCB.c:358
void send_to_network(NetSim_PACKET *packet, PNETSIM_SOCKET s)
void create_TCB(PNETSIM_SOCKET s)
Definition: TCB.c:90
void resend_syn(PNETSIM_SOCKET s)
void set_ack_type(PNETSIM_SOCKET s, PTCP_DEV_VAR tcp)
Definition: DelayedAck.c:17
bool tcp_sack_lossRecoveryPhase(PNETSIM_SOCKET s)
Definition: SACK.c:321
void delete_all_segment_from_queue(PTCP_QUEUE queue)
Definition: TCB.c:353
NetSim_PACKET * GET_PACKET_FROM_APP(bool isRemove)
struct stru_TCP_device_var * PTCP_DEV_VAR
void tcp_change_state(PNETSIM_SOCKET s, TCP_CONNECTION_STATE state)
Definition: TCB.c:138
void tcp_close(PNETSIM_SOCKET s)
Definition: TCP_Socket.c:286
void send_ack(PNETSIM_SOCKET s, double time, UINT32 seqNo, UINT32 ackNo)
void send_rst(PNETSIM_SOCKET s, NetSim_PACKET *p, UINT c)
PNETSIM_SOCKET tcp_accept(PNETSIM_SOCKET s, NetSim_PACKET *p)
Definition: TCP_Socket.c:231
void send_to_application(PNETSIM_SOCKET s, NetSim_PACKET *p)
void add_to_socket_list(NETSIM_ID devId, PNETSIM_SOCKET s)
Definition: TCP_Socket.c:94
void free_tcb(PTCB tcb)
Definition: TCB.c:126
TCPVARIANT get_tcp_variant_from_str(char *szVal)
Definition: TCP.c:217
NetSim_PACKET * check_for_other_segment_to_send_from_queue(PNETSIM_SOCKET s)
Definition: TCB.c:388
void rcv_SYN(PNETSIM_SOCKET s, NetSim_PACKET *syn)
UINT32 get_highAck(PNETSIM_SOCKET s)
Definition: SACK.c:23
void set_window_scaling_option(PNETSIM_SOCKET s, PTCP_DEV_VAR tcp)
Definition: WindowScale.c:40
struct stru_tcp_metrics * PTCP_METRICS
static PTCP_DEV_VAR GET_TCP_DEV_VAR(NETSIM_ID d)
Definition: TCP.h:167
void packet_arrive_from_network_layer()
NetSim_PACKET * create_synAck(PNETSIM_SOCKET s, double time)
Definition: TCP_Packet.c:223
bool isSegmentInQueue(PTCP_QUEUE queue, NetSim_PACKET *packet)
Definition: TCB.c:214
void delete_segment_from_queue(PTCP_QUEUE queue, UINT32 ackNo)
Definition: TCB.c:316
void tcp_connect(PNETSIM_SOCKET s, PSOCKETADDRESS localAddr, PSOCKETADDRESS remoteAddr)
Definition: TCP_Socket.c:206
void tcp_sack_fastRetransmit(PNETSIM_SOCKET s)
Definition: SACK.c:312
PNETSIM_SOCKET find_socket(NETSIM_ID devId, NETSIM_IPAddress srcIP, NETSIM_IPAddress destIP, UINT16 srcPort, UINT16 destPort)
Definition: TCP_Socket.c:117
NetSim_PACKET * get_copy_segment_from_queue(PTCP_QUEUE queue, UINT32 seqNo, bool *isSacked)
Definition: TCB.c:285
struct stru_socket_addr SOCKETADDRESS
NetSim_PACKET * create_rst(NetSim_PACKET *p, double time, UINT c)
Definition: TCP_Packet.c:254
void tcp_active_open(PNETSIM_SOCKET s)
NetSim_PACKET * get_earliest_segment_from_queue(PTCP_QUEUE queue)
Definition: TCB.c:258
void check_segment_in_queue(PNETSIM_SOCKET s)
Definition: TCB.c:410
void send_fin(PNETSIM_SOCKET s)
UINT16 window_scale_get_wnd(PNETSIM_SOCKET s)
Definition: WindowScale.c:63
enum_tcpstate
Definition: TCP.h:57
@ TCPCONNECTION_LAST_ACK
Definition: TCP.h:67
@ TCPCONNECTION_FIN_WAIT_2
Definition: TCP.h:64
@ TCPCONNECTION_LISTEN
Definition: TCP.h:59
@ TCPCONNECTION_CLOSED
Definition: TCP.h:58
@ TCPCONNECTION_SYN_RECEIVED
Definition: TCP.h:61
@ TCPCONNECTION_TIME_WAIT
Definition: TCP.h:68
@ TCPCONNECTION_CLOSING
Definition: TCP.h:66
@ TCPCONNECTION_CLOSE_WAIT
Definition: TCP.h:65
@ TCPCONNECTION_FIN_WAIT_1
Definition: TCP.h:63
@ TCPCONNECTION_SYN_SENT
Definition: TCP.h:60
@ TCPCONNECTION_ESTABLISHED
Definition: TCP.h:62
TCPACKTYPE get_tcp_ack_type_from_str(char *szVal)
Definition: TCP.c:236
struct stru_TCP_Socket * PNETSIM_SOCKET
Definition: TCP.h:54
void start_timewait_timer(PNETSIM_SOCKET s)
Definition: TCP.c:246
void print_tcp_log(char *format,...)
double calculate_RTO(double R, double *srtt, double *rtt_var)
Definition: RTO.c:35
void packet_arrives_at_synsent_state(PNETSIM_SOCKET s, NetSim_PACKET *p)
#define isTCPConfigured(d)
Definition: TCP.h:47
void set_rescueRxt(PNETSIM_SOCKET s, UINT32 seq)
Definition: SACK.c:48
UINT8 get_shift_count(PNETSIM_SOCKET s)
Definition: WindowScale.c:35
UINT32 window_scale_get_cwnd(PNETSIM_SOCKET s)
Definition: WindowScale.c:50
struct stru_TCP_device_var TCP_DEV_VAR
NetSim_PACKET * get_earliest_copy_segment_from_queue(PTCP_QUEUE queue)
Definition: TCB.c:273
PNETSIM_SOCKET find_socket_at_dest(NetSim_PACKET *packet)
Definition: TCP_Socket.c:164
bool isSynbitSet(NetSim_PACKET *packet)
Definition: TCP_Packet.c:38
void resend_segment_without_timeout(PNETSIM_SOCKET s, UINT seq)
Definition: TCP_Outgoing.c:79
enum enum_tcp_variant TCPVARIANT
void send_segment(PNETSIM_SOCKET s)
Definition: TCP_Outgoing.c:18
void packet_arrive_at_closed_state(PNETSIM_SOCKET s, NetSim_PACKET *p)
void add_tcp_hdr(NetSim_PACKET *p, PNETSIM_SOCKET s)
Definition: TCP_Packet.c:341
bool isSynPacket(NetSim_PACKET *packet)
Definition: TCP_Packet.c:28
int packet_arrive_from_application_layer()
UINT32 get_seg_len(NetSim_PACKET *p)
Definition: TCB.c:307
double get_RTT(PTCB tcb, UINT ackNo)
Definition: TCB.c:372
void handle_rto_timer()
Definition: RTO.c:101
bool send_ack_or_not(PNETSIM_SOCKET s)
Definition: DelayedAck.c:24
struct stru_socket_addr * PSOCKETADDRESS
NetSim_PACKET * create_syn(PNETSIM_SOCKET s, double time)
Definition: TCP_Packet.c:194
void write_congestion_plot(PNETSIM_SOCKET s, NetSim_PACKET *packet)
Definition: TCP.c:276
void tcp_bind(PNETSIM_SOCKET s, PSOCKETADDRESS addr)
Definition: TCP_Socket.c:216
void congestion_setcallback(PNETSIM_SOCKET s)
Definition: Congestion.c:853
void tcp_listen(PNETSIM_SOCKET s, void(*listen_callback)(PNETSIM_SOCKET, NetSim_PACKET *))
Definition: TCP_Socket.c:224
struct stru_tcp_metrics TCP_METRICS
void delete_tcb(PNETSIM_SOCKET s)
Definition: TCB.c:132
void send_fin_ack(PNETSIM_SOCKET s, double time, UINT32 seqNo, UINT32 ackNo)
UINT32 get_cwnd_print(PNETSIM_SOCKET s)
Definition: Congestion.c:200
void add_timeout_event(PNETSIM_SOCKET s, NetSim_PACKET *packet)
Definition: RTO.c:63
NetSim_PACKET * get_segment_from_queue(PTCP_QUEUE queue, UINT32 seqNo)
Definition: TCB.c:229
void tcp_init(NETSIM_ID d)
enum_tcp_ack_type
Definition: TCP.h:82
@ TCPACKTYPE_DELAYED
Definition: TCP.h:84
@ TCPACKTYPE_UNDELAYED
Definition: TCP.h:83
enum enum_tcpstate TCP_CONNECTION_STATE
char * state_to_str(TCP_CONNECTION_STATE state)
Definition: TCB.c:28
void resend_segment(PNETSIM_SOCKET s, NetSim_PACKET *expired)
Definition: TCP_Outgoing.c:64
void set_highRxt(PNETSIM_SOCKET s, UINT32 seq)
Definition: SACK.c:38
void tcp_create_metrics(PNETSIM_SOCKET s)
void packet_arrives_at_incoming_tcp(PNETSIM_SOCKET s, NetSim_PACKET *p)
Definition: TCP_Incoming.c:427
void restart_rto_timer(PNETSIM_SOCKET s)
Definition: RTO.c:152
enum enum_tcp_ack_type TCPACKTYPE
void tcp_passive_open(PNETSIM_SOCKET s, PNETSIM_SOCKET ls)
PNETSIM_SOCKET find_socket_at_source(NetSim_PACKET *packet)
Definition: TCP_Socket.c:155
enum_tcp_variant
Definition: TCP.h:72
@ 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 packet_arrives_at_listen_state(PNETSIM_SOCKET s, NetSim_PACKET *p)
void tcp_close_socket(PNETSIM_SOCKET s, NETSIM_ID devId)
Definition: TCP_Socket.c:187
bool tcp_sack_isLost(PNETSIM_SOCKET s, UINT seqNum)
Definition: SACK.c:170
NetSim_PACKET * create_fin(PNETSIM_SOCKET s, double time)
Definition: TCP_Packet.c:322
void close_all_socket(NETSIM_ID devId)
Definition: TCP_Socket.c:275
void add_packet_to_queue(PTCP_QUEUE queue, NetSim_PACKET *packet, double time)
Definition: TCB.c:164
PNETSIM_SOCKET tcp_create_socket()
Definition: TCP_Socket.c:180
bool isAPPClose
Definition: TCP.h:129
bool waitFromApp
Definition: TCP.h:128
PTCB tcb
Definition: TCP.h:132
PSOCKETADDRESS localAddr
Definition: TCP.h:121
NETSIM_ID remoteDeviceId
Definition: TCP.h:126
NETSIM_ID localDeviceId
Definition: TCP.h:125
NETSIM_ID appId
Definition: TCP.h:130
PSOCKETADDRESS remoteAddr
Definition: TCP.h:122
void(* listen_callback)(struct stru_TCP_Socket *s, NetSim_PACKET *)
Definition: TCP.h:138
PTCP_METRICS tcpMetrics
Definition: TCP.h:140
UINT SocketId
Definition: TCP.h:120
ptrSOCKETINTERFACE sId
Definition: TCP.h:127
double beta
Definition: TCP.h:159
UINT32 hystart_ack_delta
Definition: TCP.h:165
UINT16 MSS
Definition: TCP.h:148
double dDelayedAckTime
Definition: TCP.h:152
UINT16 initSSThresh
Definition: TCP.h:147
TCPACKTYPE ackType
Definition: TCP.h:150
TCPVARIANT tcpVariant
Definition: TCP.h:145
bool isWindowScaling
Definition: TCP.h:154
void * socket_list
Definition: TCP.h:146
bool isTimestampOpt
Definition: TCP.h:156
UINT MaxSynRetries
Definition: TCP.h:149
double timeWaitTimer
Definition: TCP.h:151
UINT32 smooth_part
Definition: TCP.h:162
UINT32 hystart_low_window
Definition: TCP.h:164
UINT32 bic_scale
Definition: TCP.h:163
bool isCongestionPlot
Definition: TCP.h:157
UINT8 shiftCount
Definition: TCP.h:155
UINT32 max_increment
Definition: TCP.h:161
bool isSackPermitted
Definition: TCP.h:153
UINT32 low_window
Definition: TCP.h:160
NETSIM_IPAddress ip
Definition: TCP.h:114
UINT16 port
Definition: TCP.h:115
char * dest
Definition: TCP.h:92
UINT ackReceived
Definition: TCP.h:101
bool isCongestionPlotRequire
Definition: TCP.h:109
UINT prevWindowSize
Definition: TCP.h:108
UINT segmentRetransmitted
Definition: TCP.h:99
UINT segmentReceived
Definition: TCP.h:98
UINT segmentSent
Definition: TCP.h:97
UINT timesRTOExpired
Definition: TCP.h:103
char * source
Definition: TCP.h:91
UINT synAckSent
Definition: TCP.h:96
UINT ackSent
Definition: TCP.h:100
UINT synSent
Definition: TCP.h:95
UINT dupAckReceived
Definition: TCP.h:102
void * congestionPlot
Definition: TCP.h:107
UINT dupSegmentReceived
Definition: TCP.h:104
UINT outOfOrderSegmentReceived
Definition: TCP.h:105
char * remoteAddr
Definition: TCP.h:94
char * localAddr
Definition: TCP.h:93