udp.h 15.1 KB
Newer Older
1
/* SPDX-License-Identifier: GPL-2.0-or-later */
Linus Torvalds's avatar
Linus Torvalds committed
2 3 4 5 6 7 8 9 10
/*
 * INET		An implementation of the TCP/IP protocol suite for the LINUX
 *		operating system.  INET is implemented using the  BSD Socket
 *		interface as the means of communication with the user level.
 *
 *		Definitions for the UDP module.
 *
 * Version:	@(#)udp.h	1.0.2	05/07/93
 *
11
 * Authors:	Ross Biro
Linus Torvalds's avatar
Linus Torvalds committed
12 13 14 15 16 17 18 19 20 21
 *		Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
 *
 * Fixes:
 *		Alan Cox	: Turned on udp checksums. I don't want to
 *				  chase 'memory corruption' bugs that aren't!
 */
#ifndef _UDP_H
#define _UDP_H

#include <linux/list.h>
22
#include <linux/bug.h>
23
#include <net/inet_sock.h>
Linus Torvalds's avatar
Linus Torvalds committed
24 25
#include <net/sock.h>
#include <net/snmp.h>
26 27
#include <net/ip.h>
#include <linux/ipv6.h>
Linus Torvalds's avatar
Linus Torvalds committed
28
#include <linux/seq_file.h>
29
#include <linux/poll.h>
30
#include <linux/indirect_call_wrapper.h>
Linus Torvalds's avatar
Linus Torvalds committed
31

32 33 34 35 36 37 38 39 40 41
/**
 *	struct udp_skb_cb  -  UDP(-Lite) private variables
 *
 *	@header:      private variables used by IPv4/IPv6
 *	@cscov:       checksum coverage length (UDP-Lite only)
 *	@partial_cov: if set indicates partial csum coverage
 */
struct udp_skb_cb {
	union {
		struct inet_skb_parm	h4;
42
#if IS_ENABLED(CONFIG_IPV6)
43 44 45 46 47 48 49
		struct inet6_skb_parm	h6;
#endif
	} header;
	__u16		cscov;
	__u8		partial_cov;
};
#define UDP_SKB_CB(__skb)	((struct udp_skb_cb *)((__skb)->cb))
Linus Torvalds's avatar
Linus Torvalds committed
50

51 52 53 54 55 56 57
/**
 *	struct udp_hslot - UDP hash slot
 *
 *	@head:	head of list of sockets
 *	@count:	number of sockets in 'head' list
 *	@lock:	spinlock protecting changes to head/count
 */
58
struct udp_hslot {
59
	struct hlist_head	head;
60
	int			count;
61 62
	spinlock_t		lock;
} __attribute__((aligned(2 * sizeof(long))));
63

64 65 66 67 68 69 70 71
/**
 *	struct udp_table - UDP table
 *
 *	@hash:	hash table, sockets are hashed on (local port)
 *	@hash2:	hash table, sockets are hashed on (local port, local address)
 *	@mask:	number of slots in hash tables, minus 1
 *	@log:	log2(number of slots in hash table)
 */
72
struct udp_table {
73
	struct udp_hslot	*hash;
74 75 76
	struct udp_hslot	*hash2;
	unsigned int		mask;
	unsigned int		log;
77 78
};
extern struct udp_table udp_table;
79
void udp_table_init(struct udp_table *, const char *);
80
static inline struct udp_hslot *udp_hashslot(struct udp_table *table,
81
					     struct net *net, unsigned int num)
82 83 84
{
	return &table->hash[udp_hashfn(net, num, table->mask)];
}
85 86 87 88 89 90 91 92 93
/*
 * For secondary hash, net_hash_mix() is performed before calling
 * udp_hashslot2(), this explains difference with udp_hashslot()
 */
static inline struct udp_hslot *udp_hashslot2(struct udp_table *table,
					      unsigned int hash)
{
	return &table->hash2[hash & table->mask];
}
Linus Torvalds's avatar
Linus Torvalds committed
94 95 96

