xref: /linux/net/netfilter/ipvs/ip_vs_core.c (revision 91ec2035134982b98fab0609a9fd8480e8217dc1)
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.
16  *
17  * Changes:
18  *	Paul `Rusty' Russell		properly handle non-linear skbs
19  *	Harald Welte			don't use nfcache
20  */
21 
22 #define pr_fmt(fmt) "IPVS: " fmt
23 
24 #include <linux/module.h>
25 #include <linux/kernel.h>
26 #include <linux/ip.h>
27 #include <linux/tcp.h>
28 #include <linux/sctp.h>
29 #include <linux/icmp.h>
30 #include <linux/slab.h>
31 
32 #include <net/ip.h>
33 #include <net/tcp.h>
34 #include <net/udp.h>
35 #include <net/icmp.h>                   /* for icmp_send */
36 #include <net/gue.h>
37 #include <net/gre.h>
38 #include <net/route.h>
39 #include <net/ip6_checksum.h>
40 #include <net/netns/generic.h>		/* net_generic() */
41 
42 #include <linux/netfilter.h>
43 #include <linux/netfilter_ipv4.h>
44 
45 #ifdef CONFIG_IP_VS_IPV6
46 #include <net/ipv6.h>
47 #include <linux/netfilter_ipv6.h>
48 #include <net/ip6_route.h>
49 #endif
50 
51 #include <net/ip_vs.h>
52 #include <linux/indirect_call_wrapper.h>
53 
54 
55 EXPORT_SYMBOL(register_ip_vs_scheduler);
56 EXPORT_SYMBOL(unregister_ip_vs_scheduler);
57 EXPORT_SYMBOL(ip_vs_proto_name);
58 EXPORT_SYMBOL(ip_vs_conn_new);
59 EXPORT_SYMBOL(ip_vs_conn_in_get);
60 EXPORT_SYMBOL(ip_vs_conn_out_get);
61 #ifdef CONFIG_IP_VS_PROTO_TCP
62 EXPORT_SYMBOL(ip_vs_tcp_conn_listen);
63 #endif
64 EXPORT_SYMBOL(ip_vs_conn_put);
65 #ifdef CONFIG_IP_VS_DEBUG
66 EXPORT_SYMBOL(ip_vs_get_debug_level);
67 #endif
68 EXPORT_SYMBOL(ip_vs_new_conn_out);
69 
70 #if defined(CONFIG_IP_VS_PROTO_TCP) && defined(CONFIG_IP_VS_PROTO_UDP)
71 #define SNAT_CALL(f, ...) \
72 	INDIRECT_CALL_2(f, tcp_snat_handler, udp_snat_handler, __VA_ARGS__)
73 #elif defined(CONFIG_IP_VS_PROTO_TCP)
74 #define SNAT_CALL(f, ...) INDIRECT_CALL_1(f, tcp_snat_handler, __VA_ARGS__)
75 #elif defined(CONFIG_IP_VS_PROTO_UDP)
76 #define SNAT_CALL(f, ...) INDIRECT_CALL_1(f, udp_snat_handler, __VA_ARGS__)
77 #else
78 #define SNAT_CALL(f, ...) f(__VA_ARGS__)
79 #endif
80 
81 static unsigned int ip_vs_net_id __read_mostly;
82 /* netns cnt used for uniqueness */
83 static atomic_t ipvs_netns_cnt = ATOMIC_INIT(0);
84 
85 /* ID used in ICMP lookups */
86 #define icmp_id(icmph)          (((icmph)->un).echo.id)
87 #define icmpv6_id(icmph)        (icmph->icmp6_dataun.u_echo.identifier)
88 
ip_vs_proto_name(unsigned int proto)89 const char *ip_vs_proto_name(unsigned int proto)
90 {
91 	static char buf[20];
92 
93 	switch (proto) {
94 	case IPPROTO_IP:
95 		return "IP";
96 	case IPPROTO_UDP:
97 		return "UDP";
98 	case IPPROTO_TCP:
99 		return "TCP";
100 	case IPPROTO_SCTP:
101 		return "SCTP";
102 	case IPPROTO_ICMP:
103 		return "ICMP";
104 #ifdef CONFIG_IP_VS_IPV6
105 	case IPPROTO_ICMPV6:
106 		return "ICMPv6";
107 #endif
108 	default:
109 		sprintf(buf, "IP_%u", proto);
110 		return buf;
111 	}
112 }
113 
ip_vs_init_hash_table(struct list_head * table,int rows)114 void ip_vs_init_hash_table(struct list_head *table, int rows)
115 {
116 	while (--rows >= 0)
117 		INIT_LIST_HEAD(&table[rows]);
118 }
119 
120 /* IPVS Resizable Hash Tables:
121  * - list_bl buckets with bit lock
122  *
123  * Goals:
124  * - RCU lookup for entry can run in parallel with add/del/move operations
125  * - hash keys can be on non-contiguous memory
126  * - support entries with duplicate keys
127  * - unlink entries without lookup, use the saved table and bucket id
128  * - resizing can trigger on load change or depending on key refresh period
129  * - customizable load factor to balance between speed and memory usage
130  * - add/del/move operations should be allowed for any context
131  *
132  * Resizing:
133  * - new table is attached to the current table and all entries are moved
134  * with new hash key. Finally, the new table is installed as current one and
135  * the old table is released after RCU grace period.
136  * - RCU read-side critical sections will walk two tables while resizing is
137  * in progress
138  * - new entries are added to the new table
139  * - entries will be deleted from the old or from the new table, the table_id
140  * can be saved into entry as part of the hash key to know where the entry is
141  * hashed
142  * - move operations may delay readers or to cause retry for the modified
143  * bucket. As result, searched entry will be found but walkers that operate
144  * on multiple entries may see same entry twice if bucket walking is retried.
145  * - for fast path the number of entries (load) can be compared to u_thresh
146  * and l_thresh to decide when to trigger table growing/shrinking. They
147  * are calculated based on load factor (shift count), negative value allows
148  * load to be below 100% to reduce collisions by maintaining larger table
149  * while positive value tolerates collisions by using smaller table and load
150  * above 100%: u_thresh(load) = size * (2 ^ lfactor)
151  *
152  * Locking:
153  * - lock: protect seqc if other context except resizer can move entries
154  * - seqc: seqcount_t, delay/retry readers while entries are moved to
155  * new table on resizing
156  * - bit lock: serialize bucket modifications
157  * - writers may use other locking mechanisms to serialize operations for
158  * resizing, moving and installing new tables
159  */
160 
ip_vs_rht_free(struct ip_vs_rht * t)161 void ip_vs_rht_free(struct ip_vs_rht *t)
162 {
163 	kvfree(t->buckets);
164 	kvfree(t->seqc);
165 	kvfree(t->lock);
166 	kfree(t);
167 }
168 
ip_vs_rht_rcu_free(struct rcu_head * head)169 void ip_vs_rht_rcu_free(struct rcu_head *head)
170 {
171 	struct ip_vs_rht *t;
172 
173 	t = container_of(head, struct ip_vs_rht, rcu_head);
174 	ip_vs_rht_free(t);
175 }
176 
ip_vs_rht_alloc(int buckets,int scounts,int locks)177 struct ip_vs_rht *ip_vs_rht_alloc(int buckets, int scounts, int locks)
178 {
179 	struct ip_vs_rht *t = kzalloc_obj(*t);
180 	int i;
181 
182 	if (!t)
183 		return NULL;
184 	if (scounts) {
185 		int ml = roundup_pow_of_two(nr_cpu_ids);
186 
187 		scounts = min(scounts, buckets);
188 		scounts = min(scounts, ml);
189 		t->seqc = kvmalloc_objs(*t->seqc, scounts);
190 		if (!t->seqc)
191 			goto err;
192 		for (i = 0; i < scounts; i++)
193 			seqcount_init(&t->seqc[i]);
194 
195 		if (locks) {
196 			locks = min(locks, scounts);
197 			t->lock = kvmalloc_objs(*t->lock, locks);
198 			if (!t->lock)
199 				goto err;
200 			for (i = 0; i < locks; i++)
201 				spin_lock_init(&t->lock[i].l);
202 		}
203 	}
204 
205 	t->buckets = kvmalloc_objs(*t->buckets, buckets);
206 	if (!t->buckets)
207 		goto err;
208 	for (i = 0; i < buckets; i++)
209 		INIT_HLIST_BL_HEAD(&t->buckets[i]);
210 	t->mask = buckets - 1;
211 	t->size = buckets;
212 	t->seqc_mask = scounts - 1;
213 	t->lock_mask = locks - 1;
214 	t->u_thresh = buckets;
215 	t->l_thresh = buckets >> 4;
216 	t->bits = order_base_2(buckets);
217 	/* new_tbl points to self if no new table is filled */
218 	RCU_INIT_POINTER(t->new_tbl, t);
219 	get_random_bytes(&t->hash_key, sizeof(t->hash_key));
220 	return t;
221 
222 err:
223 	ip_vs_rht_free(t);
224 	return NULL;
225 }
226 
227 /* Get the desired table size for n entries based on current table size and
228  * by using the formula size = n / (2^lfactor)
229  * lfactor: shift value for the load factor:
230  * - >0: u_thresh=size << lfactor, for load factor above 100%
231  * - <0: u_thresh=size >> -lfactor, for load factor below 100%
232  * - 0: for load factor of 100%
233  */
ip_vs_rht_desired_size(struct netns_ipvs * ipvs,struct ip_vs_rht * t,int n,int lfactor,int min_bits,int max_bits)234 int ip_vs_rht_desired_size(struct netns_ipvs *ipvs, struct ip_vs_rht *t, int n,
235 			   int lfactor, int min_bits, int max_bits)
236 {
237 	if (!t)
238 		return 1 << min_bits;
239 	n = n > 0 ? roundup_pow_of_two(n) : 1;
240 	if (lfactor < 0) {
241 		int factor = min(-lfactor, max_bits);
242 
243 		n = min(n, 1 << (max_bits - factor));
244 		n <<= factor;
245 	} else {
246 		n = min(n >> lfactor, 1 << max_bits);
247 	}
248 	if (lfactor != t->lfactor)
249 		return clamp(n, 1 << min_bits, 1 << max_bits);
250 	if (n > t->size)
251 		return n;
252 	if (n > t->size >> 4)
253 		return t->size;
254 	/* Shrink but keep it n * 2 to prevent frequent resizing */
255 	return clamp(n << 1, 1 << min_bits, 1 << max_bits);
256 }
257 
258 /* Set thresholds based on table size and load factor:
259  * u_thresh = size * (2^lfactor)
260  * l_thresh = u_thresh / 16
261  * u_thresh/l_thresh can be used to check if load triggers a table grow/shrink
262  */
ip_vs_rht_set_thresholds(struct ip_vs_rht * t,int size,int lfactor,int min_bits,int max_bits)263 void ip_vs_rht_set_thresholds(struct ip_vs_rht *t, int size, int lfactor,
264 			      int min_bits, int max_bits)
265 {
266 	if (size >= 1 << max_bits)
267 		t->u_thresh = INT_MAX;	/* stop growing */
268 	else if (lfactor <= 0)
269 		t->u_thresh = size >> min(-lfactor, max_bits);
270 	else
271 		t->u_thresh = min(size, 1 << (30 - lfactor)) << lfactor;
272 
273 	/* l_thresh: shrink when load is 16 times lower, can be 0 */
274 	if (size >= 1 << max_bits)
275 		t->l_thresh = (1 << max_bits) >> 4;
276 	else if (size > 1 << min_bits)
277 		t->l_thresh = t->u_thresh >> 4;
278 	else
279 		t->l_thresh = 0;	/* stop shrinking */
280 }
281 
282 /* Return hash value for local info (fast, insecure) */
ip_vs_rht_hash_linfo(struct ip_vs_rht * t,int af,const union nf_inet_addr * addr,u32 v1,u32 v2)283 u32 ip_vs_rht_hash_linfo(struct ip_vs_rht *t, int af,
284 			 const union nf_inet_addr *addr, u32 v1, u32 v2)
285 {
286 	u32 v3;
287 
288 #ifdef CONFIG_IP_VS_IPV6
289 	if (af == AF_INET6)
290 		v3 = ipv6_addr_hash(&addr->in6);
291 	else
292 #endif
293 		v3 = addr->all[0];
294 
295 	return jhash_3words(v1, v2, v3, (u32)t->hash_key.key[0]);
296 }
297 
298 static inline void
ip_vs_in_stats(struct ip_vs_conn * cp,struct sk_buff * skb)299 ip_vs_in_stats(struct ip_vs_conn *cp, struct sk_buff *skb)
300 {
301 	struct ip_vs_dest *dest = cp->dest;
302 	struct netns_ipvs *ipvs = cp->ipvs;
303 
304 	if (dest && (dest->cflags & IP_VS_DEST_CF_AVAILABLE)) {
305 		struct ip_vs_cpu_stats *s;
306 		struct ip_vs_service *svc;
307 
308 		local_bh_disable();
309 
310 		s = this_cpu_ptr(dest->stats.cpustats);
311 		u64_stats_update_begin(&s->syncp);
312 		u64_stats_inc(&s->cnt.inpkts);
313 		u64_stats_add(&s->cnt.inbytes, skb->len);
314 		u64_stats_update_end(&s->syncp);
315 
316 		svc = rcu_dereference(dest->svc);
317 		s = this_cpu_ptr(svc->stats.cpustats);
318 		u64_stats_update_begin(&s->syncp);
319 		u64_stats_inc(&s->cnt.inpkts);
320 		u64_stats_add(&s->cnt.inbytes, skb->len);
321 		u64_stats_update_end(&s->syncp);
322 
323 		s = this_cpu_ptr(ipvs->tot_stats->s.cpustats);
324 		u64_stats_update_begin(&s->syncp);
325 		u64_stats_inc(&s->cnt.inpkts);
326 		u64_stats_add(&s->cnt.inbytes, skb->len);
327 		u64_stats_update_end(&s->syncp);
328 
329 		local_bh_enable();
330 	}
331 }
332 
333 
334 static inline void
ip_vs_out_stats(struct ip_vs_conn * cp,struct sk_buff * skb)335 ip_vs_out_stats(struct ip_vs_conn *cp, struct sk_buff *skb)
336 {
337 	struct ip_vs_dest *dest = cp->dest;
338 	struct netns_ipvs *ipvs = cp->ipvs;
339 
340 	if (dest && (dest->cflags & IP_VS_DEST_CF_AVAILABLE)) {
341 		struct ip_vs_cpu_stats *s;
342 		struct ip_vs_service *svc;
343 
344 		local_bh_disable();
345 
346 		s = this_cpu_ptr(dest->stats.cpustats);
347 		u64_stats_update_begin(&s->syncp);
348 		u64_stats_inc(&s->cnt.outpkts);
349 		u64_stats_add(&s->cnt.outbytes, skb->len);
350 		u64_stats_update_end(&s->syncp);
351 
352 		svc = rcu_dereference(dest->svc);
353 		s = this_cpu_ptr(svc->stats.cpustats);
354 		u64_stats_update_begin(&s->syncp);
355 		u64_stats_inc(&s->cnt.outpkts);
356 		u64_stats_add(&s->cnt.outbytes, skb->len);
357 		u64_stats_update_end(&s->syncp);
358 
359 		s = this_cpu_ptr(ipvs->tot_stats->s.cpustats);
360 		u64_stats_update_begin(&s->syncp);
361 		u64_stats_inc(&s->cnt.outpkts);
362 		u64_stats_add(&s->cnt.outbytes, skb->len);
363 		u64_stats_update_end(&s->syncp);
364 
365 		local_bh_enable();
366 	}
367 }
368 
369 
370 static inline void
ip_vs_conn_stats(struct ip_vs_conn * cp,struct ip_vs_service * svc)371 ip_vs_conn_stats(struct ip_vs_conn *cp, struct ip_vs_service *svc)
372 {
373 	struct netns_ipvs *ipvs = svc->ipvs;
374 	struct ip_vs_cpu_stats *s;
375 
376 	local_bh_disable();
377 
378 	s = this_cpu_ptr(cp->dest->stats.cpustats);
379 	u64_stats_update_begin(&s->syncp);
380 	u64_stats_inc(&s->cnt.conns);
381 	u64_stats_update_end(&s->syncp);
382 
383 	s = this_cpu_ptr(svc->stats.cpustats);
384 	u64_stats_update_begin(&s->syncp);
385 	u64_stats_inc(&s->cnt.conns);
386 	u64_stats_update_end(&s->syncp);
387 
388 	s = this_cpu_ptr(ipvs->tot_stats->s.cpustats);
389 	u64_stats_update_begin(&s->syncp);
390 	u64_stats_inc(&s->cnt.conns);
391 	u64_stats_update_end(&s->syncp);
392 
393 	local_bh_enable();
394 }
395 
396 
397 static inline void
ip_vs_set_state(struct ip_vs_conn * cp,int direction,const struct sk_buff * skb,struct ip_vs_proto_data * pd,unsigned int iph_len)398 ip_vs_set_state(struct ip_vs_conn *cp, int direction,
399 		const struct sk_buff *skb,
400 		struct ip_vs_proto_data *pd, unsigned int iph_len)
401 {
402 	if (likely(pd->pp->state_transition))
403 		pd->pp->state_transition(cp, direction, skb, pd, iph_len);
404 }
405 
406 static inline int
ip_vs_conn_fill_param_persist(const struct ip_vs_service * svc,struct sk_buff * skb,int protocol,const union nf_inet_addr * caddr,__be16 cport,const union nf_inet_addr * vaddr,__be16 vport,struct ip_vs_conn_param * p)407 ip_vs_conn_fill_param_persist(const struct ip_vs_service *svc,
408 			      struct sk_buff *skb, int protocol,
409 			      const union nf_inet_addr *caddr, __be16 cport,
410 			      const union nf_inet_addr *vaddr, __be16 vport,
411 			      struct ip_vs_conn_param *p)
412 {
413 	ip_vs_conn_fill_param(svc->ipvs, svc->af, protocol, caddr, cport, vaddr,
414 			      vport, p);
415 	p->pe = rcu_dereference(svc->pe);
416 	if (p->pe && p->pe->fill_param)
417 		return p->pe->fill_param(p, skb);
418 
419 	return 0;
420 }
421 
422 /*
423  *  IPVS persistent scheduling function
424  *  It creates a connection entry according to its template if exists,
425  *  or selects a server and creates a connection entry plus a template.
426  *  Locking: we are svc user (svc->refcnt), so we hold all dests too
427  *  Protocols supported: TCP, UDP
428  */
429 static struct ip_vs_conn *
ip_vs_sched_persist(struct ip_vs_service * svc,struct sk_buff * skb,__be16 src_port,__be16 dst_port,int * ignored,struct ip_vs_iphdr * iph)430 ip_vs_sched_persist(struct ip_vs_service *svc,
431 		    struct sk_buff *skb, __be16 src_port, __be16 dst_port,
432 		    int *ignored, struct ip_vs_iphdr *iph)
433 {
434 	struct ip_vs_conn *cp = NULL;
435 	struct ip_vs_dest *dest;
436 	struct ip_vs_conn *ct;
437 	__be16 dport = 0;		/* destination port to forward */
438 	unsigned int flags;
439 	struct ip_vs_conn_param param;
440 	const union nf_inet_addr fwmark = { .ip = htonl(svc->fwmark) };
441 	union nf_inet_addr snet;	/* source network of the client,
442 					   after masking */
443 	const union nf_inet_addr *src_addr, *dst_addr;
444 
445 	if (likely(!ip_vs_iph_inverse(iph))) {
446 		src_addr = &iph->saddr;
447 		dst_addr = &iph->daddr;
448 	} else {
449 		src_addr = &iph->daddr;
450 		dst_addr = &iph->saddr;
451 	}
452 
453 
454 	/* Mask saddr with the netmask to adjust template granularity */
455 #ifdef CONFIG_IP_VS_IPV6
456 	if (svc->af == AF_INET6)
457 		ipv6_addr_prefix(&snet.in6, &src_addr->in6,
458 				 (__force __u32) svc->netmask);
459 	else
460 #endif
461 		snet.ip = src_addr->ip & svc->netmask;
462 
463 	IP_VS_DBG_BUF(6, "p-schedule: src %s:%u dest %s:%u "
464 		      "mnet %s\n",
465 		      IP_VS_DBG_ADDR(svc->af, src_addr), ntohs(src_port),
466 		      IP_VS_DBG_ADDR(svc->af, dst_addr), ntohs(dst_port),
467 		      IP_VS_DBG_ADDR(svc->af, &snet));
468 
469 	/*
470 	 * As far as we know, FTP is a very complicated network protocol, and
471 	 * it uses control connection and data connections. For active FTP,
472 	 * FTP server initialize data connection to the client, its source port
473 	 * is often 20. For passive FTP, FTP server tells the clients the port
474 	 * that it passively listens to,  and the client issues the data
475 	 * connection. In the tunneling or direct routing mode, the load
476 	 * balancer is on the client-to-server half of connection, the port
477 	 * number is unknown to the load balancer. So, a conn template like
478 	 * <caddr, 0, vaddr, 0, daddr, 0> is created for persistent FTP
479 	 * service, and a template like <caddr, 0, vaddr, vport, daddr, dport>
480 	 * is created for other persistent services.
481 	 */
482 	{
483 		int protocol = iph->protocol;
484 		const union nf_inet_addr *vaddr = dst_addr;
485 		__be16 vport = 0;
486 
487 		if (dst_port == svc->port) {
488 			/* non-FTP template:
489 			 * <protocol, caddr, 0, vaddr, vport, daddr, dport>
490 			 * FTP template:
491 			 * <protocol, caddr, 0, vaddr, 0, daddr, 0>
492 			 */
493 			if (svc->port != FTPPORT)
494 				vport = dst_port;
495 		} else {
496 			/* Note: persistent fwmark-based services and
497 			 * persistent port zero service are handled here.
498 			 * fwmark template:
499 			 * <IPPROTO_IP,caddr,0,fwmark,0,daddr,0>
500 			 * port zero template:
501 			 * <protocol,caddr,0,vaddr,0,daddr,0>
502 			 */
503 			if (svc->fwmark) {
504 				protocol = IPPROTO_IP;
505 				vaddr = &fwmark;
506 			}
507 		}
508 		/* return *ignored = -1 so NF_DROP can be used */
509 		if (ip_vs_conn_fill_param_persist(svc, skb, protocol, &snet, 0,
510 						  vaddr, vport, &param) < 0) {
511 			*ignored = -1;
512 			return NULL;
513 		}
514 	}
515 
516 	/* Check if a template already exists */
517 	ct = ip_vs_ct_in_get(&param);
518 	if (!ct || !ip_vs_check_template(ct, NULL)) {
519 		struct ip_vs_scheduler *sched;
520 
521 		/*
522 		 * No template found or the dest of the connection
523 		 * template is not available.
524 		 * return *ignored=0 i.e. ICMP and NF_DROP
525 		 */
526 		sched = rcu_dereference(svc->scheduler);
527 		if (sched) {
528 			/* read svc->sched_data after svc->scheduler */
529 			smp_rmb();
530 			dest = sched->schedule(svc, skb, iph);
531 		} else {
532 			dest = NULL;
533 		}
534 		if (!dest) {
535 			IP_VS_DBG(1, "p-schedule: no dest found.\n");
536 			kfree(param.pe_data);
537 			*ignored = 0;
538 			return NULL;
539 		}
540 
541 		if (dst_port == svc->port && svc->port != FTPPORT)
542 			dport = dest->port;
543 
544 		/* Create a template
545 		 * This adds param.pe_data to the template,
546 		 * and thus param.pe_data will be destroyed
547 		 * when the template expires */
548 		ct = ip_vs_conn_new(&param, dest->af, &dest->addr, dport,
549 				    IP_VS_CONN_F_TEMPLATE, dest, skb->mark);
550 		if (ct == NULL) {
551 			kfree(param.pe_data);
552 			*ignored = -1;
553 			return NULL;
554 		}
555 
556 		ct->timeout = svc->timeout;
557 	} else {
558 		/* set destination with the found template */
559 		dest = ct->dest;
560 		kfree(param.pe_data);
561 	}
562 
563 	dport = dst_port;
564 	if (dport == svc->port && dest->port)
565 		dport = dest->port;
566 
567 	flags = (svc->flags & IP_VS_SVC_F_ONEPACKET
568 		 && iph->protocol == IPPROTO_UDP) ?
569 		IP_VS_CONN_F_ONE_PACKET : 0;
570 
571 	/*
572 	 *    Create a new connection according to the template
573 	 */
574 	ip_vs_conn_fill_param(svc->ipvs, svc->af, iph->protocol, src_addr,
575 			      src_port, dst_addr, dst_port, &param);
576 
577 	cp = ip_vs_conn_new(&param, dest->af, &dest->addr, dport, flags, dest,
578 			    skb->mark);
579 	if (cp == NULL) {
580 		ip_vs_conn_put(ct);
581 		*ignored = -1;
582 		return NULL;
583 	}
584 
585 	/*
586 	 *    Add its control
587 	 */
588 	ip_vs_control_add(cp, ct);
589 	ip_vs_conn_put(ct);
590 
591 	ip_vs_conn_stats(cp, svc);
592 	return cp;
593 }
594 
595 
596 /*
597  *  IPVS main scheduling function
598  *  It selects a server according to the virtual service, and
599  *  creates a connection entry.
600  *  Protocols supported: TCP, UDP
601  *
602  *  Usage of *ignored
603  *
604  * 1 :   protocol tried to schedule (eg. on SYN), found svc but the
605  *       svc/scheduler decides that this packet should be accepted with
606  *       NF_ACCEPT because it must not be scheduled.
607  *
608  * 0 :   scheduler can not find destination, so try bypass or
609  *       return ICMP and then NF_DROP (ip_vs_leave).
610  *
611  * -1 :  scheduler tried to schedule but fatal error occurred, eg.
612  *       ip_vs_conn_new failure (ENOMEM) or ip_vs_sip_fill_param
613  *       failure such as missing Call-ID, ENOMEM on skb_linearize
614  *       or pe_data. In this case we should return NF_DROP without
615  *       any attempts to send ICMP with ip_vs_leave.
616  */
617 struct ip_vs_conn *
ip_vs_schedule(struct ip_vs_service * svc,struct sk_buff * skb,struct ip_vs_proto_data * pd,int * ignored,struct ip_vs_iphdr * iph)618 ip_vs_schedule(struct ip_vs_service *svc, struct sk_buff *skb,
619 	       struct ip_vs_proto_data *pd, int *ignored,
620 	       struct ip_vs_iphdr *iph)
621 {
622 	struct ip_vs_protocol *pp = pd->pp;
623 	struct ip_vs_conn *cp = NULL;
624 	struct ip_vs_scheduler *sched;
625 	struct ip_vs_dest *dest;
626 	__be16 _ports[2], *pptr, cport, vport;
627 	const void *caddr, *vaddr;
628 	unsigned int flags;
629 
630 	*ignored = 1;
631 	/*
632 	 * IPv6 frags, only the first hit here.
633 	 */
634 	pptr = frag_safe_skb_hp(skb, iph->len, sizeof(_ports), _ports);
635 	if (pptr == NULL)
636 		return NULL;
637 
638 	if (likely(!ip_vs_iph_inverse(iph))) {
639 		cport = pptr[0];
640 		caddr = &iph->saddr;
641 		vport = pptr[1];
642 		vaddr = &iph->daddr;
643 	} else {
644 		cport = pptr[1];
645 		caddr = &iph->daddr;
646 		vport = pptr[0];
647 		vaddr = &iph->saddr;
648 	}
649 
650 	/*
651 	 * FTPDATA needs this check when using local real server.
652 	 * Never schedule Active FTPDATA connections from real server.
653 	 * For LVS-NAT they must be already created. For other methods
654 	 * with persistence the connection is created on SYN+ACK.
655 	 */
656 	if (cport == FTPDATA) {
657 		IP_VS_DBG_PKT(12, svc->af, pp, skb, iph->off,
658 			      "Not scheduling FTPDATA");
659 		return NULL;
660 	}
661 
662 	/*
663 	 *    Do not schedule replies from local real server.
664 	 */
665 	if ((!skb->dev || skb->dev->flags & IFF_LOOPBACK)) {
666 		iph->hdr_flags ^= IP_VS_HDR_INVERSE;
667 		cp = INDIRECT_CALL_1(pp->conn_in_get,
668 				     ip_vs_conn_in_get_proto, svc->ipvs,
669 				     svc->af, skb, iph);
670 		iph->hdr_flags ^= IP_VS_HDR_INVERSE;
671 
672 		if (cp) {
673 			IP_VS_DBG_PKT(12, svc->af, pp, skb, iph->off,
674 				      "Not scheduling reply for existing"
675 				      " connection");
676 			__ip_vs_conn_put(cp);
677 			return NULL;
678 		}
679 	}
680 
681 	/*
682 	 *    Persistent service
683 	 */
684 	if (svc->flags & IP_VS_SVC_F_PERSISTENT)
685 		return ip_vs_sched_persist(svc, skb, cport, vport, ignored,
686 					   iph);
687 
688 	*ignored = 0;
689 
690 	/*
691 	 *    Non-persistent service
692 	 */
693 	if (!svc->fwmark && vport != svc->port) {
694 		if (!svc->port)
695 			pr_err("Schedule: port zero only supported "
696 			       "in persistent services, "
697 			       "check your ipvs configuration\n");
698 		return NULL;
699 	}
700 
701 	sched = rcu_dereference(svc->scheduler);
702 	if (sched) {
703 		/* read svc->sched_data after svc->scheduler */
704 		smp_rmb();
705 		dest = sched->schedule(svc, skb, iph);
706 	} else {
707 		dest = NULL;
708 	}
709 	if (dest == NULL) {
710 		IP_VS_DBG(1, "Schedule: no dest found.\n");
711 		return NULL;
712 	}
713 
714 	flags = (svc->flags & IP_VS_SVC_F_ONEPACKET
715 		 && iph->protocol == IPPROTO_UDP) ?
716 		IP_VS_CONN_F_ONE_PACKET : 0;
717 
718 	/*
719 	 *    Create a connection entry.
720 	 */
721 	{
722 		struct ip_vs_conn_param p;
723 
724 		ip_vs_conn_fill_param(svc->ipvs, svc->af, iph->protocol,
725 				      caddr, cport, vaddr, vport, &p);
726 		cp = ip_vs_conn_new(&p, dest->af, &dest->addr,
727 				    dest->port ? dest->port : vport,
728 				    flags, dest, skb->mark);
729 		if (!cp) {
730 			*ignored = -1;
731 			return NULL;
732 		}
733 	}
734 
735 	IP_VS_DBG_BUF(6, "Schedule fwd:%c c:%s:%u v:%s:%u "
736 		      "d:%s:%u conn->flags:%X conn->refcnt:%d\n",
737 		      ip_vs_fwd_tag(cp),
738 		      IP_VS_DBG_ADDR(cp->af, &cp->caddr), ntohs(cp->cport),
739 		      IP_VS_DBG_ADDR(cp->af, &cp->vaddr), ntohs(cp->vport),
740 		      IP_VS_DBG_ADDR(cp->daf, &cp->daddr), ntohs(cp->dport),
741 		      cp->flags, refcount_read(&cp->refcnt));
742 
743 	ip_vs_conn_stats(cp, svc);
744 	return cp;
745 }
746 
ip_vs_addr_is_unicast(struct net * net,int af,union nf_inet_addr * addr)747 static inline int ip_vs_addr_is_unicast(struct net *net, int af,
748 					union nf_inet_addr *addr)
749 {
750 #ifdef CONFIG_IP_VS_IPV6
751 	if (af == AF_INET6)
752 		return ipv6_addr_type(&addr->in6) & IPV6_ADDR_UNICAST;
753 #endif
754 	return (inet_addr_type(net, addr->ip) == RTN_UNICAST);
755 }
756 
757 /*
758  *  Pass or drop the packet.
759  *  Called by ip_vs_in, when the virtual service is available but
760  *  no destination is available for a new connection.
761  */
ip_vs_leave(struct ip_vs_service * svc,struct sk_buff * skb,struct ip_vs_proto_data * pd,struct ip_vs_iphdr * iph)762 int ip_vs_leave(struct ip_vs_service *svc, struct sk_buff *skb,
763 		struct ip_vs_proto_data *pd, struct ip_vs_iphdr *iph)
764 {
765 	__be16 _ports[2], *pptr, dport;
766 	struct netns_ipvs *ipvs = svc->ipvs;
767 	struct net *net = ipvs->net;
768 
769 	pptr = frag_safe_skb_hp(skb, iph->len, sizeof(_ports), _ports);
770 	if (!pptr)
771 		return NF_DROP;
772 	dport = likely(!ip_vs_iph_inverse(iph)) ? pptr[1] : pptr[0];
773 
774 	/* if it is fwmark-based service, the cache_bypass sysctl is up
775 	   and the destination is a non-local unicast, then create
776 	   a cache_bypass connection entry */
777 	if (sysctl_cache_bypass(ipvs) && svc->fwmark &&
778 	    !(iph->hdr_flags & (IP_VS_HDR_INVERSE | IP_VS_HDR_ICMP)) &&
779 	    ip_vs_addr_is_unicast(net, svc->af, &iph->daddr)) {
780 		int ret;
781 		struct ip_vs_conn *cp;
782 		unsigned int flags = (svc->flags & IP_VS_SVC_F_ONEPACKET &&
783 				      iph->protocol == IPPROTO_UDP) ?
784 				      IP_VS_CONN_F_ONE_PACKET : 0;
785 		union nf_inet_addr daddr = { .all = { 0, 0, 0, 0 } };
786 
787 		/* create a new connection entry */
788 		IP_VS_DBG(6, "%s(): create a cache_bypass entry\n", __func__);
789 		{
790 			struct ip_vs_conn_param p;
791 			ip_vs_conn_fill_param(svc->ipvs, svc->af, iph->protocol,
792 					      &iph->saddr, pptr[0],
793 					      &iph->daddr, pptr[1], &p);
794 			cp = ip_vs_conn_new(&p, svc->af, &daddr, 0,
795 					    IP_VS_CONN_F_BYPASS | flags,
796 					    NULL, skb->mark);
797 			if (!cp)
798 				return NF_DROP;
799 		}
800 
801 		/* statistics */
802 		ip_vs_in_stats(cp, skb);
803 
804 		/* set state */
805 		ip_vs_set_state(cp, IP_VS_DIR_INPUT, skb, pd, iph->len);
806 
807 		/* transmit the first SYN packet */
808 		ret = cp->packet_xmit(skb, cp, pd->pp, iph);
809 		/* do not touch skb anymore */
810 
811 		if ((cp->flags & IP_VS_CONN_F_ONE_PACKET) && cp->control)
812 			atomic_inc(&cp->control->in_pkts);
813 		else
814 			atomic_inc(&cp->in_pkts);
815 		ip_vs_conn_put(cp);
816 		return ret;
817 	}
818 
819 	/*
820 	 * When the virtual ftp service is presented, packets destined
821 	 * for other services on the VIP may get here (except services
822 	 * listed in the ipvs table), pass the packets, because it is
823 	 * not ipvs job to decide to drop the packets.
824 	 */
825 	if (svc->port == FTPPORT && dport != FTPPORT)
826 		return NF_ACCEPT;
827 
828 	if (unlikely(ip_vs_iph_icmp(iph)))
829 		return NF_DROP;
830 
831 	/*
832 	 * Notify the client that the destination is unreachable, and
833 	 * release the socket buffer.
834 	 * Since it is in IP layer, the TCP socket is not actually
835 	 * created, the TCP RST packet cannot be sent, instead that
836 	 * ICMP_PORT_UNREACH is sent here no matter it is TCP/UDP. --WZ
837 	 */
838 #ifdef CONFIG_IP_VS_IPV6
839 	if (svc->af == AF_INET6) {
840 		if (!skb->dev)
841 			skb->dev = net->loopback_dev;
842 		icmpv6_send(skb, ICMPV6_DEST_UNREACH, ICMPV6_PORT_UNREACH, 0);
843 	} else
844 #endif
845 		icmp_send(skb, ICMP_DEST_UNREACH, ICMP_PORT_UNREACH, 0);
846 
847 	return NF_DROP;
848 }
849 
850 #ifdef CONFIG_SYSCTL
851 
sysctl_snat_reroute(struct netns_ipvs * ipvs)852 static int sysctl_snat_reroute(struct netns_ipvs *ipvs)
853 {
854 	return ipvs->sysctl_snat_reroute;
855 }
856 
sysctl_nat_icmp_send(struct netns_ipvs * ipvs)857 static int sysctl_nat_icmp_send(struct netns_ipvs *ipvs)
858 {
859 	return ipvs->sysctl_nat_icmp_send;
860 }
861 
862 #else
863 
sysctl_snat_reroute(struct netns_ipvs * ipvs)864 static int sysctl_snat_reroute(struct netns_ipvs *ipvs) { return 0; }
sysctl_nat_icmp_send(struct netns_ipvs * ipvs)865 static int sysctl_nat_icmp_send(struct netns_ipvs *ipvs) { return 0; }
866 
867 #endif
868 
ip_vs_checksum_complete(struct sk_buff * skb,int offset)869 static __sum16 ip_vs_checksum_complete(struct sk_buff *skb, int offset)
870 {
871 	return csum_fold(skb_checksum(skb, offset, skb->len - offset, 0));
872 }
873 
ip_vs_defrag_user(unsigned int hooknum)874 static inline enum ip_defrag_users ip_vs_defrag_user(unsigned int hooknum)
875 {
876 	if (NF_INET_LOCAL_IN == hooknum)
877 		return IP_DEFRAG_VS_IN;
878 	if (NF_INET_FORWARD == hooknum)
879 		return IP_DEFRAG_VS_FWD;
880 	return IP_DEFRAG_VS_OUT;
881 }
882 
ip_vs_gather_frags(struct netns_ipvs * ipvs,struct sk_buff * skb,u_int32_t user)883 static inline int ip_vs_gather_frags(struct netns_ipvs *ipvs,
884 				     struct sk_buff *skb, u_int32_t user)
885 {
886 	int err;
887 
888 	local_bh_disable();
889 	err = ip_defrag(ipvs->net, skb, user);
890 	local_bh_enable();
891 	if (!err)
892 		ip_send_check(ip_hdr(skb));
893 
894 	return err;
895 }
896 
ip_vs_route_me_harder(struct netns_ipvs * ipvs,int af,struct sk_buff * skb,unsigned int hooknum)897 static int ip_vs_route_me_harder(struct netns_ipvs *ipvs, int af,
898 				 struct sk_buff *skb, unsigned int hooknum)
899 {
900 	if (!sysctl_snat_reroute(ipvs))
901 		return 0;
902 	/* Reroute replies only to remote clients (FORWARD and LOCAL_OUT) */
903 	if (NF_INET_LOCAL_IN == hooknum)
904 		return 0;
905 #ifdef CONFIG_IP_VS_IPV6
906 	if (af == AF_INET6) {
907 		struct dst_entry *dst = skb_dst(skb);
908 
909 		if (dst->dev && !(dst->dev->flags & IFF_LOOPBACK) &&
910 		    ip6_route_me_harder(ipvs->net, skb->sk, skb) != 0)
911 			return 1;
912 	} else
913 #endif
914 		if (!(skb_rtable(skb)->rt_flags & RTCF_LOCAL) &&
915 		    ip_route_me_harder(ipvs->net, skb->sk, skb, RTN_LOCAL) != 0)
916 			return 1;
917 
918 	return 0;
919 }
920 
921 /*
922  * Packet has been made sufficiently writable in caller
923  * - inout: 1=in->out, 0=out->in
924  */
ip_vs_nat_icmp(struct sk_buff * skb,struct ip_vs_protocol * pp,struct ip_vs_conn * cp,int inout,unsigned int toff,bool has_ports,struct ip_vs_iphdr * ciph)925 bool ip_vs_nat_icmp(struct sk_buff *skb, struct ip_vs_protocol *pp,
926 		    struct ip_vs_conn *cp, int inout, unsigned int toff,
927 		    bool has_ports, struct ip_vs_iphdr *ciph)
928 {
929 	struct iphdr *iph	 = ip_hdr(skb);
930 	struct icmphdr *icmph	 = (struct icmphdr *)(skb->data + toff);
931 	struct iphdr *cih	 = (struct iphdr *)(icmph + 1);
932 
933 	/* Before now we may used ihl from skb frag, revalidate it after
934 	 * copying it into skb head to prevent out-of-bounds access
935 	 */
936 	if (cih->ihl * 4 != ciph->len - ciph->off)
937 		return false;
938 	if (inout) {
939 		iph->saddr = cp->vaddr.ip;
940 		ip_send_check(iph);
941 		cih->daddr = cp->vaddr.ip;
942 		ip_send_check(cih);
943 	} else {
944 		iph->daddr = cp->daddr.ip;
945 		ip_send_check(iph);
946 		cih->saddr = cp->daddr.ip;
947 		ip_send_check(cih);
948 	}
949 
950 	/* the TCP/UDP/SCTP port */
951 	if (has_ports) {
952 		__be16 *ports = (void *)(skb->data + ciph->len);
953 
954 		if (inout)
955 			ports[1] = cp->vport;
956 		else
957 			ports[0] = cp->dport;
958 	}
959 
960 	/* And finally the ICMP checksum */
961 	icmph->checksum = 0;
962 	icmph->checksum = ip_vs_checksum_complete(skb, toff);
963 	skb->ip_summed = CHECKSUM_UNNECESSARY;
964 
965 	if (inout)
966 		IP_VS_DBG_PKT(11, AF_INET, pp, skb, ciph->off,
967 			      "Forwarding altered outgoing ICMP");
968 	else
969 		IP_VS_DBG_PKT(11, AF_INET, pp, skb, ciph->off,
970 			      "Forwarding altered incoming ICMP");
971 	return true;
972 }
973 
974 #ifdef CONFIG_IP_VS_IPV6
ip_vs_nat_icmp_v6(struct sk_buff * skb,struct ip_vs_protocol * pp,struct ip_vs_conn * cp,int inout,unsigned int toff,bool has_ports,struct ip_vs_iphdr * ciph)975 void ip_vs_nat_icmp_v6(struct sk_buff *skb, struct ip_vs_protocol *pp,
976 		       struct ip_vs_conn *cp, int inout, unsigned int toff,
977 		       bool has_ports, struct ip_vs_iphdr *ciph)
978 {
979 	struct ipv6hdr *iph	 = ipv6_hdr(skb);
980 	struct icmp6hdr *icmph;
981 	struct ipv6hdr *cih;
982 
983 	icmph = (struct icmp6hdr *)(skb->data + toff);
984 	cih = (struct ipv6hdr *)(skb->data + ciph->off);
985 
986 	if (inout) {
987 		iph->saddr = cp->vaddr.in6;
988 		cih->daddr = cp->vaddr.in6;
989 	} else {
990 		iph->daddr = cp->daddr.in6;
991 		cih->saddr = cp->daddr.in6;
992 	}
993 
994 	/* the TCP/UDP/SCTP port */
995 	if (has_ports) {
996 		__be16 *ports = (void *)(skb->data + ciph->len);
997 
998 		IP_VS_DBG(11, "%s() changed port %d to %d\n", __func__,
999 			      ntohs(inout ? ports[1] : ports[0]),
1000 			      ntohs(inout ? cp->vport : cp->dport));
1001 		if (inout)
1002 			ports[1] = cp->vport;
1003 		else
1004 			ports[0] = cp->dport;
1005 	}
1006 
1007 	/* And finally the ICMP checksum */
1008 	icmph->icmp6_cksum = ~csum_ipv6_magic(&iph->saddr, &iph->daddr,
1009 					      skb->len - toff,
1010 					      IPPROTO_ICMPV6, 0);
1011 	skb->csum_start = skb_headroom(skb) + toff;
1012 	skb->csum_offset = offsetof(struct icmp6hdr, icmp6_cksum);
1013 	skb->ip_summed = CHECKSUM_PARTIAL;
1014 
1015 	if (inout)
1016 		IP_VS_DBG_PKT(11, AF_INET6, pp, skb, ciph->off,
1017 			      "Forwarding altered outgoing ICMPv6");
1018 	else
1019 		IP_VS_DBG_PKT(11, AF_INET6, pp, skb, ciph->off,
1020 			      "Forwarding altered incoming ICMPv6");
1021 }
1022 #endif
1023 
1024 /* Handle relevant response ICMP messages - forward to the right
1025  * destination host.
1026  */
handle_response_icmp(int af,struct sk_buff * skb,union nf_inet_addr * snet,struct ip_vs_conn * cp,struct ip_vs_protocol * pp,struct ip_vs_iphdr * ciph,unsigned int toff,unsigned int hooknum)1027 static int handle_response_icmp(int af, struct sk_buff *skb,
1028 				union nf_inet_addr *snet,
1029 				struct ip_vs_conn *cp,
1030 				struct ip_vs_protocol *pp,
1031 				struct ip_vs_iphdr *ciph,
1032 				unsigned int toff, unsigned int hooknum)
1033 {
1034 	int iproto = af == AF_INET6 ? IPPROTO_ICMPV6 : IPPROTO_ICMP;
1035 	unsigned int verdict = NF_DROP;
1036 	unsigned int ctoff = ciph->len;
1037 	bool has_ports = false;
1038 
1039 	if (IP_VS_FWD_METHOD(cp) != IP_VS_CONN_F_MASQ)
1040 		goto after_nat;
1041 
1042 	/* Ensure the checksum is correct */
1043 	if (!ip_vs_checksum_common_check(skb, toff, iproto, af)) {
1044 		/* Failed checksum! */
1045 		IP_VS_DBG_BUF(1, "Forward ICMP: failed checksum from %s!\n",
1046 			      IP_VS_DBG_ADDR(af, snet));
1047 		goto out;
1048 	}
1049 
1050 	if (ciph->protocol == IPPROTO_TCP || ciph->protocol == IPPROTO_UDP ||
1051 	    ciph->protocol == IPPROTO_SCTP) {
1052 		ctoff += 2 * sizeof(__u16);
1053 		has_ports = true;
1054 	}
1055 	if (skb_ensure_writable(skb, ctoff))
1056 		goto out;
1057 
1058 #ifdef CONFIG_IP_VS_IPV6
1059 	if (af == AF_INET6)
1060 		ip_vs_nat_icmp_v6(skb, pp, cp, 1, toff, has_ports, ciph);
1061 	else
1062 #endif
1063 		if (!ip_vs_nat_icmp(skb, pp, cp, 1, toff, has_ports, ciph))
1064 			goto out;
1065 
1066 	if (ip_vs_route_me_harder(cp->ipvs, af, skb, hooknum))
1067 		goto out;
1068 
1069 after_nat:
1070 	/* do the statistics and put it back */
1071 	ip_vs_out_stats(cp, skb);
1072 
1073 	skb->ipvs_property = 1;
1074 	if (!(cp->flags & IP_VS_CONN_F_NFCT))
1075 		ip_vs_notrack(skb);
1076 	else
1077 		ip_vs_update_conntrack(skb, cp, 0);
1078 	verdict = NF_ACCEPT;
1079 
1080 out:
1081 	__ip_vs_conn_put(cp);
1082 
1083 	return verdict;
1084 }
1085 
1086 /*
1087  *	Handle ICMP messages in the inside-to-outside direction (outgoing).
1088  *	Find any that might be relevant, check against existing connections.
1089  *	Currently handles error types - unreachable, quench, ttl exceeded.
1090  */
ip_vs_out_icmp(struct netns_ipvs * ipvs,struct sk_buff * skb,int * related,unsigned int hooknum,struct ip_vs_iphdr * ipvsh)1091 static int ip_vs_out_icmp(struct netns_ipvs *ipvs, struct sk_buff *skb,
1092 			  int *related, unsigned int hooknum,
1093 			  struct ip_vs_iphdr *ipvsh)
1094 {
1095 	struct icmphdr	_icmph, *ic;
1096 	struct iphdr	_ciph, *cih;	/* The ip header contained within the ICMP */
1097 	struct ip_vs_iphdr ciph;
1098 	struct ip_vs_conn *cp;
1099 	struct ip_vs_protocol *pp;
1100 	unsigned int offset;
1101 	union nf_inet_addr snet;
1102 
1103 	*related = 1;
1104 
1105 	/* reassemble IP fragments */
1106 	if (ip_is_fragment(ip_hdr(skb))) {
1107 		if (ip_vs_gather_frags(ipvs, skb, ip_vs_defrag_user(hooknum)))
1108 			return NF_STOLEN;
1109 		if (!ip_vs_fill_iph_skb(AF_INET, skb, false, ipvsh))
1110 			return NF_ACCEPT;
1111 	}
1112 
1113 	offset = ipvsh->len;
1114 	ic = skb_header_pointer(skb, offset, sizeof(_icmph), &_icmph);
1115 	if (ic == NULL)
1116 		return NF_DROP;
1117 
1118 	IP_VS_DBG(12, "Outgoing ICMP (%d,%d) %pI4->%pI4\n",
1119 		  ic->type, ntohs(icmp_id(ic)),
1120 		  &ipvsh->saddr.ip, &ipvsh->daddr.ip);
1121 
1122 	/*
1123 	 * Work through seeing if this is for us.
1124 	 * These checks are supposed to be in an order that means easy
1125 	 * things are checked first to speed up processing.... however
1126 	 * this means that some packets will manage to get a long way
1127 	 * down this stack and then be rejected, but that's life.
1128 	 */
1129 	if ((ic->type != ICMP_DEST_UNREACH) &&
1130 	    (ic->type != ICMP_SOURCE_QUENCH) &&
1131 	    (ic->type != ICMP_TIME_EXCEEDED)) {
1132 		*related = 0;
1133 		return NF_ACCEPT;
1134 	}
1135 
1136 	/* Now find the contained IP header */
1137 	offset += sizeof(_icmph);
1138 	if (!ip_vs_fill_iph_skb_icmp(AF_INET, skb, offset, true, &ciph))
1139 		return NF_ACCEPT; /* The packet looks wrong, ignore */
1140 
1141 	cih = skb_header_pointer(skb, offset, sizeof(_ciph), &_ciph);
1142 	if (!(cih && cih->version == 4 &&
1143 	      ciph.len - ciph.off >= sizeof(struct iphdr)))
1144 		return NF_ACCEPT; /* The packet looks wrong, ignore */
1145 
1146 	pp = ip_vs_proto_get(ciph.protocol);
1147 	if (!pp)
1148 		return NF_ACCEPT;
1149 
1150 	/* Is the embedded protocol header present? */
1151 	if (unlikely(cih->frag_off & htons(IP_OFFSET) && !pp->dont_defrag))
1152 		return NF_ACCEPT;
1153 
1154 	IP_VS_DBG_PKT(11, AF_INET, pp, skb, offset,
1155 		      "Checking outgoing ICMP for");
1156 
1157 	/* The embedded headers contain source and dest in reverse order */
1158 	cp = INDIRECT_CALL_1(pp->conn_out_get, ip_vs_conn_out_get_proto,
1159 			     ipvs, AF_INET, skb, &ciph);
1160 	if (!cp)
1161 		return NF_ACCEPT;
1162 
1163 	snet.ip = ipvsh->saddr.ip;
1164 	return handle_response_icmp(AF_INET, skb, &snet, cp, pp, &ciph,
1165 				    ipvsh->len, hooknum);
1166 }
1167 
1168 #ifdef CONFIG_IP_VS_IPV6
ip_vs_out_icmp_v6(struct netns_ipvs * ipvs,struct sk_buff * skb,int * related,unsigned int hooknum,struct ip_vs_iphdr * ipvsh)1169 static int ip_vs_out_icmp_v6(struct netns_ipvs *ipvs, struct sk_buff *skb,
1170 			     int *related,  unsigned int hooknum,
1171 			     struct ip_vs_iphdr *ipvsh)
1172 {
1173 	struct icmp6hdr	_icmph, *ic;
1174 	struct ip_vs_iphdr ciph = {.flags = 0, .fragoffs = 0};/*Contained IP */
1175 	struct ip_vs_conn *cp;
1176 	struct ip_vs_protocol *pp;
1177 	union nf_inet_addr snet;
1178 
1179 	*related = 1;
1180 	ic = frag_safe_skb_hp(skb, ipvsh->len, sizeof(_icmph), &_icmph);
1181 	if (ic == NULL)
1182 		return NF_DROP;
1183 
1184 	/*
1185 	 * Work through seeing if this is for us.
1186 	 * These checks are supposed to be in an order that means easy
1187 	 * things are checked first to speed up processing.... however
1188 	 * this means that some packets will manage to get a long way
1189 	 * down this stack and then be rejected, but that's life.
1190 	 */
1191 	if (ic->icmp6_type & ICMPV6_INFOMSG_MASK) {
1192 		*related = 0;
1193 		return NF_ACCEPT;
1194 	}
1195 	/* Fragment header that is before ICMP header tells us that:
1196 	 * it's not an error message since they can't be fragmented.
1197 	 */
1198 	if (ipvsh->flags & IP6_FH_F_FRAG)
1199 		return NF_DROP;
1200 
1201 	IP_VS_DBG(8, "Outgoing ICMPv6 (%d,%d) %pI6c->%pI6c\n",
1202 		  ic->icmp6_type, ntohs(icmpv6_id(ic)),
1203 		  &ipvsh->saddr, &ipvsh->daddr);
1204 
1205 	if (!ip_vs_fill_iph_skb_icmp(AF_INET6, skb, ipvsh->len + sizeof(_icmph),
1206 				     true, &ciph))
1207 		return NF_ACCEPT; /* The packet looks wrong, ignore */
1208 
1209 	pp = ip_vs_proto_get(ciph.protocol);
1210 	if (!pp)
1211 		return NF_ACCEPT;
1212 
1213 	/* Is the embedded protocol header present? */
1214 	if (unlikely(ciph.fragoffs && !pp->dont_defrag))
1215 		return NF_ACCEPT;
1216 
1217 	/* The embedded headers contain source and dest in reverse order */
1218 	cp = INDIRECT_CALL_1(pp->conn_out_get, ip_vs_conn_out_get_proto,
1219 			     ipvs, AF_INET6, skb, &ciph);
1220 	if (!cp)
1221 		return NF_ACCEPT;
1222 
1223 	snet.in6 = ciph.saddr.in6;
1224 	return handle_response_icmp(AF_INET6, skb, &snet, cp, pp, &ciph,
1225 				    ipvsh->len, hooknum);
1226 }
1227 #endif
1228 
1229 /*
1230  * Check if sctp chunc is ABORT chunk
1231  */
is_sctp_abort(const struct sk_buff * skb,int nh_len)1232 static inline int is_sctp_abort(const struct sk_buff *skb, int nh_len)
1233 {
1234 	struct sctp_chunkhdr *sch, schunk;
1235 	sch = skb_header_pointer(skb, nh_len + sizeof(struct sctphdr),
1236 				 sizeof(schunk), &schunk);
1237 	if (sch == NULL)
1238 		return 0;
1239 	if (sch->type == SCTP_CID_ABORT)
1240 		return 1;
1241 	return 0;
1242 }
1243 
is_tcp_reset(const struct sk_buff * skb,int nh_len)1244 static inline int is_tcp_reset(const struct sk_buff *skb, int nh_len)
1245 {
1246 	struct tcphdr _tcph, *th;
1247 
1248 	th = skb_header_pointer(skb, nh_len, sizeof(_tcph), &_tcph);
1249 	if (th == NULL)
1250 		return 0;
1251 	return th->rst;
1252 }
1253 
is_new_conn(const struct sk_buff * skb,struct ip_vs_iphdr * iph)1254 static inline bool is_new_conn(const struct sk_buff *skb,
1255 			       struct ip_vs_iphdr *iph)
1256 {
1257 	switch (iph->protocol) {
1258 	case IPPROTO_TCP: {
1259 		struct tcphdr _tcph, *th;
1260 
1261 		th = skb_header_pointer(skb, iph->len, sizeof(_tcph), &_tcph);
1262 		if (th == NULL)
1263 			return false;
1264 		return th->syn;
1265 	}
1266 	case IPPROTO_SCTP: {
1267 		struct sctp_chunkhdr *sch, schunk;
1268 
1269 		sch = skb_header_pointer(skb, iph->len + sizeof(struct sctphdr),
1270 					 sizeof(schunk), &schunk);
1271 		if (sch == NULL)
1272 			return false;
1273 		return sch->type == SCTP_CID_INIT;
1274 	}
1275 	default:
1276 		return false;
1277 	}
1278 }
1279 
is_new_conn_expected(const struct ip_vs_conn * cp,int conn_reuse_mode)1280 static inline bool is_new_conn_expected(const struct ip_vs_conn *cp,
1281 					int conn_reuse_mode)
1282 {
1283 	/* Controlled (FTP DATA or persistence)? */
1284 	if (cp->control)
1285 		return false;
1286 
1287 	switch (cp->protocol) {
1288 	case IPPROTO_TCP:
1289 		return (cp->state == IP_VS_TCP_S_TIME_WAIT) ||
1290 		       (cp->state == IP_VS_TCP_S_CLOSE) ||
1291 			((conn_reuse_mode & 2) &&
1292 			 (cp->state == IP_VS_TCP_S_FIN_WAIT) &&
1293 			 (cp->flags & IP_VS_CONN_F_NOOUTPUT));
1294 	case IPPROTO_SCTP:
1295 		return cp->state == IP_VS_SCTP_S_CLOSED;
1296 	default:
1297 		return false;
1298 	}
1299 }
1300 
1301 /* Generic function to create new connections for outgoing RS packets
1302  *
1303  * Pre-requisites for successful connection creation:
1304  * 1) Virtual Service is NOT fwmark based:
1305  *    In fwmark-VS actual vaddr and vport are unknown to IPVS
1306  * 2) Real Server and Virtual Service were NOT configured without port:
1307  *    This is to allow match of different VS to the same RS ip-addr
1308  */
ip_vs_new_conn_out(struct ip_vs_service * svc,struct ip_vs_dest * dest,struct sk_buff * skb,const struct ip_vs_iphdr * iph,__be16 dport,__be16 cport)1309 struct ip_vs_conn *ip_vs_new_conn_out(struct ip_vs_service *svc,
1310 				      struct ip_vs_dest *dest,
1311 				      struct sk_buff *skb,
1312 				      const struct ip_vs_iphdr *iph,
1313 				      __be16 dport,
1314 				      __be16 cport)
1315 {
1316 	struct ip_vs_conn_param param;
1317 	struct ip_vs_conn *ct = NULL, *cp = NULL;
1318 	const union nf_inet_addr *vaddr, *daddr, *caddr;
1319 	union nf_inet_addr snet;
1320 	__be16 vport;
1321 	unsigned int flags;
1322 
1323 	vaddr = &svc->addr;
1324 	vport = svc->port;
1325 	daddr = &iph->saddr;
1326 	caddr = &iph->daddr;
1327 
1328 	/* check pre-requisites are satisfied */
1329 	if (svc->fwmark)
1330 		return NULL;
1331 	if (!vport || !dport)
1332 		return NULL;
1333 
1334 	/* for persistent service first create connection template */
1335 	if (svc->flags & IP_VS_SVC_F_PERSISTENT) {
1336 		/* apply netmask the same way ingress-side does */
1337 #ifdef CONFIG_IP_VS_IPV6
1338 		if (svc->af == AF_INET6)
1339 			ipv6_addr_prefix(&snet.in6, &caddr->in6,
1340 					 (__force __u32)svc->netmask);
1341 		else
1342 #endif
1343 			snet.ip = caddr->ip & svc->netmask;
1344 		/* fill params and create template if not existent */
1345 		if (ip_vs_conn_fill_param_persist(svc, skb, iph->protocol,
1346 						  &snet, 0, vaddr,
1347 						  vport, &param) < 0)
1348 			return NULL;
1349 		ct = ip_vs_ct_in_get(&param);
1350 		/* check if template exists and points to the same dest */
1351 		if (!ct || !ip_vs_check_template(ct, dest)) {
1352 			ct = ip_vs_conn_new(&param, dest->af, daddr, dport,
1353 					    IP_VS_CONN_F_TEMPLATE, dest, 0);
1354 			if (!ct) {
1355 				kfree(param.pe_data);
1356 				return NULL;
1357 			}
1358 			ct->timeout = svc->timeout;
1359 		} else {
1360 			kfree(param.pe_data);
1361 		}
1362 	}
1363 
1364 	/* connection flags */
1365 	flags = ((svc->flags & IP_VS_SVC_F_ONEPACKET) &&
1366 		 iph->protocol == IPPROTO_UDP) ? IP_VS_CONN_F_ONE_PACKET : 0;
1367 	/* create connection */
1368 	ip_vs_conn_fill_param(svc->ipvs, svc->af, iph->protocol,
1369 			      caddr, cport, vaddr, vport, &param);
1370 	cp = ip_vs_conn_new(&param, dest->af, daddr, dport, flags, dest, 0);
1371 	if (!cp) {
1372 		if (ct)
1373 			ip_vs_conn_put(ct);
1374 		return NULL;
1375 	}
1376 	if (ct) {
1377 		ip_vs_control_add(cp, ct);
1378 		ip_vs_conn_put(ct);
1379 	}
1380 	ip_vs_conn_stats(cp, svc);
1381 
1382 	/* return connection (will be used to handle outgoing packet) */
1383 	IP_VS_DBG_BUF(6, "New connection RS-initiated:%c c:%s:%u v:%s:%u "
1384 		      "d:%s:%u conn->flags:%X conn->refcnt:%d\n",
1385 		      ip_vs_fwd_tag(cp),
1386 		      IP_VS_DBG_ADDR(cp->af, &cp->caddr), ntohs(cp->cport),
1387 		      IP_VS_DBG_ADDR(cp->af, &cp->vaddr), ntohs(cp->vport),
1388 		      IP_VS_DBG_ADDR(cp->af, &cp->daddr), ntohs(cp->dport),
1389 		      cp->flags, refcount_read(&cp->refcnt));
1390 	return cp;
1391 }
1392 
1393 /* Handle outgoing packets which are considered requests initiated by
1394  * real servers, so that subsequent responses from external client can be
1395  * routed to the right real server.
1396  * Used also for outgoing responses in OPS mode.
1397  *
1398  * Connection management is handled by persistent-engine specific callback.
1399  */
__ip_vs_rs_conn_out(unsigned int hooknum,struct netns_ipvs * ipvs,int af,struct sk_buff * skb,const struct ip_vs_iphdr * iph)1400 static struct ip_vs_conn *__ip_vs_rs_conn_out(unsigned int hooknum,
1401 					      struct netns_ipvs *ipvs,
1402 					      int af, struct sk_buff *skb,
1403 					      const struct ip_vs_iphdr *iph)
1404 {
1405 	struct ip_vs_dest *dest;
1406 	struct ip_vs_conn *cp = NULL;
1407 	__be16 _ports[2], *pptr;
1408 
1409 	if (hooknum == NF_INET_LOCAL_IN)
1410 		return NULL;
1411 
1412 	pptr = frag_safe_skb_hp(skb, iph->len,
1413 				sizeof(_ports), _ports);
1414 	if (!pptr)
1415 		return NULL;
1416 
1417 	dest = ip_vs_find_real_service(ipvs, af, iph->protocol,
1418 				       &iph->saddr, pptr[0]);
1419 	if (dest) {
1420 		struct ip_vs_service *svc;
1421 		struct ip_vs_pe *pe;
1422 
1423 		svc = rcu_dereference(dest->svc);
1424 		if (svc) {
1425 			pe = rcu_dereference(svc->pe);
1426 			if (pe && pe->conn_out)
1427 				cp = pe->conn_out(svc, dest, skb, iph,
1428 						  pptr[0], pptr[1]);
1429 		}
1430 	}
1431 
1432 	return cp;
1433 }
1434 
1435 /* Handle response packets: rewrite addresses and send away...
1436  */
1437 static unsigned int
handle_response(int af,struct sk_buff * skb,struct ip_vs_proto_data * pd,struct ip_vs_conn * cp,struct ip_vs_iphdr * iph,unsigned int hooknum)1438 handle_response(int af, struct sk_buff *skb, struct ip_vs_proto_data *pd,
1439 		struct ip_vs_conn *cp, struct ip_vs_iphdr *iph,
1440 		unsigned int hooknum)
1441 {
1442 	struct ip_vs_protocol *pp = pd->pp;
1443 
1444 	if (IP_VS_FWD_METHOD(cp) != IP_VS_CONN_F_MASQ)
1445 		goto after_nat;
1446 
1447 	IP_VS_DBG_PKT(11, af, pp, skb, iph->off, "Outgoing packet");
1448 
1449 	if (skb_ensure_writable(skb, iph->len))
1450 		goto drop;
1451 
1452 	/* mangle the packet */
1453 	if (pp->snat_handler &&
1454 	    !SNAT_CALL(pp->snat_handler, skb, pp, cp, iph))
1455 		goto drop;
1456 
1457 #ifdef CONFIG_IP_VS_IPV6
1458 	if (af == AF_INET6)
1459 		ipv6_hdr(skb)->saddr = cp->vaddr.in6;
1460 	else
1461 #endif
1462 	{
1463 		ip_hdr(skb)->saddr = cp->vaddr.ip;
1464 		ip_send_check(ip_hdr(skb));
1465 	}
1466 
1467 	/*
1468 	 * nf_iterate does not expect change in the skb->dst->dev.
1469 	 * It looks like it is not fatal to enable this code for hooks
1470 	 * where our handlers are at the end of the chain list and
1471 	 * when all next handlers use skb->dst->dev and not outdev.
1472 	 * It will definitely route properly the inout NAT traffic
1473 	 * when multiple paths are used.
1474 	 */
1475 
1476 	/* For policy routing, packets originating from this
1477 	 * machine itself may be routed differently to packets
1478 	 * passing through.  We want this packet to be routed as
1479 	 * if it came from this machine itself.  So re-compute
1480 	 * the routing information.
1481 	 */
1482 	if (ip_vs_route_me_harder(cp->ipvs, af, skb, hooknum))
1483 		goto drop;
1484 
1485 	IP_VS_DBG_PKT(10, af, pp, skb, iph->off, "After SNAT");
1486 
1487 after_nat:
1488 	ip_vs_out_stats(cp, skb);
1489 	ip_vs_set_state(cp, IP_VS_DIR_OUTPUT, skb, pd, iph->len);
1490 	skb->ipvs_property = 1;
1491 	if (!(cp->flags & IP_VS_CONN_F_NFCT))
1492 		ip_vs_notrack(skb);
1493 	else
1494 		ip_vs_update_conntrack(skb, cp, 0);
1495 	ip_vs_conn_put(cp);
1496 
1497 	return NF_ACCEPT;
1498 
1499 drop:
1500 	ip_vs_conn_put(cp);
1501 	kfree_skb(skb);
1502 	return NF_STOLEN;
1503 }
1504 
1505 /*
1506  *	Check if outgoing packet belongs to the established ip_vs_conn.
1507  */
1508 static unsigned int
ip_vs_out_hook(void * priv,struct sk_buff * skb,const struct nf_hook_state * state)1509 ip_vs_out_hook(void *priv, struct sk_buff *skb, const struct nf_hook_state *state)
1510 {
1511 	struct netns_ipvs *ipvs = net_ipvs(state->net);
1512 	unsigned int hooknum = state->hook;
1513 	struct ip_vs_iphdr iph;
1514 	struct ip_vs_protocol *pp;
1515 	struct ip_vs_proto_data *pd;
1516 	struct ip_vs_conn *cp;
1517 	int af = state->pf;
1518 	struct sock *sk;
1519 
1520 	/* Already marked as IPVS request or reply? */
1521 	if (skb->ipvs_property)
1522 		return NF_ACCEPT;
1523 
1524 	sk = skb_to_full_sk(skb);
1525 	/* Bad... Do not break raw sockets */
1526 	if (unlikely(sk && hooknum == NF_INET_LOCAL_OUT &&
1527 		     af == AF_INET)) {
1528 
1529 		if (sk->sk_family == PF_INET && inet_test_bit(NODEFRAG, sk))
1530 			return NF_ACCEPT;
1531 	}
1532 
1533 	if (unlikely(!skb_dst(skb)))
1534 		return NF_ACCEPT;
1535 
1536 	ip_vs_fill_iph_skb(af, skb, false, &iph);
1537 #ifdef CONFIG_IP_VS_IPV6
1538 	if (af == AF_INET6) {
1539 		if (unlikely(iph.protocol == IPPROTO_ICMPV6)) {
1540 			int related;
1541 			int verdict = ip_vs_out_icmp_v6(ipvs, skb, &related,
1542 							hooknum, &iph);
1543 
1544 			if (related)
1545 				return verdict;
1546 		}
1547 	} else
1548 #endif
1549 		if (unlikely(iph.protocol == IPPROTO_ICMP)) {
1550 			int related;
1551 			int verdict = ip_vs_out_icmp(ipvs, skb, &related,
1552 						     hooknum, &iph);
1553 
1554 			if (related)
1555 				return verdict;
1556 		}
1557 
1558 	pd = ip_vs_proto_data_get(ipvs, iph.protocol);
1559 	if (unlikely(!pd))
1560 		return NF_ACCEPT;
1561 	pp = pd->pp;
1562 
1563 	/* reassemble IP fragments */
1564 #ifdef CONFIG_IP_VS_IPV6
1565 	if (af == AF_INET)
1566 #endif
1567 		if (unlikely(ip_is_fragment(ip_hdr(skb)) && !pp->dont_defrag)) {
1568 			if (ip_vs_gather_frags(ipvs, skb,
1569 					       ip_vs_defrag_user(hooknum)))
1570 				return NF_STOLEN;
1571 
1572 			ip_vs_fill_iph_skb(AF_INET, skb, false, &iph);
1573 		}
1574 
1575 	/*
1576 	 * Check if the packet belongs to an existing entry
1577 	 */
1578 	cp = INDIRECT_CALL_1(pp->conn_out_get, ip_vs_conn_out_get_proto,
1579 			     ipvs, af, skb, &iph);
1580 
1581 	if (likely(cp))
1582 		return handle_response(af, skb, pd, cp, &iph, hooknum);
1583 
1584 	/* Check for real-server-started requests */
1585 	if (atomic_read(&ipvs->conn_out_counter[ip_vs_af_index(af)])) {
1586 		/* Currently only for UDP:
1587 		 * connection oriented protocols typically use
1588 		 * ephemeral ports for outgoing connections, so
1589 		 * related incoming responses would not match any VS
1590 		 */
1591 		if (pp->protocol == IPPROTO_UDP) {
1592 			cp = __ip_vs_rs_conn_out(hooknum, ipvs, af, skb, &iph);
1593 			if (likely(cp))
1594 				return handle_response(af, skb, pd, cp, &iph,
1595 						       hooknum);
1596 		}
1597 	}
1598 
1599 	if (sysctl_nat_icmp_send(ipvs) &&
1600 	    (pp->protocol == IPPROTO_TCP ||
1601 	     pp->protocol == IPPROTO_UDP ||
1602 	     pp->protocol == IPPROTO_SCTP)) {
1603 		__be16 _ports[2], *pptr;
1604 
1605 		pptr = frag_safe_skb_hp(skb, iph.len,
1606 					 sizeof(_ports), _ports);
1607 		if (pptr == NULL)
1608 			return NF_ACCEPT;	/* Not for me */
1609 		if (ip_vs_has_real_service(ipvs, af, iph.protocol, &iph.saddr,
1610 					   pptr[0])) {
1611 			/*
1612 			 * Notify the real server: there is no
1613 			 * existing entry if it is not RST
1614 			 * packet or not TCP packet.
1615 			 */
1616 			if ((iph.protocol != IPPROTO_TCP &&
1617 			     iph.protocol != IPPROTO_SCTP)
1618 			     || ((iph.protocol == IPPROTO_TCP
1619 				  && !is_tcp_reset(skb, iph.len))
1620 				 || (iph.protocol == IPPROTO_SCTP
1621 					&& !is_sctp_abort(skb,
1622 						iph.len)))) {
1623 #ifdef CONFIG_IP_VS_IPV6
1624 				if (af == AF_INET6) {
1625 					if (!skb->dev)
1626 						skb->dev = ipvs->net->loopback_dev;
1627 					icmpv6_send(skb,
1628 						    ICMPV6_DEST_UNREACH,
1629 						    ICMPV6_PORT_UNREACH,
1630 						    0);
1631 				} else
1632 #endif
1633 					icmp_send(skb,
1634 						  ICMP_DEST_UNREACH,
1635 						  ICMP_PORT_UNREACH, 0);
1636 				return NF_DROP;
1637 			}
1638 		}
1639 	}
1640 
1641 	IP_VS_DBG_PKT(12, af, pp, skb, iph.off,
1642 		      "ip_vs_out: packet continues traversal as normal");
1643 	return NF_ACCEPT;
1644 }
1645 
1646 static unsigned int
ip_vs_try_to_schedule(struct netns_ipvs * ipvs,int af,struct sk_buff * skb,struct ip_vs_proto_data * pd,int * verdict,struct ip_vs_conn ** cpp,struct ip_vs_iphdr * iph)1647 ip_vs_try_to_schedule(struct netns_ipvs *ipvs, int af, struct sk_buff *skb,
1648 		      struct ip_vs_proto_data *pd,
1649 		      int *verdict, struct ip_vs_conn **cpp,
1650 		      struct ip_vs_iphdr *iph)
1651 {
1652 	struct ip_vs_protocol *pp = pd->pp;
1653 
1654 	if (!iph->fragoffs) {
1655 		/* No (second) fragments need to enter here, as nf_defrag_ipv6
1656 		 * replayed fragment zero will already have created the cp
1657 		 */
1658 
1659 		/* Schedule and create new connection entry into cpp */
1660 		if (!pp->conn_schedule(ipvs, af, skb, pd, verdict, cpp, iph))
1661 			return 0;
1662 	}
1663 
1664 	if (unlikely(!*cpp)) {
1665 		/* sorry, all this trouble for a no-hit :) */
1666 		IP_VS_DBG_PKT(12, af, pp, skb, iph->off,
1667 			      "ip_vs_in: packet continues traversal as normal");
1668 
1669 		/* Fragment couldn't be mapped to a conn entry */
1670 		if (iph->fragoffs)
1671 			IP_VS_DBG_PKT(7, af, pp, skb, iph->off,
1672 				      "unhandled fragment");
1673 
1674 		*verdict = NF_ACCEPT;
1675 		return 0;
1676 	}
1677 
1678 	return 1;
1679 }
1680 
1681 /* Check the UDP tunnel and return its header length */
ipvs_udp_decap(struct netns_ipvs * ipvs,struct sk_buff * skb,unsigned int offset,__u16 af,const union nf_inet_addr * daddr,__u8 * proto)1682 static int ipvs_udp_decap(struct netns_ipvs *ipvs, struct sk_buff *skb,
1683 			  unsigned int offset, __u16 af,
1684 			  const union nf_inet_addr *daddr, __u8 *proto)
1685 {
1686 	struct udphdr _udph, *udph;
1687 	struct ip_vs_dest *dest;
1688 
1689 	udph = skb_header_pointer(skb, offset, sizeof(_udph), &_udph);
1690 	if (!udph)
1691 		goto unk;
1692 	offset += sizeof(struct udphdr);
1693 	dest = ip_vs_find_tunnel(ipvs, af, daddr, udph->dest);
1694 	if (!dest)
1695 		goto unk;
1696 	if (dest->tun_type == IP_VS_CONN_F_TUNNEL_TYPE_GUE) {
1697 		struct guehdr _gueh, *gueh;
1698 
1699 		gueh = skb_header_pointer(skb, offset, sizeof(_gueh), &_gueh);
1700 		if (!gueh)
1701 			goto unk;
1702 		if (gueh->control != 0 || gueh->version != 0)
1703 			goto unk;
1704 		/* Later we can support also IPPROTO_IPV6 */
1705 		if (gueh->proto_ctype != IPPROTO_IPIP)
1706 			goto unk;
1707 		*proto = gueh->proto_ctype;
1708 		return sizeof(struct udphdr) + sizeof(struct guehdr) +
1709 		       (gueh->hlen << 2);
1710 	}
1711 
1712 unk:
1713 	return 0;
1714 }
1715 
1716 /* Check the GRE tunnel and return its header length */
ipvs_gre_decap(struct netns_ipvs * ipvs,struct sk_buff * skb,unsigned int offset,__u16 af,const union nf_inet_addr * daddr,__u8 * proto)1717 static int ipvs_gre_decap(struct netns_ipvs *ipvs, struct sk_buff *skb,
1718 			  unsigned int offset, __u16 af,
1719 			  const union nf_inet_addr *daddr, __u8 *proto)
1720 {
1721 	struct gre_base_hdr _greh, *greh;
1722 	struct ip_vs_dest *dest;
1723 
1724 	greh = skb_header_pointer(skb, offset, sizeof(_greh), &_greh);
1725 	if (!greh)
1726 		goto unk;
1727 	dest = ip_vs_find_tunnel(ipvs, af, daddr, 0);
1728 	if (!dest)
1729 		goto unk;
1730 	if (dest->tun_type == IP_VS_CONN_F_TUNNEL_TYPE_GRE) {
1731 		IP_TUNNEL_DECLARE_FLAGS(flags);
1732 		__be16 type;
1733 
1734 		/* Only support version 0 and C (csum) */
1735 		if ((greh->flags & ~GRE_CSUM) != 0)
1736 			goto unk;
1737 		type = greh->protocol;
1738 		/* Later we can support also IPPROTO_IPV6 */
1739 		if (type != htons(ETH_P_IP))
1740 			goto unk;
1741 		*proto = IPPROTO_IPIP;
1742 
1743 		gre_flags_to_tnl_flags(flags, greh->flags);
1744 
1745 		return gre_calc_hlen(flags);
1746 	}
1747 
1748 unk:
1749 	return 0;
1750 }
1751 
1752 /*
1753  *	Handle ICMP messages in the outside-to-inside direction (incoming).
1754  *	Find any that might be relevant, check against existing connections,
1755  *	forward to the right destination host if relevant.
1756  *	Currently handles error types - unreachable, quench, ttl exceeded.
1757  */
1758 static int
ip_vs_in_icmp(struct netns_ipvs * ipvs,struct sk_buff * skb,int * related,unsigned int hooknum,struct ip_vs_iphdr * iph)1759 ip_vs_in_icmp(struct netns_ipvs *ipvs, struct sk_buff *skb, int *related,
1760 	      unsigned int hooknum, struct ip_vs_iphdr *iph)
1761 {
1762 	struct icmphdr	_icmph, *ic;
1763 	struct iphdr	_ciph, *cih;	/* The ip header contained within the ICMP */
1764 	struct ip_vs_iphdr ciph;
1765 	struct ip_vs_conn *cp;
1766 	struct ip_vs_protocol *pp;
1767 	struct ip_vs_proto_data *pd;
1768 	unsigned int offset, offset2, ihl, verdict;
1769 	bool tunnel, new_cp = false;
1770 	union nf_inet_addr *raddr;
1771 	char *outer_proto __maybe_unused = "IPIP";
1772 	unsigned int hlen_ipip;
1773 	int ulen = 0;
1774 
1775 	*related = 1;
1776 
1777 	/* reassemble IP fragments */
1778 	if (ip_is_fragment(ip_hdr(skb))) {
1779 		if (ip_vs_gather_frags(ipvs, skb, ip_vs_defrag_user(hooknum)))
1780 			return NF_STOLEN;
1781 		if (!ip_vs_fill_iph_skb(AF_INET, skb, false, iph))
1782 			return NF_ACCEPT;
1783 	}
1784 
1785 	ihl = iph->len;
1786 	offset = iph->len;
1787 	ic = skb_header_pointer(skb, offset, sizeof(_icmph), &_icmph);
1788 	if (ic == NULL)
1789 		return NF_DROP;
1790 
1791 	IP_VS_DBG(12, "Incoming ICMP (%d,%d) %pI4->%pI4\n",
1792 		  ic->type, ntohs(icmp_id(ic)),
1793 		  &iph->saddr.ip, &iph->daddr.ip);
1794 
1795 	/*
1796 	 * Work through seeing if this is for us.
1797 	 * These checks are supposed to be in an order that means easy
1798 	 * things are checked first to speed up processing.... however
1799 	 * this means that some packets will manage to get a long way
1800 	 * down this stack and then be rejected, but that's life.
1801 	 */
1802 	if ((ic->type != ICMP_DEST_UNREACH) &&
1803 	    (ic->type != ICMP_SOURCE_QUENCH) &&
1804 	    (ic->type != ICMP_TIME_EXCEEDED)) {
1805 		*related = 0;
1806 		return NF_ACCEPT;
1807 	}
1808 
1809 	/* Now find the contained IP header */
1810 	offset += sizeof(_icmph);
1811 	cih = skb_header_pointer(skb, offset, sizeof(_ciph), &_ciph);
1812 	if (!cih)
1813 		return NF_ACCEPT; /* The packet looks wrong, ignore */
1814 	hlen_ipip = cih->ihl * 4;
1815 	if (!(cih->version == 4 && hlen_ipip >= sizeof(struct iphdr)))
1816 		return NF_ACCEPT; /* The packet looks wrong, ignore */
1817 	raddr = (union nf_inet_addr *)&cih->daddr;
1818 
1819 	/* Special case for errors for IPIP/UDP/GRE tunnel packets */
1820 	tunnel = false;
1821 	if (cih->protocol == IPPROTO_IPIP) {
1822 		struct ip_vs_dest *dest;
1823 
1824 		if (unlikely(cih->frag_off & htons(IP_OFFSET)))
1825 			return NF_ACCEPT;
1826 		/* Error for our IPIP must arrive at LOCAL_IN */
1827 		if (!(skb_rtable(skb)->rt_flags & RTCF_LOCAL))
1828 			return NF_ACCEPT;
1829 		dest = ip_vs_find_tunnel(ipvs, AF_INET, raddr, 0);
1830 		/* Only for known tunnel */
1831 		if (!dest || dest->tun_type != IP_VS_CONN_F_TUNNEL_TYPE_IPIP)
1832 			return NF_ACCEPT;
1833 		offset += hlen_ipip;
1834 		tunnel = true;
1835 	} else if ((cih->protocol == IPPROTO_UDP ||	/* Can be UDP encap */
1836 		    cih->protocol == IPPROTO_GRE) &&	/* Can be GRE encap */
1837 		   /* Error for our tunnel must arrive at LOCAL_IN */
1838 		   (skb_rtable(skb)->rt_flags & RTCF_LOCAL)) {
1839 		__u8 iproto;
1840 
1841 		/* Non-first fragment has no UDP/GRE header */
1842 		if (unlikely(cih->frag_off & htons(IP_OFFSET)))
1843 			return NF_ACCEPT;
1844 		offset2 = offset + hlen_ipip;
1845 		if (cih->protocol == IPPROTO_UDP) {
1846 			ulen = ipvs_udp_decap(ipvs, skb, offset2, AF_INET,
1847 					      raddr, &iproto);
1848 			outer_proto = "UDP";
1849 		} else {
1850 			ulen = ipvs_gre_decap(ipvs, skb, offset2, AF_INET,
1851 					      raddr, &iproto);
1852 			outer_proto = "GRE";
1853 		}
1854 		if (ulen > 0) {
1855 			/* Skip IP and UDP/GRE tunnel headers */
1856 			offset = offset2 + ulen;
1857 			/* Now we should be at the original IP header */
1858 			if (iproto == IPPROTO_IPIP)
1859 				tunnel = true;
1860 			else
1861 				return NF_ACCEPT;
1862 		}
1863 	}
1864 
1865 	if (!ip_vs_fill_iph_skb_icmp(AF_INET, skb, offset, !tunnel, &ciph))
1866 		return NF_ACCEPT;
1867 	pd = ip_vs_proto_data_get(ipvs, ciph.protocol);
1868 	if (!pd)
1869 		return NF_ACCEPT;
1870 	pp = pd->pp;
1871 
1872 	cih = skb_header_pointer(skb, offset, sizeof(_ciph), &_ciph);
1873 	if (!(cih && cih->version == 4 &&
1874 	      ciph.len - ciph.off >= sizeof(struct iphdr)))
1875 		return NF_ACCEPT; /* The packet looks wrong, ignore */
1876 
1877 	/* Is the embedded protocol header present? */
1878 	if (unlikely(cih->frag_off & htons(IP_OFFSET) && !pp->dont_defrag))
1879 		return NF_ACCEPT;
1880 
1881 	IP_VS_DBG_PKT(11, AF_INET, pp, skb, offset,
1882 		      "Checking incoming ICMP for");
1883 
1884 	/* The embedded headers contain source and dest in reverse order.
1885 	 * For IPIP/UDP/GRE tunnel this is error for request, not for reply.
1886 	 */
1887 	cp = INDIRECT_CALL_1(pp->conn_in_get, ip_vs_conn_in_get_proto,
1888 			     ipvs, AF_INET, skb, &ciph);
1889 
1890 	if (!cp) {
1891 		int v;
1892 
1893 		if (tunnel || !sysctl_schedule_icmp(ipvs))
1894 			return NF_ACCEPT;
1895 
1896 		if (!ip_vs_try_to_schedule(ipvs, AF_INET, skb, pd, &v, &cp, &ciph))
1897 			return v;
1898 		new_cp = true;
1899 	}
1900 
1901 	verdict = NF_DROP;
1902 
1903 	/* Ensure the checksum is correct */
1904 	if ((IP_VS_FWD_METHOD(cp) == IP_VS_CONN_F_MASQ || tunnel) &&
1905 	    !ip_vs_checksum_common_check(skb, ihl, IPPROTO_ICMP, AF_INET)) {
1906 		/* Failed checksum! */
1907 		IP_VS_DBG(1, "Incoming ICMP: failed checksum from %pI4!\n",
1908 			  &iph->saddr.ip);
1909 		goto out;
1910 	}
1911 
1912 	if (tunnel) {
1913 		unsigned int hlen_orig = ciph.len - ciph.off;
1914 		__be32 info = ic->un.gateway;
1915 		__u8 type = ic->type;
1916 		__u8 code = ic->code;
1917 
1918 		offset2 = offset;
1919 		/* Update the MTU */
1920 		if (ic->type == ICMP_DEST_UNREACH &&
1921 		    ic->code == ICMP_FRAG_NEEDED) {
1922 			struct ip_vs_dest *dest = cp->dest;
1923 			u32 mtu = ntohs(ic->un.frag.mtu);
1924 			__be16 frag_off = cih->frag_off;
1925 
1926 			/* Strip outer IP and ICMP, go to IPIP/UDP/GRE header */
1927 			if (pskb_pull(skb, ihl + sizeof(_icmph)) == NULL)
1928 				goto ignore_tunnel;
1929 			offset2 -= ihl + sizeof(_icmph);
1930 			skb_reset_network_header(skb);
1931 			/* Ensure the IP header is present in headroom */
1932 			if (!pskb_may_pull(skb, hlen_ipip))
1933 				goto ignore_tunnel;
1934 			IP_VS_DBG(12, "ICMP for %s %pI4->%pI4: mtu=%u\n",
1935 				  outer_proto, &ip_hdr(skb)->saddr,
1936 				  &ip_hdr(skb)->daddr, mtu);
1937 			ipv4_update_pmtu(skb, ipvs->net, mtu, 0, 0);
1938 			/* Client uses PMTUD? */
1939 			if (!(frag_off & htons(IP_DF)))
1940 				goto ignore_tunnel;
1941 			/* Prefer the resulting PMTU */
1942 			if (dest) {
1943 				struct ip_vs_dest_dst *dest_dst;
1944 
1945 				dest_dst = rcu_dereference(dest->dest_dst);
1946 				if (dest_dst)
1947 					mtu = dst_mtu(dest_dst->dst_cache);
1948 			}
1949 			if (mtu > 68 + hlen_ipip + ulen)
1950 				mtu -= hlen_ipip + ulen;
1951 			info = htonl(mtu);
1952 		}
1953 		/* Strip outer IP, ICMP and IPIP/UDP/GRE, go to IP header of
1954 		 * original request.
1955 		 */
1956 		if (pskb_pull(skb, offset2) == NULL)
1957 			goto ignore_tunnel;
1958 		skb_reset_network_header(skb);
1959 		memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt));
1960 		/* Ensure the IP header is present in headroom */
1961 		if (!pskb_may_pull(skb, hlen_orig))
1962 			goto ignore_tunnel;
1963 		IP_VS_DBG(12, "Sending ICMP for %pI4->%pI4: t=%u, c=%u, i=%u\n",
1964 			&ip_hdr(skb)->saddr, &ip_hdr(skb)->daddr,
1965 			type, code, ntohl(info));
1966 		icmp_send(skb, type, code, info);
1967 		/* ICMP can be shorter but anyways, account it */
1968 		ip_vs_out_stats(cp, skb);
1969 
1970 ignore_tunnel:
1971 		consume_skb(skb);
1972 		verdict = NF_STOLEN;
1973 		goto out;
1974 	}
1975 
1976 	/* do the statistics and put it back */
1977 	ip_vs_in_stats(cp, skb);
1978 	verdict = ip_vs_icmp_xmit(skb, cp, pp, iph->len, hooknum, &ciph);
1979 
1980 out:
1981 	if (likely(!new_cp))
1982 		__ip_vs_conn_put(cp);
1983 	else
1984 		ip_vs_conn_put(cp);
1985 
1986 	return verdict;
1987 }
1988 
1989 #ifdef CONFIG_IP_VS_IPV6
ip_vs_in_icmp_v6(struct netns_ipvs * ipvs,struct sk_buff * skb,int * related,unsigned int hooknum,struct ip_vs_iphdr * iph)1990 static int ip_vs_in_icmp_v6(struct netns_ipvs *ipvs, struct sk_buff *skb,
1991 			    int *related, unsigned int hooknum,
1992 			    struct ip_vs_iphdr *iph)
1993 {
1994 	struct icmp6hdr	_icmph, *ic;
1995 	struct ip_vs_iphdr ciph = {.flags = 0, .fragoffs = 0};/*Contained IP */
1996 	struct ip_vs_conn *cp;
1997 	struct ip_vs_protocol *pp;
1998 	struct ip_vs_proto_data *pd;
1999 	unsigned int offset, verdict;
2000 	bool new_cp = false;
2001 
2002 	*related = 1;
2003 
2004 	ic = frag_safe_skb_hp(skb, iph->len, sizeof(_icmph), &_icmph);
2005 	if (ic == NULL)
2006 		return NF_DROP;
2007 
2008 	/*
2009 	 * Work through seeing if this is for us.
2010 	 * These checks are supposed to be in an order that means easy
2011 	 * things are checked first to speed up processing.... however
2012 	 * this means that some packets will manage to get a long way
2013 	 * down this stack and then be rejected, but that's life.
2014 	 */
2015 	if (ic->icmp6_type & ICMPV6_INFOMSG_MASK) {
2016 		*related = 0;
2017 		return NF_ACCEPT;
2018 	}
2019 	/* Fragment header that is before ICMP header tells us that:
2020 	 * it's not an error message since they can't be fragmented.
2021 	 */
2022 	if (iph->flags & IP6_FH_F_FRAG)
2023 		return NF_DROP;
2024 
2025 	IP_VS_DBG(8, "Incoming ICMPv6 (%d,%d) %pI6c->%pI6c\n",
2026 		  ic->icmp6_type, ntohs(icmpv6_id(ic)),
2027 		  &iph->saddr, &iph->daddr);
2028 
2029 	offset = iph->len + sizeof(_icmph);
2030 	if (!ip_vs_fill_iph_skb_icmp(AF_INET6, skb, offset, true, &ciph))
2031 		return NF_ACCEPT;
2032 
2033 	pd = ip_vs_proto_data_get(ipvs, ciph.protocol);
2034 	if (!pd)
2035 		return NF_ACCEPT;
2036 	pp = pd->pp;
2037 
2038 	/* Is the embedded protocol header present? */
2039 	if (ciph.fragoffs && !pp->dont_defrag)
2040 		return NF_ACCEPT;
2041 
2042 	IP_VS_DBG_PKT(11, AF_INET6, pp, skb, offset,
2043 		      "Checking incoming ICMPv6 for");
2044 
2045 	/* The embedded headers contain source and dest in reverse order
2046 	 * if not from localhost
2047 	 */
2048 	cp = INDIRECT_CALL_1(pp->conn_in_get, ip_vs_conn_in_get_proto,
2049 			     ipvs, AF_INET6, skb, &ciph);
2050 
2051 	if (!cp) {
2052 		int v;
2053 
2054 		if (!sysctl_schedule_icmp(ipvs))
2055 			return NF_ACCEPT;
2056 
2057 		if (!ip_vs_try_to_schedule(ipvs, AF_INET6, skb, pd, &v, &cp, &ciph))
2058 			return v;
2059 
2060 		new_cp = true;
2061 	}
2062 
2063 	verdict = NF_DROP;
2064 
2065 	/* Ensure the checksum is correct */
2066 	if (IP_VS_FWD_METHOD(cp) == IP_VS_CONN_F_MASQ &&
2067 	    !ip_vs_checksum_common_check(skb, iph->len, IPPROTO_ICMPV6,
2068 					 AF_INET6)) {
2069 		/* Failed checksum! */
2070 		IP_VS_DBG(1, "Incoming ICMPv6: failed checksum from %pI6c!\n",
2071 			  &iph->saddr);
2072 		goto out;
2073 	}
2074 
2075 	/* do the statistics and put it back */
2076 	ip_vs_in_stats(cp, skb);
2077 
2078 	verdict = ip_vs_icmp_xmit_v6(skb, cp, pp, iph->len, hooknum, &ciph);
2079 
2080 out:
2081 	if (likely(!new_cp))
2082 		__ip_vs_conn_put(cp);
2083 	else
2084 		ip_vs_conn_put(cp);
2085 
2086 	return verdict;
2087 }
2088 #endif
2089 
2090 
2091 /*
2092  *	Check if it's for virtual services, look it up,
2093  *	and send it on its way...
2094  */
2095 static unsigned int
ip_vs_in_hook(void * priv,struct sk_buff * skb,const struct nf_hook_state * state)2096 ip_vs_in_hook(void *priv, struct sk_buff *skb, const struct nf_hook_state *state)
2097 {
2098 	struct netns_ipvs *ipvs = net_ipvs(state->net);
2099 	unsigned int hooknum = state->hook;
2100 	struct ip_vs_iphdr iph;
2101 	struct ip_vs_protocol *pp;
2102 	struct ip_vs_proto_data *pd;
2103 	struct ip_vs_conn *cp;
2104 	int ret, pkts;
2105 	struct sock *sk;
2106 	int af = state->pf;
2107 
2108 	/* Already marked as IPVS request or reply? */
2109 	if (skb->ipvs_property)
2110 		return NF_ACCEPT;
2111 
2112 	/*
2113 	 *	Big tappo:
2114 	 *	- remote client: only PACKET_HOST
2115 	 *	- route: used for struct net when skb->dev is unset
2116 	 */
2117 	if (unlikely((skb->pkt_type != PACKET_HOST &&
2118 		      hooknum != NF_INET_LOCAL_OUT) ||
2119 		     !skb_dst(skb))) {
2120 		ip_vs_fill_iph_skb(af, skb, false, &iph);
2121 		IP_VS_DBG_BUF(12, "packet type=%d proto=%d daddr=%s"
2122 			      " ignored in hook %u\n",
2123 			      skb->pkt_type, iph.protocol,
2124 			      IP_VS_DBG_ADDR(af, &iph.daddr), hooknum);
2125 		return NF_ACCEPT;
2126 	}
2127 	/* ipvs enabled in this netns ? */
2128 	if (unlikely(sysctl_backup_only(ipvs)))
2129 		return NF_ACCEPT;
2130 
2131 	ip_vs_fill_iph_skb(af, skb, false, &iph);
2132 
2133 	/* Bad... Do not break raw sockets */
2134 	sk = skb_to_full_sk(skb);
2135 	if (unlikely(sk && hooknum == NF_INET_LOCAL_OUT &&
2136 		     af == AF_INET)) {
2137 
2138 		if (sk->sk_family == PF_INET && inet_test_bit(NODEFRAG, sk))
2139 			return NF_ACCEPT;
2140 	}
2141 
2142 #ifdef CONFIG_IP_VS_IPV6
2143 	if (af == AF_INET6) {
2144 		if (unlikely(iph.protocol == IPPROTO_ICMPV6)) {
2145 			int related;
2146 			int verdict = ip_vs_in_icmp_v6(ipvs, skb, &related,
2147 						       hooknum, &iph);
2148 
2149 			if (related)
2150 				return verdict;
2151 		}
2152 	} else
2153 #endif
2154 		if (unlikely(iph.protocol == IPPROTO_ICMP)) {
2155 			int related;
2156 			int verdict = ip_vs_in_icmp(ipvs, skb, &related,
2157 						    hooknum, &iph);
2158 
2159 			if (related)
2160 				return verdict;
2161 		}
2162 
2163 	/* Protocol supported? */
2164 	pd = ip_vs_proto_data_get(ipvs, iph.protocol);
2165 	if (unlikely(!pd)) {
2166 		/* The only way we'll see this packet again is if it's
2167 		 * encapsulated, so mark it with ipvs_property=1 so we
2168 		 * skip it if we're ignoring tunneled packets
2169 		 */
2170 		if (sysctl_ignore_tunneled(ipvs))
2171 			skb->ipvs_property = 1;
2172 
2173 		return NF_ACCEPT;
2174 	}
2175 	pp = pd->pp;
2176 	/*
2177 	 * Check if the packet belongs to an existing connection entry
2178 	 */
2179 	cp = INDIRECT_CALL_1(pp->conn_in_get, ip_vs_conn_in_get_proto,
2180 			     ipvs, af, skb, &iph);
2181 
2182 	if (!iph.fragoffs && is_new_conn(skb, &iph) && cp) {
2183 		int conn_reuse_mode = sysctl_conn_reuse_mode(ipvs);
2184 		bool old_ct = false, resched = false;
2185 
2186 		if (unlikely(sysctl_expire_nodest_conn(ipvs)) && cp->dest &&
2187 		    unlikely(!atomic_read(&cp->dest->weight))) {
2188 			resched = true;
2189 			old_ct = ip_vs_conn_uses_old_conntrack(cp, skb);
2190 		} else if (conn_reuse_mode &&
2191 			   is_new_conn_expected(cp, conn_reuse_mode)) {
2192 			old_ct = ip_vs_conn_uses_old_conntrack(cp, skb);
2193 			if (!atomic_read(&cp->n_control)) {
2194 				resched = true;
2195 			} else {
2196 				/* Do not reschedule controlling connection
2197 				 * that uses conntrack while it is still
2198 				 * referenced by controlled connection(s).
2199 				 */
2200 				resched = !old_ct;
2201 			}
2202 		}
2203 
2204 		if (resched) {
2205 			if (!old_ct) {
2206 				spin_lock_bh(&cp->lock);
2207 				cp->flags &= ~IP_VS_CONN_F_NFCT;
2208 				spin_unlock_bh(&cp->lock);
2209 			}
2210 			if (!atomic_read(&cp->n_control))
2211 				ip_vs_conn_expire_now(cp);
2212 			__ip_vs_conn_put(cp);
2213 			if (old_ct)
2214 				return NF_DROP;
2215 			cp = NULL;
2216 		}
2217 	}
2218 
2219 	/* Check the server status */
2220 	if (cp && cp->dest && !(cp->dest->cflags & IP_VS_DEST_CF_AVAILABLE)) {
2221 		/* the destination server is not available */
2222 		if (sysctl_expire_nodest_conn(ipvs)) {
2223 			bool old_ct = ip_vs_conn_uses_old_conntrack(cp, skb);
2224 
2225 			if (!old_ct) {
2226 				spin_lock_bh(&cp->lock);
2227 				cp->flags &= ~IP_VS_CONN_F_NFCT;
2228 				spin_unlock_bh(&cp->lock);
2229 			}
2230 
2231 			ip_vs_conn_expire_now(cp);
2232 			__ip_vs_conn_put(cp);
2233 			if (old_ct)
2234 				return NF_DROP;
2235 			cp = NULL;
2236 		} else {
2237 			__ip_vs_conn_put(cp);
2238 			return NF_DROP;
2239 		}
2240 	}
2241 
2242 	if (unlikely(!cp)) {
2243 		int v;
2244 
2245 		if (!ip_vs_try_to_schedule(ipvs, af, skb, pd, &v, &cp, &iph))
2246 			return v;
2247 	}
2248 
2249 	IP_VS_DBG_PKT(11, af, pp, skb, iph.off, "Incoming packet");
2250 
2251 	ip_vs_in_stats(cp, skb);
2252 	ip_vs_set_state(cp, IP_VS_DIR_INPUT, skb, pd, iph.len);
2253 	if (cp->packet_xmit)
2254 		ret = cp->packet_xmit(skb, cp, pp, &iph);
2255 		/* do not touch skb anymore */
2256 	else {
2257 		IP_VS_DBG_RL("warning: packet_xmit is null");
2258 		ret = NF_ACCEPT;
2259 	}
2260 
2261 	/* Increase its packet counter and check if it is needed
2262 	 * to be synchronized
2263 	 *
2264 	 * Sync connection if it is about to close to
2265 	 * encorage the standby servers to update the connections timeout
2266 	 *
2267 	 * For ONE_PKT let ip_vs_sync_conn() do the filter work.
2268 	 */
2269 
2270 	if (cp->flags & IP_VS_CONN_F_ONE_PACKET)
2271 		pkts = sysctl_sync_threshold(ipvs);
2272 	else
2273 		pkts = atomic_inc_return(&cp->in_pkts);
2274 
2275 	if (ipvs->sync_state & IP_VS_STATE_MASTER)
2276 		ip_vs_sync_conn(ipvs, cp, pkts);
2277 	else if ((cp->flags & IP_VS_CONN_F_ONE_PACKET) && cp->control)
2278 		/* increment is done inside ip_vs_sync_conn too */
2279 		atomic_inc(&cp->control->in_pkts);
2280 
2281 	ip_vs_conn_put(cp);
2282 	return ret;
2283 }
2284 
2285 /*
2286  *	It is hooked at the NF_INET_FORWARD chain, in order to catch ICMP
2287  *      related packets destined for 0.0.0.0/0.
2288  *      When fwmark-based virtual service is used, such as transparent
2289  *      cache cluster, TCP packets can be marked and routed to ip_vs_in,
2290  *      but ICMP destined for 0.0.0.0/0 cannot not be easily marked and
2291  *      sent to ip_vs_in_icmp. So, catch them at the NF_INET_FORWARD chain
2292  *      and send them to ip_vs_in_icmp.
2293  */
2294 static unsigned int
ip_vs_forward_icmp(void * priv,struct sk_buff * skb,const struct nf_hook_state * state)2295 ip_vs_forward_icmp(void *priv, struct sk_buff *skb,
2296 		   const struct nf_hook_state *state)
2297 {
2298 	struct netns_ipvs *ipvs = net_ipvs(state->net);
2299 	struct ip_vs_iphdr iphdr;
2300 	int r;
2301 
2302 	/* ipvs enabled in this netns ? */
2303 	if (unlikely(sysctl_backup_only(ipvs)))
2304 		return NF_ACCEPT;
2305 
2306 	if (state->pf == NFPROTO_IPV4) {
2307 		if (ip_hdr(skb)->protocol != IPPROTO_ICMP)
2308 			return NF_ACCEPT;
2309 		ip_vs_fill_iph_skb(AF_INET, skb, false, &iphdr);
2310 #ifdef CONFIG_IP_VS_IPV6
2311 	} else {
2312 		ip_vs_fill_iph_skb(AF_INET6, skb, false, &iphdr);
2313 
2314 		if (iphdr.protocol != IPPROTO_ICMPV6)
2315 			return NF_ACCEPT;
2316 
2317 		return ip_vs_in_icmp_v6(ipvs, skb, &r, state->hook, &iphdr);
2318 #endif
2319 	}
2320 
2321 	return ip_vs_in_icmp(ipvs, skb, &r, state->hook, &iphdr);
2322 }
2323 
2324 static const struct nf_hook_ops ip_vs_ops4[] = {
2325 	/* After packet filtering, change source only for VS/NAT */
2326 	{
2327 		.hook		= ip_vs_out_hook,
2328 		.pf		= NFPROTO_IPV4,
2329 		.hooknum	= NF_INET_LOCAL_IN,
2330 		.priority	= NF_IP_PRI_NAT_SRC - 2,
2331 	},
2332 	/* After packet filtering, forward packet through VS/DR, VS/TUN,
2333 	 * or VS/NAT(change destination), so that filtering rules can be
2334 	 * applied to IPVS. */
2335 	{
2336 		.hook		= ip_vs_in_hook,
2337 		.pf		= NFPROTO_IPV4,
2338 		.hooknum	= NF_INET_LOCAL_IN,
2339 		.priority	= NF_IP_PRI_NAT_SRC - 1,
2340 	},
2341 	/* Before ip_vs_in, change source only for VS/NAT */
2342 	{
2343 		.hook		= ip_vs_out_hook,
2344 		.pf		= NFPROTO_IPV4,
2345 		.hooknum	= NF_INET_LOCAL_OUT,
2346 		.priority	= NF_IP_PRI_NAT_DST + 1,
2347 	},
2348 	/* After mangle, schedule and forward local requests */
2349 	{
2350 		.hook		= ip_vs_in_hook,
2351 		.pf		= NFPROTO_IPV4,
2352 		.hooknum	= NF_INET_LOCAL_OUT,
2353 		.priority	= NF_IP_PRI_NAT_DST + 2,
2354 	},
2355 	/* After packet filtering (but before ip_vs_out_icmp), catch icmp
2356 	 * destined for 0.0.0.0/0, which is for incoming IPVS connections */
2357 	{
2358 		.hook		= ip_vs_forward_icmp,
2359 		.pf		= NFPROTO_IPV4,
2360 		.hooknum	= NF_INET_FORWARD,
2361 		.priority	= 99,
2362 	},
2363 	/* After packet filtering, change source only for VS/NAT */
2364 	{
2365 		.hook		= ip_vs_out_hook,
2366 		.pf		= NFPROTO_IPV4,
2367 		.hooknum	= NF_INET_FORWARD,
2368 		.priority	= 100,
2369 	},
2370 };
2371 
2372 #ifdef CONFIG_IP_VS_IPV6
2373 static const struct nf_hook_ops ip_vs_ops6[] = {
2374 	/* After packet filtering, change source only for VS/NAT */
2375 	{
2376 		.hook		= ip_vs_out_hook,
2377 		.pf		= NFPROTO_IPV6,
2378 		.hooknum	= NF_INET_LOCAL_IN,
2379 		.priority	= NF_IP6_PRI_NAT_SRC - 2,
2380 	},
2381 	/* After packet filtering, forward packet through VS/DR, VS/TUN,
2382 	 * or VS/NAT(change destination), so that filtering rules can be
2383 	 * applied to IPVS. */
2384 	{
2385 		.hook		= ip_vs_in_hook,
2386 		.pf		= NFPROTO_IPV6,
2387 		.hooknum	= NF_INET_LOCAL_IN,
2388 		.priority	= NF_IP6_PRI_NAT_SRC - 1,
2389 	},
2390 	/* Before ip_vs_in, change source only for VS/NAT */
2391 	{
2392 		.hook		= ip_vs_out_hook,
2393 		.pf		= NFPROTO_IPV6,
2394 		.hooknum	= NF_INET_LOCAL_OUT,
2395 		.priority	= NF_IP6_PRI_NAT_DST + 1,
2396 	},
2397 	/* After mangle, schedule and forward local requests */
2398 	{
2399 		.hook		= ip_vs_in_hook,
2400 		.pf		= NFPROTO_IPV6,
2401 		.hooknum	= NF_INET_LOCAL_OUT,
2402 		.priority	= NF_IP6_PRI_NAT_DST + 2,
2403 	},
2404 	/* After packet filtering (but before ip_vs_out_icmp), catch icmp
2405 	 * destined for 0.0.0.0/0, which is for incoming IPVS connections */
2406 	{
2407 		.hook		= ip_vs_forward_icmp,
2408 		.pf		= NFPROTO_IPV6,
2409 		.hooknum	= NF_INET_FORWARD,
2410 		.priority	= 99,
2411 	},
2412 	/* After packet filtering, change source only for VS/NAT */
2413 	{
2414 		.hook		= ip_vs_out_hook,
2415 		.pf		= NFPROTO_IPV6,
2416 		.hooknum	= NF_INET_FORWARD,
2417 		.priority	= 100,
2418 	},
2419 };
2420 #endif
2421 
ip_vs_register_hooks(struct netns_ipvs * ipvs,unsigned int af)2422 int ip_vs_register_hooks(struct netns_ipvs *ipvs, unsigned int af)
2423 {
2424 	const struct nf_hook_ops *ops;
2425 	unsigned int count;
2426 	unsigned int afmask;
2427 	int ret = 0;
2428 
2429 	if (af == AF_INET6) {
2430 #ifdef CONFIG_IP_VS_IPV6
2431 		ops = ip_vs_ops6;
2432 		count = ARRAY_SIZE(ip_vs_ops6);
2433 		afmask = 2;
2434 #else
2435 		return -EINVAL;
2436 #endif
2437 	} else {
2438 		ops = ip_vs_ops4;
2439 		count = ARRAY_SIZE(ip_vs_ops4);
2440 		afmask = 1;
2441 	}
2442 
2443 	if (!(ipvs->hooks_afmask & afmask)) {
2444 		ret = nf_register_net_hooks(ipvs->net, ops, count);
2445 		if (ret >= 0)
2446 			ipvs->hooks_afmask |= afmask;
2447 	}
2448 	return ret;
2449 }
2450 
ip_vs_unregister_hooks(struct netns_ipvs * ipvs,unsigned int af)2451 void ip_vs_unregister_hooks(struct netns_ipvs *ipvs, unsigned int af)
2452 {
2453 	const struct nf_hook_ops *ops;
2454 	unsigned int count;
2455 	unsigned int afmask;
2456 
2457 	if (af == AF_INET6) {
2458 #ifdef CONFIG_IP_VS_IPV6
2459 		ops = ip_vs_ops6;
2460 		count = ARRAY_SIZE(ip_vs_ops6);
2461 		afmask = 2;
2462 #else
2463 		return;
2464 #endif
2465 	} else {
2466 		ops = ip_vs_ops4;
2467 		count = ARRAY_SIZE(ip_vs_ops4);
2468 		afmask = 1;
2469 	}
2470 
2471 	if (ipvs->hooks_afmask & afmask) {
2472 		nf_unregister_net_hooks(ipvs->net, ops, count);
2473 		ipvs->hooks_afmask &= ~afmask;
2474 	}
2475 }
2476 
2477 /*
2478  *	Initialize IP Virtual Server netns mem.
2479  */
__ip_vs_init(struct net * net)2480 static int __net_init __ip_vs_init(struct net *net)
2481 {
2482 	struct netns_ipvs *ipvs;
2483 
2484 	ipvs = net_generic(net, ip_vs_net_id);
2485 	if (ipvs == NULL)
2486 		return -ENOMEM;
2487 
2488 	/* Hold the beast until a service is registered */
2489 	WRITE_ONCE(ipvs->enable, 0);
2490 	ipvs->net = net;
2491 	/* Counters used for creating unique names */
2492 	ipvs->gen = atomic_read(&ipvs_netns_cnt);
2493 	atomic_inc(&ipvs_netns_cnt);
2494 	net->ipvs = ipvs;
2495 
2496 	if (ip_vs_estimator_net_init(ipvs) < 0)
2497 		goto estimator_fail;
2498 
2499 	if (ip_vs_control_net_init(ipvs) < 0)
2500 		goto control_fail;
2501 
2502 	if (ip_vs_protocol_net_init(ipvs) < 0)
2503 		goto protocol_fail;
2504 
2505 	if (ip_vs_app_net_init(ipvs) < 0)
2506 		goto app_fail;
2507 
2508 	if (ip_vs_conn_net_init(ipvs) < 0)
2509 		goto conn_fail;
2510 
2511 	if (ip_vs_sync_net_init(ipvs) < 0)
2512 		goto sync_fail;
2513 
2514 	return 0;
2515 /*
2516  * Error handling
2517  */
2518 
2519 sync_fail:
2520 	ip_vs_conn_net_cleanup(ipvs);
2521 conn_fail:
2522 	ip_vs_app_net_cleanup(ipvs);
2523 app_fail:
2524 	ip_vs_protocol_net_cleanup(ipvs);
2525 protocol_fail:
2526 	ip_vs_control_net_cleanup(ipvs);
2527 control_fail:
2528 	ip_vs_estimator_net_cleanup(ipvs);
2529 estimator_fail:
2530 	net->ipvs = NULL;
2531 	return -ENOMEM;
2532 }
2533 
__ip_vs_cleanup_batch(struct list_head * net_list)2534 static void __net_exit __ip_vs_cleanup_batch(struct list_head *net_list)
2535 {
2536 	struct netns_ipvs *ipvs;
2537 	struct net *net;
2538 
2539 	ip_vs_service_nets_cleanup(net_list);	/* ip_vs_flush() with locks */
2540 	list_for_each_entry(net, net_list, exit_list) {
2541 		ipvs = net_ipvs(net);
2542 		ip_vs_conn_net_cleanup(ipvs);
2543 		ip_vs_app_net_cleanup(ipvs);
2544 		ip_vs_protocol_net_cleanup(ipvs);
2545 		ip_vs_control_net_cleanup(ipvs);
2546 		ip_vs_estimator_net_cleanup(ipvs);
2547 		IP_VS_DBG(2, "ipvs netns %d released\n", ipvs->gen);
2548 		net->ipvs = NULL;
2549 	}
2550 }
2551 
__ip_vs_dev_cleanup_batch(struct list_head * net_list)2552 static void __net_exit __ip_vs_dev_cleanup_batch(struct list_head *net_list)
2553 {
2554 	struct netns_ipvs *ipvs;
2555 	struct net *net;
2556 
2557 	list_for_each_entry(net, net_list, exit_list) {
2558 		ipvs = net_ipvs(net);
2559 		ip_vs_unregister_hooks(ipvs, AF_INET);
2560 		ip_vs_unregister_hooks(ipvs, AF_INET6);
2561 		WRITE_ONCE(ipvs->enable, 0);	/* Disable packet reception */
2562 		smp_wmb();
2563 		ip_vs_sync_net_cleanup(ipvs);
2564 	}
2565 }
2566 
2567 static struct pernet_operations ipvs_core_ops = {
2568 	.init = __ip_vs_init,
2569 	.exit_batch = __ip_vs_cleanup_batch,
2570 	.id   = &ip_vs_net_id,
2571 	.size = sizeof(struct netns_ipvs),
2572 };
2573 
2574 static struct pernet_operations ipvs_core_dev_ops = {
2575 	.exit_batch = __ip_vs_dev_cleanup_batch,
2576 };
2577 
2578 /*
2579  *	Initialize IP Virtual Server
2580  */
ip_vs_init(void)2581 static int __init ip_vs_init(void)
2582 {
2583 	int ret;
2584 
2585 	ret = ip_vs_control_init();
2586 	if (ret < 0) {
2587 		pr_err("can't setup control.\n");
2588 		goto exit;
2589 	}
2590 
2591 	ip_vs_protocol_init();
2592 
2593 	ret = ip_vs_conn_init();
2594 	if (ret < 0) {
2595 		pr_err("can't setup connection table.\n");
2596 		goto cleanup_protocol;
2597 	}
2598 
2599 	ret = register_pernet_subsys(&ipvs_core_ops);	/* Alloc ip_vs struct */
2600 	if (ret < 0)
2601 		goto cleanup_conn;
2602 
2603 	ret = register_pernet_device(&ipvs_core_dev_ops);
2604 	if (ret < 0)
2605 		goto cleanup_sub;
2606 
2607 	ret = ip_vs_register_nl_ioctl();
2608 	if (ret < 0) {
2609 		pr_err("can't register netlink/ioctl.\n");
2610 		goto cleanup_dev;
2611 	}
2612 
2613 	pr_info("ipvs loaded.\n");
2614 
2615 	return ret;
2616 
2617 cleanup_dev:
2618 	unregister_pernet_device(&ipvs_core_dev_ops);
2619 cleanup_sub:
2620 	unregister_pernet_subsys(&ipvs_core_ops);
2621 cleanup_conn:
2622 	ip_vs_conn_cleanup();
2623 cleanup_protocol:
2624 	ip_vs_protocol_cleanup();
2625 	ip_vs_control_cleanup();
2626 exit:
2627 	return ret;
2628 }
2629 
ip_vs_cleanup(void)2630 static void __exit ip_vs_cleanup(void)
2631 {
2632 	ip_vs_unregister_nl_ioctl();
2633 	unregister_pernet_device(&ipvs_core_dev_ops);
2634 	unregister_pernet_subsys(&ipvs_core_ops);	/* free ip_vs struct */
2635 	ip_vs_conn_cleanup();
2636 	ip_vs_protocol_cleanup();
2637 	ip_vs_control_cleanup();
2638 	/* common rcu_barrier() used by:
2639 	 * - ip_vs_control_cleanup()
2640 	 */
2641 	rcu_barrier();
2642 	pr_info("ipvs unloaded.\n");
2643 }
2644 
2645 module_init(ip_vs_init);
2646 module_exit(ip_vs_cleanup);
2647 MODULE_LICENSE("GPL");
2648 MODULE_DESCRIPTION("IP Virtual Server");
2649