176404edcSAsim Jamshed #ifndef __TIMER_H_
276404edcSAsim Jamshed #define __TIMER_H_
3*786603b0SAsim Jamshed /*----------------------------------------------------------------------------*/
476404edcSAsim Jamshed #include "mtcp.h"
576404edcSAsim Jamshed #include "tcp_stream.h"
6*786603b0SAsim Jamshed #include <sys/time.h>
7*786603b0SAsim Jamshed /*----------------------------------------------------------------------------*/
876404edcSAsim Jamshed #define RTO_HASH 2048
9*786603b0SAsim Jamshed /*----------------------------------------------------------------------------*/
10*786603b0SAsim Jamshed #define TIMEVAL_ADD(a, b) \
11*786603b0SAsim Jamshed do { (a)->tv_sec += (b)->tv_sec; \
12*786603b0SAsim Jamshed 	if (((a)->tv_usec += (b)->tv_usec) > 1000000) { \
13*786603b0SAsim Jamshed 		(a)->tv_sec++; (a)->tv_usec -= 1000000; } \
14*786603b0SAsim Jamshed } while (0)
1576404edcSAsim Jamshed 
1676404edcSAsim Jamshed #define TIMEVAL_LT(a, b)			\
17*786603b0SAsim Jamshed 	timercmp(a, b, <)
18*786603b0SAsim Jamshed /*----------------------------------------------------------------------------*/
1976404edcSAsim Jamshed struct timer {
2076404edcSAsim Jamshed 	int id;
2176404edcSAsim Jamshed 	struct timeval exp; /* expiration time */
2276404edcSAsim Jamshed 	callback_t cb;
2376404edcSAsim Jamshed 
2476404edcSAsim Jamshed 	TAILQ_ENTRY(timer) timer_link;
2576404edcSAsim Jamshed };
2676404edcSAsim Jamshed 
2776404edcSAsim Jamshed struct rto_hashstore
2876404edcSAsim Jamshed {
2976404edcSAsim Jamshed 	uint32_t rto_now_idx; // pointing the hs_table_s index
3076404edcSAsim Jamshed 	uint32_t rto_now_ts; //
3176404edcSAsim Jamshed 
3276404edcSAsim Jamshed 	TAILQ_HEAD(rto_head , tcp_stream) rto_list[RTO_HASH+1];
3376404edcSAsim Jamshed };
34*786603b0SAsim Jamshed /*----------------------------------------------------------------------------*/
3576404edcSAsim Jamshed struct rto_hashstore*
3676404edcSAsim Jamshed InitRTOHashstore();
3776404edcSAsim Jamshed 
3876404edcSAsim Jamshed extern inline void
3976404edcSAsim Jamshed AddtoRTOList(mtcp_manager_t mtcp, tcp_stream *cur_stream);
4076404edcSAsim Jamshed 
4176404edcSAsim Jamshed extern inline void
4276404edcSAsim Jamshed RemoveFromRTOList(mtcp_manager_t mtcp, tcp_stream *cur_stream);
4376404edcSAsim Jamshed 
4476404edcSAsim Jamshed extern inline void
4576404edcSAsim Jamshed AddtoTimewaitList(mtcp_manager_t mtcp, tcp_stream *cur_stream, uint32_t cur_ts);
4676404edcSAsim Jamshed 
4776404edcSAsim Jamshed extern inline void
4876404edcSAsim Jamshed RemoveFromTimewaitList(mtcp_manager_t mtcp, tcp_stream *cur_stream);
4976404edcSAsim Jamshed 
5076404edcSAsim Jamshed extern inline void
5176404edcSAsim Jamshed AddtoTimeoutList(mtcp_manager_t mtcp, tcp_stream *cur_stream);
5276404edcSAsim Jamshed 
5376404edcSAsim Jamshed extern inline void
5476404edcSAsim Jamshed RemoveFromTimeoutList(mtcp_manager_t mtcp, tcp_stream *cur_stream);
5576404edcSAsim Jamshed 
5676404edcSAsim Jamshed extern inline void
5776404edcSAsim Jamshed UpdateTimeoutList(mtcp_manager_t mtcp, tcp_stream *cur_stream);
5876404edcSAsim Jamshed 
5976404edcSAsim Jamshed extern inline void
6076404edcSAsim Jamshed UpdateRetransmissionTimer(mtcp_manager_t mtcp,
6176404edcSAsim Jamshed 		tcp_stream *cur_stream, uint32_t cur_ts);
6276404edcSAsim Jamshed 
6376404edcSAsim Jamshed void
6476404edcSAsim Jamshed CheckRtmTimeout(mtcp_manager_t mtcp, uint32_t cur_ts, int thresh);
6576404edcSAsim Jamshed 
6676404edcSAsim Jamshed void
6776404edcSAsim Jamshed CheckTimewaitExpire(mtcp_manager_t mtcp, uint32_t cur_ts, int thresh);
6876404edcSAsim Jamshed 
6976404edcSAsim Jamshed void
7076404edcSAsim Jamshed CheckConnectionTimeout(mtcp_manager_t mtcp, uint32_t cur_ts, int thresh);
7176404edcSAsim Jamshed 
7276404edcSAsim Jamshed void
7376404edcSAsim Jamshed DelTimer(mtcp_manager_t mtcp, struct timer *timer);
74*786603b0SAsim Jamshed /*----------------------------------------------------------------------------*/
7576404edcSAsim Jamshed #endif /* __TIMER_H_ */
76