extern struct proto udp_prot;

Eric Dumazet's avatar
Eric Dumazet committed
97
extern atomic_long_t udp_memory_allocated;
Hideo Aoki's avatar
Hideo Aoki committed
98 99

/* sysctl variables for udp */
Eric Dumazet's avatar
Eric Dumazet committed
100
extern long sysctl_udp_mem[3];
Hideo Aoki's avatar
Hideo Aoki committed
101 102 103
extern int sysctl_udp_rmem_min;
extern int sysctl_udp_wmem_min;

104
struct sk_buff;
Linus Torvalds's avatar
Linus Torvalds committed
105

106 107 108
/*
 *	Generic checksumming routines for UDP(-Lite) v4 and v6
 */
109
static inline __sum16 __udp_lib_checksum_complete(struct sk_buff *skb)
110
{
111 112 113
	return (UDP_SKB_CB(skb)->cscov == skb->len ?
		__skb_checksum_complete(skb) :
		__skb_checksum_complete_head(skb, UDP_SKB_CB(skb)->cscov));
114 115
}

116
static inline int udp_lib_checksum_complete(struct sk_buff *skb)
117
{
118
	return !skb_csum_unnecessary(skb) &&
119 120 121 122 123 124 125 126 127
		__udp_lib_checksum_complete(skb);
}

/**
 * 	udp_csum_outgoing  -  compute UDPv4/v6 checksum over fragments
 * 	@sk: 	socket we are writing to
 * 	@skb: 	sk_buff containing the filled-in UDP header
 * 	        (checksum field must be zeroed out)
 */
128
static inline __wsum udp_csum_outgoing(struct sock *sk, struct sk_buff *skb)
129
{
130 131
	__wsum csum = csum_partial(skb_transport_header(skb),
				   sizeof(struct udphdr), 0);
132 133 134 135 136 137
	skb_queue_walk(&sk->sk_write_queue, skb) {
		csum = csum_add(csum, skb->csum);
	}
	return csum;
}

Herbert Xu's avatar
Herbert Xu committed
138 139 140 141 142 143 144 145 146 147 148
static inline __wsum udp_csum(struct sk_buff *skb)
{
	__wsum csum = csum_partial(skb_transport_header(skb),
				   sizeof(struct udphdr), skb->csum);

	for (skb = skb_shinfo(skb)->frag_list; skb; skb = skb->next) {
		csum = csum_add(csum, skb->csum);
	}
	return csum;
}

149 150 151 152 153 154 155 156 157
static inline __sum16 udp_v4_check(int len, __be32 saddr,
				   __be32 daddr, __wsum base)
{
	return csum_tcpudp_magic(saddr, daddr, len, IPPROTO_UDP, base);
}

void udp_set_csum(bool nocheck, struct sk_buff *skb,
		  __be32 saddr, __be32 daddr, int len);

158 159
static inline void udp_csum_pull_header(struct sk_buff *skb)
{
160 161
	if (!skb->csum_valid && skb->ip_summed == CHECKSUM_NONE)
		skb->csum = csum_partial(skb->data, sizeof(struct udphdr),
162 163 164 165 166
					 skb->csum);
	skb_pull_rcsum(skb, sizeof(struct udphdr));
	UDP_SKB_CB(skb)->cscov -= sizeof(struct udphdr);
}

167 168 169
typedef struct sock *(*udp_lookup_t)(struct sk_buff *skb, __be16 sport,
				     __be16 dport);

170 171 172 173 174 175
INDIRECT_CALLABLE_DECLARE(struct sk_buff *udp4_gro_receive(struct list_head *,
							   struct sk_buff *));
INDIRECT_CALLABLE_DECLARE(int udp4_gro_complete(struct sk_buff *, int));
INDIRECT_CALLABLE_DECLARE(struct sk_buff *udp6_gro_receive(struct list_head *,
							   struct sk_buff *));
