Blame view

include/net/inet_timewait_sock.h 6.69 KB
8feaf0c0a   Arnaldo Carvalho de Melo   [INET]: Generalis...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  /*
   * INET		An implementation of the TCP/IP protocol suite for the LINUX
   *		operating system.  INET is implemented using the  BSD Socket
   *		interface as the means of communication with the user level.
   *
   *		Definitions for a generic INET TIMEWAIT sock
   *
   *		From code originally in net/tcp.h
   *
   *		This program is free software; you can redistribute it and/or
   *		modify it under the terms of the GNU General Public License
   *		as published by the Free Software Foundation; either version
   *		2 of the License, or (at your option) any later version.
   */
  #ifndef _INET_TIMEWAIT_SOCK_
  #define _INET_TIMEWAIT_SOCK_
8feaf0c0a   Arnaldo Carvalho de Melo   [INET]: Generalis...
17

9e337b0fb   Vegard Nossum   net: annotate ine...
18
  #include <linux/kmemcheck.h>
8feaf0c0a   Arnaldo Carvalho de Melo   [INET]: Generalis...
19
  #include <linux/list.h>
295ff7edb   Arnaldo Carvalho de Melo   [TIMEWAIT]: Intro...
20
  #include <linux/timer.h>
8feaf0c0a   Arnaldo Carvalho de Melo   [INET]: Generalis...
21
  #include <linux/types.h>
295ff7edb   Arnaldo Carvalho de Melo   [TIMEWAIT]: Intro...
22
  #include <linux/workqueue.h>
8feaf0c0a   Arnaldo Carvalho de Melo   [INET]: Generalis...
23

14c850212   Arnaldo Carvalho de Melo   [INET_SOCK]: Move...
24
  #include <net/inet_sock.h>
8feaf0c0a   Arnaldo Carvalho de Melo   [INET]: Generalis...
25
26
  #include <net/sock.h>
  #include <net/tcp_states.h>
6d6ee43e0   Arnaldo Carvalho de Melo   [TWSK]: Introduce...
27
  #include <net/timewait_sock.h>
8feaf0c0a   Arnaldo Carvalho de Melo   [INET]: Generalis...
28

60063497a   Arun Sharma   atomic: use <linu...
29
  #include <linux/atomic.h>
8feaf0c0a   Arnaldo Carvalho de Melo   [INET]: Generalis...
30

295ff7edb   Arnaldo Carvalho de Melo   [TIMEWAIT]: Intro...
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
  struct inet_hashinfo;
  
  #define INET_TWDR_RECYCLE_SLOTS_LOG	5
  #define INET_TWDR_RECYCLE_SLOTS		(1 << INET_TWDR_RECYCLE_SLOTS_LOG)
  
  /*
   * If time > 4sec, it is "slow" path, no recycling is required,
   * so that we select tick to get range about 4 seconds.
   */
  #if HZ <= 16 || HZ > 4096
  # error Unsupported: HZ <= 16 or HZ > 4096
  #elif HZ <= 32
  # define INET_TWDR_RECYCLE_TICK (5 + 2 - INET_TWDR_RECYCLE_SLOTS_LOG)
  #elif HZ <= 64
  # define INET_TWDR_RECYCLE_TICK (6 + 2 - INET_TWDR_RECYCLE_SLOTS_LOG)
  #elif HZ <= 128
  # define INET_TWDR_RECYCLE_TICK (7 + 2 - INET_TWDR_RECYCLE_SLOTS_LOG)
  #elif HZ <= 256
  # define INET_TWDR_RECYCLE_TICK (8 + 2 - INET_TWDR_RECYCLE_SLOTS_LOG)
  #elif HZ <= 512
  # define INET_TWDR_RECYCLE_TICK (9 + 2 - INET_TWDR_RECYCLE_SLOTS_LOG)
  #elif HZ <= 1024
  # define INET_TWDR_RECYCLE_TICK (10 + 2 - INET_TWDR_RECYCLE_SLOTS_LOG)
  #elif HZ <= 2048
  # define INET_TWDR_RECYCLE_TICK (11 + 2 - INET_TWDR_RECYCLE_SLOTS_LOG)
  #else
  # define INET_TWDR_RECYCLE_TICK (12 + 2 - INET_TWDR_RECYCLE_SLOTS_LOG)
  #endif
  
  /* TIME_WAIT reaping mechanism. */
  #define INET_TWDR_TWKILL_SLOTS	8 /* Please keep this a power of 2. */
  
  #define INET_TWDR_TWKILL_QUOTA 100
  
  struct inet_timewait_death_row {
  	/* Short-time timewait calendar */
  	int			twcal_hand;
187f5f84e   Eric Dumazet   [INET]: twcal_jif...
68
  	unsigned long		twcal_jiffie;
295ff7edb   Arnaldo Carvalho de Melo   [TIMEWAIT]: Intro...
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
  	struct timer_list	twcal_timer;
  	struct hlist_head	twcal_row[INET_TWDR_RECYCLE_SLOTS];
  
  	spinlock_t		death_lock;
  	int			tw_count;
  	int			period;
  	u32			thread_slots;
  	struct work_struct	twkill_work;
  	struct timer_list	tw_timer;
  	int			slot;
  	struct hlist_head	cells[INET_TWDR_TWKILL_SLOTS];
  	struct inet_hashinfo 	*hashinfo;
  	int			sysctl_tw_recycle;
  	int			sysctl_max_tw_buckets;
  };
