38 static double dropProbability = 0.5;
39 static bool burstDrop =
true;
40 static int burstDropSize = 10;
41 static bool isAckDrop =
true;
44#pragma comment (lib,"NetworkStack.lib")
47#define isTCPConfigured(d) (DEVICE_TRXLayer(d) && DEVICE_TRXLayer(d)->isTCP)
48#define isTCPControl(p) (p->nControlDataType/100 == TX_PROTOCOL_TCP)
51#define TCP_DupThresh 3
56 typedef enum enum_tcpstate
60 TCPCONNECTION_SYN_SENT,
61 TCPCONNECTION_SYN_RECEIVED,
62 TCPCONNECTION_ESTABLISHED,
63 TCPCONNECTION_FIN_WAIT_1,
64 TCPCONNECTION_FIN_WAIT_2,
65 TCPCONNECTION_CLOSE_WAIT,
66 TCPCONNECTION_CLOSING,
67 TCPCONNECTION_LAST_ACK,
68 TCPCONNECTION_TIME_WAIT,
69 }TCP_CONNECTION_STATE;
71 typedef enum enum_tcp_variant
81 typedef enum enum_tcp_ack_type
99 UINT segmentRetransmitted;
103 UINT timesRTOExpired;
104 UINT dupSegmentReceived;
105 UINT outOfOrderSegmentReceived;
107 void* congestionPlot;
109 bool isCongestionPlotRequire;
110 }TCP_METRICS,*PTCP_METRICS;
116 }SOCKETADDRESS, *PSOCKETADDRESS;
121 PSOCKETADDRESS localAddr;
122 PSOCKETADDRESS remoteAddr;
125 NETSIM_ID localDeviceId;
126 NETSIM_ID remoteDeviceId;
127 ptrSOCKETINTERFACE sId;
140 PTCP_METRICS tcpMetrics;
145 TCPVARIANT tcpVariant;
151 double timeWaitTimer;
152 double dDelayedAckTime;
153 bool isSackPermitted;
154 bool isWindowScaling;
160 UINT32 max_increment;
163 UINT32 hystart_low_window;
164 UINT32 hystart_ack_delta;
165 }TCP_DEV_VAR,*PTCP_DEV_VAR;
166 static PTCP_DEV_VAR GET_TCP_DEV_VAR(NETSIM_ID d)
168 if (isTCPConfigured(d))
169 return DEVICE_TRXLayer(d)->TCPVar;
172#define GET_TCP_VARIANT(d) (GET_TCP_DEV_VAR(d)->tcpVariant)
176 void add_to_socket_list(NETSIM_ID devId, PNETSIM_SOCKET s);
177 PNETSIM_SOCKET find_socket(NETSIM_ID devId,
178 NETSIM_IPAddress srcIP,
179 NETSIM_IPAddress destIP,
182 PNETSIM_SOCKET find_socket_at_source(NetSim_PACKET* packet);
183 PNETSIM_SOCKET find_socket_at_dest(NetSim_PACKET* packet);
184 PNETSIM_SOCKET tcp_create_socket();
185 void tcp_bind(PNETSIM_SOCKET s, PSOCKETADDRESS addr);
186 void tcp_listen(PNETSIM_SOCKET s,
187 void(*listen_callback)(PNETSIM_SOCKET, NetSim_PACKET*));
188 void tcp_connect(PNETSIM_SOCKET s,
189 PSOCKETADDRESS localAddr,
190 PSOCKETADDRESS remoteAddr);
191 PNETSIM_SOCKET tcp_accept(PNETSIM_SOCKET s,
193 void close_all_socket(NETSIM_ID devId);
194 void tcp_close(PNETSIM_SOCKET s);
195 void tcp_close_socket(PNETSIM_SOCKET s, NETSIM_ID devId);
198 void tcp_active_open(PNETSIM_SOCKET s);
199 void tcp_passive_open(PNETSIM_SOCKET s, PNETSIM_SOCKET ls);
202 double get_RTT(PTCB tcb, UINT ackNo);
203 double calculate_RTO(
double R,
206 void add_timeout_event(PNETSIM_SOCKET s,
207 NetSim_PACKET* packet);
208 void handle_rto_timer();
209 void restart_rto_timer(PNETSIM_SOCKET s);
212 void start_timewait_timer(PNETSIM_SOCKET s);
215 bool isSegmentInQueue(PTCP_QUEUE queue, NetSim_PACKET* packet);
216 void add_packet_to_queue(PTCP_QUEUE queue, NetSim_PACKET* packet,
double time);
217 NetSim_PACKET* get_segment_from_queue(PTCP_QUEUE queue, UINT32 seqNo);
218 NetSim_PACKET* get_copy_segment_from_queue(PTCP_QUEUE queue, UINT32 seqNo,
bool* isSacked);
219 NetSim_PACKET* get_earliest_segment_from_queue(PTCP_QUEUE queue);
220 NetSim_PACKET* get_earliest_copy_segment_from_queue(PTCP_QUEUE queue);
221 void delete_all_segment_from_queue(PTCP_QUEUE queue);
222 void delete_segment_from_queue(PTCP_QUEUE queue, UINT32 ackNo);
223 void check_segment_in_queue(PNETSIM_SOCKET s);
224 NetSim_PACKET* check_for_other_segment_to_send_from_queue(PNETSIM_SOCKET s);
228 void send_rst(PNETSIM_SOCKET s, NetSim_PACKET* p, UINT c);
230 bool isSynPacket(NetSim_PACKET* packet);
231 bool isSynbitSet(NetSim_PACKET* packet);
232 NetSim_PACKET* create_syn(PNETSIM_SOCKET s,
234 void resend_syn(PNETSIM_SOCKET s);
235 void rcv_SYN(PNETSIM_SOCKET s, NetSim_PACKET* syn);
238 NetSim_PACKET* create_synAck(PNETSIM_SOCKET s,
242 NetSim_PACKET* create_ack(PNETSIM_SOCKET s,
246 void send_ack(PNETSIM_SOCKET s,
double time, UINT32 seqNo, UINT32 ackNo);
249 NetSim_PACKET* create_fin(PNETSIM_SOCKET s,
251 void send_fin(PNETSIM_SOCKET s);
254 void send_fin_ack(PNETSIM_SOCKET s,
double time, UINT32 seqNo, UINT32 ackNo);
257 NetSim_PACKET* create_rst(NetSim_PACKET* p,
262 UINT32 get_seg_len(NetSim_PACKET* p);
263 void add_tcp_hdr(NetSim_PACKET* p, PNETSIM_SOCKET s);
266 void packet_arrive_at_closed_state(PNETSIM_SOCKET s, NetSim_PACKET* p);
267 void packet_arrives_at_listen_state(PNETSIM_SOCKET s, NetSim_PACKET* p);
268 void packet_arrives_at_synsent_state(PNETSIM_SOCKET s, NetSim_PACKET* p);
269 void packet_arrives_at_incoming_tcp(PNETSIM_SOCKET s, NetSim_PACKET* p);
272 void resend_segment_without_timeout(PNETSIM_SOCKET s, UINT seq);
273 void send_segment(PNETSIM_SOCKET s);
274 void resend_segment(PNETSIM_SOCKET s, NetSim_PACKET* expired);
277 void update_seq_num_on_receiving(PNETSIM_SOCKET s,
281 void tcp_change_state(PNETSIM_SOCKET s, TCP_CONNECTION_STATE state);
282 void create_TCB(PNETSIM_SOCKET s);
283 void free_tcb(PTCB tcb);
284 void delete_tcb(PNETSIM_SOCKET s);
287 void congestion_setcallback(PNETSIM_SOCKET s);
288 UINT32 get_cwnd_print(PNETSIM_SOCKET s);
291 void set_ack_type(PNETSIM_SOCKET s, PTCP_DEV_VAR tcp);
292 bool send_ack_or_not(PNETSIM_SOCKET s);
295 UINT32 get_highAck(PNETSIM_SOCKET s);
296 void set_highRxt(PNETSIM_SOCKET s, UINT32 seq);
297 void set_rescueRxt(PNETSIM_SOCKET s, UINT32 seq);
298 void tcp_sack_fastRetransmit(PNETSIM_SOCKET s);
299 bool tcp_sack_lossRecoveryPhase(PNETSIM_SOCKET s);
300 bool tcp_sack_isLost(PNETSIM_SOCKET s, UINT seqNum);
303 UINT8 get_shift_count(PNETSIM_SOCKET s);
304 void set_window_scaling_option(PNETSIM_SOCKET s, PTCP_DEV_VAR tcp);
305 UINT32 window_scale_get_cwnd(PNETSIM_SOCKET s);
306 UINT16 window_scale_get_wnd(PNETSIM_SOCKET s);
309 void print_tcp_log(
char* format, ...);
310 bool get_protocol_log_status(
char* logname);
311 void tcp_create_metrics(PNETSIM_SOCKET s);
312 TCPVARIANT get_tcp_variant_from_str(
char* szVal);
313 TCPACKTYPE get_tcp_ack_type_from_str(
char* szVal);
314 char* state_to_str(TCP_CONNECTION_STATE state);
315 bool isAnySegmentInQueue(PTCP_QUEUE queue);
316 void write_congestion_plot(PNETSIM_SOCKET s, NetSim_PACKET* packet);
317 void init_TCP_congestion_log();
318 void close_TCP_congestion_log();
321 void tcp_init(NETSIM_ID d);
322 NetSim_PACKET* GET_PACKET_FROM_APP(
bool isRemove);
323 int packet_arrive_from_application_layer();
324 void send_to_application(PNETSIM_SOCKET s, NetSim_PACKET* p);
327 void packet_arrive_from_network_layer();
328 void send_to_network(NetSim_PACKET* packet, PNETSIM_SOCKET s);