1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3 * IPVS An implementation of the IP virtual server support for the
4 * LINUX operating system. IPVS is now implemented as a module
5 * over the Netfilter framework. IPVS can be used to build a
6 * high-performance and highly available server based on a
7 * cluster of servers.
8 *
9 * Authors: Wensong Zhang <wensong@linuxvirtualserver.org>
10 * Peter Kese <peter.kese@ijs.si>
11 * Julian Anastasov <ja@ssi.bg>
12 *
13 * The IPVS code for kernel 2.2 was done by Wensong Zhang and Peter Kese,
14 * with changes/fixes from Julian Anastasov, Lars Marowsky-Bree, Horms
15 * and others. Many code here is taken from IP MASQ code of kernel 2.2.
16 *
17 * Changes:
18 */
19
20 #define pr_fmt(fmt) "IPVS: " fmt
21
22 #include <linux/interrupt.h>
23 #include <linux/in.h>
24 #include <linux/inet.h>
25 #include <linux/net.h>
26 #include <linux/kernel.h>
27 #include <linux/module.h>
28 #include <linux/proc_fs.h> /* for proc_net_* */
29 #include <linux/slab.h>
30 #include <linux/seq_file.h>
31 #include <linux/jhash.h>
32 #include <linux/random.h>
33 #include <linux/rcupdate_wait.h>
34
35 #include <net/net_namespace.h>
36 #include <net/ip_vs.h>
37
38
39 #ifndef CONFIG_IP_VS_TAB_BITS
40 #define CONFIG_IP_VS_TAB_BITS 12
41 #endif
42
43 /*
44 * Connection hash size. Default is what was selected at compile time.
45 */
46 static int ip_vs_conn_tab_bits = CONFIG_IP_VS_TAB_BITS;
47 module_param_named(conn_tab_bits, ip_vs_conn_tab_bits, int, 0444);
48 MODULE_PARM_DESC(conn_tab_bits, "Set connections' hash size");
49
50 /* Max table size */
51 int ip_vs_conn_tab_size __read_mostly;
52
53 /* SLAB cache for IPVS connections */
54 static struct kmem_cache *ip_vs_conn_cachep __read_mostly;
55
56 /* We need an addrstrlen that works with or without v6 */
57 #ifdef CONFIG_IP_VS_IPV6
58 #define IP_VS_ADDRSTRLEN INET6_ADDRSTRLEN
59 #else
60 #define IP_VS_ADDRSTRLEN (8+1)
61 #endif
62
63 /* Connection hashing:
64 * - hash (add conn) and unhash (del conn) are safe for RCU readers walking
65 * the bucket, they will not jump to another bucket or hash table and to miss
66 * conns
67 * - rehash (fill cport) hashes the conn to new bucket or even new table,
68 * so we use seqcount to retry lookups on buckets where we delete
69 * conns (unhash) because after hashing their next ptr can point to another
70 * bucket or hash table
71 * - hash table resize works like rehash but always rehashes into new table
72 * - bit lock on bucket serializes all operations that modify the chain
73 * - on resize, bucket from the old table is locked before bucket from the
74 * new table
75 * - cp->lock protects conn fields like cp->flags, cp->dest
76 */
77
78 /**
79 * conn_tab_lock - Lock conn_tab buckets for conn hash/unhash, not for rehash
80 * @t: hash table for hn0, new_tbl when new_hash=true
81 * @t2: hash table for hn1, new_tbl when new_hash2=true
82 * @cp: connection
83 * @hash_key: hash key for hn0
84 * @hash_key2: hash key for hn1
85 * @use2: using hn1 (double hashing) based on the forwarding method
86 * @new_hash: mode for hn0, hash node (true) or seek node (false)
87 * @new_hash2: mode for hn1, hash node (true) or seek node (false)
88 * @head_ret: returned head for hn0
89 * @head2_ret: returned head for hn1
90 *
91 * We support 3 modes:
92 * - seek mode for both nodes, used for unhashing
93 * - hash mode for both nodes, used for hashing
94 * - seek hn0 and hash hn1, used when forwarding method is changed
95 */
96 static __always_inline void
conn_tab_lock(struct ip_vs_rht * t,struct ip_vs_rht * t2,struct ip_vs_conn * cp,u32 hash_key,u32 hash_key2,bool use2,bool new_hash,bool new_hash2,struct hlist_bl_head ** head_ret,struct hlist_bl_head ** head2_ret)97 conn_tab_lock(struct ip_vs_rht *t, struct ip_vs_rht *t2, struct ip_vs_conn *cp,
98 u32 hash_key, u32 hash_key2, bool use2, bool new_hash,
99 bool new_hash2, struct hlist_bl_head **head_ret,
100 struct hlist_bl_head **head2_ret)
101 {
102 struct hlist_bl_head *head, *head2;
103 u32 hash_key_new, hash_key_new2;
104 int idx = 0, idx2 = 0;
105
106 /* Advance idx2 when new_hash is not set but hash_key2
107 * is for new table
108 */
109 if (new_hash2 && use2 && t != t2)
110 idx2++;
111
112 if (!new_hash) {
113 /* We need to lock the bucket in the right table */
114
115 retry:
116 if (!ip_vs_rht_same_table(t, hash_key)) {
117 /* It is already moved to new table */
118 t = rcu_dereference(t->new_tbl);
119 /* Rehashing works in two steps and we may detect
120 * both nodes in different tables, use idx/idx2
121 * for proper lock ordering for heads.
122 */
123 idx++;
124 }
125 }
126 if (use2 && !new_hash2 && !ip_vs_rht_same_table(t2, hash_key2)) {
127 /* It is already moved to new table */
128 t2 = rcu_dereference(t2->new_tbl);
129 idx2++;
130 }
131
132 if (!use2)
133 idx2 = idx;
134 head = t->buckets + (hash_key & t->mask);
135 head2 = use2 ? t2->buckets + (hash_key2 & t2->mask) : head;
136
137 if (idx > idx2 || (head > head2 && idx == idx2)) {
138 hlist_bl_lock(head2);
139 hlist_bl_lock(head);
140 } else {
141 hlist_bl_lock(head);
142 if (head != head2)
143 hlist_bl_lock(head2);
144 }
145 if (!new_hash) {
146 bool changed;
147
148 /* Ensure hash_key is read under lock */
149 hash_key_new = READ_ONCE(cp->hn0.hash_key);
150 changed = hash_key != hash_key_new;
151 if (use2 && !new_hash2) {
152 hash_key_new2 = READ_ONCE(cp->hn1.hash_key);
153 changed |= hash_key2 != hash_key_new2;
154 } else {
155 hash_key_new2 = hash_key2;
156 }
157 /* Hash changed ? */
158 if (changed) {
159 if (head != head2)
160 hlist_bl_unlock(head2);
161 hlist_bl_unlock(head);
162 hash_key = hash_key_new;
163 hash_key2 = hash_key_new2;
164 goto retry;
165 }
166 }
167 *head_ret = head;
168 *head2_ret = head2;
169 }
170
conn_tab_unlock(struct hlist_bl_head * head,struct hlist_bl_head * head2)171 static inline void conn_tab_unlock(struct hlist_bl_head *head,
172 struct hlist_bl_head *head2)
173 {
174 if (head != head2)
175 hlist_bl_unlock(head2);
176 hlist_bl_unlock(head);
177 }
178
179 static void ip_vs_conn_expire(struct timer_list *t);
180
181 /*
182 * Returns hash value for IPVS connection entry
183 */
ip_vs_conn_hashkey(struct ip_vs_rht * t,int af,unsigned int proto,const union nf_inet_addr * addr,__be16 port,const union nf_inet_addr * laddr,__be16 lport)184 static u32 ip_vs_conn_hashkey(struct ip_vs_rht *t, int af, unsigned int proto,
185 const union nf_inet_addr *addr, __be16 port,
186 const union nf_inet_addr *laddr, __be16 lport)
187 {
188 u64 a = (u32)proto << 16 | (__force u32)port;
189 u64 d;
190
191 #ifdef CONFIG_IP_VS_IPV6
192 if (af == AF_INET6) {
193 u64 b = (u64)addr->all[0] << 32 | addr->all[1];
194 u64 c = (u64)addr->all[2] << 32 | addr->all[3];
195
196 a |= (u64)laddr->all[2] << 32 ^ (__force u32)lport;
197 c ^= laddr->all[1];
198 d = (u64)laddr->all[0] << 32 | laddr->all[3];
199 return (u32)siphash_4u64(a, b, c, d, &t->hash_key);
200 }
201 #endif
202 a |= (u64)addr->all[0] << 32;
203 d = (u64)laddr->all[0] << 32 | (__force u32)lport;
204 return (u32)siphash_2u64(a, d, &t->hash_key);
205 }
206
ip_vs_conn_hashkey_param(const struct ip_vs_conn_param * p,struct ip_vs_rht * t,bool inverse)207 static unsigned int ip_vs_conn_hashkey_param(const struct ip_vs_conn_param *p,
208 struct ip_vs_rht *t, bool inverse)
209 {
210 const union nf_inet_addr *laddr;
211 const union nf_inet_addr *addr;
212 __be16 lport;
213 __be16 port;
214
215 if (p->pe_data && p->pe->hashkey_raw)
216 return p->pe->hashkey_raw(p, t, inverse);
217
218 if (likely(!inverse)) {
219 addr = p->caddr;
220 port = p->cport;
221 laddr = p->vaddr;
222 lport = p->vport;
223 } else {
224 addr = p->vaddr;
225 port = p->vport;
226 laddr = p->caddr;
227 lport = p->cport;
228 }
229
230 return ip_vs_conn_hashkey(t, p->af, p->protocol, addr, port, laddr,
231 lport);
232 }
233
ip_vs_conn_hashkey_conn(struct ip_vs_rht * t,const struct ip_vs_conn * cp,bool out)234 static unsigned int ip_vs_conn_hashkey_conn(struct ip_vs_rht *t,
235 const struct ip_vs_conn *cp,
236 bool out)
237 {
238 struct ip_vs_conn_param p;
239
240 if (!out)
241 ip_vs_conn_fill_param(cp->ipvs, cp->af, cp->protocol,
242 &cp->caddr, cp->cport, &cp->vaddr,
243 cp->vport, &p);
244 else
245 ip_vs_conn_fill_param(cp->ipvs, cp->af, cp->protocol,
246 &cp->daddr, cp->dport, &cp->caddr,
247 cp->cport, &p);
248
249 if (cp->pe) {
250 p.pe = cp->pe;
251 p.pe_data = cp->pe_data;
252 p.pe_data_len = cp->pe_data_len;
253 }
254
255 return ip_vs_conn_hashkey_param(&p, t, out);
256 }
257
258 /* Hashes ip_vs_conn in conn_tab
259 * returns bool success.
260 */
ip_vs_conn_hash(struct ip_vs_conn * cp)261 static inline int ip_vs_conn_hash(struct ip_vs_conn *cp)
262 {
263 struct netns_ipvs *ipvs = cp->ipvs;
264 struct hlist_bl_head *head, *head2;
265 u32 hash_key, hash_key2;
266 struct ip_vs_rht *t;
267 u32 hash, hash2;
268 bool use2;
269 int ret;
270
271 if (cp->flags & IP_VS_CONN_F_ONE_PACKET)
272 return 0;
273
274 /* New entries go into recent table */
275 t = rcu_dereference(ipvs->conn_tab);
276 t = rcu_dereference(t->new_tbl);
277
278 hash = ip_vs_conn_hashkey_conn(t, cp, false);
279 hash_key = ip_vs_rht_build_hash_key(t, hash);
280 if (ip_vs_conn_use_hash2(cp)) {
281 hash2 = ip_vs_conn_hashkey_conn(t, cp, true);
282 hash_key2 = ip_vs_rht_build_hash_key(t, hash2);
283 use2 = true;
284 } else {
285 hash_key2 = hash_key;
286 use2 = false;
287 }
288
289 local_bh_disable();
290 conn_tab_lock(t, t, cp, hash_key, hash_key2, use2, true /* new_hash */,
291 true /* new_hash2 */, &head, &head2);
292
293 cp->flags |= IP_VS_CONN_F_HASHED;
294 WRITE_ONCE(cp->hn0.hash_key, hash_key);
295 WRITE_ONCE(cp->hn1.hash_key, hash_key2);
296 refcount_inc(&cp->refcnt);
297 hlist_bl_add_head_rcu(&cp->hn0.node, head);
298 if (use2)
299 hlist_bl_add_head_rcu(&cp->hn1.node, head2);
300
301 conn_tab_unlock(head, head2);
302 local_bh_enable();
303 ret = 1;
304
305 /* Schedule resizing if load increases */
306 if (atomic_read(&ipvs->conn_count) > t->u_thresh &&
307 !test_and_set_bit(IP_VS_WORK_CONN_RESIZE, &ipvs->work_flags))
308 mod_delayed_work(system_dfl_long_wq, &ipvs->conn_resize_work, 0);
309
310 return ret;
311 }
312
313 /* Try to unlink ip_vs_conn from conn_tab.
314 * returns bool success.
315 */
ip_vs_conn_unlink(struct ip_vs_conn * cp)316 static inline bool ip_vs_conn_unlink(struct ip_vs_conn *cp)
317 {
318 struct netns_ipvs *ipvs = cp->ipvs;
319 struct hlist_bl_head *head, *head2;
320 u32 hash_key, hash_key2;
321 struct ip_vs_rht *t;
322 bool ret = false;
323 bool use2;
324
325 if (cp->flags & IP_VS_CONN_F_ONE_PACKET)
326 return refcount_dec_if_one(&cp->refcnt);
327
328 rcu_read_lock();
329 local_bh_disable();
330
331 t = rcu_dereference(ipvs->conn_tab);
332 hash_key = READ_ONCE(cp->hn0.hash_key);
333 hash_key2 = READ_ONCE(cp->hn1.hash_key);
334 use2 = ip_vs_conn_use_hash2(cp);
335
336 conn_tab_lock(t, t, cp, hash_key, hash_key2, use2, false /* new_hash */,
337 false /* new_hash2 */, &head, &head2);
338
339 if (cp->flags & IP_VS_CONN_F_HASHED) {
340 /* Decrease refcnt and unlink conn only if we are last user */
341 if (use2 == ip_vs_conn_use_hash2(cp) &&
342 refcount_dec_if_one(&cp->refcnt)) {
343 hlist_bl_del_rcu(&cp->hn0.node);
344 if (use2)
345 hlist_bl_del_rcu(&cp->hn1.node);
346 cp->flags &= ~IP_VS_CONN_F_HASHED;
347 ret = true;
348 }
349 }
350
351 conn_tab_unlock(head, head2);
352
353 local_bh_enable();
354 rcu_read_unlock();
355
356 return ret;
357 }
358
359
360 /*
361 * Gets ip_vs_conn associated with supplied parameters in the conn_tab.
362 * Called for pkts coming from OUTside-to-INside.
363 * p->caddr, p->cport: pkt source address (foreign host)
364 * p->vaddr, p->vport: pkt dest address (load balancer)
365 */
366 static inline struct ip_vs_conn *
__ip_vs_conn_in_get(const struct ip_vs_conn_param * p)367 __ip_vs_conn_in_get(const struct ip_vs_conn_param *p)
368 {
369 DECLARE_IP_VS_RHT_WALK_BUCKET_RCU();
370 struct netns_ipvs *ipvs = p->ipvs;
371 struct ip_vs_conn_hnode *hn;
372 struct hlist_bl_head *head;
373 struct ip_vs_rht *t, *pt;
374 struct hlist_bl_node *e;
375 struct ip_vs_conn *cp;
376 u32 hash, hash_key;
377
378 rcu_read_lock();
379
380 ip_vs_rht_for_each_table_rcu(ipvs->conn_tab, t, pt) {
381 hash = ip_vs_conn_hashkey_param(p, t, false);
382 hash_key = ip_vs_rht_build_hash_key(t, hash);
383 ip_vs_rht_walk_bucket_rcu(t, hash_key, head) {
384 hlist_bl_for_each_entry_rcu(hn, e, head, node) {
385 if (READ_ONCE(hn->hash_key) != hash_key ||
386 hn->dir != 0)
387 continue;
388 cp = ip_vs_hn0_to_conn(hn);
389 if (p->cport == cp->cport &&
390 p->vport == cp->vport && cp->af == p->af &&
391 ip_vs_addr_equal(p->af, p->caddr,
392 &cp->caddr) &&
393 ip_vs_addr_equal(p->af, p->vaddr,
394 &cp->vaddr) &&
395 (!p->cport ^
396 (!(cp->flags & IP_VS_CONN_F_NO_CPORT))) &&
397 p->protocol == cp->protocol) {
398 if (__ip_vs_conn_get(cp)) {
399 /* HIT */
400 rcu_read_unlock();
401 return cp;
402 }
403 }
404 }
405 }
406 }
407
408 rcu_read_unlock();
409
410 return NULL;
411 }
412
ip_vs_conn_in_get(const struct ip_vs_conn_param * p)413 struct ip_vs_conn *ip_vs_conn_in_get(const struct ip_vs_conn_param *p)
414 {
415 struct ip_vs_conn *cp;
416
417 cp = __ip_vs_conn_in_get(p);
418 if (!cp) {
419 struct netns_ipvs *ipvs = p->ipvs;
420 int af_id = ip_vs_af_index(p->af);
421
422 if (atomic_read(&ipvs->no_cport_conns[af_id])) {
423 struct ip_vs_conn_param cport_zero_p = *p;
424
425 cport_zero_p.cport = 0;
426 cp = __ip_vs_conn_in_get(&cport_zero_p);
427 }
428 }
429
430 IP_VS_DBG_BUF(9, "lookup/in %s %s:%d->%s:%d %s\n",
431 ip_vs_proto_name(p->protocol),
432 IP_VS_DBG_ADDR(p->af, p->caddr), ntohs(p->cport),
433 IP_VS_DBG_ADDR(p->af, p->vaddr), ntohs(p->vport),
434 cp ? "hit" : "not hit");
435
436 return cp;
437 }
438
439 static int
ip_vs_conn_fill_param_proto(struct netns_ipvs * ipvs,int af,const struct sk_buff * skb,const struct ip_vs_iphdr * iph,struct ip_vs_conn_param * p)440 ip_vs_conn_fill_param_proto(struct netns_ipvs *ipvs,
441 int af, const struct sk_buff *skb,
442 const struct ip_vs_iphdr *iph,
443 struct ip_vs_conn_param *p)
444 {
445 __be16 _ports[2], *pptr;
446
447 pptr = frag_safe_skb_hp(skb, iph->len, sizeof(_ports), _ports);
448 if (pptr == NULL)
449 return 1;
450
451 if (likely(!ip_vs_iph_inverse(iph)))
452 ip_vs_conn_fill_param(ipvs, af, iph->protocol, &iph->saddr,
453 pptr[0], &iph->daddr, pptr[1], p);
454 else
455 ip_vs_conn_fill_param(ipvs, af, iph->protocol, &iph->daddr,
456 pptr[1], &iph->saddr, pptr[0], p);
457 return 0;
458 }
459
460 struct ip_vs_conn *
ip_vs_conn_in_get_proto(struct netns_ipvs * ipvs,int af,const struct sk_buff * skb,const struct ip_vs_iphdr * iph)461 ip_vs_conn_in_get_proto(struct netns_ipvs *ipvs, int af,
462 const struct sk_buff *skb,
463 const struct ip_vs_iphdr *iph)
464 {
465 struct ip_vs_conn_param p;
466
467 if (ip_vs_conn_fill_param_proto(ipvs, af, skb, iph, &p))
468 return NULL;
469
470 return ip_vs_conn_in_get(&p);
471 }
472 EXPORT_SYMBOL_GPL(ip_vs_conn_in_get_proto);
473
474 /* Get reference to connection template */
ip_vs_ct_in_get(const struct ip_vs_conn_param * p)475 struct ip_vs_conn *ip_vs_ct_in_get(const struct ip_vs_conn_param *p)
476 {
477 DECLARE_IP_VS_RHT_WALK_BUCKET_RCU();
478 struct netns_ipvs *ipvs = p->ipvs;
479 struct ip_vs_conn_hnode *hn;
480 struct hlist_bl_head *head;
481 struct ip_vs_rht *t, *pt;
482 struct hlist_bl_node *e;
483 struct ip_vs_conn *cp;
484 u32 hash, hash_key;
485
486 rcu_read_lock();
487
488 ip_vs_rht_for_each_table_rcu(ipvs->conn_tab, t, pt) {
489 hash = ip_vs_conn_hashkey_param(p, t, false);
490 hash_key = ip_vs_rht_build_hash_key(t, hash);
491 ip_vs_rht_walk_bucket_rcu(t, hash_key, head) {
492 hlist_bl_for_each_entry_rcu(hn, e, head, node) {
493 if (READ_ONCE(hn->hash_key) != hash_key ||
494 hn->dir != 0)
495 continue;
496 cp = ip_vs_hn0_to_conn(hn);
497 if (unlikely(p->pe_data && p->pe->ct_match)) {
498 if (p->pe == cp->pe &&
499 p->pe->ct_match(p, cp) &&
500 __ip_vs_conn_get(cp))
501 goto out;
502 continue;
503 }
504 if (cp->af == p->af &&
505 ip_vs_addr_equal(p->af, p->caddr,
506 &cp->caddr) &&
507 /* protocol should only be IPPROTO_IP if
508 * p->vaddr is a fwmark
509 */
510 ip_vs_addr_equal(p->protocol == IPPROTO_IP ?
511 AF_UNSPEC : p->af,
512 p->vaddr, &cp->vaddr) &&
513 p->vport == cp->vport &&
514 p->cport == cp->cport &&
515 cp->flags & IP_VS_CONN_F_TEMPLATE &&
516 p->protocol == cp->protocol &&
517 cp->dport != htons(0xffff)) {
518 if (__ip_vs_conn_get(cp))
519 goto out;
520 }
521 }
522 }
523
524 }
525 cp = NULL;
526
527 out:
528 rcu_read_unlock();
529
530 IP_VS_DBG_BUF(9, "template lookup/in %s %s:%d->%s:%d %s\n",
531 ip_vs_proto_name(p->protocol),
532 IP_VS_DBG_ADDR(p->af, p->caddr), ntohs(p->cport),
533 IP_VS_DBG_ADDR(p->af, p->vaddr), ntohs(p->vport),
534 cp ? "hit" : "not hit");
535
536 return cp;
537 }
538
539 /* Gets ip_vs_conn associated with supplied parameters in the conn_tab.
540 * Called for pkts coming from inside-to-OUTside.
541 * p->caddr, p->cport: pkt source address (inside host)
542 * p->vaddr, p->vport: pkt dest address (foreign host) */
ip_vs_conn_out_get(const struct ip_vs_conn_param * p)543 struct ip_vs_conn *ip_vs_conn_out_get(const struct ip_vs_conn_param *p)
544 {
545 DECLARE_IP_VS_RHT_WALK_BUCKET_RCU();
546 struct netns_ipvs *ipvs = p->ipvs;
547 const union nf_inet_addr *saddr;
548 struct ip_vs_conn_hnode *hn;
549 struct hlist_bl_head *head;
550 struct ip_vs_rht *t, *pt;
551 struct hlist_bl_node *e;
552 struct ip_vs_conn *cp;
553 u32 hash, hash_key;
554 __be16 sport;
555
556 rcu_read_lock();
557
558 ip_vs_rht_for_each_table_rcu(ipvs->conn_tab, t, pt) {
559 hash = ip_vs_conn_hashkey_param(p, t, true);
560 hash_key = ip_vs_rht_build_hash_key(t, hash);
561 ip_vs_rht_walk_bucket_rcu(t, hash_key, head) {
562 hlist_bl_for_each_entry_rcu(hn, e, head, node) {
563 /* dir can be 0 for DR/TUN */
564 if (READ_ONCE(hn->hash_key) != hash_key)
565 continue;
566 cp = ip_vs_hn_to_conn(hn);
567 if (p->vport != cp->cport)
568 continue;
569
570 if (IP_VS_FWD_METHOD(cp) != IP_VS_CONN_F_MASQ) {
571 sport = cp->vport;
572 saddr = &cp->vaddr;
573 } else {
574 sport = cp->dport;
575 saddr = &cp->daddr;
576 }
577
578 if (p->cport == sport && cp->af == p->af &&
579 ip_vs_addr_equal(p->af, p->vaddr,
580 &cp->caddr) &&
581 ip_vs_addr_equal(p->af, p->caddr, saddr) &&
582 p->protocol == cp->protocol) {
583 if (__ip_vs_conn_get(cp))
584 goto out;
585 }
586 }
587 }
588 }
589 cp = NULL;
590
591 out:
592 rcu_read_unlock();
593
594 IP_VS_DBG_BUF(9, "lookup/out %s %s:%d->%s:%d %s\n",
595 ip_vs_proto_name(p->protocol),
596 IP_VS_DBG_ADDR(p->af, p->caddr), ntohs(p->cport),
597 IP_VS_DBG_ADDR(p->af, p->vaddr), ntohs(p->vport),
598 cp ? "hit" : "not hit");
599
600 return cp;
601 }
602
603 struct ip_vs_conn *
ip_vs_conn_out_get_proto(struct netns_ipvs * ipvs,int af,const struct sk_buff * skb,const struct ip_vs_iphdr * iph)604 ip_vs_conn_out_get_proto(struct netns_ipvs *ipvs, int af,
605 const struct sk_buff *skb,
606 const struct ip_vs_iphdr *iph)
607 {
608 struct ip_vs_conn_param p;
609
610 if (ip_vs_conn_fill_param_proto(ipvs, af, skb, iph, &p))
611 return NULL;
612
613 return ip_vs_conn_out_get(&p);
614 }
615 EXPORT_SYMBOL_GPL(ip_vs_conn_out_get_proto);
616
617 /*
618 * Put back the conn and restart its timer with its timeout
619 */
__ip_vs_conn_put_timer(struct ip_vs_conn * cp)620 static void __ip_vs_conn_put_timer(struct ip_vs_conn *cp)
621 {
622 unsigned long t = (cp->flags & IP_VS_CONN_F_ONE_PACKET) ?
623 0 : cp->timeout;
624 mod_timer(&cp->timer, jiffies+t);
625
626 __ip_vs_conn_put(cp);
627 }
628
ip_vs_conn_put(struct ip_vs_conn * cp)629 void ip_vs_conn_put(struct ip_vs_conn *cp)
630 {
631 if ((cp->flags & IP_VS_CONN_F_ONE_PACKET) &&
632 (refcount_read(&cp->refcnt) == 1) &&
633 !timer_pending(&cp->timer))
634 /* expire connection immediately */
635 ip_vs_conn_expire(&cp->timer);
636 else
637 __ip_vs_conn_put_timer(cp);
638 }
639
640 /*
641 * Fill a no_client_port connection with a client port number
642 */
ip_vs_conn_fill_cport(struct ip_vs_conn * cp,__be16 cport)643 void ip_vs_conn_fill_cport(struct ip_vs_conn *cp, __be16 cport)
644 {
645 struct hlist_bl_head *head, *head2, *head_new;
646 bool use2 = ip_vs_conn_use_hash2(cp);
647 struct netns_ipvs *ipvs = cp->ipvs;
648 int af_id = ip_vs_af_index(cp->af);
649 u32 hash_r = 0, hash_key_r = 0;
650 struct ip_vs_rht *t, *tp, *t2;
651 struct ip_vs_conn_hnode *hn;
652 u32 hash_key, hash_key_new;
653 struct ip_vs_conn_param p;
654 bool by_me = false;
655 int ntbl;
656 int dir;
657
658 restart:
659 /* No packets from inside, so we can do it in 2 steps. */
660 dir = use2 ? 1 : 0;
661
662 next_dir:
663 if (dir)
664 ip_vs_conn_fill_param(ipvs, cp->af, cp->protocol, &cp->daddr,
665 cp->dport, &cp->caddr, cport, &p);
666 else
667 ip_vs_conn_fill_param(ipvs, cp->af, cp->protocol, &cp->caddr,
668 cport, &cp->vaddr, cp->vport, &p);
669 hn = dir ? &cp->hn1 : &cp->hn0;
670 ntbl = 0;
671
672 /* Attempt to rehash cp safely, by informing seqcount readers */
673 t = rcu_dereference(ipvs->conn_tab);
674 hash_key = READ_ONCE(hn->hash_key);
675 tp = NULL;
676
677 retry:
678 /* Moved to new table ? */
679 if (!ip_vs_rht_same_table(t, hash_key)) {
680 t = rcu_dereference(t->new_tbl);
681 ntbl++;
682 /* We are lost? */
683 if (ntbl >= 2) {
684 spin_lock_bh(&cp->lock);
685 if (cp->flags & IP_VS_CONN_F_NO_CPORT && by_me)
686 cp->cport = 0;
687 /* hn1 will be rehashed on next packet */
688 spin_unlock_bh(&cp->lock);
689 IP_VS_ERR_RL("%s(): Too many ht changes for dir %d\n",
690 __func__, dir);
691 return;
692 }
693 }
694
695 /* Rehashing during resize? Use the recent table for adds */
696 t2 = rcu_dereference(t->new_tbl);
697 /* Calc new hash once per table */
698 if (tp != t2) {
699 hash_r = ip_vs_conn_hashkey_param(&p, t2, dir);
700 hash_key_r = ip_vs_rht_build_hash_key(t2, hash_r);
701 tp = t2;
702 }
703 head = t->buckets + (hash_key & t->mask);
704 head2 = t2->buckets + (hash_key_r & t2->mask);
705 head_new = head2;
706
707 if (head > head2 && t == t2)
708 swap(head, head2);
709
710 /* Protect the cp->flags modification */
711 spin_lock_bh(&cp->lock);
712
713 /* Recheck the forwarding method under lock */
714 if (use2 != ip_vs_conn_use_hash2(cp)) {
715 use2 = !use2;
716 if (use2) {
717 spin_unlock_bh(&cp->lock);
718 /* Restart with new use2 value */
719 goto restart;
720 }
721 if (dir) {
722 /* Not started yet, so just skip dir 1 */
723 spin_unlock_bh(&cp->lock);
724 dir--;
725 goto next_dir;
726 }
727 /* Just finish dir 0 */
728 }
729
730 /* Lock seqcount only for the old bucket, even if we are on new table
731 * because it affects the del operation, not the adding.
732 */
733 spin_lock(&t->lock[hash_key & t->lock_mask].l);
734 preempt_disable_nested();
735 write_seqcount_begin(&t->seqc[hash_key & t->seqc_mask]);
736
737 /* Lock buckets in same (increasing) order */
738 hlist_bl_lock(head);
739 if (head != head2)
740 hlist_bl_lock(head2);
741
742 /* Ensure hash_key is read under lock */
743 hash_key_new = READ_ONCE(hn->hash_key);
744 /* Racing with another rehashing ? */
745 if (unlikely(hash_key != hash_key_new)) {
746 if (head != head2)
747 hlist_bl_unlock(head2);
748 hlist_bl_unlock(head);
749 write_seqcount_end(&t->seqc[hash_key & t->seqc_mask]);
750 preempt_enable_nested();
751 spin_unlock(&t->lock[hash_key & t->lock_mask].l);
752 spin_unlock_bh(&cp->lock);
753 hash_key = hash_key_new;
754 goto retry;
755 }
756
757 /* Fill cport once, even if multiple packets try to do it */
758 if (cp->flags & IP_VS_CONN_F_NO_CPORT && (!cp->cport || by_me)) {
759 /* If we race with resizing make sure cport is set for dir 1 */
760 if (!cp->cport) {
761 cp->cport = cport;
762 by_me = true;
763 }
764 if (!dir) {
765 atomic_dec(&ipvs->no_cport_conns[af_id]);
766 cp->flags &= ~IP_VS_CONN_F_NO_CPORT;
767 }
768 /* We do not recalc hash_key_r under lock, we assume the
769 * parameters in cp do not change, i.e. cport is
770 * the only possible change.
771 */
772 WRITE_ONCE(hn->hash_key, hash_key_r);
773 if (!use2)
774 WRITE_ONCE(cp->hn1.hash_key, hash_key_r);
775 /* For dir=1 we do not check in flags if hn is already
776 * rehashed but this check will do it.
777 */
778 if (head != head2) {
779 hlist_bl_del_rcu(&hn->node);
780 hlist_bl_add_head_rcu(&hn->node, head_new);
781 }
782 }
783
784 if (head != head2)
785 hlist_bl_unlock(head2);
786 hlist_bl_unlock(head);
787 write_seqcount_end(&t->seqc[hash_key & t->seqc_mask]);
788 preempt_enable_nested();
789 spin_unlock(&t->lock[hash_key & t->lock_mask].l);
790
791 spin_unlock_bh(&cp->lock);
792 if (dir-- && by_me)
793 goto next_dir;
794 }
795
796 /* Change forwarding method for hashed conn */
ip_vs_conn_change_fwd_mask(struct ip_vs_conn * cp,u32 new_flags)797 static void ip_vs_conn_change_fwd_mask(struct ip_vs_conn *cp, u32 new_flags)
798 {
799 struct netns_ipvs *ipvs = cp->ipvs;
800 struct hlist_bl_head *head, *head2;
801 u32 hash2, hash_key, hash_key2;
802 struct ip_vs_rht *t, *t2;
803
804 /* See ip_vs_conn_use_hash2() for reference */
805 if ((cp->flags & IP_VS_CONN_F_TEMPLATE) ||
806 /* No change in double hashing ? */
807 (IP_VS_FWD_METHOD(cp) == IP_VS_CONN_F_MASQ) ==
808 ((new_flags & IP_VS_CONN_F_FWD_MASK) == IP_VS_CONN_F_MASQ)) {
809 cp->flags = new_flags;
810 return;
811 }
812 t = rcu_dereference(ipvs->conn_tab);
813 if (ip_vs_conn_use_hash2(cp)) {
814 /* Stop double hashing */
815 hash_key = READ_ONCE(cp->hn0.hash_key);
816 hash_key2 = READ_ONCE(cp->hn1.hash_key);
817
818 conn_tab_lock(t, t, cp, hash_key, hash_key2, true /* use2 */,
819 false /* new_hash */, false /* new_hash2 */,
820 &head, &head2);
821
822 /* Keep both hash keys in same table */
823 hash_key = READ_ONCE(cp->hn0.hash_key);
824 WRITE_ONCE(cp->hn1.hash_key, hash_key);
825 hlist_bl_del_rcu(&cp->hn1.node);
826 cp->flags = new_flags;
827
828 conn_tab_unlock(head, head2);
829 } else {
830 /* Start double hashing */
831
832 hash_key = READ_ONCE(cp->hn0.hash_key);
833
834 t2 = rcu_dereference(t->new_tbl);
835 hash2 = ip_vs_conn_hashkey_conn(t2, cp, true);
836 hash_key2 = ip_vs_rht_build_hash_key(t2, hash2);
837
838 /* Change the forwarding method under locked hn0 */
839 conn_tab_lock(t, t2, cp, hash_key, hash_key2, true /* use2 */,
840 false /* new_hash */, true /* new_hash2 */,
841 &head, &head2);
842
843 WRITE_ONCE(cp->hn1.hash_key, hash_key2);
844 cp->flags = new_flags;
845 hlist_bl_add_head_rcu(&cp->hn1.node, head2);
846
847 conn_tab_unlock(head, head2);
848 }
849 }
850
851 /* Get default load factor to map conn_count/u_thresh to t->size */
ip_vs_conn_default_load_factor(struct netns_ipvs * ipvs)852 static int ip_vs_conn_default_load_factor(struct netns_ipvs *ipvs)
853 {
854 int factor;
855
856 if (net_eq(ipvs->net, &init_net))
857 factor = -3;
858 else
859 factor = -1;
860 /* Double hashing adds twice more nodes for NAT */
861 factor--;
862 return factor;
863 }
864
865 /* Get the desired conn_tab size */
ip_vs_conn_desired_size(struct netns_ipvs * ipvs,struct ip_vs_rht * t,int lfactor)866 int ip_vs_conn_desired_size(struct netns_ipvs *ipvs, struct ip_vs_rht *t,
867 int lfactor)
868 {
869 return ip_vs_rht_desired_size(ipvs, t, atomic_read(&ipvs->conn_count),
870 lfactor, IP_VS_CONN_TAB_MIN_BITS,
871 ip_vs_conn_tab_bits);
872 }
873
874 /* Allocate conn_tab */
ip_vs_conn_tab_alloc(struct netns_ipvs * ipvs,int buckets,int lfactor)875 struct ip_vs_rht *ip_vs_conn_tab_alloc(struct netns_ipvs *ipvs, int buckets,
876 int lfactor)
877 {
878 struct ip_vs_rht *t;
879 int scounts, locks;
880
881 /* scounts: affects readers during resize */
882 scounts = clamp(buckets >> 6, 1, 256);
883 /* locks: based on parallel IP_VS_CONN_F_NO_CPORT operations + resize */
884 locks = clamp(8, 1, scounts);
885
886 t = ip_vs_rht_alloc(buckets, scounts, locks);
887 if (!t)
888 return NULL;
889 t->lfactor = lfactor;
890 ip_vs_rht_set_thresholds(t, t->size, lfactor, IP_VS_CONN_TAB_MIN_BITS,
891 ip_vs_conn_tab_bits);
892 return t;
893 }
894
895 /* conn_tab resizer work */
conn_resize_work_handler(struct work_struct * work)896 static void conn_resize_work_handler(struct work_struct *work)
897 {
898 struct hlist_bl_head *head, *head2;
899 unsigned int resched_score = 0;
900 struct hlist_bl_node *cn, *nn;
901 struct ip_vs_rht *t, *t_new;
902 struct ip_vs_conn_hnode *hn;
903 struct netns_ipvs *ipvs;
904 struct ip_vs_conn *cp;
905 bool more_work = false;
906 u32 hash, hash_key;
907 int limit = 0;
908 int new_size;
909 int lfactor;
910 u32 bucket;
911
912 ipvs = container_of(work, struct netns_ipvs, conn_resize_work.work);
913
914 /* Allow work to be queued again */
915 clear_bit(IP_VS_WORK_CONN_RESIZE, &ipvs->work_flags);
916 t = rcu_dereference_protected(ipvs->conn_tab, 1);
917 /* Do nothing if table is removed */
918 if (!t)
919 goto out;
920 /* New table needs to be registered? BUG! */
921 if (t != rcu_dereference_protected(t->new_tbl, 1))
922 goto out;
923
924 lfactor = sysctl_conn_lfactor(ipvs);
925 /* Should we resize ? */
926 new_size = ip_vs_conn_desired_size(ipvs, t, lfactor);
927 if (new_size == t->size && lfactor == t->lfactor)
928 goto out;
929
930 t_new = ip_vs_conn_tab_alloc(ipvs, new_size, lfactor);
931 if (!t_new) {
932 more_work = true;
933 goto out;
934 }
935 /* Flip the table_id */
936 t_new->table_id = t->table_id ^ IP_VS_RHT_TABLE_ID_MASK;
937
938 rcu_assign_pointer(t->new_tbl, t_new);
939
940 /* Wait RCU readers to see the new table, we do not want new
941 * conns to go into old table and to be left there.
942 */
943 synchronize_rcu();
944
945 ip_vs_rht_for_each_bucket(t, bucket, head) {
946 same_bucket:
947 if (++limit >= 16) {
948 if (resched_score >= 100) {
949 resched_score = 0;
950 cond_resched();
951 }
952 limit = 0;
953 }
954 if (hlist_bl_empty(head)) {
955 resched_score++;
956 continue;
957 }
958 /* Preemption calls ahead... */
959 resched_score = 0;
960
961 /* seqcount_t usage considering PREEMPT_RT rules:
962 * - other writers (SoftIRQ) => serialize with spin_lock_bh
963 * - readers (SoftIRQ) => disable BHs
964 * - readers (processes) => preemption should be disabled
965 */
966 spin_lock_bh(&t->lock[bucket & t->lock_mask].l);
967 preempt_disable_nested();
968 write_seqcount_begin(&t->seqc[bucket & t->seqc_mask]);
969 hlist_bl_lock(head);
970
971 hlist_bl_for_each_entry_safe(hn, cn, nn, head, node) {
972 cp = ip_vs_hn_to_conn(hn);
973 hash = ip_vs_conn_hashkey_conn(t_new, cp, hn->dir);
974 hash_key = ip_vs_rht_build_hash_key(t_new, hash);
975
976 head2 = t_new->buckets + (hash & t_new->mask);
977 hlist_bl_lock(head2);
978 /* t_new->seqc are not used at this stage, we race
979 * only with add/del, so only lock the bucket.
980 */
981 hlist_bl_del_rcu(&hn->node);
982 WRITE_ONCE(hn->hash_key, hash_key);
983 /* Keep both hash keys in sync if no double hashing */
984 if (!ip_vs_conn_use_hash2(cp))
985 WRITE_ONCE(cp->hn1.hash_key, hash_key);
986 hlist_bl_add_head_rcu(&hn->node, head2);
987 hlist_bl_unlock(head2);
988 /* Too long chain? Do it in steps */
989 if (++limit >= 64)
990 break;
991 }
992
993 hlist_bl_unlock(head);
994 write_seqcount_end(&t->seqc[bucket & t->seqc_mask]);
995 preempt_enable_nested();
996 spin_unlock_bh(&t->lock[bucket & t->lock_mask].l);
997 if (limit >= 64)
998 goto same_bucket;
999 }
1000
1001 rcu_assign_pointer(ipvs->conn_tab, t_new);
1002 /* Inform readers that new table is installed */
1003 smp_mb__before_atomic();
1004 atomic_inc(&ipvs->conn_tab_changes);
1005
1006 /* RCU readers should not see more than two tables in chain.
1007 * To prevent new table to be attached wait here instead of
1008 * freeing the old table in RCU callback.
1009 */
1010 synchronize_rcu();
1011 ip_vs_rht_free(t);
1012
1013 out:
1014 /* Monitor if we need to shrink table */
1015 queue_delayed_work(system_dfl_long_wq, &ipvs->conn_resize_work,
1016 more_work ? 1 : 2 * HZ);
1017 }
1018
1019 /*
1020 * Bind a connection entry with the corresponding packet_xmit.
1021 * Called by ip_vs_conn_new.
1022 */
ip_vs_bind_xmit(struct ip_vs_conn * cp)1023 static inline void ip_vs_bind_xmit(struct ip_vs_conn *cp)
1024 {
1025 switch (IP_VS_FWD_METHOD(cp)) {
1026 case IP_VS_CONN_F_MASQ:
1027 cp->packet_xmit = ip_vs_nat_xmit;
1028 break;
1029
1030 case IP_VS_CONN_F_TUNNEL:
1031 #ifdef CONFIG_IP_VS_IPV6
1032 if (cp->daf == AF_INET6)
1033 cp->packet_xmit = ip_vs_tunnel_xmit_v6;
1034 else
1035 #endif
1036 cp->packet_xmit = ip_vs_tunnel_xmit;
1037 break;
1038
1039 case IP_VS_CONN_F_DROUTE:
1040 cp->packet_xmit = ip_vs_dr_xmit;
1041 break;
1042
1043 case IP_VS_CONN_F_LOCALNODE:
1044 cp->packet_xmit = ip_vs_null_xmit;
1045 break;
1046
1047 case IP_VS_CONN_F_BYPASS:
1048 cp->packet_xmit = ip_vs_bypass_xmit;
1049 break;
1050 }
1051 }
1052
1053 #ifdef CONFIG_IP_VS_IPV6
ip_vs_bind_xmit_v6(struct ip_vs_conn * cp)1054 static inline void ip_vs_bind_xmit_v6(struct ip_vs_conn *cp)
1055 {
1056 switch (IP_VS_FWD_METHOD(cp)) {
1057 case IP_VS_CONN_F_MASQ:
1058 cp->packet_xmit = ip_vs_nat_xmit_v6;
1059 break;
1060
1061 case IP_VS_CONN_F_TUNNEL:
1062 if (cp->daf == AF_INET6)
1063 cp->packet_xmit = ip_vs_tunnel_xmit_v6;
1064 else
1065 cp->packet_xmit = ip_vs_tunnel_xmit;
1066 break;
1067
1068 case IP_VS_CONN_F_DROUTE:
1069 cp->packet_xmit = ip_vs_dr_xmit_v6;
1070 break;
1071
1072 case IP_VS_CONN_F_LOCALNODE:
1073 cp->packet_xmit = ip_vs_null_xmit;
1074 break;
1075
1076 case IP_VS_CONN_F_BYPASS:
1077 cp->packet_xmit = ip_vs_bypass_xmit_v6;
1078 break;
1079 }
1080 }
1081 #endif
1082
1083
1084 /*
1085 * Bind a connection entry with a virtual service destination
1086 * Called just after a new connection entry is created.
1087 */
1088 static inline void
ip_vs_bind_dest(struct ip_vs_conn * cp,struct ip_vs_dest * dest)1089 ip_vs_bind_dest(struct ip_vs_conn *cp, struct ip_vs_dest *dest)
1090 {
1091 unsigned int conn_flags;
1092 __u32 flags;
1093
1094 /* if dest is NULL, then return directly */
1095 if (!dest)
1096 return;
1097
1098 /* Increase the refcnt counter of the dest */
1099 ip_vs_dest_hold(dest);
1100
1101 conn_flags = atomic_read(&dest->conn_flags);
1102 if (cp->protocol != IPPROTO_UDP)
1103 conn_flags &= ~IP_VS_CONN_F_ONE_PACKET;
1104 flags = cp->flags;
1105 /* Only visible templates can control multiple connections */
1106 if (flags & IP_VS_CONN_F_TEMPLATE)
1107 conn_flags &= ~IP_VS_CONN_F_ONE_PACKET;
1108 /* Bind with the destination and its corresponding transmitter */
1109 if (flags & IP_VS_CONN_F_SYNC) {
1110 /* Synced conns are hashed, so they can not get this flag */
1111 conn_flags &= ~IP_VS_CONN_F_ONE_PACKET;
1112
1113 /* if the connection is not template and is created
1114 * by sync, preserve the activity flag.
1115 */
1116 if (!(flags & IP_VS_CONN_F_TEMPLATE))
1117 conn_flags &= ~IP_VS_CONN_F_INACTIVE;
1118 /* connections inherit forwarding method from dest */
1119 flags &= ~(IP_VS_CONN_F_FWD_MASK | IP_VS_CONN_F_NOOUTPUT);
1120 flags |= conn_flags;
1121 /* Changing forwarding method for hashed conn can
1122 * happen only under locks
1123 */
1124 if (cp->flags & IP_VS_CONN_F_HASHED)
1125 ip_vs_conn_change_fwd_mask(cp, flags);
1126 else
1127 cp->flags = flags;
1128 } else {
1129 flags |= conn_flags;
1130 cp->flags = flags;
1131 }
1132 cp->dest = dest;
1133
1134 IP_VS_DBG_BUF(7, "Bind-dest %s c:%s:%d v:%s:%d "
1135 "d:%s:%d fwd:%c s:%u conn->flags:%X conn->refcnt:%d "
1136 "dest->refcnt:%d\n",
1137 ip_vs_proto_name(cp->protocol),
1138 IP_VS_DBG_ADDR(cp->af, &cp->caddr), ntohs(cp->cport),
1139 IP_VS_DBG_ADDR(cp->af, &cp->vaddr), ntohs(cp->vport),
1140 IP_VS_DBG_ADDR(cp->daf, &cp->daddr), ntohs(cp->dport),
1141 ip_vs_fwd_tag(cp), cp->state,
1142 cp->flags, refcount_read(&cp->refcnt),
1143 refcount_read(&dest->refcnt));
1144
1145 /* Update the connection counters */
1146 if (!(flags & IP_VS_CONN_F_TEMPLATE)) {
1147 int tc;
1148
1149 /* It is a normal connection, so modify the counters
1150 * according to the flags, later the protocol can
1151 * update them on state change
1152 */
1153 if (!(flags & IP_VS_CONN_F_INACTIVE))
1154 atomic_inc(&dest->activeconns);
1155 tc = atomic_inc_return(&dest->totalconns);
1156 if (tc == READ_ONCE(dest->u_threshold))
1157 ip_vs_dest_update_overload(dest, 1);
1158 } else {
1159 /* It is a persistent connection/template, so increase
1160 the persistent connection counter */
1161 atomic_inc(&dest->persistconns);
1162 }
1163 }
1164
1165
1166 /*
1167 * Check if there is a destination for the connection, if so
1168 * bind the connection to the destination.
1169 */
ip_vs_try_bind_dest(struct ip_vs_conn * cp)1170 void ip_vs_try_bind_dest(struct ip_vs_conn *cp)
1171 {
1172 struct ip_vs_dest *dest;
1173
1174 rcu_read_lock();
1175
1176 /* This function is only invoked by the synchronization code. We do
1177 * not currently support heterogeneous pools with synchronization,
1178 * so we can make the assumption that the svc_af is the same as the
1179 * dest_af
1180 */
1181 dest = ip_vs_find_dest(cp->ipvs, cp->af, cp->af, &cp->daddr,
1182 cp->dport, &cp->vaddr, cp->vport,
1183 cp->protocol, cp->fwmark, cp->flags);
1184 if (dest) {
1185 struct ip_vs_proto_data *pd;
1186
1187 spin_lock_bh(&cp->lock);
1188 if (cp->dest) {
1189 spin_unlock_bh(&cp->lock);
1190 rcu_read_unlock();
1191 return;
1192 }
1193
1194 /* Applications work depending on the forwarding method
1195 * but better to reassign them always when binding dest */
1196 if (cp->app)
1197 ip_vs_unbind_app(cp);
1198
1199 ip_vs_bind_dest(cp, dest);
1200 spin_unlock_bh(&cp->lock);
1201
1202 /* Update its packet transmitter */
1203 cp->packet_xmit = NULL;
1204 #ifdef CONFIG_IP_VS_IPV6
1205 if (cp->af == AF_INET6)
1206 ip_vs_bind_xmit_v6(cp);
1207 else
1208 #endif
1209 ip_vs_bind_xmit(cp);
1210
1211 pd = ip_vs_proto_data_get(cp->ipvs, cp->protocol);
1212 if (pd && atomic_read(&pd->appcnt))
1213 ip_vs_bind_app(cp, pd->pp);
1214 }
1215 rcu_read_unlock();
1216 }
1217
1218
1219 /*
1220 * Unbind a connection entry with its VS destination
1221 * Called by the ip_vs_conn_expire function.
1222 */
ip_vs_unbind_dest(struct ip_vs_conn * cp)1223 static inline void ip_vs_unbind_dest(struct ip_vs_conn *cp)
1224 {
1225 struct ip_vs_dest *dest = cp->dest;
1226
1227 if (!dest)
1228 return;
1229
1230 IP_VS_DBG_BUF(7, "Unbind-dest %s c:%s:%d v:%s:%d "
1231 "d:%s:%d fwd:%c s:%u conn->flags:%X conn->refcnt:%d "
1232 "dest->refcnt:%d\n",
1233 ip_vs_proto_name(cp->protocol),
1234 IP_VS_DBG_ADDR(cp->af, &cp->caddr), ntohs(cp->cport),
1235 IP_VS_DBG_ADDR(cp->af, &cp->vaddr), ntohs(cp->vport),
1236 IP_VS_DBG_ADDR(cp->daf, &cp->daddr), ntohs(cp->dport),
1237 ip_vs_fwd_tag(cp), cp->state,
1238 cp->flags, refcount_read(&cp->refcnt),
1239 refcount_read(&dest->refcnt));
1240
1241 /* Update the connection counters */
1242 if (!(cp->flags & IP_VS_CONN_F_TEMPLATE)) {
1243 int tc;
1244
1245 /* It is a normal connection, so decrease the counters */
1246 if (!(cp->flags & IP_VS_CONN_F_INACTIVE))
1247 atomic_dec(&dest->activeconns);
1248 tc = atomic_fetch_dec(&dest->totalconns);
1249 if (tc == READ_ONCE(dest->l_threshold_val))
1250 ip_vs_dest_update_overload(dest, -1);
1251 } else {
1252 /* It is a persistent connection/template, so decrease
1253 the persistent connection counter */
1254 atomic_dec(&dest->persistconns);
1255 }
1256
1257 ip_vs_dest_put(dest);
1258 }
1259
expire_quiescent_template(struct netns_ipvs * ipvs,struct ip_vs_dest * dest)1260 static int expire_quiescent_template(struct netns_ipvs *ipvs,
1261 struct ip_vs_dest *dest)
1262 {
1263 #ifdef CONFIG_SYSCTL
1264 return ipvs->sysctl_expire_quiescent_template &&
1265 (atomic_read(&dest->weight) == 0);
1266 #else
1267 return 0;
1268 #endif
1269 }
1270
1271 /*
1272 * Checking if the destination of a connection template is available.
1273 * If available, return 1, otherwise invalidate this connection
1274 * template and return 0.
1275 */
ip_vs_check_template(struct ip_vs_conn * ct,struct ip_vs_dest * cdest)1276 int ip_vs_check_template(struct ip_vs_conn *ct, struct ip_vs_dest *cdest)
1277 {
1278 struct ip_vs_dest *dest = ct->dest;
1279 struct netns_ipvs *ipvs = ct->ipvs;
1280
1281 /*
1282 * Checking the dest server status.
1283 */
1284 if ((dest == NULL) ||
1285 !(dest->cflags & IP_VS_DEST_CF_AVAILABLE) ||
1286 expire_quiescent_template(ipvs, dest) ||
1287 (cdest && (dest != cdest))) {
1288 IP_VS_DBG_BUF(9, "check_template: dest not available for "
1289 "protocol %s s:%s:%d v:%s:%d "
1290 "-> d:%s:%d\n",
1291 ip_vs_proto_name(ct->protocol),
1292 IP_VS_DBG_ADDR(ct->af, &ct->caddr),
1293 ntohs(ct->cport),
1294 IP_VS_DBG_ADDR(ct->af, &ct->vaddr),
1295 ntohs(ct->vport),
1296 IP_VS_DBG_ADDR(ct->daf, &ct->daddr),
1297 ntohs(ct->dport));
1298
1299 /* Invalidate the connection template. Prefer to avoid
1300 * rehashing, it will move it as first in chain, so use
1301 * only dport as indication, it is not a hash key.
1302 */
1303 ct->dport = htons(0xffff);
1304
1305 /*
1306 * Simply decrease the refcnt of the template,
1307 * don't restart its timer.
1308 */
1309 __ip_vs_conn_put(ct);
1310 return 0;
1311 }
1312 return 1;
1313 }
1314
ip_vs_conn_rcu_free(struct rcu_head * head)1315 static void ip_vs_conn_rcu_free(struct rcu_head *head)
1316 {
1317 struct ip_vs_conn *cp = container_of(head, struct ip_vs_conn,
1318 rcu_head);
1319
1320 ip_vs_pe_put(cp->pe);
1321 kfree(cp->pe_data);
1322 kmem_cache_free(ip_vs_conn_cachep, cp);
1323 }
1324
1325 /* Try to delete connection while not holding reference */
ip_vs_conn_del(struct ip_vs_conn * cp)1326 static void ip_vs_conn_del(struct ip_vs_conn *cp)
1327 {
1328 if (timer_delete(&cp->timer)) {
1329 /* Drop cp->control chain too */
1330 if (cp->control)
1331 cp->timeout = 0;
1332 ip_vs_conn_expire(&cp->timer);
1333 }
1334 }
1335
1336 /* Try to delete connection while holding reference */
ip_vs_conn_del_put(struct ip_vs_conn * cp)1337 static void ip_vs_conn_del_put(struct ip_vs_conn *cp)
1338 {
1339 if (timer_delete(&cp->timer)) {
1340 /* Drop cp->control chain too */
1341 if (cp->control)
1342 cp->timeout = 0;
1343 __ip_vs_conn_put(cp);
1344 ip_vs_conn_expire(&cp->timer);
1345 } else {
1346 __ip_vs_conn_put(cp);
1347 }
1348 }
1349
ip_vs_conn_expire(struct timer_list * t)1350 static void ip_vs_conn_expire(struct timer_list *t)
1351 {
1352 struct ip_vs_conn *cp = timer_container_of(cp, t, timer);
1353 struct netns_ipvs *ipvs = cp->ipvs;
1354
1355 /*
1356 * do I control anybody?
1357 */
1358 if (atomic_read(&cp->n_control))
1359 goto expire_later;
1360
1361 /* Unlink conn if not referenced anymore */
1362 if (likely(ip_vs_conn_unlink(cp))) {
1363 struct ip_vs_conn *ct = cp->control;
1364
1365 /* delete the timer if it is activated by other users */
1366 timer_delete(&cp->timer);
1367
1368 /* does anybody control me? */
1369 if (ct) {
1370 bool has_ref = !cp->timeout && __ip_vs_conn_get(ct);
1371
1372 ip_vs_control_del(cp);
1373 /* Drop CTL or non-assured TPL if not used anymore */
1374 if (has_ref && !atomic_read(&ct->n_control) &&
1375 (!(ct->flags & IP_VS_CONN_F_TEMPLATE) ||
1376 !(ct->state & IP_VS_CTPL_S_ASSURED))) {
1377 IP_VS_DBG(4, "drop controlling connection\n");
1378 ip_vs_conn_del_put(ct);
1379 } else if (has_ref) {
1380 __ip_vs_conn_put(ct);
1381 }
1382 }
1383
1384 if ((cp->flags & IP_VS_CONN_F_NFCT) &&
1385 !(cp->flags & IP_VS_CONN_F_ONE_PACKET)) {
1386 /* Do not access conntracks during subsys cleanup
1387 * because nf_conntrack_find_get can not be used after
1388 * conntrack cleanup for the net.
1389 */
1390 smp_rmb();
1391 if (READ_ONCE(ipvs->enable))
1392 ip_vs_conn_drop_conntrack(cp);
1393 }
1394
1395 if (unlikely(cp->app != NULL))
1396 ip_vs_unbind_app(cp);
1397 ip_vs_unbind_dest(cp);
1398 if (unlikely(cp->flags & IP_VS_CONN_F_NO_CPORT)) {
1399 int af_id = ip_vs_af_index(cp->af);
1400
1401 atomic_dec(&ipvs->no_cport_conns[af_id]);
1402 }
1403 if (cp->flags & IP_VS_CONN_F_ONE_PACKET)
1404 ip_vs_conn_rcu_free(&cp->rcu_head);
1405 else
1406 call_rcu(&cp->rcu_head, ip_vs_conn_rcu_free);
1407 atomic_dec(&ipvs->conn_count);
1408 return;
1409 }
1410
1411 expire_later:
1412 IP_VS_DBG(7, "delayed: conn->refcnt=%d conn->n_control=%d\n",
1413 refcount_read(&cp->refcnt),
1414 atomic_read(&cp->n_control));
1415
1416 refcount_inc(&cp->refcnt);
1417 cp->timeout = 60*HZ;
1418
1419 if (ipvs->sync_state & IP_VS_STATE_MASTER)
1420 ip_vs_sync_conn(ipvs, cp, sysctl_sync_threshold(ipvs));
1421
1422 __ip_vs_conn_put_timer(cp);
1423 }
1424
1425 /* Modify timer, so that it expires as soon as possible.
1426 * Can be called without reference only if under RCU lock.
1427 * We can have such chain of conns linked with ->control: DATA->CTL->TPL
1428 * - DATA (eg. FTP) and TPL (persistence) can be present depending on setup
1429 * - cp->timeout=0 indicates all conns from chain should be dropped but
1430 * TPL is not dropped if in assured state
1431 */
ip_vs_conn_expire_now(struct ip_vs_conn * cp)1432 void ip_vs_conn_expire_now(struct ip_vs_conn *cp)
1433 {
1434 /* Using mod_timer_pending will ensure the timer is not
1435 * modified after the final timer_delete in ip_vs_conn_expire.
1436 */
1437 if (timer_pending(&cp->timer) &&
1438 time_after(cp->timer.expires, jiffies))
1439 mod_timer_pending(&cp->timer, jiffies);
1440 }
1441
1442
1443 /*
1444 * Create a new connection entry and hash it into the conn_tab
1445 */
1446 struct ip_vs_conn *
ip_vs_conn_new(const struct ip_vs_conn_param * p,int dest_af,const union nf_inet_addr * daddr,__be16 dport,unsigned int flags,struct ip_vs_dest * dest,__u32 fwmark)1447 ip_vs_conn_new(const struct ip_vs_conn_param *p, int dest_af,
1448 const union nf_inet_addr *daddr, __be16 dport, unsigned int flags,
1449 struct ip_vs_dest *dest, __u32 fwmark)
1450 {
1451 struct ip_vs_conn *cp;
1452 struct netns_ipvs *ipvs = p->ipvs;
1453 struct ip_vs_proto_data *pd = ip_vs_proto_data_get(p->ipvs,
1454 p->protocol);
1455 /* Increment conn_count up to conn_max */
1456 int count = atomic_read(&ipvs->conn_count);
1457 int max = sysctl_conn_max(ipvs);
1458
1459 do {
1460 if (count >= max)
1461 return NULL;
1462 } while (!atomic_try_cmpxchg(&ipvs->conn_count, &count, count + 1));
1463
1464 cp = kmem_cache_alloc(ip_vs_conn_cachep, GFP_ATOMIC);
1465 if (cp == NULL) {
1466 atomic_dec(&ipvs->conn_count);
1467 IP_VS_ERR_RL("%s(): no memory\n", __func__);
1468 return NULL;
1469 }
1470
1471 INIT_HLIST_BL_NODE(&cp->hn0.node);
1472 INIT_HLIST_BL_NODE(&cp->hn1.node);
1473 timer_setup(&cp->timer, ip_vs_conn_expire, 0);
1474 cp->ipvs = ipvs;
1475 cp->hn0.dir = 0;
1476 cp->af = p->af;
1477 cp->hn1.dir = 1;
1478 cp->daf = dest_af;
1479 cp->protocol = p->protocol;
1480 ip_vs_addr_set(p->af, &cp->caddr, p->caddr);
1481 cp->cport = p->cport;
1482 /* proto should only be IPPROTO_IP if p->vaddr is a fwmark */
1483 ip_vs_addr_set(p->protocol == IPPROTO_IP ? AF_UNSPEC : p->af,
1484 &cp->vaddr, p->vaddr);
1485 cp->vport = p->vport;
1486 ip_vs_addr_set(cp->daf, &cp->daddr, daddr);
1487 cp->dport = dport;
1488 cp->flags = flags;
1489 cp->fwmark = fwmark;
1490 if (flags & IP_VS_CONN_F_TEMPLATE && p->pe) {
1491 ip_vs_pe_get(p->pe);
1492 cp->pe = p->pe;
1493 cp->pe_data = p->pe_data;
1494 cp->pe_data_len = p->pe_data_len;
1495 } else {
1496 cp->pe = NULL;
1497 cp->pe_data = NULL;
1498 cp->pe_data_len = 0;
1499 }
1500 spin_lock_init(&cp->lock);
1501
1502 /*
1503 * Set the entry is referenced by the current thread before hashing
1504 * it in the table, so that other thread run ip_vs_random_dropentry
1505 * but cannot drop this entry.
1506 */
1507 refcount_set(&cp->refcnt, 1);
1508
1509 cp->control = NULL;
1510 atomic_set(&cp->n_control, 0);
1511 atomic_set(&cp->in_pkts, 0);
1512
1513 cp->packet_xmit = NULL;
1514 cp->app = NULL;
1515 cp->app_data = NULL;
1516 /* reset struct ip_vs_seq */
1517 memset(&cp->in_seq, 0, sizeof(cp->in_seq));
1518 memset(&cp->out_seq, 0, sizeof(cp->out_seq));
1519
1520 if (unlikely(flags & IP_VS_CONN_F_NO_CPORT)) {
1521 int af_id = ip_vs_af_index(cp->af);
1522
1523 atomic_inc(&ipvs->no_cport_conns[af_id]);
1524 }
1525
1526 /* Bind the connection with a destination server */
1527 cp->dest = NULL;
1528 ip_vs_bind_dest(cp, dest);
1529
1530 /* Set its state and timeout */
1531 cp->state = 0;
1532 cp->old_state = 0;
1533 cp->timeout = 3*HZ;
1534 cp->sync_endtime = jiffies & ~3UL;
1535
1536 /* Bind its packet transmitter */
1537 #ifdef CONFIG_IP_VS_IPV6
1538 if (p->af == AF_INET6)
1539 ip_vs_bind_xmit_v6(cp);
1540 else
1541 #endif
1542 ip_vs_bind_xmit(cp);
1543
1544 if (unlikely(pd && atomic_read(&pd->appcnt)))
1545 ip_vs_bind_app(cp, pd->pp);
1546
1547 /*
1548 * Allow conntrack to be preserved. By default, conntrack
1549 * is created and destroyed for every packet.
1550 * Sometimes keeping conntrack can be useful for
1551 * IP_VS_CONN_F_ONE_PACKET too.
1552 */
1553
1554 if (ip_vs_conntrack_enabled(ipvs))
1555 cp->flags |= IP_VS_CONN_F_NFCT;
1556
1557 /* Hash it in the conn_tab finally */
1558 ip_vs_conn_hash(cp);
1559
1560 return cp;
1561 }
1562
1563 /*
1564 * /proc/net/ip_vs_conn entries
1565 */
1566 #ifdef CONFIG_PROC_FS
1567 struct ip_vs_iter_state {
1568 struct seq_net_private p;
1569 struct ip_vs_rht *t;
1570 int gen;
1571 u32 bucket;
1572 unsigned int skip_elems;
1573 };
1574
ip_vs_conn_array(struct seq_file * seq)1575 static void *ip_vs_conn_array(struct seq_file *seq)
1576 {
1577 struct ip_vs_iter_state *iter = seq->private;
1578 struct net *net = seq_file_net(seq);
1579 struct netns_ipvs *ipvs = net_ipvs(net);
1580 struct ip_vs_rht *t = iter->t;
1581 struct ip_vs_conn_hnode *hn;
1582 struct hlist_bl_node *e;
1583 int idx;
1584
1585 if (!t)
1586 return NULL;
1587 for (idx = iter->bucket; idx < t->size; idx++) {
1588 unsigned int skip = 0;
1589
1590 hlist_bl_for_each_entry_rcu(hn, e, &t->buckets[idx], node) {
1591 /* __ip_vs_conn_get() is not needed by
1592 * ip_vs_conn_seq_show and ip_vs_conn_sync_seq_show
1593 */
1594 if (!ip_vs_rht_same_table(t, READ_ONCE(hn->hash_key)))
1595 break;
1596 if (hn->dir != 0)
1597 continue;
1598 if (skip >= iter->skip_elems) {
1599 iter->bucket = idx;
1600 return hn;
1601 }
1602
1603 ++skip;
1604 }
1605
1606 if (!(idx & 31)) {
1607 cond_resched_rcu();
1608 /* New table installed ? */
1609 if (iter->gen != atomic_read(&ipvs->conn_tab_changes))
1610 break;
1611 }
1612 iter->skip_elems = 0;
1613 }
1614
1615 iter->bucket = idx;
1616 return NULL;
1617 }
1618
ip_vs_conn_seq_start(struct seq_file * seq,loff_t * pos)1619 static void *ip_vs_conn_seq_start(struct seq_file *seq, loff_t *pos)
1620 __acquires(RCU)
1621 {
1622 struct ip_vs_iter_state *iter = seq->private;
1623 struct net *net = seq_file_net(seq);
1624 struct netns_ipvs *ipvs = net_ipvs(net);
1625
1626 rcu_read_lock();
1627 iter->gen = atomic_read(&ipvs->conn_tab_changes);
1628 smp_rmb(); /* ipvs->conn_tab and conn_tab_changes */
1629 iter->t = rcu_dereference(ipvs->conn_tab);
1630 if (*pos == 0) {
1631 iter->skip_elems = 0;
1632 iter->bucket = 0;
1633 return SEQ_START_TOKEN;
1634 }
1635
1636 return ip_vs_conn_array(seq);
1637 }
1638
ip_vs_conn_seq_next(struct seq_file * seq,void * v,loff_t * pos)1639 static void *ip_vs_conn_seq_next(struct seq_file *seq, void *v, loff_t *pos)
1640 {
1641 struct ip_vs_iter_state *iter = seq->private;
1642 struct ip_vs_conn_hnode *hn = v;
1643 struct hlist_bl_node *e;
1644 struct ip_vs_rht *t;
1645
1646 ++*pos;
1647 if (v == SEQ_START_TOKEN)
1648 return ip_vs_conn_array(seq);
1649
1650 t = iter->t;
1651 if (!t)
1652 return NULL;
1653
1654 /* more on same hash chain? */
1655 hlist_bl_for_each_entry_continue_rcu(hn, e, node) {
1656 /* Our cursor was moved to new table ? */
1657 if (!ip_vs_rht_same_table(t, READ_ONCE(hn->hash_key)))
1658 break;
1659 if (hn->dir != 0)
1660 continue;
1661 iter->skip_elems++;
1662 return hn;
1663 }
1664
1665 iter->skip_elems = 0;
1666 iter->bucket++;
1667
1668 return ip_vs_conn_array(seq);
1669 }
1670
ip_vs_conn_seq_stop(struct seq_file * seq,void * v)1671 static void ip_vs_conn_seq_stop(struct seq_file *seq, void *v)
1672 __releases(RCU)
1673 {
1674 rcu_read_unlock();
1675 }
1676
ip_vs_conn_seq_show(struct seq_file * seq,void * v)1677 static int ip_vs_conn_seq_show(struct seq_file *seq, void *v)
1678 {
1679
1680 if (v == SEQ_START_TOKEN)
1681 seq_puts(seq,
1682 "Pro FromIP FPrt ToIP TPrt DestIP DPrt State Expires PEName PEData\n");
1683 else {
1684 struct ip_vs_conn_hnode *hn = v;
1685 const struct ip_vs_conn *cp = ip_vs_hn0_to_conn(hn);
1686 char pe_data[IP_VS_PENAME_MAXLEN + IP_VS_PEDATA_MAXLEN + 3];
1687 size_t len = 0;
1688 char dbuf[IP_VS_ADDRSTRLEN];
1689
1690 if (cp->pe_data) {
1691 pe_data[0] = ' ';
1692 len = strlen(cp->pe->name);
1693 memcpy(pe_data + 1, cp->pe->name, len);
1694 pe_data[len + 1] = ' ';
1695 len += 2;
1696 len += cp->pe->show_pe_data(cp, pe_data + len);
1697 }
1698 pe_data[len] = '\0';
1699
1700 #ifdef CONFIG_IP_VS_IPV6
1701 if (cp->daf == AF_INET6)
1702 snprintf(dbuf, sizeof(dbuf), "%pI6", &cp->daddr.in6);
1703 else
1704 #endif
1705 snprintf(dbuf, sizeof(dbuf), "%08X",
1706 ntohl(cp->daddr.ip));
1707
1708 #ifdef CONFIG_IP_VS_IPV6
1709 if (cp->af == AF_INET6)
1710 seq_printf(seq, "%-3s %pI6 %04X %pI6 %04X "
1711 "%s %04X %-11s %7u%s\n",
1712 ip_vs_proto_name(cp->protocol),
1713 &cp->caddr.in6, ntohs(cp->cport),
1714 &cp->vaddr.in6, ntohs(cp->vport),
1715 dbuf, ntohs(cp->dport),
1716 ip_vs_state_name(cp),
1717 jiffies_delta_to_msecs(cp->timer.expires -
1718 jiffies) / 1000,
1719 pe_data);
1720 else
1721 #endif
1722 seq_printf(seq,
1723 "%-3s %08X %04X %08X %04X"
1724 " %s %04X %-11s %7u%s\n",
1725 ip_vs_proto_name(cp->protocol),
1726 ntohl(cp->caddr.ip), ntohs(cp->cport),
1727 ntohl(cp->vaddr.ip), ntohs(cp->vport),
1728 dbuf, ntohs(cp->dport),
1729 ip_vs_state_name(cp),
1730 jiffies_delta_to_msecs(cp->timer.expires -
1731 jiffies) / 1000,
1732 pe_data);
1733 }
1734 return 0;
1735 }
1736
1737 static const struct seq_operations ip_vs_conn_seq_ops = {
1738 .start = ip_vs_conn_seq_start,
1739 .next = ip_vs_conn_seq_next,
1740 .stop = ip_vs_conn_seq_stop,
1741 .show = ip_vs_conn_seq_show,
1742 };
1743
ip_vs_origin_name(unsigned int flags)1744 static const char *ip_vs_origin_name(unsigned int flags)
1745 {
1746 if (flags & IP_VS_CONN_F_SYNC)
1747 return "SYNC";
1748 else
1749 return "LOCAL";
1750 }
1751
ip_vs_conn_sync_seq_show(struct seq_file * seq,void * v)1752 static int ip_vs_conn_sync_seq_show(struct seq_file *seq, void *v)
1753 {
1754 char dbuf[IP_VS_ADDRSTRLEN];
1755
1756 if (v == SEQ_START_TOKEN)
1757 seq_puts(seq,
1758 "Pro FromIP FPrt ToIP TPrt DestIP DPrt State Origin Expires\n");
1759 else {
1760 const struct ip_vs_conn *cp = v;
1761
1762 #ifdef CONFIG_IP_VS_IPV6
1763 if (cp->daf == AF_INET6)
1764 snprintf(dbuf, sizeof(dbuf), "%pI6", &cp->daddr.in6);
1765 else
1766 #endif
1767 snprintf(dbuf, sizeof(dbuf), "%08X",
1768 ntohl(cp->daddr.ip));
1769
1770 #ifdef CONFIG_IP_VS_IPV6
1771 if (cp->af == AF_INET6)
1772 seq_printf(seq, "%-3s %pI6 %04X %pI6 %04X "
1773 "%s %04X %-11s %-6s %7u\n",
1774 ip_vs_proto_name(cp->protocol),
1775 &cp->caddr.in6, ntohs(cp->cport),
1776 &cp->vaddr.in6, ntohs(cp->vport),
1777 dbuf, ntohs(cp->dport),
1778 ip_vs_state_name(cp),
1779 ip_vs_origin_name(cp->flags),
1780 jiffies_delta_to_msecs(cp->timer.expires -
1781 jiffies) / 1000);
1782 else
1783 #endif
1784 seq_printf(seq,
1785 "%-3s %08X %04X %08X %04X "
1786 "%s %04X %-11s %-6s %7u\n",
1787 ip_vs_proto_name(cp->protocol),
1788 ntohl(cp->caddr.ip), ntohs(cp->cport),
1789 ntohl(cp->vaddr.ip), ntohs(cp->vport),
1790 dbuf, ntohs(cp->dport),
1791 ip_vs_state_name(cp),
1792 ip_vs_origin_name(cp->flags),
1793 jiffies_delta_to_msecs(cp->timer.expires -
1794 jiffies) / 1000);
1795 }
1796 return 0;
1797 }
1798
1799 static const struct seq_operations ip_vs_conn_sync_seq_ops = {
1800 .start = ip_vs_conn_seq_start,
1801 .next = ip_vs_conn_seq_next,
1802 .stop = ip_vs_conn_seq_stop,
1803 .show = ip_vs_conn_sync_seq_show,
1804 };
1805 #endif
1806
1807 #ifdef CONFIG_SYSCTL
1808
1809 /* Randomly drop connection entries before running out of memory
1810 * Can be used for DATA and CTL conns. For TPL conns there are exceptions:
1811 * - traffic for services in OPS mode increases ct->in_pkts, so it is supported
1812 * - traffic for services not in OPS mode does not increase ct->in_pkts in
1813 * all cases, so it is not supported
1814 */
todrop_entry(struct ip_vs_conn * cp)1815 static inline int todrop_entry(struct ip_vs_conn *cp)
1816 {
1817 struct netns_ipvs *ipvs = cp->ipvs;
1818 int i;
1819
1820 /* if the conn entry hasn't lasted for 60 seconds, don't drop it.
1821 This will leave enough time for normal connection to get
1822 through. */
1823 if (time_before(cp->timeout + jiffies, cp->timer.expires + 60*HZ))
1824 return 0;
1825
1826 /* Drop only conns with number of incoming packets in [1..8] range */
1827 i = atomic_read(&cp->in_pkts);
1828 if (i > 8 || i < 1)
1829 return 0;
1830
1831 i--;
1832 if (--ipvs->dropentry_counters[i] > 0)
1833 return 0;
1834
1835 /* Prefer to drop conns with less number of incoming packets */
1836 ipvs->dropentry_counters[i] = i + 1;
1837 return 1;
1838 }
1839
ip_vs_conn_ops_mode(struct ip_vs_conn * cp)1840 static inline bool ip_vs_conn_ops_mode(struct ip_vs_conn *cp)
1841 {
1842 struct ip_vs_service *svc;
1843
1844 if (!cp->dest)
1845 return false;
1846 svc = rcu_dereference(cp->dest->svc);
1847 return svc && (svc->flags & IP_VS_SVC_F_ONEPACKET);
1848 }
1849
ip_vs_random_dropentry(struct netns_ipvs * ipvs)1850 void ip_vs_random_dropentry(struct netns_ipvs *ipvs)
1851 {
1852 struct ip_vs_conn_hnode *hn;
1853 struct hlist_bl_node *e;
1854 struct ip_vs_conn *cp;
1855 struct ip_vs_rht *t;
1856 unsigned int r;
1857 int idx;
1858
1859 r = get_random_u32();
1860 rcu_read_lock();
1861 t = rcu_dereference(ipvs->conn_tab);
1862 if (!t)
1863 goto out;
1864 /*
1865 * Randomly scan 1/32 of the whole table every second
1866 */
1867 for (idx = 0; idx < (t->size >> 5); idx++) {
1868 unsigned int hash = (r + idx) & t->mask;
1869
1870 /* Don't care if due to moved entry we jump to another bucket
1871 * and even to new table
1872 */
1873 hlist_bl_for_each_entry_rcu(hn, e, &t->buckets[hash], node) {
1874 if (hn->dir != 0)
1875 continue;
1876 cp = ip_vs_hn0_to_conn(hn);
1877 if (atomic_read(&cp->n_control))
1878 continue;
1879 if (cp->flags & IP_VS_CONN_F_TEMPLATE) {
1880 /* connection template of OPS */
1881 if (ip_vs_conn_ops_mode(cp))
1882 goto try_drop;
1883 if (!(cp->state & IP_VS_CTPL_S_ASSURED))
1884 goto drop;
1885 continue;
1886 }
1887 if (cp->protocol == IPPROTO_TCP) {
1888 switch(cp->state) {
1889 case IP_VS_TCP_S_SYN_RECV:
1890 case IP_VS_TCP_S_SYNACK:
1891 break;
1892
1893 case IP_VS_TCP_S_ESTABLISHED:
1894 if (todrop_entry(cp))
1895 break;
1896 continue;
1897
1898 default:
1899 continue;
1900 }
1901 } else if (cp->protocol == IPPROTO_SCTP) {
1902 switch (cp->state) {
1903 case IP_VS_SCTP_S_INIT1:
1904 case IP_VS_SCTP_S_INIT:
1905 break;
1906 case IP_VS_SCTP_S_ESTABLISHED:
1907 if (todrop_entry(cp))
1908 break;
1909 continue;
1910 default:
1911 continue;
1912 }
1913 } else {
1914 try_drop:
1915 if (!todrop_entry(cp))
1916 continue;
1917 }
1918
1919 drop:
1920 IP_VS_DBG(4, "drop connection\n");
1921 ip_vs_conn_del(cp);
1922 }
1923 if (!(idx & 31)) {
1924 cond_resched_rcu();
1925 t = rcu_dereference(ipvs->conn_tab);
1926 if (!t)
1927 goto out;
1928 }
1929 }
1930
1931 out:
1932 rcu_read_unlock();
1933 }
1934 #endif
1935
1936 /* Flush all the connection entries in the conn_tab */
ip_vs_conn_flush(struct netns_ipvs * ipvs)1937 static void ip_vs_conn_flush(struct netns_ipvs *ipvs)
1938 {
1939 DECLARE_IP_VS_RHT_WALK_BUCKETS_SAFE_RCU();
1940 struct ip_vs_conn *cp, *cp_c;
1941 struct ip_vs_conn_hnode *hn;
1942 struct hlist_bl_head *head;
1943 struct ip_vs_rht *t, *p;
1944 struct hlist_bl_node *e;
1945
1946 if (!rcu_dereference_protected(ipvs->conn_tab, 1))
1947 return;
1948 disable_delayed_work_sync(&ipvs->conn_resize_work);
1949 if (!atomic_read(&ipvs->conn_count))
1950 goto unreg;
1951
1952 flush_again:
1953 /* Rely on RCU grace period while accessing cp after ip_vs_conn_del */
1954 rcu_read_lock();
1955 ip_vs_rht_walk_buckets_safe_rcu(ipvs->conn_tab, head) {
1956 hlist_bl_for_each_entry_rcu(hn, e, head, node) {
1957 if (hn->dir != 0)
1958 continue;
1959 cp = ip_vs_hn0_to_conn(hn);
1960 if (atomic_read(&cp->n_control))
1961 continue;
1962 cp_c = cp->control;
1963 IP_VS_DBG(4, "del connection\n");
1964 ip_vs_conn_del(cp);
1965 if (cp_c && !atomic_read(&cp_c->n_control)) {
1966 IP_VS_DBG(4, "del controlling connection\n");
1967 ip_vs_conn_del(cp_c);
1968 }
1969 }
1970 cond_resched_rcu();
1971 }
1972 rcu_read_unlock();
1973
1974 /* the counter may be not NULL, because maybe some conn entries
1975 are run by slow timer handler or unhashed but still referred */
1976 if (atomic_read(&ipvs->conn_count) != 0) {
1977 schedule();
1978 goto flush_again;
1979 }
1980
1981 unreg:
1982 /* Unregister the hash table and release it after RCU grace period.
1983 * This is needed because other works may not be stopped yet and
1984 * they may walk the tables.
1985 */
1986 t = rcu_dereference_protected(ipvs->conn_tab, 1);
1987 rcu_assign_pointer(ipvs->conn_tab, NULL);
1988 /* Inform readers that conn_tab is changed */
1989 smp_mb__before_atomic();
1990 atomic_inc(&ipvs->conn_tab_changes);
1991 while (1) {
1992 p = rcu_dereference_protected(t->new_tbl, 1);
1993 call_rcu(&t->rcu_head, ip_vs_rht_rcu_free);
1994 if (p == t)
1995 break;
1996 t = p;
1997 }
1998 }
1999
2000 #ifdef CONFIG_SYSCTL
ip_vs_expire_nodest_conn_flush(struct netns_ipvs * ipvs)2001 void ip_vs_expire_nodest_conn_flush(struct netns_ipvs *ipvs)
2002 {
2003 DECLARE_IP_VS_RHT_WALK_BUCKETS_RCU();
2004 unsigned int resched_score = 0;
2005 struct ip_vs_conn *cp, *cp_c;
2006 struct ip_vs_conn_hnode *hn;
2007 struct hlist_bl_head *head;
2008 struct ip_vs_dest *dest;
2009 struct hlist_bl_node *e;
2010 int old_gen, new_gen;
2011
2012 if (!atomic_read(&ipvs->conn_count))
2013 return;
2014 old_gen = atomic_read(&ipvs->conn_tab_changes);
2015 rcu_read_lock();
2016
2017 repeat:
2018 smp_rmb(); /* ipvs->conn_tab and conn_tab_changes */
2019 ip_vs_rht_walk_buckets_rcu(ipvs->conn_tab, head) {
2020 hlist_bl_for_each_entry_rcu(hn, e, head, node) {
2021 if (hn->dir != 0)
2022 continue;
2023 cp = ip_vs_hn0_to_conn(hn);
2024 resched_score++;
2025 dest = cp->dest;
2026 if (!dest || (dest->cflags & IP_VS_DEST_CF_AVAILABLE))
2027 continue;
2028
2029 if (atomic_read(&cp->n_control))
2030 continue;
2031
2032 cp_c = cp->control;
2033 IP_VS_DBG(4, "del connection\n");
2034 ip_vs_conn_del(cp);
2035 if (cp_c && !atomic_read(&cp_c->n_control)) {
2036 IP_VS_DBG(4, "del controlling connection\n");
2037 ip_vs_conn_del(cp_c);
2038 }
2039 resched_score += 10;
2040 }
2041 resched_score++;
2042 if (resched_score >= 100) {
2043 resched_score = 0;
2044 cond_resched_rcu();
2045 /* netns clean up started, abort delayed work */
2046 if (!READ_ONCE(ipvs->enable))
2047 goto out;
2048 new_gen = atomic_read(&ipvs->conn_tab_changes);
2049 /* New table installed ? */
2050 if (old_gen != new_gen) {
2051 old_gen = new_gen;
2052 goto repeat;
2053 }
2054 }
2055 }
2056
2057 out:
2058 rcu_read_unlock();
2059 }
2060 #endif
2061
2062 /*
2063 * per netns init and exit
2064 */
ip_vs_conn_net_init(struct netns_ipvs * ipvs)2065 int __net_init ip_vs_conn_net_init(struct netns_ipvs *ipvs)
2066 {
2067 int idx;
2068
2069 atomic_set(&ipvs->conn_count, 0);
2070 for (idx = 0; idx < IP_VS_AF_MAX; idx++)
2071 atomic_set(&ipvs->no_cport_conns[idx], 0);
2072 INIT_DELAYED_WORK(&ipvs->conn_resize_work, conn_resize_work_handler);
2073 RCU_INIT_POINTER(ipvs->conn_tab, NULL);
2074 atomic_set(&ipvs->conn_tab_changes, 0);
2075 ipvs->sysctl_conn_lfactor = ip_vs_conn_default_load_factor(ipvs);
2076
2077 #ifdef CONFIG_PROC_FS
2078 if (!proc_create_net("ip_vs_conn", 0, ipvs->net->proc_net,
2079 &ip_vs_conn_seq_ops,
2080 sizeof(struct ip_vs_iter_state)))
2081 goto err_conn;
2082
2083 if (!proc_create_net("ip_vs_conn_sync", 0, ipvs->net->proc_net,
2084 &ip_vs_conn_sync_seq_ops,
2085 sizeof(struct ip_vs_iter_state)))
2086 goto err_conn_sync;
2087 #endif
2088
2089 return 0;
2090
2091 #ifdef CONFIG_PROC_FS
2092 err_conn_sync:
2093 remove_proc_entry("ip_vs_conn", ipvs->net->proc_net);
2094 err_conn:
2095 return -ENOMEM;
2096 #endif
2097 }
2098
ip_vs_conn_net_cleanup(struct netns_ipvs * ipvs)2099 void __net_exit ip_vs_conn_net_cleanup(struct netns_ipvs *ipvs)
2100 {
2101 /* flush all the connection entries first */
2102 ip_vs_conn_flush(ipvs);
2103 #ifdef CONFIG_PROC_FS
2104 remove_proc_entry("ip_vs_conn", ipvs->net->proc_net);
2105 remove_proc_entry("ip_vs_conn_sync", ipvs->net->proc_net);
2106 #endif
2107 }
2108
ip_vs_conn_init(void)2109 int __init ip_vs_conn_init(void)
2110 {
2111 int min = IP_VS_CONN_TAB_MIN_BITS;
2112 int max = IP_VS_CONN_TAB_MAX_BITS;
2113 size_t tab_array_size;
2114 int max_avail;
2115
2116 max_avail = order_base_2(totalram_pages()) + PAGE_SHIFT;
2117 /* 64-bit: 27 bits at 64GB, 32-bit: 20 bits at 512MB */
2118 max_avail += 1; /* hash table loaded at 50% */
2119 max_avail -= 1; /* IPVS up to 1/2 of mem */
2120 max_avail -= order_base_2(sizeof(struct ip_vs_conn));
2121 max = clamp(max_avail, min, max);
2122 ip_vs_conn_tab_bits = clamp(ip_vs_conn_tab_bits, min, max);
2123 ip_vs_conn_tab_size = 1 << ip_vs_conn_tab_bits;
2124
2125 /*
2126 * Allocate the connection hash table and initialize its list heads
2127 */
2128 tab_array_size = array_size(ip_vs_conn_tab_size,
2129 sizeof(struct hlist_bl_head));
2130
2131 /* Allocate ip_vs_conn slab cache */
2132 ip_vs_conn_cachep = KMEM_CACHE(ip_vs_conn, SLAB_HWCACHE_ALIGN);
2133 if (!ip_vs_conn_cachep)
2134 return -ENOMEM;
2135
2136 pr_info("Connection hash table configured (size=%d, memory=%zdKbytes)\n",
2137 ip_vs_conn_tab_size, tab_array_size / 1024);
2138 IP_VS_DBG(0, "Each connection entry needs %zd bytes at least\n",
2139 sizeof(struct ip_vs_conn));
2140
2141 return 0;
2142 }
2143
ip_vs_conn_cleanup(void)2144 void ip_vs_conn_cleanup(void)
2145 {
2146 /* Wait all ip_vs_conn_rcu_free() callbacks to complete */
2147 rcu_barrier();
2148 /* Release the empty cache */
2149 kmem_cache_destroy(ip_vs_conn_cachep);
2150 }
2151