INDIRECT_CALLABLE_DECLARE(int udp6_gro_complete(struct sk_buff *, int));
176
struct sk_buff *udp_gro_receive(struct list_head *head, struct sk_buff *skb,
177
				struct udphdr *uh, struct sock *sk);
178
int udp_gro_complete(struct sk_buff *skb, int nhoff, udp_lookup_t lookup);
Tom Herbert's avatar
Tom Herbert committed
179

Willem de Bruijn's avatar
Willem de Bruijn committed
180
struct sk_buff *__udp_gso_segment(struct sk_buff *gso_skb,
181
				  netdev_features_t features);
Willem de Bruijn's avatar
Willem de Bruijn committed
182

Tom Herbert's avatar
Tom Herbert committed
183 184 185 186 187 188 189 190 191 192 193 194 195 196
static inline struct udphdr *udp_gro_udphdr(struct sk_buff *skb)
{
	struct udphdr *uh;
	unsigned int hlen, off;

	off  = skb_gro_offset(skb);
	hlen = off + sizeof(*uh);
	uh   = skb_gro_header_fast(skb, off);
	if (skb_gro_header_hard(skb, hlen))
		uh = skb_gro_header_slow(skb, hlen, off);

	return uh;
}

197
/* hash routines shared between UDPv4/6 and UDP-Litev4/6 */
198
static inline int udp_lib_hash(struct sock *sk)
199 200
{
	BUG();
201
	return 0;
202 203
}

204 205
void udp_lib_unhash(struct sock *sk);
void udp_lib_rehash(struct sock *sk, u16 new_hash);
206 207 208 209 210 211

static inline void udp_lib_close(struct sock *sk, long timeout)
{
	sk_common_release(sk);
}

212 213
int udp_lib_get_port(struct sock *sk, unsigned short snum,
		     unsigned int hash2_nulladdr);
214

215 216
u32 udp_flow_hashrnd(void);

217 218 219 220 221 222 223 224 225 226 227
static inline __be16 udp_flow_src_port(struct net *net, struct sk_buff *skb,
				       int min, int max, bool use_eth)
{
	u32 hash;

	if (min >= max) {
		/* Use default range */
		inet_get_local_port_range(net, &min, &max);
	}

	hash = skb_get_hash(skb);
228 229 230 231 232 233 234 235 236 237 238 239 240
	if (unlikely(!hash)) {
		if (use_eth) {
			/* Can't find a normal hash, caller has indicated an
			 * Ethernet packet so use that to compute a hash.
			 */
			hash = jhash(skb->data, 2 * ETH_ALEN,
				     (__force u32) skb->protocol);
		} else {
			/* Can't derive any sort of hash for the packet, set
			 * to some consistent random value.
			 */
			hash = udp_flow_hashrnd();
		}
241 242 243 244 245 246 247 248 249 250 251 252
	}

	/* Since this is being sent on the wire obfuscate hash a bit
	 * to minimize possbility that any useful information to an
	 * attacker is leaked. Only upper 16 bits are relevant in the
	 * computation for 16 bit port value.
	 */
	hash ^= hash << 16;

	return htons((((u64) hash * (max - min)) >> 32) + min);
}

253 254 255 256 257
static inline int udp_rqueue_get(struct sock *sk)
{
	return sk_rmem_alloc_get(sk) - READ_ONCE(udp_sk(sk)->forward_deficit);
}

258 259 260 261 262 263 264 265 266 267 268
static inline bool udp_sk_bound_dev_eq(struct net *net, int bound_dev_if,
				       int dif, int sdif)
{
#if IS_ENABLED(CONFIG_NET_L3_MASTER_DEV)
	return inet_bound_dev_eq(!!net->ipv4.sysctl_udp_l3mdev_accept,
				 bound_dev_if, dif, sdif);
#else
	return inet_bound_dev_eq(true, bound_dev_if, dif, sdif);
#endif
}

