NetSim Source Code Help
Loading...
Searching...
No Matches
TCB.c
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#include "main.h"
15#include "TCP.h"
16#include "List.h"
17#include "TCP_Header.h"
18
19//Function prototype
20static void free_queue(PTCP_QUEUE queue);
21
22
24{
25 return max(1,(UINT32)(time/4.0));
26}
27
29{
30 switch (state)
31 {
33 return "Closed";
35 return "Listen";
37 return "Close-Wait";
39 return "Closing";
41 return "Established";
43 return "Fin-Wait-1";
45 return "Fin-wait-2";
47 return "Last-Ack";
49 return "Syn-received";
51 return "Time-wait";
53 return "Syn-sent";
54 default:
55 return "Unknown";
56 }
57}
58
60{
61 s->tcb->variant = t->tcpVariant;
62 switch (s->tcb->variant)
63 {
66 case TCPVariant_RENO:
68 case TCPVariant_BIC:
71 break;
72 default:
73 fnNetSimError("Unknown tcp variant %d in %s\n",
74 t->tcpVariant,
75 __FUNCTION__);
76 break;
77 }
78}
79
81{
83}
84
86{
87 s->tcb->isTSopt = t->isTimestampOpt;
88}
89
91{
93 PTCB tcb = (PTCB)calloc(1, sizeof* tcb);
94 s->tcb = tcb;
95
96 set_tcp_variant(s, tcp);
97
98 set_ack_type(s, tcp);
99
100 setSackPermitted(s, tcp);
101
103
104 set_timestamp_option(s, tcp);
105
106 TCP_RTO(tcb) = calculate_RTO(0,
107 &TCP_SRTT(tcb),
108 &TCP_RTTVAR(tcb));
109
110 print_tcp_log("New RTO = %0.2lf", TCP_RTO(tcb));
111
112 tcb->timeWaitTimer = tcp->timeWaitTimer;
113
115 tcb->SND.WND = tcb->get_WND(s);
116 tcb->RCV.WND = tcb->get_RCVWND(s);
117
118 //Start with closed state
121
122 //Set initial RMSS and SMSS size
124}
125
126void free_tcb(PTCB tcb)
127{
129 free(tcb);
130}
131
133{
134 free_tcb(s->tcb);
135 s->tcb = NULL;
136}
137
139{
140 PTCB tcb = s->tcb;
141 if (tcb->tcp_state != state)
142 {
143 tcb->tcp_prev_state = tcb->tcp_state;
144 tcb->tcp_state = state;
145 print_tcp_log("TCP state is changed to \"%s\" from \"%s\".",
148 }
149}
150
151static void free_queue(PTCP_QUEUE queue)
152{
153 PQueueInfo info = queue->queue;
154 while (info)
155 {
156 NetSim_PACKET* p = info->packet;
157 PQueueInfo i = info;
158 info = info->next;
159 free(i);
161 }
162}
163
164void add_packet_to_queue(PTCP_QUEUE queue, NetSim_PACKET* packet, double time)
165{
166 PQueueInfo info = queue->queue;
167
168 PQueueInfo ninfo = (PQueueInfo)calloc(1, sizeof* ninfo);
169 ninfo->packet = packet;
170 ninfo->time = time;
171
173
174 if (info)
175 {
176 PQueueInfo pinfo = NULL;
177 while (info)
178 {
179 NetSim_PACKET* p = info->packet;
181
182 if (h->SeqNum < hdr->SeqNum)
183 {
184 pinfo = info;
185 info = info->next;
186 }
187 else
188 {
189 if (pinfo)
190 {
191 pinfo->next = ninfo;
192 ninfo->next = info;
193 }
194 else
195 {
196 ninfo->next = info;
197 queue->queue = ninfo;
198 }
199 break;
200 }
201 }
202 if (!info)
203 {
204 pinfo->next = ninfo;
205 }
206 }
207 else
208 {
209 queue->queue = ninfo;
210 }
211 queue->size += (UINT)packet->pstruTransportData->dPacketSize;
212}
213
215{
217 PQueueInfo info = queue->queue;
218 while (info)
219 {
220 NetSim_PACKET* p = info->packet;
222 if (hdr->SeqNum == h->SeqNum)
223 return true;
224 info = info->next;
225 }
226 return false;
227}
228
230{
231 PQueueInfo info = queue->queue;
232 PQueueInfo pr=NULL;
233 while (info)
234 {
235 NetSim_PACKET* p = info->packet;
237 if (hdr->SeqNum == seqNo)
238 {
240 if (pr)
241 {
242 pr->next = info->next;
243 free(info);
244 }
245 else
246 {
247 queue->queue = info->next;
248 free(info);
249 }
250 return p;
251 }
252 pr = info;
253 info = info->next;
254 }
255 return NULL;
256}
257
259{
260 PQueueInfo info = queue->queue;
261 if (info)
262 {
263 NetSim_PACKET* p = info->packet;
265
266 queue->queue = info->next;
267 free(info);
268 return p;
269 }
270 return NULL;
271}
272
274{
275 PQueueInfo info = queue->queue;
276 if (info)
277 {
278 NetSim_PACKET* p = info->packet;
279
281 }
282 return NULL;
283}
284
286{
287 PQueueInfo info = queue->queue;
288 PQueueInfo pr = NULL;
289 while (info)
290 {
291 NetSim_PACKET* p = info->packet;
293 if (hdr->SeqNum == seqNo)
294 {
296 pret->pstruNextPacket = NULL;
297 *isSacked = info->isSacked;
298 return pret;
299 }
300 pr = info;
301 info = info->next;
302 }
303 return NULL;
304}
305
306
308{
310 if (hdr->Syn)
311 return 1;
312 else
313 return (UINT32)(p->pstruTransportData->dPayload);
314}
315
317{
318 PQueueInfo info = queue->queue;
319 PQueueInfo pr = NULL;
320 while (info)
321 {
322 NetSim_PACKET* p = info->packet;
324 if (hdr->SeqNum + get_seg_len(p) <= ackNo)
325 {
326 //Delete
328 if (pr)
329 {
330 pr->next = info->next;
331 free(info);
332 info = pr->next;
333 }
334 else
335 {
336 queue->queue = info->next;
337 free(info);
338 info = queue->queue;
339 }
341 continue;
342 }
343 pr = info;
344 info = info->next;
345 }
346}
347
349{
350 return queue->size > 0;
351}
352
354{
355 free_queue(queue);
356}
357
359 NetSim_PACKET* p)
360{
362 PTCB t = s->tcb;
363 if (t)
364 {
365 t->SEG.ACK = hdr->AckNum;
366 t->SEG.LEN = get_seg_len(p);
367 t->SEG.SEQ = hdr->SeqNum;
368 t->SEG.WND = hdr->Window;
369 }
370}
371
372double get_RTT(PTCB tcb, UINT ackNo)
373{
375 while (info)
376 {
377 NetSim_PACKET* p = info->packet;
379 if (hdr->SeqNum + get_seg_len(p) == ackNo)
380 {
381 return pstruEventDetails->dEventTime - info->time;
382 }
383 info = info->next;
384 }
385 return 0;
386}
387
389{
390 PTCP_QUEUE queue = &s->tcb->outOfOrderSegment;
391 PQueueInfo info = queue->queue;
392 NetSim_PACKET* pr = NULL;
393 if (info)
394 {
395 pr = info->packet;
397 if (h->SeqNum < s->tcb->RCV.NXT)
398 {
399 //Delete
400 queue->size -= (UINT)pr->pstruTransportData->dPacketSize;
401 queue->queue = info->next;
402 free(info);
403 }
404 else
405 pr = NULL;
406 }
407 return pr;
408}
409
411{
412 PTCP_QUEUE queue = &s->tcb->outOfOrderSegment;
413 PQueueInfo info = queue->queue;
414 while (info)
415 {
416 NetSim_PACKET* pr = NULL;
417 pr = info->packet;
419 if (h->SeqNum == s->tcb->RCV.NXT)
420 {
421 s->tcb->RCV.NXT += get_seg_len(pr);
422 }
423 info = info->next;
424 }
425}
426
429 PTSopt opt)
430{
431 if (hdr->Syn)
432 {
433 if (opt && s->tcb->isTSopt)
434 s->tcb->isTSopt = true;
435 else
436 s->tcb->isTSopt = false;
437 }
438
439 if (opt && s->tcb->isTSopt)
440 {
441 s->tcb->TSVal = opt->TSval;
442 }
443
444}
void congestion_setcallback(PNETSIM_SOCKET s)
Definition: Congestion.c:853
void set_ack_type(PNETSIM_SOCKET s, PTCP_DEV_VAR tcp)
Definition: DelayedAck.c:17
#define UINT
Definition: Linux.h:38
#define UINT32
Definition: Linux.h:35
#define fnNetSimError(x,...)
Definition: Linux.h:56
#define max(a, b)
Definition: Linux.h:107
#define free(p)
Definition: Memory.h:31
#define calloc(c, s)
Definition: Memory.h:29
double calculate_RTO(double R, double *srtt, double *rtt_var)
Definition: RTO.c:35
EXPORTED struct stru_NetSim_EventDetails * pstruEventDetails
Definition: Stack.h:837
bool isAnySegmentInQueue(PTCP_QUEUE queue)
Definition: TCB.c:348
void update_seq_num_on_receiving(PNETSIM_SOCKET s, NetSim_PACKET *p)
Definition: TCB.c:358
void create_TCB(PNETSIM_SOCKET s)
Definition: TCB.c:90
void delete_all_segment_from_queue(PTCP_QUEUE queue)
Definition: TCB.c:353
void tcp_change_state(PNETSIM_SOCKET s, TCP_CONNECTION_STATE state)
Definition: TCB.c:138
void free_tcb(PTCB tcb)
Definition: TCB.c:126
static void free_queue(PTCP_QUEUE queue)
Definition: TCB.c:151
NetSim_PACKET * check_for_other_segment_to_send_from_queue(PNETSIM_SOCKET s)
Definition: TCB.c:388
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
NetSim_PACKET * get_copy_segment_from_queue(PTCP_QUEUE queue, UINT32 seqNo, bool *isSacked)
Definition: TCB.c:285
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
static void set_timestamp_option(PNETSIM_SOCKET s, PTCP_DEV_VAR t)
Definition: TCB.c:85
NetSim_PACKET * get_earliest_copy_segment_from_queue(PTCP_QUEUE queue)
Definition: TCB.c:273
UINT32 calculate_initial_seq_num(double time)
Definition: TCB.c:23
static void setSackPermitted(PNETSIM_SOCKET s, PTCP_DEV_VAR t)
Definition: TCB.c:80
UINT32 get_seg_len(NetSim_PACKET *p)
Definition: TCB.c:307
double get_RTT(PTCB tcb, UINT ackNo)
Definition: TCB.c:372
void set_timestamp_value(PNETSIM_SOCKET s, PTCP_SEGMENT_HDR hdr, PTSopt opt)
Definition: TCB.c:427
static void set_tcp_variant(PNETSIM_SOCKET s, PTCP_DEV_VAR t)
Definition: TCB.c:59
void delete_tcb(PNETSIM_SOCKET s)
Definition: TCB.c:132
NetSim_PACKET * get_segment_from_queue(PTCP_QUEUE queue, UINT32 seqNo)
Definition: TCB.c:229
char * state_to_str(TCP_CONNECTION_STATE state)
Definition: TCB.c:28
void add_packet_to_queue(PTCP_QUEUE queue, NetSim_PACKET *packet, double time)
Definition: TCB.c:164
struct stru_tcp_queue_info * PQueueInfo
#define TCP_RTO(tcb)
Definition: TCB.h:118
#define TCP_RTTVAR(tcb)
Definition: TCB.h:120
struct stru_tcp_Transmission_Control_Block * PTCB
#define TCP_SRTT(tcb)
Definition: TCB.h:119
void set_window_scaling_option(PNETSIM_SOCKET s, PTCP_DEV_VAR tcp)
Definition: WindowScale.c:40
static PTCP_DEV_VAR GET_TCP_DEV_VAR(NETSIM_ID d)
Definition: TCP.h:167
@ 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
void print_tcp_log(char *format,...)
enum enum_tcpstate TCP_CONNECTION_STATE
@ 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
static PTCP_SEGMENT_HDR TCP_GET_SEGMENT_HDR(NetSim_PACKET *packet)
Definition: TCP_Header.h:107
#define fn_NetSim_Packet_CopyPacket(pstruPacket)
Definition: main.h:182
#define fn_NetSim_Packet_FreePacket(pstruPacket)
Definition: main.h:177
struct stru_NetSim_Packet * pstruNextPacket
Definition: Packet.h:278
struct stru_NetSim_Packet_TransportLayer * pstruTransportData
Definition: Packet.h:274
PTCB tcb
Definition: TCP.h:132
NETSIM_ID localDeviceId
Definition: TCP.h:125
TCPVARIANT tcpVariant
Definition: TCP.h:145
bool isTimestampOpt
Definition: TCP.h:156
double timeWaitTimer
Definition: TCP.h:151
bool isSackPermitted
Definition: TCP.h:153
void(* init_congestionalgo)(PNETSIM_SOCKET)
Definition: TCB.h:131
TCP_CONNECTION_STATE tcp_state
Present State of the TCP Connection.
Definition: TCB.h:47
struct stru_tcp_Transmission_Control_Block::stru_tcb_send_seq_var SND
UINT32(* get_RCVWND)(PNETSIM_SOCKET)
Definition: TCB.h:137
struct stru_tcp_Transmission_Control_Block::stru_tcb_recv_seq_var RCV
UINT16(* get_WND)(PNETSIM_SOCKET)
Definition: TCB.h:135
TCP_CONNECTION_STATE tcp_prev_state
Present State of the Connection.
Definition: TCB.h:48
struct stru_tcp_Transmission_Control_Block::stru_tcb_curr_seg_var SEG
bool isSacked
Definition: TCB.h:36
double time
Definition: TCB.h:35
NetSim_PACKET * packet
Definition: TCB.h:34
struct stru_tcp_queue_info * next
Definition: TCB.h:37
UINT size
Definition: TCB.h:41
PQueueInfo queue
Definition: TCB.h:42