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
173#define GET_TCP_VARIANT(d) (GET_TCP_DEV_VAR(d)->tcpVariant)
#define DEVICE_TRXLayer(DeviceId)
bool isAnySegmentInQueue(PTCP_QUEUE queue)
NetSim_PACKET * create_ack(PNETSIM_SOCKET s, double time, UINT32 seqno, UINT32 ackno)
void update_seq_num_on_receiving(PNETSIM_SOCKET s, NetSim_PACKET *p)
void send_to_network(NetSim_PACKET *packet, PNETSIM_SOCKET s)
void create_TCB(PNETSIM_SOCKET s)
void resend_syn(PNETSIM_SOCKET s)
void set_ack_type(PNETSIM_SOCKET s, PTCP_DEV_VAR tcp)
bool tcp_sack_lossRecoveryPhase(PNETSIM_SOCKET s)
void delete_all_segment_from_queue(PTCP_QUEUE queue)
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)
void tcp_close(PNETSIM_SOCKET s)
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)
void send_to_application(PNETSIM_SOCKET s, NetSim_PACKET *p)
void add_to_socket_list(NETSIM_ID devId, PNETSIM_SOCKET s)
TCPVARIANT get_tcp_variant_from_str(char *szVal)
NetSim_PACKET * check_for_other_segment_to_send_from_queue(PNETSIM_SOCKET s)
void rcv_SYN(PNETSIM_SOCKET s, NetSim_PACKET *syn)
UINT32 get_highAck(PNETSIM_SOCKET s)
void set_window_scaling_option(PNETSIM_SOCKET s, PTCP_DEV_VAR tcp)
struct stru_tcp_metrics * PTCP_METRICS
static PTCP_DEV_VAR GET_TCP_DEV_VAR(NETSIM_ID d)
void packet_arrive_from_network_layer()
NetSim_PACKET * create_synAck(PNETSIM_SOCKET s, double time)
bool isSegmentInQueue(PTCP_QUEUE queue, NetSim_PACKET *packet)
void delete_segment_from_queue(PTCP_QUEUE queue, UINT32 ackNo)
void tcp_connect(PNETSIM_SOCKET s, PSOCKETADDRESS localAddr, PSOCKETADDRESS remoteAddr)
void tcp_sack_fastRetransmit(PNETSIM_SOCKET s)
PNETSIM_SOCKET find_socket(NETSIM_ID devId, NETSIM_IPAddress srcIP, NETSIM_IPAddress destIP, UINT16 srcPort, UINT16 destPort)
NetSim_PACKET * get_copy_segment_from_queue(PTCP_QUEUE queue, UINT32 seqNo, bool *isSacked)
struct stru_socket_addr SOCKETADDRESS
NetSim_PACKET * create_rst(NetSim_PACKET *p, double time, UINT c)
void tcp_active_open(PNETSIM_SOCKET s)
NetSim_PACKET * get_earliest_segment_from_queue(PTCP_QUEUE queue)
void check_segment_in_queue(PNETSIM_SOCKET s)
void send_fin(PNETSIM_SOCKET s)
UINT16 window_scale_get_wnd(PNETSIM_SOCKET s)
@ TCPCONNECTION_FIN_WAIT_2
@ TCPCONNECTION_SYN_RECEIVED
@ TCPCONNECTION_TIME_WAIT
@ TCPCONNECTION_CLOSE_WAIT
@ TCPCONNECTION_FIN_WAIT_1
@ TCPCONNECTION_ESTABLISHED
TCPACKTYPE get_tcp_ack_type_from_str(char *szVal)
struct stru_TCP_Socket * PNETSIM_SOCKET
void start_timewait_timer(PNETSIM_SOCKET s)
void print_tcp_log(char *format,...)
double calculate_RTO(double R, double *srtt, double *rtt_var)
void packet_arrives_at_synsent_state(PNETSIM_SOCKET s, NetSim_PACKET *p)
#define isTCPConfigured(d)
void set_rescueRxt(PNETSIM_SOCKET s, UINT32 seq)
UINT8 get_shift_count(PNETSIM_SOCKET s)
UINT32 window_scale_get_cwnd(PNETSIM_SOCKET s)
struct stru_TCP_device_var TCP_DEV_VAR
NetSim_PACKET * get_earliest_copy_segment_from_queue(PTCP_QUEUE queue)
PNETSIM_SOCKET find_socket_at_dest(NetSim_PACKET *packet)
bool isSynbitSet(NetSim_PACKET *packet)
void resend_segment_without_timeout(PNETSIM_SOCKET s, UINT seq)
enum enum_tcp_variant TCPVARIANT
void send_segment(PNETSIM_SOCKET s)
void packet_arrive_at_closed_state(PNETSIM_SOCKET s, NetSim_PACKET *p)
void add_tcp_hdr(NetSim_PACKET *p, PNETSIM_SOCKET s)
bool isSynPacket(NetSim_PACKET *packet)
int packet_arrive_from_application_layer()
UINT32 get_seg_len(NetSim_PACKET *p)
double get_RTT(PTCB tcb, UINT ackNo)
bool send_ack_or_not(PNETSIM_SOCKET s)
struct stru_socket_addr * PSOCKETADDRESS
NetSim_PACKET * create_syn(PNETSIM_SOCKET s, double time)
void write_congestion_plot(PNETSIM_SOCKET s, NetSim_PACKET *packet)
void tcp_bind(PNETSIM_SOCKET s, PSOCKETADDRESS addr)
void congestion_setcallback(PNETSIM_SOCKET s)
void tcp_listen(PNETSIM_SOCKET s, void(*listen_callback)(PNETSIM_SOCKET, NetSim_PACKET *))
struct stru_tcp_metrics TCP_METRICS
void delete_tcb(PNETSIM_SOCKET s)
void send_fin_ack(PNETSIM_SOCKET s, double time, UINT32 seqNo, UINT32 ackNo)
UINT32 get_cwnd_print(PNETSIM_SOCKET s)
void add_timeout_event(PNETSIM_SOCKET s, NetSim_PACKET *packet)
NetSim_PACKET * get_segment_from_queue(PTCP_QUEUE queue, UINT32 seqNo)
void tcp_init(NETSIM_ID d)
enum enum_tcpstate TCP_CONNECTION_STATE
char * state_to_str(TCP_CONNECTION_STATE state)
void resend_segment(PNETSIM_SOCKET s, NetSim_PACKET *expired)
void set_highRxt(PNETSIM_SOCKET s, UINT32 seq)
void tcp_create_metrics(PNETSIM_SOCKET s)
void packet_arrives_at_incoming_tcp(PNETSIM_SOCKET s, NetSim_PACKET *p)
void restart_rto_timer(PNETSIM_SOCKET s)
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)
void packet_arrives_at_listen_state(PNETSIM_SOCKET s, NetSim_PACKET *p)
void tcp_close_socket(PNETSIM_SOCKET s, NETSIM_ID devId)
bool tcp_sack_isLost(PNETSIM_SOCKET s, UINT seqNum)
NetSim_PACKET * create_fin(PNETSIM_SOCKET s, double time)
void close_all_socket(NETSIM_ID devId)
void add_packet_to_queue(PTCP_QUEUE queue, NetSim_PACKET *packet, double time)
PNETSIM_SOCKET tcp_create_socket()
PSOCKETADDRESS remoteAddr
void(* listen_callback)(struct stru_TCP_Socket *s, NetSim_PACKET *)
UINT32 hystart_low_window
bool isCongestionPlotRequire
UINT segmentRetransmitted
UINT outOfOrderSegmentReceived