269
/* net/ipv4/udp.c */
270
void udp_destruct_sock(struct sock *sk);
271 272
void skb_consume_udp(struct sock *sk, struct sk_buff *skb, int len);
int __udp_enqueue_schedule_skb(struct sock *sk, struct sk_buff *skb);
273
void udp_skb_destructor(struct sock *sk, struct sk_buff *skb);
274
struct sk_buff *__skb_recv_udp(struct sock *sk, unsigned int flags,
275
			       int noblock, int *off, int *err);
276 277 278
static inline struct sk_buff *skb_recv_udp(struct sock *sk, unsigned int flags,
					   int noblock, int *err)
{
279
	int off = 0;
280

281
	return __skb_recv_udp(sk, flags, noblock, &off, err);
282
}
283

284
int udp_v4_early_demux(struct sk_buff *skb);
285
bool udp_sk_rx_dst_set(struct sock *sk, struct dst_entry *dst);
286 287 288
int udp_get_port(struct sock *sk, unsigned short snum,
		 int (*saddr_cmp)(const struct sock *,
				  const struct sock *));
289
int udp_err(struct sk_buff *, u32);
290
int udp_abort(struct sock *sk, int err);
291
int udp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len);
292 293
int udp_push_pending_frames(struct sock *sk);
void udp_flush_pending_frames(struct sock *sk);
294
int udp_cmsg_send(struct sock *sk, struct msghdr *msg, u16 *gso_size);
295 296 297
void udp4_hwcsum(struct sk_buff *skb, __be32 src, __be32 dst);
int udp_rcv(struct sk_buff *skb);
int udp_ioctl(struct sock *sk, int cmd, unsigned long arg);
298
int udp_init_sock(struct sock *sk);
299
int udp_pre_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len);
300
int __udp_disconnect(struct sock *sk, int flags);
301
int udp_disconnect(struct sock *sk, int flags);
302
__poll_t udp_poll(struct file *file, struct socket *sock, poll_table *wait);
303
struct sk_buff *skb_udp_tunnel_segment(struct sk_buff *skb,
304 305
				       netdev_features_t features,
				       bool is_ipv6);
306 307 308 309 310 311 312 313
int udp_lib_getsockopt(struct sock *sk, int level, int optname,
		       char __user *optval, int __user *optlen);
int udp_lib_setsockopt(struct sock *sk, int level, int optname,
		       char __user *optval, unsigned int optlen,
		       int (*push_pending_frames)(struct sock *));
struct sock *udp4_lib_lookup(struct net *net, __be32 saddr, __be16 sport,
			     __be32 daddr, __be16 dport, int dif);
struct sock *__udp4_lib_lookup(struct net *net, __be32 saddr, __be16 sport,
314
			       __be32 daddr, __be16 dport, int dif, int sdif,
315
			       struct udp_table *tbl, struct sk_buff *skb);
316 317
struct sock *udp4_lib_lookup_skb(struct sk_buff *skb,
				 __be16 sport, __be16 dport);
318 319 320 321 322 323 324
struct sock *udp6_lib_lookup(struct net *net,
			     const struct in6_addr *saddr, __be16 sport,
			     const struct in6_addr *daddr, __be16 dport,
			     int dif);
struct sock *__udp6_lib_lookup(struct net *net,
			       const struct in6_addr *saddr, __be16 sport,
			       const struct in6_addr *daddr, __be16 dport,
325
			       int dif, int sdif, struct udp_table *tbl,
326
			       struct sk_buff *skb);
327 328
struct sock *udp6_lib_lookup_skb(struct sk_buff *skb,
				 __be16 sport, __be16 dport);
329

330 331 332 333
/* UDP uses skb->dev_scratch to cache as much information as possible and avoid
 * possibly multiple cache miss on dequeue()
 */
