17#include "TCP_Header.h"
20static void free_queue(PTCP_QUEUE queue);
23UINT32 calculate_initial_seq_num(
double time)
25 return max(1,(UINT32)(time/4.0));
28char* state_to_str(TCP_CONNECTION_STATE state)
32 case TCPCONNECTION_CLOSED:
34 case TCPCONNECTION_LISTEN:
36 case TCPCONNECTION_CLOSE_WAIT:
38 case TCPCONNECTION_CLOSING:
40 case TCPCONNECTION_ESTABLISHED:
42 case TCPCONNECTION_FIN_WAIT_1:
44 case TCPCONNECTION_FIN_WAIT_2:
46 case TCPCONNECTION_LAST_ACK:
48 case TCPCONNECTION_SYN_RECEIVED:
49 return "Syn-received";
50 case TCPCONNECTION_TIME_WAIT:
52 case TCPCONNECTION_SYN_SENT:
59static void set_tcp_variant(PNETSIM_SOCKET s, PTCP_DEV_VAR t)
61 s->tcb->variant = t->tcpVariant;
62 switch (s->tcb->variant)
64 case TCPVariant_OLDTAHOE:
65 case TCPVariant_TAHOE:
67 case TCPVariant_NEWRENO:
69 case TCPVariant_CUBIC:
70 congestion_setcallback(s);
73 fnNetSimError(
"Unknown tcp variant %d in %s\n",
80static void setSackPermitted(PNETSIM_SOCKET s, PTCP_DEV_VAR t)
82 s->tcb->isSackPermitted = t->isSackPermitted;
85static void set_timestamp_option(PNETSIM_SOCKET s, PTCP_DEV_VAR t)
87 s->tcb->isTSopt = t->isTimestampOpt;
90void create_TCB(PNETSIM_SOCKET s)
92 PTCP_DEV_VAR tcp = GET_TCP_DEV_VAR(s->localDeviceId);
93 PTCB tcb = (PTCB)calloc(1,
sizeof* tcb);
96 set_tcp_variant(s, tcp);
100 setSackPermitted(s, tcp);
102 set_window_scaling_option(s, tcp);
104 set_timestamp_option(s, tcp);
106 TCP_RTO(tcb) = calculate_RTO(0,
110 print_tcp_log(
"New RTO = %0.2lf", TCP_RTO(tcb));
112 tcb->timeWaitTimer = tcp->timeWaitTimer;
114 tcb->ISS = calculate_initial_seq_num(pstruEventDetails->dEventTime);
115 tcb->SND.WND = tcb->get_WND(s);
116 tcb->RCV.WND = tcb->get_RCVWND(s);
123 s->tcb->init_congestionalgo(s);
126void free_tcb(PTCB tcb)
128 free_queue(&tcb->retransmissionQueue);
132void delete_tcb(PNETSIM_SOCKET s)
138void tcp_change_state(PNETSIM_SOCKET s, TCP_CONNECTION_STATE state)
145 print_tcp_log(
"TCP state is changed to \"%s\" from \"%s\".",
151static void free_queue(PTCP_QUEUE queue)
153 PQueueInfo info = queue->queue;
156 NetSim_PACKET* p = info->packet;
160 fn_NetSim_Packet_FreePacket(p);
164void add_packet_to_queue(PTCP_QUEUE queue, NetSim_PACKET* packet,
double time)
166 PQueueInfo info = queue->queue;
168 PQueueInfo ninfo = (PQueueInfo)calloc(1,
sizeof* ninfo);
169 ninfo->packet = packet;
172 PTCP_SEGMENT_HDR hdr = TCP_GET_SEGMENT_HDR(packet);
176 PQueueInfo pinfo = NULL;
179 NetSim_PACKET* p = info->packet;
180 PTCP_SEGMENT_HDR h = TCP_GET_SEGMENT_HDR(p);
182 if (h->SeqNum < hdr->SeqNum)
197 queue->queue = ninfo;
209 queue->queue = ninfo;
211 queue->size += (UINT)packet->pstruTransportData->dPacketSize;
214bool isSegmentInQueue(PTCP_QUEUE queue, NetSim_PACKET* packet)
216 PTCP_SEGMENT_HDR hdr = TCP_GET_SEGMENT_HDR(packet);
217 PQueueInfo info = queue->queue;
220 NetSim_PACKET* p = info->packet;
221 PTCP_SEGMENT_HDR h = TCP_GET_SEGMENT_HDR(p);
222 if (hdr->SeqNum == h->SeqNum)
229NetSim_PACKET* get_segment_from_queue(PTCP_QUEUE queue, UINT32 seqNo)
231 PQueueInfo info = queue->queue;
235 NetSim_PACKET* p = info->packet;
236 PTCP_SEGMENT_HDR hdr = TCP_GET_SEGMENT_HDR(p);
237 if (hdr->SeqNum == seqNo)
239 queue->size -= (UINT)p->pstruTransportData->dPacketSize;
242 pr->next = info->next;
247 queue->queue = info->next;
258NetSim_PACKET* get_earliest_segment_from_queue(PTCP_QUEUE queue)
260 PQueueInfo info = queue->queue;
263 NetSim_PACKET* p = info->packet;
264 queue->size -= (UINT)p->pstruTransportData->dPacketSize;
266 queue->queue = info->next;
273NetSim_PACKET* get_earliest_copy_segment_from_queue(PTCP_QUEUE queue)
275 PQueueInfo info = queue->queue;
278 NetSim_PACKET* p = info->packet;
280 return fn_NetSim_Packet_CopyPacket(p);
285NetSim_PACKET* get_copy_segment_from_queue(PTCP_QUEUE queue, UINT32 seqNo,
bool* isSacked)
287 PQueueInfo info = queue->queue;
288 PQueueInfo pr = NULL;
291 NetSim_PACKET* p = info->packet;
292 PTCP_SEGMENT_HDR hdr = TCP_GET_SEGMENT_HDR(p);
293 if (hdr->SeqNum == seqNo)
295 NetSim_PACKET* pret = fn_NetSim_Packet_CopyPacket(p);
296 pret->pstruNextPacket = NULL;
297 *isSacked = info->isSacked;
307UINT32 get_seg_len(NetSim_PACKET* p)
309 PTCP_SEGMENT_HDR hdr = TCP_GET_SEGMENT_HDR(p);
313 return (UINT32)(p->pstruTransportData->dPayload);
316void delete_segment_from_queue(PTCP_QUEUE queue, UINT32 ackNo)
318 PQueueInfo info = queue->queue;
319 PQueueInfo pr = NULL;
322 NetSim_PACKET* p = info->packet;
323 PTCP_SEGMENT_HDR hdr = TCP_GET_SEGMENT_HDR(p);
324 if (hdr->SeqNum + get_seg_len(p) <= ackNo)
327 queue->size -= (UINT)p->pstruTransportData->dPacketSize;
330 pr->next = info->next;
336 queue->queue = info->next;
340 fn_NetSim_Packet_FreePacket(p);
348bool isAnySegmentInQueue(PTCP_QUEUE queue)
350 return queue->size > 0;
353void delete_all_segment_from_queue(PTCP_QUEUE queue)
358void update_seq_num_on_receiving(PNETSIM_SOCKET s,
361 PTCP_SEGMENT_HDR hdr = TCP_GET_SEGMENT_HDR(p);
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;
372double get_RTT(PTCB tcb, UINT ackNo)
374 PQueueInfo info = tcb->retransmissionQueue.queue;
377 NetSim_PACKET* p = info->packet;
378 PTCP_SEGMENT_HDR hdr = TCP_GET_SEGMENT_HDR(p);
379 if (hdr->SeqNum + get_seg_len(p) == ackNo)
381 return pstruEventDetails->dEventTime - info->time;
388NetSim_PACKET* check_for_other_segment_to_send_from_queue(PNETSIM_SOCKET s)
390 PTCP_QUEUE queue = &s->tcb->outOfOrderSegment;
391 PQueueInfo info = queue->queue;
392 NetSim_PACKET* pr = NULL;
396 PTCP_SEGMENT_HDR h = TCP_GET_SEGMENT_HDR(pr);
397 if (h->SeqNum < s->tcb->RCV.NXT)
400 queue->size -= (UINT)pr->pstruTransportData->dPacketSize;
401 queue->queue = info->next;
410void check_segment_in_queue(PNETSIM_SOCKET s)
412 PTCP_QUEUE queue = &s->tcb->outOfOrderSegment;
413 PQueueInfo info = queue->queue;
416 NetSim_PACKET* pr = NULL;
418 PTCP_SEGMENT_HDR h = TCP_GET_SEGMENT_HDR(pr);
419 if (h->SeqNum == s->tcb->RCV.NXT)
421 s->tcb->RCV.NXT += get_seg_len(pr);
427void set_timestamp_value(PNETSIM_SOCKET s,
428 PTCP_SEGMENT_HDR hdr,
433 if (opt && s->tcb->isTSopt)
434 s->tcb->isTSopt =
true;
436 s->tcb->isTSopt =
false;
439 if (opt && s->tcb->isTSopt)
441 s->tcb->TSVal = opt->TSval;
TCP_CONNECTION_STATE tcp_state
Present State of the TCP Connection.
TCP_CONNECTION_STATE tcp_prev_state
Present State of the Connection.