1*76404edcSAsim Jamshed #ifndef __TIMER_H_
2*76404edcSAsim Jamshed #define __TIMER_H_
3*76404edcSAsim Jamshed 
4*76404edcSAsim Jamshed #include "mtcp.h"
5*76404edcSAsim Jamshed #include "tcp_stream.h"
6*76404edcSAsim Jamshed 
7*76404edcSAsim Jamshed #define RTO_HASH 2048
8*76404edcSAsim Jamshed 
9*76404edcSAsim Jamshed #define TIMEVAL_LT(a, b) \
10*76404edcSAsim Jamshed 	(((a)->tv_sec < (b)->tv_sec) ? 1 : \
11*76404edcSAsim Jamshed 	 ((a)->tv_sec < (b)->tv_sec) ? 1 : \
12*76404edcSAsim Jamshed 	 ((a)->tv_usec < (b)->tv_usec) ? 1 : 0)
13*76404edcSAsim Jamshed 
14*76404edcSAsim Jamshed struct timer {
15*76404edcSAsim Jamshed 	int id;
16*76404edcSAsim Jamshed 	struct timeval exp; /* expiration time */
17*76404edcSAsim Jamshed 	callback_t cb;
18*76404edcSAsim Jamshed 
19*76404edcSAsim Jamshed 	TAILQ_ENTRY(timer) timer_link;
20*76404edcSAsim Jamshed };
21*76404edcSAsim Jamshed 
22*76404edcSAsim Jamshed struct rto_hashstore
23*76404edcSAsim Jamshed {
24*76404edcSAsim Jamshed 	uint32_t rto_now_idx; // pointing the hs_table_s index
25*76404edcSAsim Jamshed 	uint32_t rto_now_ts; //
26*76404edcSAsim Jamshed 
27*76404edcSAsim Jamshed 	TAILQ_HEAD(rto_head , tcp_stream) rto_list[RTO_HASH+1];
28*76404edcSAsim Jamshed };
29*76404edcSAsim Jamshed 
30*76404edcSAsim Jamshed struct rto_hashstore*
31*76404edcSAsim Jamshed InitRTOHashstore();
32*76404edcSAsim Jamshed 
33*76404edcSAsim Jamshed extern inline void
34*76404edcSAsim Jamshed AddtoRTOList(mtcp_manager_t mtcp, tcp_stream *cur_stream);
35*76404edcSAsim Jamshed 
36*76404edcSAsim Jamshed extern inline void
37*76404edcSAsim Jamshed RemoveFromRTOList(mtcp_manager_t mtcp, tcp_stream *cur_stream);
38*76404edcSAsim Jamshed 
39*76404edcSAsim Jamshed extern inline void
40*76404edcSAsim Jamshed AddtoTimewaitList(mtcp_manager_t mtcp, tcp_stream *cur_stream, uint32_t cur_ts);
41*76404edcSAsim Jamshed 
42*76404edcSAsim Jamshed extern inline void
43*76404edcSAsim Jamshed RemoveFromTimewaitList(mtcp_manager_t mtcp, tcp_stream *cur_stream);
44*76404edcSAsim Jamshed 
45*76404edcSAsim Jamshed extern inline void
46*76404edcSAsim Jamshed AddtoTimeoutList(mtcp_manager_t mtcp, tcp_stream *cur_stream);
47*76404edcSAsim Jamshed 
48*76404edcSAsim Jamshed extern inline void
49*76404edcSAsim Jamshed RemoveFromTimeoutList(mtcp_manager_t mtcp, tcp_stream *cur_stream);
50*76404edcSAsim Jamshed 
51*76404edcSAsim Jamshed extern inline void
52*76404edcSAsim Jamshed UpdateTimeoutList(mtcp_manager_t mtcp, tcp_stream *cur_stream);
53*76404edcSAsim Jamshed 
54*76404edcSAsim Jamshed extern inline void
55*76404edcSAsim Jamshed UpdateRetransmissionTimer(mtcp_manager_t mtcp,
56*76404edcSAsim Jamshed 		tcp_stream *cur_stream, uint32_t cur_ts);
57*76404edcSAsim Jamshed 
58*76404edcSAsim Jamshed void
59*76404edcSAsim Jamshed CheckRtmTimeout(mtcp_manager_t mtcp, uint32_t cur_ts, int thresh);
60*76404edcSAsim Jamshed 
61*76404edcSAsim Jamshed void
62*76404edcSAsim Jamshed CheckTimewaitExpire(mtcp_manager_t mtcp, uint32_t cur_ts, int thresh);
63*76404edcSAsim Jamshed 
64*76404edcSAsim Jamshed void
65*76404edcSAsim Jamshed CheckConnectionTimeout(mtcp_manager_t mtcp, uint32_t cur_ts, int thresh);
66*76404edcSAsim Jamshed 
67*76404edcSAsim Jamshed void
68*76404edcSAsim Jamshed DelTimer(mtcp_manager_t mtcp, struct timer *timer);
69*76404edcSAsim Jamshed 
70*76404edcSAsim Jamshed #endif /* __TIMER_H_ */
71