struct udp_dev_scratch {
334 335 336 337 338 339 340 341 342 343 344 345
	/* skb->truesize and the stateless bit are embedded in a single field;
	 * do not use a bitfield since the compiler emits better/smaller code
	 * this way
	 */
	u32 _tsize_state;

#if BITS_PER_LONG == 64
	/* len and the bit needed to compute skb_csum_unnecessary
	 * will be on cold cache lines at recvmsg time.
	 * skb->len can be stored on 16 bits since the udp header has been
	 * already validated and pulled.
	 */
346 347 348
	u16 len;
	bool is_linear;
	bool csum_unnecessary;
349
#endif
350 351
};

352 353 354 355 356 357
static inline struct udp_dev_scratch *udp_skb_scratch(struct sk_buff *skb)
{
	return (struct udp_dev_scratch *)&skb->dev_scratch;
}

#if BITS_PER_LONG == 64
358 359
static inline unsigned int udp_skb_len(struct sk_buff *skb)
{
360
	return udp_skb_scratch(skb)->len;
361 362 363 364
}

static inline bool udp_skb_csum_unnecessary(struct sk_buff *skb)
{
365
	return udp_skb_scratch(skb)->csum_unnecessary;
366 367 368 369
}

static inline bool udp_skb_is_linear(struct sk_buff *skb)
{
370
	return udp_skb_scratch(skb)->is_linear;
371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392
}

#else
static inline unsigned int udp_skb_len(struct sk_buff *skb)
{
	return skb->len;
}

static inline bool udp_skb_csum_unnecessary(struct sk_buff *skb)
{
	return skb_csum_unnecessary(skb);
}

static inline bool udp_skb_is_linear(struct sk_buff *skb)
{
	return !skb_is_nonlinear(skb);
}
#endif

static inline int copy_linear_skb(struct sk_buff *skb, int len, int off,
				  struct iov_iter *to)
{
393
	int n;
394

395 396
	n = copy_to_iter(skb->data + off, len, to);
	if (n == len)
397 398
		return 0;

399
	iov_iter_revert(to, n);
400 401 402
	return -EFAULT;
}

403 404 405
/*
 * 	SNMP statistics for UDP and UDP-Lite
 */
406 407 408
#define UDP_INC_STATS(net, field, is_udplite)		      do { \
	if (is_udplite) SNMP_INC_STATS((net)->mib.udplite_statistics, field);       \
	else		SNMP_INC_STATS((net)->mib.udp_statistics, field);  }  while(0)
409
#define __UDP_INC_STATS(net, field, is_udplite) 	      do { \
410 411
	if (is_udplite) __SNMP_INC_STATS((net)->mib.udplite_statistics, field);         \
	else		__SNMP_INC_STATS((net)->mib.udp_statistics, field);    }  while(0)
Linus Torvalds's avatar
Linus Torvalds committed
412

413
#define __UDP6_INC_STATS(net, field, is_udplite)	    do { \
414 415
	if (is_udplite) __SNMP_INC_STATS((net)->mib.udplite_stats_in6, field);\
	else		__SNMP_INC_STATS((net)->mib.udp_stats_in6, field);  \
416
} while(0)
417 418 419
#define UDP6_INC_STATS(net, field, __lite)		    do { \
	if (__lite) SNMP_INC_STATS((net)->mib.udplite_stats_in6, field);  \
	else	    SNMP_INC_STATS((net)->mib.udp_stats_in6, field);      \
420
} while(0)
421

422
#if IS_ENABLED(CONFIG_IPV6)
423 424 425 426 427 428 429
#define __UDPX_MIB(sk, ipv4)						\
({									\
	ipv4 ? (IS_UDPLITE(sk) ? sock_net(sk)->mib.udplite_statistics :	\
				 sock_net(sk)->mib.udp_statistics) :	\
		(IS_UDPLITE(sk) ? sock_net(sk)->mib.udplite_stats_in6 :	\
				 sock_net(sk)->mib.udp_stats_in6);	\
})
430
#else
431 432 433 434 435
#define __UDPX_MIB(sk, ipv4)						\
({									\
	IS_UDPLITE(sk) ? sock_net(sk)->mib.udplite_statistics :		\
			 sock_net(sk)->mib.udp_statistics;		\
})
436 437
#endif

