Branch data Line data Source code
1 : : // SPDX-License-Identifier: GPL-2.0-or-later
2 : : /*
3 : : * INET An implementation of the TCP/IP protocol suite for the LINUX
4 : : * operating system. INET is implemented using the BSD Socket
5 : : * interface as the means of communication with the user level.
6 : : *
7 : : * Support for INET connection oriented protocols.
8 : : *
9 : : * Authors: See the TCP sources
10 : : */
11 : :
12 : : #include <linux/module.h>
13 : : #include <linux/jhash.h>
14 : :
15 : : #include <net/inet_connection_sock.h>
16 : : #include <net/inet_hashtables.h>
17 : : #include <net/inet_timewait_sock.h>
18 : : #include <net/ip.h>
19 : : #include <net/route.h>
20 : : #include <net/tcp_states.h>
21 : : #include <net/xfrm.h>
22 : : #include <net/tcp.h>
23 : : #include <net/sock_reuseport.h>
24 : : #include <net/addrconf.h>
25 : :
26 : : #if IS_ENABLED(CONFIG_IPV6)
27 : : /* match_wildcard == true: IPV6_ADDR_ANY equals to any IPv6 addresses if IPv6
28 : : * only, and any IPv4 addresses if not IPv6 only
29 : : * match_wildcard == false: addresses must be exactly the same, i.e.
30 : : * IPV6_ADDR_ANY only equals to IPV6_ADDR_ANY,
31 : : * and 0.0.0.0 equals to 0.0.0.0 only
32 : : */
33 : 26 : static bool ipv6_rcv_saddr_equal(const struct in6_addr *sk1_rcv_saddr6,
34 : : const struct in6_addr *sk2_rcv_saddr6,
35 : : __be32 sk1_rcv_saddr, __be32 sk2_rcv_saddr,
36 : : bool sk1_ipv6only, bool sk2_ipv6only,
37 : : bool match_wildcard)
38 : : {
39 : 26 : int addr_type = ipv6_addr_type(sk1_rcv_saddr6);
40 [ - + ]: 26 : int addr_type2 = sk2_rcv_saddr6 ? ipv6_addr_type(sk2_rcv_saddr6) : IPV6_ADDR_MAPPED;
41 : :
42 : : /* if both are mapped, treat as IPv4 */
43 [ - + ]: 26 : if (addr_type == IPV6_ADDR_MAPPED && addr_type2 == IPV6_ADDR_MAPPED) {
44 [ # # ]: 0 : if (!sk2_ipv6only) {
45 [ # # ]: 0 : if (sk1_rcv_saddr == sk2_rcv_saddr)
46 : : return true;
47 [ # # ]: 0 : if (!sk1_rcv_saddr || !sk2_rcv_saddr)
48 : : return match_wildcard;
49 : : }
50 : 0 : return false;
51 : : }
52 : :
53 [ + - ]: 26 : if (addr_type == IPV6_ADDR_ANY && addr_type2 == IPV6_ADDR_ANY)
54 : : return true;
55 : :
56 [ - + ]: 26 : if (addr_type2 == IPV6_ADDR_ANY && match_wildcard &&
57 [ # # ]: 0 : !(sk2_ipv6only && addr_type == IPV6_ADDR_MAPPED))
58 : : return true;
59 : :
60 [ + - ]: 26 : if (addr_type == IPV6_ADDR_ANY && match_wildcard &&
61 [ + - ]: 26 : !(sk1_ipv6only && addr_type2 == IPV6_ADDR_MAPPED))
62 : : return true;
63 : :
64 [ - + - - ]: 26 : if (sk2_rcv_saddr6 &&
65 : : ipv6_addr_equal(sk1_rcv_saddr6, sk2_rcv_saddr6))
66 : 0 : return true;
67 : :
68 : : return false;
69 : : }
70 : : #endif
71 : :
72 : : /* match_wildcard == true: 0.0.0.0 equals to any IPv4 addresses
73 : : * match_wildcard == false: addresses must be exactly the same, i.e.
74 : : * 0.0.0.0 only equals to 0.0.0.0
75 : : */
76 : 0 : static bool ipv4_rcv_saddr_equal(__be32 sk1_rcv_saddr, __be32 sk2_rcv_saddr,
77 : : bool sk2_ipv6only, bool match_wildcard)
78 : : {
79 : 0 : if (!sk2_ipv6only) {
80 [ # # # # ]: 0 : if (sk1_rcv_saddr == sk2_rcv_saddr)
81 : : return true;
82 [ # # # # ]: 0 : if (!sk1_rcv_saddr || !sk2_rcv_saddr)
83 : 0 : return match_wildcard;
84 : : }
85 : : return false;
86 : : }
87 : :
88 : 26 : bool inet_rcv_saddr_equal(const struct sock *sk, const struct sock *sk2,
89 : : bool match_wildcard)
90 : : {
91 : : #if IS_ENABLED(CONFIG_IPV6)
92 [ + - ]: 26 : if (sk->sk_family == AF_INET6)
93 : 26 : return ipv6_rcv_saddr_equal(&sk->sk_v6_rcv_saddr,
94 : : inet6_rcv_saddr(sk2),
95 : : sk->sk_rcv_saddr,
96 : : sk2->sk_rcv_saddr,
97 : 26 : ipv6_only_sock(sk),
98 [ - + ]: 26 : ipv6_only_sock(sk2),
99 : : match_wildcard);
100 : : #endif
101 : 0 : return ipv4_rcv_saddr_equal(sk->sk_rcv_saddr, sk2->sk_rcv_saddr,
102 [ # # ]: 0 : ipv6_only_sock(sk2), match_wildcard);
103 : : }
104 : : EXPORT_SYMBOL(inet_rcv_saddr_equal);
105 : :
106 : 0 : bool inet_rcv_saddr_any(const struct sock *sk)
107 : : {
108 : : #if IS_ENABLED(CONFIG_IPV6)
109 [ # # ]: 0 : if (sk->sk_family == AF_INET6)
110 : 0 : return ipv6_addr_any(&sk->sk_v6_rcv_saddr);
111 : : #endif
112 : 0 : return !sk->sk_rcv_saddr;
113 : : }
114 : :
115 : 1170 : void inet_get_local_port_range(struct net *net, int *low, int *high)
116 : : {
117 : 1170 : unsigned int seq;
118 : :
119 : 1170 : do {
120 : 1170 : seq = read_seqbegin(&net->ipv4.ip_local_ports.lock);
121 : :
122 : 1170 : *low = net->ipv4.ip_local_ports.range[0];
123 : 1170 : *high = net->ipv4.ip_local_ports.range[1];
124 [ - - - + ]: 1170 : } while (read_seqretry(&net->ipv4.ip_local_ports.lock, seq));
125 : 1170 : }
126 : : EXPORT_SYMBOL(inet_get_local_port_range);
127 : :
128 : 39 : static int inet_csk_bind_conflict(const struct sock *sk,
129 : : const struct inet_bind_bucket *tb,
130 : : bool relax, bool reuseport_ok)
131 : : {
132 : 39 : struct sock *sk2;
133 : 39 : bool reuse = sk->sk_reuse;
134 [ - + - - ]: 39 : bool reuseport = !!sk->sk_reuseport && reuseport_ok;
135 : 39 : kuid_t uid = sock_i_uid((struct sock *)sk);
136 : :
137 : : /*
138 : : * Unlike other sk lookup places we do not check
139 : : * for sk_net here, since _all_ the socks listed
140 : : * in tb->owners list belong to the same net - the
141 : : * one this bucket belongs to.
142 : : */
143 : :
144 [ + - + + : 130 : sk_for_each_bound(sk2, &tb->owners) {
+ - ]
145 [ + + ]: 52 : if (sk != sk2 &&
146 [ - + ]: 26 : (!sk->sk_bound_dev_if ||
147 [ # # # # ]: 0 : !sk2->sk_bound_dev_if ||
148 : : sk->sk_bound_dev_if == sk2->sk_bound_dev_if)) {
149 [ + - + - ]: 26 : if ((!reuse || !sk2->sk_reuse ||
150 [ + - - + ]: 26 : sk2->sk_state == TCP_LISTEN) &&
151 [ # # # # ]: 0 : (!reuseport || !sk2->sk_reuseport ||
152 [ # # ]: 0 : rcu_access_pointer(sk->sk_reuseport_cb) ||
153 [ # # # # ]: 0 : (sk2->sk_state != TCP_TIME_WAIT &&
154 : 0 : !uid_eq(uid, sock_i_uid(sk2))))) {
155 [ + - ]: 26 : if (inet_rcv_saddr_equal(sk, sk2, true))
156 : : break;
157 : : }
158 [ - + - - ]: 26 : if (!relax && reuse && sk2->sk_reuse &&
159 [ # # ]: 0 : sk2->sk_state != TCP_LISTEN) {
160 [ # # ]: 0 : if (inet_rcv_saddr_equal(sk, sk2, true))
161 : : break;
162 : : }
163 : : }
164 : : }
165 : 39 : return sk2 != NULL;
166 : : }
167 : :
168 : : /*
169 : : * Find an open port number for the socket. Returns with the
170 : : * inet_bind_hashbucket lock held.
171 : : */
172 : : static struct inet_bind_hashbucket *
173 : 0 : inet_csk_find_open_port(struct sock *sk, struct inet_bind_bucket **tb_ret, int *port_ret)
174 : : {
175 : 0 : struct inet_hashinfo *hinfo = sk->sk_prot->h.hashinfo;
176 : 0 : int port = 0;
177 : 0 : struct inet_bind_hashbucket *head;
178 : 0 : struct net *net = sock_net(sk);
179 : 0 : int i, low, high, attempt_half;
180 : 0 : struct inet_bind_bucket *tb;
181 : 0 : u32 remaining, offset;
182 : 0 : int l3mdev;
183 : :
184 : 0 : l3mdev = inet_sk_bound_l3mdev(sk);
185 : 0 : attempt_half = (sk->sk_reuse == SK_CAN_REUSE) ? 1 : 0;
186 : 0 : other_half_scan:
187 : 0 : inet_get_local_port_range(net, &low, &high);
188 : 0 : high++; /* [32768, 60999] -> [32768, 61000[ */
189 [ # # ]: 0 : if (high - low < 4)
190 : : attempt_half = 0;
191 [ # # ]: 0 : if (attempt_half) {
192 : 0 : int half = low + (((high - low) >> 2) << 1);
193 : :
194 [ # # ]: 0 : if (attempt_half == 1)
195 : : high = half;
196 : : else
197 : 0 : low = half;
198 : : }
199 : 0 : remaining = high - low;
200 [ # # ]: 0 : if (likely(remaining > 1))
201 : 0 : remaining &= ~1U;
202 : :
203 : 0 : offset = prandom_u32() % remaining;
204 : : /* __inet_hash_connect() favors ports having @low parity
205 : : * We do the opposite to not pollute connect() users.
206 : : */
207 : 0 : offset |= 1U;
208 : :
209 : 0 : other_parity_scan:
210 : 0 : port = low + offset;
211 [ # # ]: 0 : for (i = 0; i < remaining; i += 2, port += 2) {
212 [ # # ]: 0 : if (unlikely(port >= high))
213 : 0 : port -= remaining;
214 [ # # # # ]: 0 : if (inet_is_local_reserved_port(net, port))
215 : 0 : continue;
216 : 0 : head = &hinfo->bhash[inet_bhashfn(net, port,
217 : : hinfo->bhash_size)];
218 : 0 : spin_lock_bh(&head->lock);
219 [ # # # # : 0 : inet_bind_bucket_for_each(tb, &head->chain)
# # ]
220 [ # # # # ]: 0 : if (net_eq(ib_net(tb), net) && tb->l3mdev == l3mdev &&
221 [ # # ]: 0 : tb->port == port) {
222 [ # # ]: 0 : if (!inet_csk_bind_conflict(sk, tb, false, false))
223 : 0 : goto success;
224 : 0 : goto next_port;
225 : : }
226 : 0 : tb = NULL;
227 : 0 : goto success;
228 : : next_port:
229 : 0 : spin_unlock_bh(&head->lock);
230 : 0 : cond_resched();
231 : : }
232 : :
233 : 0 : offset--;
234 [ # # ]: 0 : if (!(offset & 1))
235 : 0 : goto other_parity_scan;
236 : :
237 [ # # ]: 0 : if (attempt_half == 1) {
238 : : /* OK we now try the upper half of the range */
239 : 0 : attempt_half = 2;
240 : 0 : goto other_half_scan;
241 : : }
242 : : return NULL;
243 : 0 : success:
244 : 0 : *port_ret = port;
245 : 0 : *tb_ret = tb;
246 : 0 : return head;
247 : : }
248 : :
249 : 39 : static inline int sk_reuseport_match(struct inet_bind_bucket *tb,
250 : : struct sock *sk)
251 : : {
252 : 39 : kuid_t uid = sock_i_uid(sk);
253 : :
254 [ - + ]: 39 : if (tb->fastreuseport <= 0)
255 : : return 0;
256 [ # # ]: 0 : if (!sk->sk_reuseport)
257 : : return 0;
258 [ # # ]: 0 : if (rcu_access_pointer(sk->sk_reuseport_cb))
259 : : return 0;
260 [ # # ]: 0 : if (!uid_eq(tb->fastuid, uid))
261 : : return 0;
262 : : /* We only need to check the rcv_saddr if this tb was once marked
263 : : * without fastreuseport and then was reset, as we can only know that
264 : : * the fast_*rcv_saddr doesn't have any conflicts with the socks on the
265 : : * owners list.
266 : : */
267 [ # # ]: 0 : if (tb->fastreuseport == FASTREUSEPORT_ANY)
268 : : return 1;
269 : : #if IS_ENABLED(CONFIG_IPV6)
270 [ # # ]: 0 : if (tb->fast_sk_family == AF_INET6)
271 : 0 : return ipv6_rcv_saddr_equal(&tb->fast_v6_rcv_saddr,
272 : : inet6_rcv_saddr(sk),
273 : : tb->fast_rcv_saddr,
274 : : sk->sk_rcv_saddr,
275 [ # # ]: 0 : tb->fast_ipv6_only,
276 : : ipv6_only_sock(sk), true);
277 : : #endif
278 [ # # ]: 0 : return ipv4_rcv_saddr_equal(tb->fast_rcv_saddr, sk->sk_rcv_saddr,
279 : : ipv6_only_sock(sk), true);
280 : : }
281 : :
282 : : /* Obtain a reference to a local port for the given sock,
283 : : * if snum is zero it means select any available local port.
284 : : * We try to allocate an odd port (and leave even ports for connect())
285 : : */
286 : 52 : int inet_csk_get_port(struct sock *sk, unsigned short snum)
287 : : {
288 [ + - + + ]: 52 : bool reuse = sk->sk_reuse && sk->sk_state != TCP_LISTEN;
289 : 52 : struct inet_hashinfo *hinfo = sk->sk_prot->h.hashinfo;
290 : 52 : int ret = 1, port = snum;
291 : 52 : struct inet_bind_hashbucket *head;
292 : 52 : struct net *net = sock_net(sk);
293 : 52 : struct inet_bind_bucket *tb = NULL;
294 : 52 : kuid_t uid = sock_i_uid(sk);
295 : 52 : int l3mdev;
296 : :
297 [ - + ]: 52 : l3mdev = inet_sk_bound_l3mdev(sk);
298 : :
299 [ - + ]: 52 : if (!port) {
300 : 0 : head = inet_csk_find_open_port(sk, &tb, &port);
301 [ # # ]: 0 : if (!head)
302 : : return ret;
303 [ # # ]: 0 : if (!tb)
304 : 0 : goto tb_not_found;
305 : 0 : goto success;
306 : : }
307 : 52 : head = &hinfo->bhash[inet_bhashfn(net, port,
308 : : hinfo->bhash_size)];
309 : 52 : spin_lock_bh(&head->lock);
310 [ + + - - : 52 : inet_bind_bucket_for_each(tb, &head->chain)
+ + ]
311 [ + - + - ]: 39 : if (net_eq(ib_net(tb), net) && tb->l3mdev == l3mdev &&
312 [ + - ]: 39 : tb->port == port)
313 : 39 : goto tb_found;
314 : 13 : tb_not_found:
315 : 13 : tb = inet_bind_bucket_create(hinfo->bind_bucket_cachep,
316 : : net, head, port, l3mdev);
317 [ - + ]: 13 : if (!tb)
318 : 0 : goto fail_unlock;
319 : 13 : tb_found:
320 [ + + ]: 52 : if (!hlist_empty(&tb->owners)) {
321 [ - + ]: 39 : if (sk->sk_reuse == SK_FORCE_REUSE)
322 : 0 : goto success;
323 : :
324 [ + + + - : 78 : if ((tb->fastreuse > 0 && reuse) ||
- + ]
325 : 39 : sk_reuseport_match(tb, sk))
326 : 0 : goto success;
327 [ + - ]: 39 : if (inet_csk_bind_conflict(sk, tb, true, true))
328 : 0 : goto fail_unlock;
329 : : }
330 : 52 : success:
331 [ + + ]: 52 : if (hlist_empty(&tb->owners)) {
332 : 13 : tb->fastreuse = reuse;
333 [ - + ]: 13 : if (sk->sk_reuseport) {
334 : 0 : tb->fastreuseport = FASTREUSEPORT_ANY;
335 : 0 : tb->fastuid = uid;
336 : 0 : tb->fast_rcv_saddr = sk->sk_rcv_saddr;
337 : 0 : tb->fast_ipv6_only = ipv6_only_sock(sk);
338 : 0 : tb->fast_sk_family = sk->sk_family;
339 : : #if IS_ENABLED(CONFIG_IPV6)
340 : 0 : tb->fast_v6_rcv_saddr = sk->sk_v6_rcv_saddr;
341 : : #endif
342 : : } else {
343 : 13 : tb->fastreuseport = 0;
344 : : }
345 : : } else {
346 [ + + ]: 39 : if (!reuse)
347 : 26 : tb->fastreuse = 0;
348 [ - + ]: 39 : if (sk->sk_reuseport) {
349 : : /* We didn't match or we don't have fastreuseport set on
350 : : * the tb, but we have sk_reuseport set on this socket
351 : : * and we know that there are no bind conflicts with
352 : : * this socket in this tb, so reset our tb's reuseport
353 : : * settings so that any subsequent sockets that match
354 : : * our current socket will be put on the fast path.
355 : : *
356 : : * If we reset we need to set FASTREUSEPORT_STRICT so we
357 : : * do extra checking for all subsequent sk_reuseport
358 : : * socks.
359 : : */
360 [ # # ]: 0 : if (!sk_reuseport_match(tb, sk)) {
361 : 0 : tb->fastreuseport = FASTREUSEPORT_STRICT;
362 : 0 : tb->fastuid = uid;
363 : 0 : tb->fast_rcv_saddr = sk->sk_rcv_saddr;
364 : 0 : tb->fast_ipv6_only = ipv6_only_sock(sk);
365 : 0 : tb->fast_sk_family = sk->sk_family;
366 : : #if IS_ENABLED(CONFIG_IPV6)
367 : 0 : tb->fast_v6_rcv_saddr = sk->sk_v6_rcv_saddr;
368 : : #endif
369 : : }
370 : : } else {
371 : 39 : tb->fastreuseport = 0;
372 : : }
373 : : }
374 [ + + ]: 52 : if (!inet_csk(sk)->icsk_bind_hash)
375 : 26 : inet_bind_hash(sk, tb, port);
376 [ - + ]: 52 : WARN_ON(inet_csk(sk)->icsk_bind_hash != tb);
377 : : ret = 0;
378 : :
379 : 52 : fail_unlock:
380 : 52 : spin_unlock_bh(&head->lock);
381 : 52 : return ret;
382 : : }
383 : : EXPORT_SYMBOL_GPL(inet_csk_get_port);
384 : :
385 : : /*
386 : : * Wait for an incoming connection, avoid race conditions. This must be called
387 : : * with the socket locked.
388 : : */
389 : 0 : static int inet_csk_wait_for_connect(struct sock *sk, long timeo)
390 : : {
391 : 0 : struct inet_connection_sock *icsk = inet_csk(sk);
392 : 0 : DEFINE_WAIT(wait);
393 : 0 : int err;
394 : :
395 : : /*
396 : : * True wake-one mechanism for incoming connections: only
397 : : * one process gets woken up, not the 'whole herd'.
398 : : * Since we do not 'race & poll' for established sockets
399 : : * anymore, the common case will execute the loop only once.
400 : : *
401 : : * Subtle issue: "add_wait_queue_exclusive()" will be added
402 : : * after any current non-exclusive waiters, and we know that
403 : : * it will always _stay_ after any new non-exclusive waiters
404 : : * because all non-exclusive waiters are added at the
405 : : * beginning of the wait-queue. As such, it's ok to "drop"
406 : : * our exclusiveness temporarily when we get woken up without
407 : : * having to remove and re-insert us on the wait queue.
408 : : */
409 : 0 : for (;;) {
410 : 0 : prepare_to_wait_exclusive(sk_sleep(sk), &wait,
411 : : TASK_INTERRUPTIBLE);
412 : 0 : release_sock(sk);
413 [ # # ]: 0 : if (reqsk_queue_empty(&icsk->icsk_accept_queue))
414 : 0 : timeo = schedule_timeout(timeo);
415 : 0 : sched_annotate_sleep();
416 : 0 : lock_sock(sk);
417 : 0 : err = 0;
418 [ # # ]: 0 : if (!reqsk_queue_empty(&icsk->icsk_accept_queue))
419 : : break;
420 : 0 : err = -EINVAL;
421 [ # # ]: 0 : if (sk->sk_state != TCP_LISTEN)
422 : : break;
423 [ # # ]: 0 : err = sock_intr_errno(timeo);
424 [ # # ]: 0 : if (signal_pending(current))
425 : : break;
426 : 0 : err = -EAGAIN;
427 [ # # ]: 0 : if (!timeo)
428 : : break;
429 : : }
430 : 0 : finish_wait(sk_sleep(sk), &wait);
431 : 0 : return err;
432 : : }
433 : :
434 : : /*
435 : : * This will accept the next outstanding connection.
436 : : */
437 : 0 : struct sock *inet_csk_accept(struct sock *sk, int flags, int *err, bool kern)
438 : : {
439 : 0 : struct inet_connection_sock *icsk = inet_csk(sk);
440 : 0 : struct request_sock_queue *queue = &icsk->icsk_accept_queue;
441 : 0 : struct request_sock *req;
442 : 0 : struct sock *newsk;
443 : 0 : int error;
444 : :
445 : 0 : lock_sock(sk);
446 : :
447 : : /* We need to make sure that this socket is listening,
448 : : * and that it has something pending.
449 : : */
450 : 0 : error = -EINVAL;
451 [ # # ]: 0 : if (sk->sk_state != TCP_LISTEN)
452 : 0 : goto out_err;
453 : :
454 : : /* Find already established connection */
455 [ # # ]: 0 : if (reqsk_queue_empty(queue)) {
456 [ # # ]: 0 : long timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
457 : :
458 : : /* If this is a non blocking socket don't sleep */
459 : 0 : error = -EAGAIN;
460 [ # # ]: 0 : if (!timeo)
461 : 0 : goto out_err;
462 : :
463 : 0 : error = inet_csk_wait_for_connect(sk, timeo);
464 [ # # ]: 0 : if (error)
465 : 0 : goto out_err;
466 : : }
467 : 0 : req = reqsk_queue_remove(queue, sk);
468 : 0 : newsk = req->sk;
469 : :
470 [ # # ]: 0 : if (sk->sk_protocol == IPPROTO_TCP &&
471 [ # # ]: 0 : tcp_rsk(req)->tfo_listener) {
472 : 0 : spin_lock_bh(&queue->fastopenq.lock);
473 [ # # ]: 0 : if (tcp_rsk(req)->tfo_listener) {
474 : : /* We are still waiting for the final ACK from 3WHS
475 : : * so can't free req now. Instead, we set req->sk to
476 : : * NULL to signify that the child socket is taken
477 : : * so reqsk_fastopen_remove() will free the req
478 : : * when 3WHS finishes (or is aborted).
479 : : */
480 : 0 : req->sk = NULL;
481 : 0 : req = NULL;
482 : : }
483 : 0 : spin_unlock_bh(&queue->fastopenq.lock);
484 : : }
485 : :
486 : 0 : out:
487 : 0 : release_sock(sk);
488 : 0 : if (newsk && mem_cgroup_sockets_enabled) {
489 : : int amt;
490 : :
491 : : /* atomically get the memory usage, set and charge the
492 : : * newsk->sk_memcg.
493 : : */
494 : : lock_sock(newsk);
495 : :
496 : : /* The socket has not been accepted yet, no need to look at
497 : : * newsk->sk_wmem_queued.
498 : : */
499 : : amt = sk_mem_pages(newsk->sk_forward_alloc +
500 : : atomic_read(&newsk->sk_rmem_alloc));
501 : : mem_cgroup_sk_alloc(newsk);
502 : : if (newsk->sk_memcg && amt)
503 : : mem_cgroup_charge_skmem(newsk->sk_memcg, amt);
504 : :
505 : : release_sock(newsk);
506 : : }
507 [ # # ]: 0 : if (req)
508 : 0 : reqsk_put(req);
509 : 0 : return newsk;
510 : 0 : out_err:
511 : 0 : newsk = NULL;
512 : 0 : req = NULL;
513 : 0 : *err = error;
514 : 0 : goto out;
515 : : }
516 : : EXPORT_SYMBOL(inet_csk_accept);
517 : :
518 : : /*
519 : : * Using different timers for retransmit, delayed acks and probes
520 : : * We may wish use just one timer maintaining a list of expire jiffies
521 : : * to optimize.
522 : : */
523 : 26 : void inet_csk_init_xmit_timers(struct sock *sk,
524 : : void (*retransmit_handler)(struct timer_list *t),
525 : : void (*delack_handler)(struct timer_list *t),
526 : : void (*keepalive_handler)(struct timer_list *t))
527 : : {
528 : 26 : struct inet_connection_sock *icsk = inet_csk(sk);
529 : :
530 : 26 : timer_setup(&icsk->icsk_retransmit_timer, retransmit_handler, 0);
531 : 26 : timer_setup(&icsk->icsk_delack_timer, delack_handler, 0);
532 : 26 : timer_setup(&sk->sk_timer, keepalive_handler, 0);
533 : 26 : icsk->icsk_pending = icsk->icsk_ack.pending = 0;
534 : 26 : }
535 : : EXPORT_SYMBOL(inet_csk_init_xmit_timers);
536 : :
537 : 0 : void inet_csk_clear_xmit_timers(struct sock *sk)
538 : : {
539 : 0 : struct inet_connection_sock *icsk = inet_csk(sk);
540 : :
541 : 0 : icsk->icsk_pending = icsk->icsk_ack.pending = icsk->icsk_ack.blocked = 0;
542 : :
543 : 0 : sk_stop_timer(sk, &icsk->icsk_retransmit_timer);
544 : 0 : sk_stop_timer(sk, &icsk->icsk_delack_timer);
545 : 0 : sk_stop_timer(sk, &sk->sk_timer);
546 : 0 : }
547 : : EXPORT_SYMBOL(inet_csk_clear_xmit_timers);
548 : :
549 : 0 : void inet_csk_delete_keepalive_timer(struct sock *sk)
550 : : {
551 : 0 : sk_stop_timer(sk, &sk->sk_timer);
552 : 0 : }
553 : : EXPORT_SYMBOL(inet_csk_delete_keepalive_timer);
554 : :
555 : 0 : void inet_csk_reset_keepalive_timer(struct sock *sk, unsigned long len)
556 : : {
557 : 0 : sk_reset_timer(sk, &sk->sk_timer, jiffies + len);
558 : 0 : }
559 : : EXPORT_SYMBOL(inet_csk_reset_keepalive_timer);
560 : :
561 : 0 : struct dst_entry *inet_csk_route_req(const struct sock *sk,
562 : : struct flowi4 *fl4,
563 : : const struct request_sock *req)
564 : : {
565 : 0 : const struct inet_request_sock *ireq = inet_rsk(req);
566 : 0 : struct net *net = read_pnet(&ireq->ireq_net);
567 : 0 : struct ip_options_rcu *opt;
568 : 0 : struct rtable *rt;
569 : :
570 : 0 : rcu_read_lock();
571 [ # # ]: 0 : opt = rcu_dereference(ireq->ireq_opt);
572 : :
573 : 0 : flowi4_init_output(fl4, ireq->ir_iif, ireq->ir_mark,
574 : 0 : RT_CONN_FLAGS(sk), RT_SCOPE_UNIVERSE,
575 : 0 : sk->sk_protocol, inet_sk_flowi_flags(sk),
576 [ # # ]: 0 : (opt && opt->opt.srr) ? opt->opt.faddr : ireq->ir_rmt_addr,
577 : 0 : ireq->ir_loc_addr, ireq->ir_rmt_port,
578 [ # # ]: 0 : htons(ireq->ir_num), sk->sk_uid);
579 : 0 : security_req_classify_flow(req, flowi4_to_flowi(fl4));
580 : 0 : rt = ip_route_output_flow(net, fl4, sk);
581 [ # # ]: 0 : if (IS_ERR(rt))
582 : 0 : goto no_route;
583 [ # # # # : 0 : if (opt && opt->opt.is_strictroute && rt->rt_uses_gateway)
# # ]
584 : 0 : goto route_err;
585 : 0 : rcu_read_unlock();
586 : 0 : return &rt->dst;
587 : :
588 : : route_err:
589 : 0 : ip_rt_put(rt);
590 : 0 : no_route:
591 : 0 : rcu_read_unlock();
592 : 0 : __IP_INC_STATS(net, IPSTATS_MIB_OUTNOROUTES);
593 : 0 : return NULL;
594 : : }
595 : : EXPORT_SYMBOL_GPL(inet_csk_route_req);
596 : :
597 : 0 : struct dst_entry *inet_csk_route_child_sock(const struct sock *sk,
598 : : struct sock *newsk,
599 : : const struct request_sock *req)
600 : : {
601 [ # # ]: 0 : const struct inet_request_sock *ireq = inet_rsk(req);
602 [ # # ]: 0 : struct net *net = read_pnet(&ireq->ireq_net);
603 [ # # ]: 0 : struct inet_sock *newinet = inet_sk(newsk);
604 : 0 : struct ip_options_rcu *opt;
605 : 0 : struct flowi4 *fl4;
606 : 0 : struct rtable *rt;
607 : :
608 [ # # ]: 0 : opt = rcu_dereference(ireq->ireq_opt);
609 : 0 : fl4 = &newinet->cork.fl.u.ip4;
610 : :
611 : 0 : flowi4_init_output(fl4, ireq->ir_iif, ireq->ir_mark,
612 : 0 : RT_CONN_FLAGS(sk), RT_SCOPE_UNIVERSE,
613 : 0 : sk->sk_protocol, inet_sk_flowi_flags(sk),
614 [ # # ]: 0 : (opt && opt->opt.srr) ? opt->opt.faddr : ireq->ir_rmt_addr,
615 : 0 : ireq->ir_loc_addr, ireq->ir_rmt_port,
616 [ # # ]: 0 : htons(ireq->ir_num), sk->sk_uid);
617 : 0 : security_req_classify_flow(req, flowi4_to_flowi(fl4));
618 : 0 : rt = ip_route_output_flow(net, fl4, sk);
619 [ # # ]: 0 : if (IS_ERR(rt))
620 : 0 : goto no_route;
621 [ # # # # : 0 : if (opt && opt->opt.is_strictroute && rt->rt_uses_gateway)
# # ]
622 : 0 : goto route_err;
623 : 0 : return &rt->dst;
624 : :
625 : : route_err:
626 : 0 : ip_rt_put(rt);
627 : 0 : no_route:
628 : 0 : __IP_INC_STATS(net, IPSTATS_MIB_OUTNOROUTES);
629 : 0 : return NULL;
630 : : }
631 : : EXPORT_SYMBOL_GPL(inet_csk_route_child_sock);
632 : :
633 : : /* Decide when to expire the request and when to resend SYN-ACK */
634 : 0 : static inline void syn_ack_recalc(struct request_sock *req, const int thresh,
635 : : const int max_retries,
636 : : const u8 rskq_defer_accept,
637 : : int *expire, int *resend)
638 : : {
639 : 0 : if (!rskq_defer_accept) {
640 : 0 : *expire = req->num_timeout >= thresh;
641 : 0 : *resend = 1;
642 : 0 : return;
643 : : }
644 [ # # ]: 0 : *expire = req->num_timeout >= thresh &&
645 [ # # # # ]: 0 : (!inet_rsk(req)->acked || req->num_timeout >= max_retries);
646 : : /*
647 : : * Do not resend while waiting for data after ACK,
648 : : * start to resend on end of deferring period to give
649 : : * last chance for data or ACK to create established socket.
650 : : */
651 [ # # ]: 0 : *resend = !inet_rsk(req)->acked ||
652 [ # # ]: 0 : req->num_timeout >= rskq_defer_accept - 1;
653 : : }
654 : :
655 : 0 : int inet_rtx_syn_ack(const struct sock *parent, struct request_sock *req)
656 : : {
657 : 0 : int err = req->rsk_ops->rtx_syn_ack(parent, req);
658 : :
659 [ # # # # ]: 0 : if (!err)
660 : 0 : req->num_retrans++;
661 : 0 : return err;
662 : : }
663 : : EXPORT_SYMBOL(inet_rtx_syn_ack);
664 : :
665 : : /* return true if req was found in the ehash table */
666 : 0 : static bool reqsk_queue_unlink(struct request_sock *req)
667 : : {
668 [ # # ]: 0 : struct inet_hashinfo *hashinfo = req_to_sk(req)->sk_prot->h.hashinfo;
669 : 0 : bool found = false;
670 : :
671 [ # # ]: 0 : if (sk_hashed(req_to_sk(req))) {
672 : 0 : spinlock_t *lock = inet_ehash_lockp(hashinfo, req->rsk_hash);
673 : :
674 : 0 : spin_lock(lock);
675 [ # # ]: 0 : found = __sk_nulls_del_node_init_rcu(req_to_sk(req));
676 : 0 : spin_unlock(lock);
677 : : }
678 [ # # # # ]: 0 : if (timer_pending(&req->rsk_timer) && del_timer_sync(&req->rsk_timer))
679 : 0 : reqsk_put(req);
680 : 0 : return found;
681 : : }
682 : :
683 : 0 : void inet_csk_reqsk_queue_drop(struct sock *sk, struct request_sock *req)
684 : : {
685 [ # # ]: 0 : if (reqsk_queue_unlink(req)) {
686 : 0 : reqsk_queue_removed(&inet_csk(sk)->icsk_accept_queue, req);
687 : 0 : reqsk_put(req);
688 : : }
689 : 0 : }
690 : : EXPORT_SYMBOL(inet_csk_reqsk_queue_drop);
691 : :
692 : 0 : void inet_csk_reqsk_queue_drop_and_put(struct sock *sk, struct request_sock *req)
693 : : {
694 : 0 : inet_csk_reqsk_queue_drop(sk, req);
695 : 0 : reqsk_put(req);
696 : 0 : }
697 : : EXPORT_SYMBOL(inet_csk_reqsk_queue_drop_and_put);
698 : :
699 : 0 : static void reqsk_timer_handler(struct timer_list *t)
700 : : {
701 : 0 : struct request_sock *req = from_timer(req, t, rsk_timer);
702 : 0 : struct sock *sk_listener = req->rsk_listener;
703 : 0 : struct net *net = sock_net(sk_listener);
704 : 0 : struct inet_connection_sock *icsk = inet_csk(sk_listener);
705 : 0 : struct request_sock_queue *queue = &icsk->icsk_accept_queue;
706 : 0 : int qlen, expire = 0, resend = 0;
707 : 0 : int max_retries, thresh;
708 : 0 : u8 defer_accept;
709 : :
710 [ # # ]: 0 : if (inet_sk_state_load(sk_listener) != TCP_LISTEN)
711 : 0 : goto drop;
712 : :
713 [ # # ]: 0 : max_retries = icsk->icsk_syn_retries ? : net->ipv4.sysctl_tcp_synack_retries;
714 : 0 : thresh = max_retries;
715 : : /* Normally all the openreqs are young and become mature
716 : : * (i.e. converted to established socket) for first timeout.
717 : : * If synack was not acknowledged for 1 second, it means
718 : : * one of the following things: synack was lost, ack was lost,
719 : : * rtt is high or nobody planned to ack (i.e. synflood).
720 : : * When server is a bit loaded, queue is populated with old
721 : : * open requests, reducing effective size of queue.
722 : : * When server is well loaded, queue size reduces to zero
723 : : * after several minutes of work. It is not synflood,
724 : : * it is normal operation. The solution is pruning
725 : : * too old entries overriding normal timeout, when
726 : : * situation becomes dangerous.
727 : : *
728 : : * Essentially, we reserve half of room for young
729 : : * embrions; and abort old ones without pity, if old
730 : : * ones are about to clog our table.
731 : : */
732 : 0 : qlen = reqsk_queue_len(queue);
733 [ # # ]: 0 : if ((qlen << 1) > max(8U, READ_ONCE(sk_listener->sk_max_ack_backlog))) {
734 : 0 : int young = reqsk_queue_len_young(queue) << 1;
735 : :
736 [ # # ]: 0 : while (thresh > 2) {
737 [ # # ]: 0 : if (qlen < young)
738 : : break;
739 : 0 : thresh--;
740 : 0 : young <<= 1;
741 : : }
742 : : }
743 [ # # ]: 0 : defer_accept = READ_ONCE(queue->rskq_defer_accept);
744 [ # # ]: 0 : if (defer_accept)
745 : 0 : max_retries = defer_accept;
746 [ # # ]: 0 : syn_ack_recalc(req, thresh, max_retries, defer_accept,
747 : : &expire, &resend);
748 : 0 : req->rsk_ops->syn_ack_timeout(req);
749 [ # # # # ]: 0 : if (!expire &&
750 [ # # ]: 0 : (!resend ||
751 [ # # ]: 0 : !inet_rtx_syn_ack(sk_listener, req) ||
752 : : inet_rsk(req)->acked)) {
753 : 0 : unsigned long timeo;
754 : :
755 [ # # ]: 0 : if (req->num_timeout++ == 0)
756 : 0 : atomic_dec(&queue->young);
757 : 0 : timeo = min(TCP_TIMEOUT_INIT << req->num_timeout, TCP_RTO_MAX);
758 : 0 : mod_timer(&req->rsk_timer, jiffies + timeo);
759 : 0 : return;
760 : : }
761 : 0 : drop:
762 : 0 : inet_csk_reqsk_queue_drop_and_put(sk_listener, req);
763 : : }
764 : :
765 : 0 : static void reqsk_queue_hash_req(struct request_sock *req,
766 : : unsigned long timeout)
767 : : {
768 : 0 : timer_setup(&req->rsk_timer, reqsk_timer_handler, TIMER_PINNED);
769 : 0 : mod_timer(&req->rsk_timer, jiffies + timeout);
770 : :
771 : 0 : inet_ehash_insert(req_to_sk(req), NULL);
772 : : /* before letting lookups find us, make sure all req fields
773 : : * are committed to memory and refcnt initialized.
774 : : */
775 : 0 : smp_wmb();
776 : 0 : refcount_set(&req->rsk_refcnt, 2 + 1);
777 : 0 : }
778 : :
779 : 0 : void inet_csk_reqsk_queue_hash_add(struct sock *sk, struct request_sock *req,
780 : : unsigned long timeout)
781 : : {
782 : 0 : reqsk_queue_hash_req(req, timeout);
783 : 0 : inet_csk_reqsk_queue_added(sk);
784 : 0 : }
785 : : EXPORT_SYMBOL_GPL(inet_csk_reqsk_queue_hash_add);
786 : :
787 : 0 : static void inet_clone_ulp(const struct request_sock *req, struct sock *newsk,
788 : : const gfp_t priority)
789 : : {
790 : 0 : struct inet_connection_sock *icsk = inet_csk(newsk);
791 : :
792 [ # # ]: 0 : if (!icsk->icsk_ulp_ops)
793 : : return;
794 : :
795 [ # # ]: 0 : if (icsk->icsk_ulp_ops->clone)
796 : 0 : icsk->icsk_ulp_ops->clone(req, newsk, priority);
797 : : }
798 : :
799 : : /**
800 : : * inet_csk_clone_lock - clone an inet socket, and lock its clone
801 : : * @sk: the socket to clone
802 : : * @req: request_sock
803 : : * @priority: for allocation (%GFP_KERNEL, %GFP_ATOMIC, etc)
804 : : *
805 : : * Caller must unlock socket even in error path (bh_unlock_sock(newsk))
806 : : */
807 : 0 : struct sock *inet_csk_clone_lock(const struct sock *sk,
808 : : const struct request_sock *req,
809 : : const gfp_t priority)
810 : : {
811 : 0 : struct sock *newsk = sk_clone_lock(sk, priority);
812 : :
813 [ # # ]: 0 : if (newsk) {
814 : 0 : struct inet_connection_sock *newicsk = inet_csk(newsk);
815 : :
816 : 0 : inet_sk_set_state(newsk, TCP_SYN_RECV);
817 : 0 : newicsk->icsk_bind_hash = NULL;
818 : :
819 : 0 : inet_sk(newsk)->inet_dport = inet_rsk(req)->ir_rmt_port;
820 : 0 : inet_sk(newsk)->inet_num = inet_rsk(req)->ir_num;
821 : 0 : inet_sk(newsk)->inet_sport = htons(inet_rsk(req)->ir_num);
822 : :
823 : : /* listeners have SOCK_RCU_FREE, not the children */
824 : 0 : sock_reset_flag(newsk, SOCK_RCU_FREE);
825 : :
826 : 0 : inet_sk(newsk)->mc_list = NULL;
827 : :
828 : 0 : newsk->sk_mark = inet_rsk(req)->ir_mark;
829 : 0 : atomic64_set(&newsk->sk_cookie,
830 : 0 : atomic64_read(&inet_rsk(req)->ir_cookie));
831 : :
832 : 0 : newicsk->icsk_retransmits = 0;
833 : 0 : newicsk->icsk_backoff = 0;
834 : 0 : newicsk->icsk_probes_out = 0;
835 : :
836 : : /* Deinitialize accept_queue to trap illegal accesses. */
837 : 0 : memset(&newicsk->icsk_accept_queue, 0, sizeof(newicsk->icsk_accept_queue));
838 : :
839 [ # # ]: 0 : inet_clone_ulp(req, newsk, priority);
840 : :
841 : 0 : security_inet_csk_clone(newsk, req);
842 : : }
843 : 0 : return newsk;
844 : : }
845 : : EXPORT_SYMBOL_GPL(inet_csk_clone_lock);
846 : :
847 : : /*
848 : : * At this point, there should be no process reference to this
849 : : * socket, and thus no user references at all. Therefore we
850 : : * can assume the socket waitqueue is inactive and nobody will
851 : : * try to jump onto it.
852 : : */
853 : 0 : void inet_csk_destroy_sock(struct sock *sk)
854 : : {
855 [ # # ]: 0 : WARN_ON(sk->sk_state != TCP_CLOSE);
856 [ # # ]: 0 : WARN_ON(!sock_flag(sk, SOCK_DEAD));
857 : :
858 : : /* It cannot be in hash table! */
859 [ # # ]: 0 : WARN_ON(!sk_unhashed(sk));
860 : :
861 : : /* If it has not 0 inet_sk(sk)->inet_num, it must be bound */
862 [ # # # # : 0 : WARN_ON(inet_sk(sk)->inet_num && !inet_csk(sk)->icsk_bind_hash);
# # ]
863 : :
864 : 0 : sk->sk_prot->destroy(sk);
865 : :
866 : 0 : sk_stream_kill_queues(sk);
867 : :
868 : 0 : xfrm_sk_free_policy(sk);
869 : :
870 : 0 : sk_refcnt_debug_release(sk);
871 : :
872 : 0 : percpu_counter_dec(sk->sk_prot->orphan_count);
873 : :
874 : 0 : sock_put(sk);
875 : 0 : }
876 : : EXPORT_SYMBOL(inet_csk_destroy_sock);
877 : :
878 : : /* This function allows to force a closure of a socket after the call to
879 : : * tcp/dccp_create_openreq_child().
880 : : */
881 : 0 : void inet_csk_prepare_forced_close(struct sock *sk)
882 : : __releases(&sk->sk_lock.slock)
883 : : {
884 : : /* sk_clone_lock locked the socket and set refcnt to 2 */
885 : 0 : bh_unlock_sock(sk);
886 : 0 : sock_put(sk);
887 : :
888 : : /* The below has to be done to allow calling inet_csk_destroy_sock */
889 : 0 : sock_set_flag(sk, SOCK_DEAD);
890 : 0 : percpu_counter_inc(sk->sk_prot->orphan_count);
891 : 0 : inet_sk(sk)->inet_num = 0;
892 : 0 : }
893 : : EXPORT_SYMBOL(inet_csk_prepare_forced_close);
894 : :
895 : 26 : int inet_csk_listen_start(struct sock *sk, int backlog)
896 : : {
897 : 26 : struct inet_connection_sock *icsk = inet_csk(sk);
898 : 26 : struct inet_sock *inet = inet_sk(sk);
899 : 26 : int err = -EADDRINUSE;
900 : :
901 : 26 : reqsk_queue_alloc(&icsk->icsk_accept_queue);
902 : :
903 : 26 : sk->sk_ack_backlog = 0;
904 : 26 : inet_csk_delack_init(sk);
905 : :
906 : : /* There is race window here: we announce ourselves listening,
907 : : * but this transition is still not validated by get_port().
908 : : * It is OK, because this socket enters to hash table only
909 : : * after validation is complete.
910 : : */
911 : 26 : inet_sk_state_store(sk, TCP_LISTEN);
912 [ + - ]: 26 : if (!sk->sk_prot->get_port(sk, inet->inet_num)) {
913 : 26 : inet->inet_sport = htons(inet->inet_num);
914 : :
915 : 26 : sk_dst_reset(sk);
916 : 26 : err = sk->sk_prot->hash(sk);
917 : :
918 [ - + ]: 26 : if (likely(!err))
919 : : return 0;
920 : : }
921 : :
922 : 0 : inet_sk_set_state(sk, TCP_CLOSE);
923 : 0 : return err;
924 : : }
925 : : EXPORT_SYMBOL_GPL(inet_csk_listen_start);
926 : :
927 : 0 : static void inet_child_forget(struct sock *sk, struct request_sock *req,
928 : : struct sock *child)
929 : : {
930 : 0 : sk->sk_prot->disconnect(child, O_NONBLOCK);
931 : :
932 : 0 : sock_orphan(child);
933 : :
934 : 0 : percpu_counter_inc(sk->sk_prot->orphan_count);
935 : :
936 [ # # # # ]: 0 : if (sk->sk_protocol == IPPROTO_TCP && tcp_rsk(req)->tfo_listener) {
937 [ # # ]: 0 : BUG_ON(rcu_access_pointer(tcp_sk(child)->fastopen_rsk) != req);
938 [ # # ]: 0 : BUG_ON(sk != req->rsk_listener);
939 : :
940 : : /* Paranoid, to prevent race condition if
941 : : * an inbound pkt destined for child is
942 : : * blocked by sock lock in tcp_v4_rcv().
943 : : * Also to satisfy an assertion in
944 : : * tcp_v4_destroy_sock().
945 : : */
946 : 0 : RCU_INIT_POINTER(tcp_sk(child)->fastopen_rsk, NULL);
947 : : }
948 : 0 : inet_csk_destroy_sock(child);
949 : 0 : }
950 : :
951 : 0 : struct sock *inet_csk_reqsk_queue_add(struct sock *sk,
952 : : struct request_sock *req,
953 : : struct sock *child)
954 : : {
955 : 0 : struct request_sock_queue *queue = &inet_csk(sk)->icsk_accept_queue;
956 : :
957 : 0 : spin_lock(&queue->rskq_lock);
958 [ # # ]: 0 : if (unlikely(sk->sk_state != TCP_LISTEN)) {
959 : 0 : inet_child_forget(sk, req, child);
960 : 0 : child = NULL;
961 : : } else {
962 : 0 : req->sk = child;
963 : 0 : req->dl_next = NULL;
964 [ # # ]: 0 : if (queue->rskq_accept_head == NULL)
965 : 0 : WRITE_ONCE(queue->rskq_accept_head, req);
966 : : else
967 : 0 : queue->rskq_accept_tail->dl_next = req;
968 : 0 : queue->rskq_accept_tail = req;
969 : 0 : sk_acceptq_added(sk);
970 : : }
971 : 0 : spin_unlock(&queue->rskq_lock);
972 : 0 : return child;
973 : : }
974 : : EXPORT_SYMBOL(inet_csk_reqsk_queue_add);
975 : :
976 : 0 : struct sock *inet_csk_complete_hashdance(struct sock *sk, struct sock *child,
977 : : struct request_sock *req, bool own_req)
978 : : {
979 [ # # ]: 0 : if (own_req) {
980 : 0 : inet_csk_reqsk_queue_drop(sk, req);
981 : 0 : reqsk_queue_removed(&inet_csk(sk)->icsk_accept_queue, req);
982 [ # # ]: 0 : if (inet_csk_reqsk_queue_add(sk, req, child))
983 : : return child;
984 : : }
985 : : /* Too bad, another child took ownership of the request, undo. */
986 : 0 : bh_unlock_sock(child);
987 : 0 : sock_put(child);
988 : 0 : return NULL;
989 : : }
990 : : EXPORT_SYMBOL(inet_csk_complete_hashdance);
991 : :
992 : : /*
993 : : * This routine closes sockets which have been at least partially
994 : : * opened, but not yet accepted.
995 : : */
996 : 0 : void inet_csk_listen_stop(struct sock *sk)
997 : : {
998 : 0 : struct inet_connection_sock *icsk = inet_csk(sk);
999 : 0 : struct request_sock_queue *queue = &icsk->icsk_accept_queue;
1000 : 0 : struct request_sock *next, *req;
1001 : :
1002 : : /* Following specs, it would be better either to send FIN
1003 : : * (and enter FIN-WAIT-1, it is normal close)
1004 : : * or to send active reset (abort).
1005 : : * Certainly, it is pretty dangerous while synflood, but it is
1006 : : * bad justification for our negligence 8)
1007 : : * To be honest, we are not able to make either
1008 : : * of the variants now. --ANK
1009 : : */
1010 [ # # ]: 0 : while ((req = reqsk_queue_remove(queue, sk)) != NULL) {
1011 : 0 : struct sock *child = req->sk;
1012 : :
1013 : 0 : local_bh_disable();
1014 : 0 : bh_lock_sock(child);
1015 [ # # ]: 0 : WARN_ON(sock_owned_by_user(child));
1016 : 0 : sock_hold(child);
1017 : :
1018 : 0 : inet_child_forget(sk, req, child);
1019 : 0 : reqsk_put(req);
1020 : 0 : bh_unlock_sock(child);
1021 : 0 : local_bh_enable();
1022 : 0 : sock_put(child);
1023 : :
1024 : 0 : cond_resched();
1025 : : }
1026 [ # # ]: 0 : if (queue->fastopenq.rskq_rst_head) {
1027 : : /* Free all the reqs queued in rskq_rst_head. */
1028 : 0 : spin_lock_bh(&queue->fastopenq.lock);
1029 : 0 : req = queue->fastopenq.rskq_rst_head;
1030 : 0 : queue->fastopenq.rskq_rst_head = NULL;
1031 : 0 : spin_unlock_bh(&queue->fastopenq.lock);
1032 [ # # ]: 0 : while (req != NULL) {
1033 : 0 : next = req->dl_next;
1034 : 0 : reqsk_put(req);
1035 : 0 : req = next;
1036 : : }
1037 : : }
1038 [ # # ]: 0 : WARN_ON_ONCE(sk->sk_ack_backlog);
1039 : 0 : }
1040 : : EXPORT_SYMBOL_GPL(inet_csk_listen_stop);
1041 : :
1042 : 0 : void inet_csk_addr2sockaddr(struct sock *sk, struct sockaddr *uaddr)
1043 : : {
1044 : 0 : struct sockaddr_in *sin = (struct sockaddr_in *)uaddr;
1045 : 0 : const struct inet_sock *inet = inet_sk(sk);
1046 : :
1047 : 0 : sin->sin_family = AF_INET;
1048 : 0 : sin->sin_addr.s_addr = inet->inet_daddr;
1049 : 0 : sin->sin_port = inet->inet_dport;
1050 : 0 : }
1051 : : EXPORT_SYMBOL_GPL(inet_csk_addr2sockaddr);
1052 : :
1053 : : #ifdef CONFIG_COMPAT
1054 : 0 : int inet_csk_compat_getsockopt(struct sock *sk, int level, int optname,
1055 : : char __user *optval, int __user *optlen)
1056 : : {
1057 [ # # ]: 0 : const struct inet_connection_sock *icsk = inet_csk(sk);
1058 : :
1059 [ # # ]: 0 : if (icsk->icsk_af_ops->compat_getsockopt)
1060 : 0 : return icsk->icsk_af_ops->compat_getsockopt(sk, level, optname,
1061 : : optval, optlen);
1062 : 0 : return icsk->icsk_af_ops->getsockopt(sk, level, optname,
1063 : : optval, optlen);
1064 : : }
1065 : : EXPORT_SYMBOL_GPL(inet_csk_compat_getsockopt);
1066 : :
1067 : 0 : int inet_csk_compat_setsockopt(struct sock *sk, int level, int optname,
1068 : : char __user *optval, unsigned int optlen)
1069 : : {
1070 [ # # ]: 0 : const struct inet_connection_sock *icsk = inet_csk(sk);
1071 : :
1072 [ # # ]: 0 : if (icsk->icsk_af_ops->compat_setsockopt)
1073 : 0 : return icsk->icsk_af_ops->compat_setsockopt(sk, level, optname,
1074 : : optval, optlen);
1075 : 0 : return icsk->icsk_af_ops->setsockopt(sk, level, optname,
1076 : : optval, optlen);
1077 : : }
1078 : : EXPORT_SYMBOL_GPL(inet_csk_compat_setsockopt);
1079 : : #endif
1080 : :
1081 : 0 : static struct dst_entry *inet_csk_rebuild_route(struct sock *sk, struct flowi *fl)
1082 : : {
1083 : 0 : const struct inet_sock *inet = inet_sk(sk);
1084 : 0 : const struct ip_options_rcu *inet_opt;
1085 : 0 : __be32 daddr = inet->inet_daddr;
1086 : 0 : struct flowi4 *fl4;
1087 : 0 : struct rtable *rt;
1088 : :
1089 : 0 : rcu_read_lock();
1090 [ # # ]: 0 : inet_opt = rcu_dereference(inet->inet_opt);
1091 [ # # # # ]: 0 : if (inet_opt && inet_opt->opt.srr)
1092 : 0 : daddr = inet_opt->opt.faddr;
1093 : 0 : fl4 = &fl->u.ip4;
1094 : 0 : rt = ip_route_output_ports(sock_net(sk), fl4, sk, daddr,
1095 : 0 : inet->inet_saddr, inet->inet_dport,
1096 : 0 : inet->inet_sport, sk->sk_protocol,
1097 : 0 : RT_CONN_FLAGS(sk), sk->sk_bound_dev_if);
1098 [ # # ]: 0 : if (IS_ERR(rt))
1099 : : rt = NULL;
1100 [ # # ]: 0 : if (rt)
1101 : 0 : sk_setup_caps(sk, &rt->dst);
1102 : 0 : rcu_read_unlock();
1103 : :
1104 : 0 : return &rt->dst;
1105 : : }
1106 : :
1107 : 0 : struct dst_entry *inet_csk_update_pmtu(struct sock *sk, u32 mtu)
1108 : : {
1109 : 0 : struct dst_entry *dst = __sk_dst_check(sk, 0);
1110 [ # # ]: 0 : struct inet_sock *inet = inet_sk(sk);
1111 : :
1112 [ # # ]: 0 : if (!dst) {
1113 : 0 : dst = inet_csk_rebuild_route(sk, &inet->cork.fl);
1114 [ # # ]: 0 : if (!dst)
1115 : 0 : goto out;
1116 : : }
1117 : 0 : dst->ops->update_pmtu(dst, sk, NULL, mtu, true);
1118 : :
1119 : 0 : dst = __sk_dst_check(sk, 0);
1120 [ # # ]: 0 : if (!dst)
1121 : 0 : dst = inet_csk_rebuild_route(sk, &inet->cork.fl);
1122 : 0 : out:
1123 : 0 : return dst;
1124 : : }
1125 : : EXPORT_SYMBOL_GPL(inet_csk_update_pmtu);
|