session: remove ipv6 lookup threading assert
[vpp.git] / src / vnet / tcp / tcp_timer.h
1 /*
2  * Copyright (c) 2016-2019 Cisco and/or its affiliates.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at:
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #ifndef __included_tcp_timer_h__
16 #define __included_tcp_timer_h__
17
18 #include <vnet/tcp/tcp_types.h>
19
20 static inline u8
21 tcp_timer_thread_is_valid (tcp_connection_t *tc)
22 {
23   return ((tc->c_thread_index == vlib_get_thread_index ()) ||
24           vlib_thread_is_main_w_barrier ());
25 }
26
27 always_inline void
28 tcp_timer_set (tcp_timer_wheel_t *tw, tcp_connection_t *tc, u8 timer_id,
29                u32 interval)
30 {
31   ASSERT (tcp_timer_thread_is_valid (tc));
32   ASSERT (tc->timers[timer_id] == TCP_TIMER_HANDLE_INVALID);
33   tc->timers[timer_id] = tw_timer_start_tcp_twsl (tw, tc->c_c_index,
34                                                   timer_id, interval);
35 }
36
37 always_inline void
38 tcp_timer_reset (tcp_timer_wheel_t * tw, tcp_connection_t * tc, u8 timer_id)
39 {
40   ASSERT (tcp_timer_thread_is_valid (tc));
41   tc->pending_timers &= ~(1 << timer_id);
42   if (tc->timers[timer_id] == TCP_TIMER_HANDLE_INVALID)
43     return;
44
45   tw_timer_stop_tcp_twsl (tw, tc->timers[timer_id]);
46   tc->timers[timer_id] = TCP_TIMER_HANDLE_INVALID;
47 }
48
49 always_inline void
50 tcp_timer_update (tcp_timer_wheel_t * tw, tcp_connection_t * tc, u8 timer_id,
51                   u32 interval)
52 {
53   ASSERT (tcp_timer_thread_is_valid (tc));
54   if (tc->timers[timer_id] != TCP_TIMER_HANDLE_INVALID)
55     tw_timer_update_tcp_twsl (tw, tc->timers[timer_id], interval);
56   else
57     tc->timers[timer_id] = tw_timer_start_tcp_twsl (tw, tc->c_c_index,
58                                                     timer_id, interval);
59 }
60
61 always_inline u8
62 tcp_timer_is_active (tcp_connection_t *tc, tcp_timers_e timer)
63 {
64   return tc->timers[timer] != TCP_TIMER_HANDLE_INVALID ||
65          (tc->pending_timers & (1 << timer));
66 }
67
68 always_inline void
69 tcp_retransmit_timer_set (tcp_timer_wheel_t * tw, tcp_connection_t * tc)
70 {
71   ASSERT (tc->snd_una != tc->snd_nxt);
72   tcp_timer_set (tw, tc, TCP_TIMER_RETRANSMIT,
73                  clib_max ((u32) tc->rto * TCP_TO_TIMER_TICK, 1));
74 }
75
76 always_inline void
77 tcp_retransmit_timer_reset (tcp_timer_wheel_t * tw, tcp_connection_t * tc)
78 {
79   tcp_timer_reset (tw, tc, TCP_TIMER_RETRANSMIT);
80 }
81
82 always_inline void
83 tcp_persist_timer_set (tcp_timer_wheel_t * tw, tcp_connection_t * tc)
84 {
85   /* Reuse RTO. It's backed off in handler */
86   tcp_timer_set (tw, tc, TCP_TIMER_PERSIST,
87                  clib_max ((u32) tc->rto * TCP_TO_TIMER_TICK, 1));
88 }
89
90 always_inline void
91 tcp_persist_timer_reset (tcp_timer_wheel_t * tw, tcp_connection_t * tc)
92 {
93   tcp_timer_reset (tw, tc, TCP_TIMER_PERSIST);
94 }
95
96 always_inline void
97 tcp_retransmit_timer_update (tcp_timer_wheel_t * tw, tcp_connection_t * tc)
98 {
99   if (tc->snd_una == tc->snd_nxt)
100     {
101       tcp_retransmit_timer_reset (tw, tc);
102       if (tc->snd_wnd < tc->snd_mss &&
103           !tcp_timer_is_active (tc, TCP_TIMER_PERSIST))
104         tcp_persist_timer_set (tw, tc);
105     }
106   else
107     tcp_timer_update (tw, tc, TCP_TIMER_RETRANSMIT,
108                       clib_max ((u32) tc->rto * TCP_TO_TIMER_TICK, 1));
109 }
110
111 always_inline void
112 tcp_timer_expire_timers (tcp_timer_wheel_t * tw, f64 now)
113 {
114   tw_timer_expire_timers_tcp_twsl (tw, now);
115 }
116
117 void tcp_timer_initialize_wheel (tcp_timer_wheel_t * tw,
118                                  void (*expired_timer_cb) (u32 *), f64 now);
119
120 #endif /* __included_tcp_timer_h__ */
121
122 /*
123  * fd.io coding-style-patch-verification: ON
124  *
125  * Local Variables:
126  * eval: (c-set-style "gnu")
127  * End:
128  */