438 439 440
#define __UDPX_INC_STATS(sk, field) \
	__SNMP_INC_STATS(__UDPX_MIB(sk, (sk)->sk_family == AF_INET), field)

441
#ifdef CONFIG_PROC_FS
Linus Torvalds's avatar
Linus Torvalds committed
442
struct udp_seq_afinfo {
443 444
	sa_family_t			family;
	struct udp_table		*udp_table;
Linus Torvalds's avatar
Linus Torvalds committed
445 446 447
};

struct udp_iter_state {
448
	struct seq_net_private  p;
Linus Torvalds's avatar
Linus Torvalds committed
449 450 451
	int			bucket;
};

452 453 454 455
void *udp_seq_start(struct seq_file *seq, loff_t *pos);
void *udp_seq_next(struct seq_file *seq, void *v, loff_t *pos);
void udp_seq_stop(struct seq_file *seq, void *v);

456 457
extern const struct seq_operations udp_seq_ops;
extern const struct seq_operations udp6_seq_ops;
458

459 460
int udp4_proc_init(void);
void udp4_proc_exit(void);
461
#endif /* CONFIG_PROC_FS */
Hideo Aoki's avatar
Hideo Aoki committed
462

463
int udpv4_offload_init(void);
464

465
void udp_init(void);
466

467
DECLARE_STATIC_KEY_FALSE(udp_encap_needed_key);
468
void udp_encap_enable(void);
469
#if IS_ENABLED(CONFIG_IPV6)
470
DECLARE_STATIC_KEY_FALSE(udpv6_encap_needed_key);
471
void udpv6_encap_enable(void);
472
#endif
473

474 475 476
static inline struct sk_buff *udp_rcv_segment(struct sock *sk,
					      struct sk_buff *skb, bool ipv4)
{
477
	netdev_features_t features = NETIF_F_SG;
478 479
	struct sk_buff *segs;

480 481 482 483 484 485
	/* Avoid csum recalculation by skb_segment unless userspace explicitly
	 * asks for the final checksum values
	 */
	if (!inet_get_convert_csum(sk))
		features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;

486 487 488 489 490 491 492
	/* UDP segmentation expects packets of type CHECKSUM_PARTIAL or
	 * CHECKSUM_NONE in __udp_gso_segment. UDP GRO indeed builds partial
	 * packets in udp_gro_complete_segment. As does UDP GSO, verified by
	 * udp_send_skb. But when those packets are looped in dev_loopback_xmit
	 * their ip_summed is set to CHECKSUM_UNNECESSARY. Reset in this
	 * specific case, where PARTIAL is both correct and required.
	 */
493 494 495
	if (skb->pkt_type == PACKET_LOOPBACK)
		skb->ip_summed = CHECKSUM_PARTIAL;

496 497 498
	/* the GSO CB lays after the UDP one, no need to save and restore any
	 * CB fragment
	 */
499
	segs = __skb_gso_segment(skb, features, false);
500
	if (IS_ERR_OR_NULL(segs)) {
501 502 503 504 505 506 507 508 509 510 511 512
		int segs_nr = skb_shinfo(skb)->gso_segs;

		atomic_add(segs_nr, &sk->sk_drops);
		SNMP_ADD_STATS(__UDPX_MIB(sk, ipv4), UDP_MIB_INERRORS, segs_nr);
		kfree_skb(skb);
		return NULL;
	}

	consume_skb(skb);
	return segs;
}

513 514 515 516 517
#ifdef CONFIG_BPF_STREAM_PARSER
struct sk_psock;
struct proto *udp_bpf_get_proto(struct sock *sk, struct sk_psock *psock);
#endif /* BPF_STREAM_PARSER */

Linus Torvalds's avatar
Linus Torvalds committed
518
#endif	/* _UDP_H */