696ab2d3b   Arnaldo Carvalho de Melo   [TIMEWAIT]: Move ...
84
  extern void inet_twdr_hangman(unsigned long data);
65f27f384   David Howells   WorkStruct: Pass ...
85
  extern void inet_twdr_twkill_work(struct work_struct *work);
696ab2d3b   Arnaldo Carvalho de Melo   [TIMEWAIT]: Move ...
86
  extern void inet_twdr_twcal_tick(unsigned long data);
8feaf0c0a   Arnaldo Carvalho de Melo   [INET]: Generalis...
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
  struct inet_bind_bucket;
  
  /*
   * This is a TIME_WAIT sock. It works around the memory consumption
   * problems of sockets in such a state on heavily loaded servers, but
   * without violating the protocol specification.
   */
  struct inet_timewait_sock {
  	/*
  	 * Now struct sock also uses sock_common, so please just
  	 * don't add nothing before this first member (__tw_common) --acme
  	 */
  	struct sock_common	__tw_common;
  #define tw_family		__tw_common.skc_family
  #define tw_state		__tw_common.skc_state
  #define tw_reuse		__tw_common.skc_reuse
  #define tw_bound_dev_if		__tw_common.skc_bound_dev_if
3ab5aee7f   Eric Dumazet   net: Convert TCP ...
104
  #define tw_node			__tw_common.skc_nulls_node
8feaf0c0a   Arnaldo Carvalho de Melo   [INET]: Generalis...
105
106
  #define tw_bind_node		__tw_common.skc_bind_node
  #define tw_refcnt		__tw_common.skc_refcnt
81c3d5470   Eric Dumazet   [INET]: speedup i...
107
  #define tw_hash			__tw_common.skc_hash
8feaf0c0a   Arnaldo Carvalho de Melo   [INET]: Generalis...
108
  #define tw_prot			__tw_common.skc_prot
07feaebfc   Eric W. Biederman   [NET]: Add a netw...
109
  #define tw_net			__tw_common.skc_net
68835aba4   Eric Dumazet   net: optimize INE...
110
111
  #define tw_daddr        	__tw_common.skc_daddr
  #define tw_rcv_saddr    	__tw_common.skc_rcv_saddr
ad8bb7808   Arnaldo Carvalho de Melo   [INET_TIMEWAIT_SO...
112
  	int			tw_timeout;
8feaf0c0a   Arnaldo Carvalho de Melo   [INET]: Generalis...
113
  	volatile unsigned char	tw_substate;
8feaf0c0a   Arnaldo Carvalho de Melo   [INET]: Generalis...
114
  	unsigned char		tw_rcv_wscale;
68835aba4   Eric Dumazet   net: optimize INE...
115

8feaf0c0a   Arnaldo Carvalho de Melo   [INET]: Generalis...
116
  	/* Socket demultiplex comparisons on incoming packets. */
68835aba4   Eric Dumazet   net: optimize INE...
117
  	/* these three are in inet_sock */
23f33c2d4   Al Viro   [IPV4]: struct in...
118
  	__be16			tw_sport;
23f33c2d4   Al Viro   [IPV4]: struct in...
119
  	__be16			tw_dport;
8feaf0c0a   Arnaldo Carvalho de Melo   [INET]: Generalis...
120
  	__u16			tw_num;
9e337b0fb   Vegard Nossum   net: annotate ine...
121
  	kmemcheck_bitfield_begin(flags);
8feaf0c0a   Arnaldo Carvalho de Melo   [INET]: Generalis...
122
  	/* And these are ours. */
abf90cca9   Eric Dumazet   net: Fix struct i...
123
124
  	unsigned int		tw_ipv6only     : 1,
  				tw_transparent  : 1,
66b13d99d   Eric Dumazet   ipv4: tcp: fix TO...
125
126
  				tw_pad		: 6,	/* 6 bits hole */
  				tw_tos		: 8,
abf90cca9   Eric Dumazet   net: Fix struct i...
127
  				tw_ipv6_offset  : 16;
9e337b0fb   Vegard Nossum   net: annotate ine...
128
  	kmemcheck_bitfield_end(flags);
8feaf0c0a   Arnaldo Carvalho de Melo   [INET]: Generalis...
129
130
131
132
  	unsigned long		tw_ttd;
  	struct inet_bind_bucket	*tw_tb;
  	struct hlist_node	tw_death_node;
  };
b903d324b   Eric Dumazet   ipv6: tcp: fix TC...
133
  #define tw_tclass tw_tos
8feaf0c0a   Arnaldo Carvalho de Melo   [INET]: Generalis...
134

3ab5aee7f   Eric Dumazet   net: Convert TCP ...
135
136
  static inline void inet_twsk_add_node_rcu(struct inet_timewait_sock *tw,
  				      struct hlist_nulls_head *list)
8feaf0c0a   Arnaldo Carvalho de Melo   [INET]: Generalis...
137
  {
3ab5aee7f   Eric Dumazet   net: Convert TCP ...
138
  	hlist_nulls_add_head_rcu(&tw->tw_node, list);
8feaf0c0a   Arnaldo Carvalho de Melo   [INET]: Generalis...
139
140
141
142
143
144
145
146
147
148
  }
  
  static inline void inet_twsk_add_bind_node(struct inet_timewait_sock *tw,
  					   struct hlist_head *list)
  {
  	hlist_add_head(&tw->tw_bind_node, list);
  }
  
  static inline int inet_twsk_dead_hashed(const struct inet_timewait_sock *tw)
  {
da753beae   Akinobu Mita   [NET]: use hlist_...
149
  	return !hlist_unhashed(&tw->tw_death_node);
8feaf0c0a   Arnaldo Carvalho de Melo   [INET]: Generalis...
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
  }
  
  static inline void inet_twsk_dead_node_init(struct inet_timewait_sock *tw)
  {
  	tw->tw_death_node.pprev = NULL;
  }
  
  static inline void __inet_twsk_del_dead_node(struct inet_timewait_sock *tw)
  {
  	__hlist_del(&tw->tw_death_node);
  	inet_twsk_dead_node_init(tw);
  }
  
  static inline int inet_twsk_del_dead_node(struct inet_timewait_sock *tw)
  {
  	if (inet_twsk_dead_hashed(tw)) {
  		__inet_twsk_del_dead_node(tw);
  		return 1;
  	}
  	return 0;
  }
  
  #define inet_twsk_for_each(tw, node, head) \
3ab5aee7f   Eric Dumazet   net: Convert TCP ...
173
  	hlist_nulls_for_each_entry(tw, node, head, tw_node)
8feaf0c0a   Arnaldo Carvalho de Melo   [INET]: Generalis...
174
175
176
177
178
179
180
181
182
183
184
  
  #define inet_twsk_for_each_inmate(tw, node, jail) \
  	hlist_for_each_entry(tw, node, jail, tw_death_node)
  
  #define inet_twsk_for_each_inmate_safe(tw, node, safe, jail) \
  	hlist_for_each_entry_safe(tw, node, safe, jail, tw_death_node)
  
  static inline struct inet_timewait_sock *inet_twsk(const struct sock *sk)
  {
  	return (struct inet_timewait_sock *)sk;
  }
68835aba4   Eric Dumazet   net: optimize INE...
185
  static inline __be32 sk_rcv_saddr(const struct sock *sk)
8feaf0c0a   Arnaldo Carvalho de Melo   [INET]: Generalis...
186
  {
68835aba4   Eric Dumazet   net: optimize INE...
187
188
  /* both inet_sk() and inet_twsk() store rcv_saddr in skc_rcv_saddr */
  	return sk->__sk_common.skc_rcv_saddr;
8feaf0c0a   Arnaldo Carvalho de Melo   [INET]: Generalis...
189
  }
7054fb937   Pavel Emelyanov   [INET]: Uninline ...
190
  extern void inet_twsk_put(struct inet_timewait_sock *tw);
e48c414ee   Arnaldo Carvalho de Melo   [INET]: Generalis...
191

13475a30b   Eric Dumazet   tcp: connect() ra...
192
  extern int inet_twsk_unhash(struct inet_timewait_sock *tw);
3cdaedae6   Eric Dumazet   tcp: Fix a connec...
193
194
  extern int inet_twsk_bind_unhash(struct inet_timewait_sock *tw,
  				 struct inet_hashinfo *hashinfo);
c676270bc   Arnaldo Carvalho de Melo   [INET_TWSK]: Intr...
195
196
  extern struct inet_timewait_sock *inet_twsk_alloc(const struct sock *sk,
  						  const int state);
e48c414ee   Arnaldo Carvalho de Melo   [INET]: Generalis...
197
198
199
  extern void __inet_twsk_hashdance(struct inet_timewait_sock *tw,
  				  struct sock *sk,
  				  struct inet_hashinfo *hashinfo);
696ab2d3b   Arnaldo Carvalho de Melo   [TIMEWAIT]: Move ...
200
201
202
203
204
205
  
  extern void inet_twsk_schedule(struct inet_timewait_sock *tw,
  			       struct inet_timewait_death_row *twdr,
  			       const int timeo, const int timewait_len);
  extern void inet_twsk_deschedule(struct inet_timewait_sock *tw,
  				 struct inet_timewait_death_row *twdr);
3b1e0a655   YOSHIFUJI Hideaki   [NET] NETNS: Omit...
206

b099ce260   Eric W. Biederman   net: Batch inet_t...
207
  extern void inet_twsk_purge(struct inet_hashinfo *hashinfo,
d315492b1   Daniel Lezcano   netns : fix kerne...
208
  			    struct inet_timewait_death_row *twdr, int family);
3b1e0a655   YOSHIFUJI Hideaki   [NET] NETNS: Omit...
209
210
211
  static inline
  struct net *twsk_net(const struct inet_timewait_sock *twsk)
  {
f943cbe6f   Eric Dumazet   inet: remove rcu ...
212
  	return read_pnet(&twsk->tw_net);
3b1e0a655   YOSHIFUJI Hideaki   [NET] NETNS: Omit...
213
214
215
  }
  
  static inline
f5aa23fd4   Denis V. Lunev   [NETNS]: Compilat...
216
  void twsk_net_set(struct inet_timewait_sock *twsk, struct net *net)
3b1e0a655   YOSHIFUJI Hideaki   [NET] NETNS: Omit...
217
  {
f943cbe6f   Eric Dumazet   inet: remove rcu ...
218
  	write_pnet(&twsk->tw_net, net);
3b1e0a655   YOSHIFUJI Hideaki   [NET] NETNS: Omit...
219
  }
8feaf0c0a   Arnaldo Carvalho de Melo   [INET]: Generalis...
220
  #endif	/* _INET_TIMEWAIT_SOCK_ */