Branch data Line data Source code
1 : : /*
2 : : * NET Generic infrastructure for INET connection oriented protocols.
3 : : *
4 : : * Definitions for inet_connection_sock
5 : : *
6 : : * Authors: Many people, see the TCP sources
7 : : *
8 : : * From code originally in TCP
9 : : *
10 : : * This program is free software; you can redistribute it and/or
11 : : * modify it under the terms of the GNU General Public License
12 : : * as published by the Free Software Foundation; either version
13 : : * 2 of the License, or (at your option) any later version.
14 : : */
15 : : #ifndef _INET_CONNECTION_SOCK_H
16 : : #define _INET_CONNECTION_SOCK_H
17 : :
18 : : #include <linux/compiler.h>
19 : : #include <linux/string.h>
20 : : #include <linux/timer.h>
21 : : #include <linux/poll.h>
22 : :
23 : : #include <net/inet_sock.h>
24 : : #include <net/request_sock.h>
25 : :
26 : : #define INET_CSK_DEBUG 1
27 : :
28 : : /* Cancel timers, when they are not required. */
29 : : #undef INET_CSK_CLEAR_TIMERS
30 : :
31 : : struct inet_bind_bucket;
32 : : struct tcp_congestion_ops;
33 : :
34 : : /*
35 : : * Pointers to address related TCP functions
36 : : * (i.e. things that depend on the address family)
37 : : */
38 : : struct inet_connection_sock_af_ops {
39 : : int (*queue_xmit)(struct sk_buff *skb, struct flowi *fl);
40 : : void (*send_check)(struct sock *sk, struct sk_buff *skb);
41 : : int (*rebuild_header)(struct sock *sk);
42 : : void (*sk_rx_dst_set)(struct sock *sk, const struct sk_buff *skb);
43 : : int (*conn_request)(struct sock *sk, struct sk_buff *skb);
44 : : struct sock *(*syn_recv_sock)(struct sock *sk, struct sk_buff *skb,
45 : : struct request_sock *req,
46 : : struct dst_entry *dst);
47 : : u16 net_header_len;
48 : : u16 net_frag_header_len;
49 : : u16 sockaddr_len;
50 : : int (*setsockopt)(struct sock *sk, int level, int optname,
51 : : char __user *optval, unsigned int optlen);
52 : : int (*getsockopt)(struct sock *sk, int level, int optname,
53 : : char __user *optval, int __user *optlen);
54 : : #ifdef CONFIG_COMPAT
55 : : int (*compat_setsockopt)(struct sock *sk,
56 : : int level, int optname,
57 : : char __user *optval, unsigned int optlen);
58 : : int (*compat_getsockopt)(struct sock *sk,
59 : : int level, int optname,
60 : : char __user *optval, int __user *optlen);
61 : : #endif
62 : : void (*addr2sockaddr)(struct sock *sk, struct sockaddr *);
63 : : int (*bind_conflict)(const struct sock *sk,
64 : : const struct inet_bind_bucket *tb, bool relax);
65 : : };
66 : :
67 : : /** inet_connection_sock - INET connection oriented sock
68 : : *
69 : : * @icsk_accept_queue: FIFO of established children
70 : : * @icsk_bind_hash: Bind node
71 : : * @icsk_timeout: Timeout
72 : : * @icsk_retransmit_timer: Resend (no ack)
73 : : * @icsk_rto: Retransmit timeout
74 : : * @icsk_pmtu_cookie Last pmtu seen by socket
75 : : * @icsk_ca_ops Pluggable congestion control hook
76 : : * @icsk_af_ops Operations which are AF_INET{4,6} specific
77 : : * @icsk_ca_state: Congestion control state
78 : : * @icsk_retransmits: Number of unrecovered [RTO] timeouts
79 : : * @icsk_pending: Scheduled timer event
80 : : * @icsk_backoff: Backoff
81 : : * @icsk_syn_retries: Number of allowed SYN (or equivalent) retries
82 : : * @icsk_probes_out: unanswered 0 window probes
83 : : * @icsk_ext_hdr_len: Network protocol overhead (IP/IPv6 options)
84 : : * @icsk_ack: Delayed ACK control data
85 : : * @icsk_mtup; MTU probing control data
86 : : */
87 : : struct inet_connection_sock {
88 : : /* inet_sock has to be the first member! */
89 : : struct inet_sock icsk_inet;
90 : : struct request_sock_queue icsk_accept_queue;
91 : : struct inet_bind_bucket *icsk_bind_hash;
92 : : unsigned long icsk_timeout;
93 : : struct timer_list icsk_retransmit_timer;
94 : : struct timer_list icsk_delack_timer;
95 : : __u32 icsk_rto;
96 : : __u32 icsk_pmtu_cookie;
97 : : const struct tcp_congestion_ops *icsk_ca_ops;
98 : : const struct inet_connection_sock_af_ops *icsk_af_ops;
99 : : unsigned int (*icsk_sync_mss)(struct sock *sk, u32 pmtu);
100 : : __u8 icsk_ca_state;
101 : : __u8 icsk_retransmits;
102 : : __u8 icsk_pending;
103 : : __u8 icsk_backoff;
104 : : __u8 icsk_syn_retries;
105 : : __u8 icsk_probes_out;
106 : : __u16 icsk_ext_hdr_len;
107 : : struct {
108 : : __u8 pending; /* ACK is pending */
109 : : __u8 quick; /* Scheduled number of quick acks */
110 : : __u8 pingpong; /* The session is interactive */
111 : : __u8 blocked; /* Delayed ACK was blocked by socket lock */
112 : : __u32 ato; /* Predicted tick of soft clock */
113 : : unsigned long timeout; /* Currently scheduled timeout */
114 : : __u32 lrcvtime; /* timestamp of last received data packet */
115 : : __u16 last_seg_size; /* Size of last incoming segment */
116 : : __u16 rcv_mss; /* MSS used for delayed ACK decisions */
117 : : } icsk_ack;
118 : : struct {
119 : : int enabled;
120 : :
121 : : /* Range of MTUs to search */
122 : : int search_high;
123 : : int search_low;
124 : :
125 : : /* Information on the current probe. */
126 : : int probe_size;
127 : : } icsk_mtup;
128 : : u32 icsk_ca_priv[16];
129 : : u32 icsk_user_timeout;
130 : : #define ICSK_CA_PRIV_SIZE (16 * sizeof(u32))
131 : : };
132 : :
133 : : #define ICSK_TIME_RETRANS 1 /* Retransmit timer */
134 : : #define ICSK_TIME_DACK 2 /* Delayed ack timer */
135 : : #define ICSK_TIME_PROBE0 3 /* Zero window probe timer */
136 : : #define ICSK_TIME_EARLY_RETRANS 4 /* Early retransmit timer */
137 : : #define ICSK_TIME_LOSS_PROBE 5 /* Tail loss probe timer */
138 : :
139 : : static inline struct inet_connection_sock *inet_csk(const struct sock *sk)
140 : : {
141 : : return (struct inet_connection_sock *)sk;
142 : : }
143 : :
144 : : static inline void *inet_csk_ca(const struct sock *sk)
145 : : {
146 : : return (void *)inet_csk(sk)->icsk_ca_priv;
147 : : }
148 : :
149 : : struct sock *inet_csk_clone_lock(const struct sock *sk,
150 : : const struct request_sock *req,
151 : : const gfp_t priority);
152 : :
153 : : enum inet_csk_ack_state_t {
154 : : ICSK_ACK_SCHED = 1,
155 : : ICSK_ACK_TIMER = 2,
156 : : ICSK_ACK_PUSHED = 4,
157 : : ICSK_ACK_PUSHED2 = 8
158 : : };
159 : :
160 : : void inet_csk_init_xmit_timers(struct sock *sk,
161 : : void (*retransmit_handler)(unsigned long),
162 : : void (*delack_handler)(unsigned long),
163 : : void (*keepalive_handler)(unsigned long));
164 : : void inet_csk_clear_xmit_timers(struct sock *sk);
165 : :
166 : : static inline void inet_csk_schedule_ack(struct sock *sk)
167 : : {
168 : 0 : inet_csk(sk)->icsk_ack.pending |= ICSK_ACK_SCHED;
169 : : }
170 : :
171 : : static inline int inet_csk_ack_scheduled(const struct sock *sk)
172 : : {
173 : 25794 : return inet_csk(sk)->icsk_ack.pending & ICSK_ACK_SCHED;
174 : : }
175 : :
176 : : static inline void inet_csk_delack_init(struct sock *sk)
177 : : {
178 : 10 : memset(&inet_csk(sk)->icsk_ack, 0, sizeof(inet_csk(sk)->icsk_ack));
179 : : }
180 : :
181 : : void inet_csk_delete_keepalive_timer(struct sock *sk);
182 : : void inet_csk_reset_keepalive_timer(struct sock *sk, unsigned long timeout);
183 : :
184 : : #ifdef INET_CSK_DEBUG
185 : : extern const char inet_csk_timer_bug_msg[];
186 : : #endif
187 : :
188 : : static inline void inet_csk_clear_xmit_timer(struct sock *sk, const int what)
189 : : {
190 : : struct inet_connection_sock *icsk = inet_csk(sk);
191 : :
192 : : if (what == ICSK_TIME_RETRANS || what == ICSK_TIME_PROBE0) {
193 : 13716 : icsk->icsk_pending = 0;
194 : : #ifdef INET_CSK_CLEAR_TIMERS
195 : : sk_stop_timer(sk, &icsk->icsk_retransmit_timer);
196 : : #endif
197 : : } else if (what == ICSK_TIME_DACK) {
198 : 23602 : icsk->icsk_ack.blocked = icsk->icsk_ack.pending = 0;
199 : : #ifdef INET_CSK_CLEAR_TIMERS
200 : : sk_stop_timer(sk, &icsk->icsk_delack_timer);
201 : : #endif
202 : : }
203 : : #ifdef INET_CSK_DEBUG
204 : : else {
205 : : pr_debug("%s", inet_csk_timer_bug_msg);
206 : : }
207 : : #endif
208 : : }
209 : :
210 : : /*
211 : : * Reset the retransmission timer
212 : : */
213 : : static inline void inet_csk_reset_xmit_timer(struct sock *sk, const int what,
214 : : unsigned long when,
215 : : const unsigned long max_when)
216 : : {
217 : : struct inet_connection_sock *icsk = inet_csk(sk);
218 : :
219 [ - + ][ # # ]: 83359 : if (when > max_when) {
[ # # ][ # # ]
[ - + ][ - + ]
[ - + ]
220 : : #ifdef INET_CSK_DEBUG
221 : : pr_debug("reset_xmit_timer: sk=%p %d when=0x%lx, caller=%p\n",
222 : : sk, what, when, current_text_addr());
223 : : #endif
224 : : when = max_when;
225 : : }
226 : :
227 : : if (what == ICSK_TIME_RETRANS || what == ICSK_TIME_PROBE0 ||
228 : : what == ICSK_TIME_EARLY_RETRANS || what == ICSK_TIME_LOSS_PROBE) {
229 : 30944 : icsk->icsk_pending = what;
230 : 30944 : icsk->icsk_timeout = jiffies + when;
231 : 82783 : sk_reset_timer(sk, &icsk->icsk_retransmit_timer, icsk->icsk_timeout);
232 : : } else if (what == ICSK_TIME_DACK) {
233 : 576 : icsk->icsk_ack.pending |= ICSK_ACK_TIMER;
234 : 576 : icsk->icsk_ack.timeout = jiffies + when;
235 : 576 : sk_reset_timer(sk, &icsk->icsk_delack_timer, icsk->icsk_ack.timeout);
236 : : }
237 : : #ifdef INET_CSK_DEBUG
238 : : else {
239 : : pr_debug("%s", inet_csk_timer_bug_msg);
240 : : }
241 : : #endif
242 : : }
243 : :
244 : : struct sock *inet_csk_accept(struct sock *sk, int flags, int *err);
245 : :
246 : : struct request_sock *inet_csk_search_req(const struct sock *sk,
247 : : struct request_sock ***prevp,
248 : : const __be16 rport,
249 : : const __be32 raddr,
250 : : const __be32 laddr);
251 : : int inet_csk_bind_conflict(const struct sock *sk,
252 : : const struct inet_bind_bucket *tb, bool relax);
253 : : int inet_csk_get_port(struct sock *sk, unsigned short snum);
254 : :
255 : : struct dst_entry *inet_csk_route_req(struct sock *sk, struct flowi4 *fl4,
256 : : const struct request_sock *req);
257 : : struct dst_entry *inet_csk_route_child_sock(struct sock *sk, struct sock *newsk,
258 : : const struct request_sock *req);
259 : :
260 : : static inline void inet_csk_reqsk_queue_add(struct sock *sk,
261 : : struct request_sock *req,
262 : : struct sock *child)
263 : : {
264 : : reqsk_queue_add(&inet_csk(sk)->icsk_accept_queue, req, sk, child);
265 : : }
266 : :
267 : : void inet_csk_reqsk_queue_hash_add(struct sock *sk, struct request_sock *req,
268 : : unsigned long timeout);
269 : :
270 : : static inline void inet_csk_reqsk_queue_removed(struct sock *sk,
271 : : struct request_sock *req)
272 : : {
273 [ + - ][ # # ]: 26 : if (reqsk_queue_removed(&inet_csk(sk)->icsk_accept_queue, req) == 0)
274 : 26 : inet_csk_delete_keepalive_timer(sk);
275 : : }
276 : :
277 : : static inline void inet_csk_reqsk_queue_added(struct sock *sk,
278 : : const unsigned long timeout)
279 : : {
280 [ + - ]: 26 : if (reqsk_queue_added(&inet_csk(sk)->icsk_accept_queue) == 0)
281 : 26 : inet_csk_reset_keepalive_timer(sk, timeout);
282 : : }
283 : :
284 : : static inline int inet_csk_reqsk_queue_len(const struct sock *sk)
285 : : {
286 : 0 : return reqsk_queue_len(&inet_csk(sk)->icsk_accept_queue);
287 : : }
288 : :
289 : : static inline int inet_csk_reqsk_queue_young(const struct sock *sk)
290 : : {
291 : 0 : return reqsk_queue_len_young(&inet_csk(sk)->icsk_accept_queue);
292 : : }
293 : :
294 : : static inline int inet_csk_reqsk_queue_is_full(const struct sock *sk)
295 : : {
296 : 26 : return reqsk_queue_is_full(&inet_csk(sk)->icsk_accept_queue);
297 : : }
298 : :
299 : : static inline void inet_csk_reqsk_queue_unlink(struct sock *sk,
300 : : struct request_sock *req,
301 : : struct request_sock **prev)
302 : : {
303 : : reqsk_queue_unlink(&inet_csk(sk)->icsk_accept_queue, req, prev);
304 : : }
305 : :
306 : : static inline void inet_csk_reqsk_queue_drop(struct sock *sk,
307 : : struct request_sock *req,
308 : : struct request_sock **prev)
309 : : {
310 : : inet_csk_reqsk_queue_unlink(sk, req, prev);
311 : : inet_csk_reqsk_queue_removed(sk, req);
312 : : reqsk_free(req);
313 : : }
314 : :
315 : : void inet_csk_reqsk_queue_prune(struct sock *parent,
316 : : const unsigned long interval,
317 : : const unsigned long timeout,
318 : : const unsigned long max_rto);
319 : :
320 : : void inet_csk_destroy_sock(struct sock *sk);
321 : : void inet_csk_prepare_forced_close(struct sock *sk);
322 : :
323 : : /*
324 : : * LISTEN is a special case for poll..
325 : : */
326 : : static inline unsigned int inet_csk_listen_poll(const struct sock *sk)
327 : : {
328 [ + + ]: 104 : return !reqsk_queue_empty(&inet_csk(sk)->icsk_accept_queue) ?
329 : : (POLLIN | POLLRDNORM) : 0;
330 : : }
331 : :
332 : : int inet_csk_listen_start(struct sock *sk, const int nr_table_entries);
333 : : void inet_csk_listen_stop(struct sock *sk);
334 : :
335 : : void inet_csk_addr2sockaddr(struct sock *sk, struct sockaddr *uaddr);
336 : :
337 : : int inet_csk_compat_getsockopt(struct sock *sk, int level, int optname,
338 : : char __user *optval, int __user *optlen);
339 : : int inet_csk_compat_setsockopt(struct sock *sk, int level, int optname,
340 : : char __user *optval, unsigned int optlen);
341 : :
342 : : struct dst_entry *inet_csk_update_pmtu(struct sock *sk, u32 mtu);
343 : : #endif /* _INET_CONNECTION_SOCK_H */
|