FD.io VPP  v20.09-64-g4f7b92f0a
Vector Packet Processing
tcp_timer.h
Go to the documentation of this file.
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 always_inline void
22  u32 interval)
23 {
24  ASSERT (tc->c_thread_index == vlib_get_thread_index ());
25  ASSERT (tc->timers[timer_id] == TCP_TIMER_HANDLE_INVALID);
26  tc->timers[timer_id] = tw_timer_start_16t_2w_512sl (tw, tc->c_c_index,
27  timer_id, interval);
28 }
29 
30 always_inline void
32 {
33  ASSERT (tc->c_thread_index == vlib_get_thread_index ());
34  tc->pending_timers &= ~(1 << timer_id);
35  if (tc->timers[timer_id] == TCP_TIMER_HANDLE_INVALID)
36  return;
37 
38  tw_timer_stop_16t_2w_512sl (tw, tc->timers[timer_id]);
39  tc->timers[timer_id] = TCP_TIMER_HANDLE_INVALID;
40 }
41 
42 always_inline void
44  u32 interval)
45 {
46  ASSERT (tc->c_thread_index == vlib_get_thread_index ());
47  if (tc->timers[timer_id] != TCP_TIMER_HANDLE_INVALID)
48  tw_timer_update_16t_2w_512sl (tw, tc->timers[timer_id], interval);
49  else
50  tc->timers[timer_id] = tw_timer_start_16t_2w_512sl (tw, tc->c_c_index,
51  timer_id, interval);
52 }
53 
54 always_inline void
56 {
57  ASSERT (tc->snd_una != tc->snd_una_max);
58  tcp_timer_set (tw, tc, TCP_TIMER_RETRANSMIT,
59  clib_max (tc->rto * TCP_TO_TIMER_TICK, 1));
60 }
61 
62 always_inline void
64 {
65  tcp_timer_reset (tw, tc, TCP_TIMER_RETRANSMIT);
66 }
67 
68 always_inline void
70  tcp_connection_t * tc)
71 {
72  tcp_timer_update (tw, tc, TCP_TIMER_RETRANSMIT,
73  clib_max (tc->rto * TCP_TO_TIMER_TICK, 1));
74 }
75 
76 always_inline void
78 {
79  /* Reuse RTO. It's backed off in handler */
80  tcp_timer_set (tw, tc, TCP_TIMER_PERSIST,
81  clib_max (tc->rto * TCP_TO_TIMER_TICK, 1));
82 }
83 
84 always_inline void
86 {
87  u32 interval;
88 
89  if (seq_leq (tc->snd_una, tc->snd_congestion + tc->burst_acked))
90  interval = 1;
91  else
92  interval = clib_max (tc->rto * TCP_TO_TIMER_TICK, 1);
93 
94  tcp_timer_update (tw, tc, TCP_TIMER_PERSIST, interval);
95 }
96 
97 always_inline void
99 {
100  tcp_timer_reset (tw, tc, TCP_TIMER_PERSIST);
101 }
102 
103 always_inline void
105 {
106  if (tc->snd_una == tc->snd_nxt)
107  {
109  if (tc->snd_wnd < tc->snd_mss)
110  tcp_persist_timer_update (tw, tc);
111  }
112  else
113  tcp_timer_update (tw, tc, TCP_TIMER_RETRANSMIT,
114  clib_max (tc->rto * TCP_TO_TIMER_TICK, 1));
115 }
116 
119 {
120  return tc->timers[timer] != TCP_TIMER_HANDLE_INVALID;
121 }
122 
123 #endif /* __included_tcp_timer_h__ */
124 
125 /*
126  * fd.io coding-style-patch-verification: ON
127  *
128  * Local Variables:
129  * eval: (c-set-style "gnu")
130  * End:
131  */
#define TCP_TIMER_HANDLE_INVALID
Definition: tcp_types.h:81
static void tcp_persist_timer_set(tcp_timer_wheel_t *tw, tcp_connection_t *tc)
Definition: tcp_timer.h:77
struct _tcp_connection tcp_connection_t
unsigned char u8
Definition: types.h:56
static void tcp_persist_timer_reset(tcp_timer_wheel_t *tw, tcp_connection_t *tc)
Definition: tcp_timer.h:98
#define seq_leq(_s1, _s2)
Definition: tcp_packet.h:178
static void tcp_retransmit_timer_force_update(tcp_timer_wheel_t *tw, tcp_connection_t *tc)
Definition: tcp_timer.h:69
unsigned int u32
Definition: types.h:88
static void tcp_timer_reset(tcp_timer_wheel_t *tw, tcp_connection_t *tc, u8 timer_id)
Definition: tcp_timer.h:31
static void tcp_retransmit_timer_update(tcp_timer_wheel_t *tw, tcp_connection_t *tc)
Definition: tcp_timer.h:104
static void tcp_timer_set(tcp_timer_wheel_t *tw, tcp_connection_t *tc, u8 timer_id, u32 interval)
Definition: tcp_timer.h:21
enum _tcp_timers tcp_timers_e
static void tcp_retransmit_timer_reset(tcp_timer_wheel_t *tw, tcp_connection_t *tc)
Definition: tcp_timer.h:63
static void tcp_retransmit_timer_set(tcp_timer_wheel_t *tw, tcp_connection_t *tc)
Definition: tcp_timer.h:55
tw_timer_wheel_16t_2w_512sl_t tcp_timer_wheel_t
Definition: tcp_types.h:451
#define always_inline
Definition: ipsec.h:28
static_always_inline uword vlib_get_thread_index(void)
Definition: threads.h:219
#define TCP_TO_TIMER_TICK
Factor for converting ticks to timer ticks.
Definition: tcp_types.h:84
#define ASSERT(truth)
u16 interval
Definition: vrrp.api:34
#define clib_max(x, y)
Definition: clib.h:320
static void tcp_timer_update(tcp_timer_wheel_t *tw, tcp_connection_t *tc, u8 timer_id, u32 interval)
Definition: tcp_timer.h:43
static u8 tcp_timer_is_active(tcp_connection_t *tc, tcp_timers_e timer)
Definition: tcp_timer.h:118
static void tcp_persist_timer_update(tcp_timer_wheel_t *tw, tcp_connection_t *tc)
Definition: tcp_timer.h:85