udp.h 12.7 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9
/*
 * 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
 *
10
 * Authors:	Ross Biro
L
Linus Torvalds 已提交
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
 *		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!
 *
 *		This program is free software; you can redistribute it and/or
 *		modify it under the terms of the GNU General Public License
 *		as published by the Free Software Foundation; either version
 *		2 of the License, or (at your option) any later version.
 */
#ifndef _UDP_H
#define _UDP_H

#include <linux/list.h>
26
#include <linux/bug.h>
27
#include <net/inet_sock.h>
L
Linus Torvalds 已提交
28 29
#include <net/sock.h>
#include <net/snmp.h>
30 31
#include <net/ip.h>
#include <linux/ipv6.h>
L
Linus Torvalds 已提交
32
#include <linux/seq_file.h>
A
Al Viro 已提交
33
#include <linux/poll.h>
L
Linus Torvalds 已提交
34

35 36 37 38 39 40 41 42 43 44
/**
 *	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;
E
Eric Dumazet 已提交
45
#if IS_ENABLED(CONFIG_IPV6)
46 47 48 49 50 51 52
		struct inet6_skb_parm	h6;
#endif
	} header;
	__u16		cscov;
	__u8		partial_cov;
};
#define UDP_SKB_CB(__skb)	((struct udp_skb_cb *)((__skb)->cb))
L
Linus Torvalds 已提交
53

E
Eric Dumazet 已提交
54 55 56 57 58 59 60
/**
 *	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
 */
61
struct udp_hslot {
62
	struct hlist_head	head;
E
Eric Dumazet 已提交
63
	int			count;
64 65
	spinlock_t		lock;
} __attribute__((aligned(2 * sizeof(long))));
66

67 68 69 70 71 72 73 74
/**
 *	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)
 */
75
struct udp_table {
76
	struct udp_hslot	*hash;
77 78 79
	struct udp_hslot	*hash2;
	unsigned int		mask;
	unsigned int		log;
80 81
};
extern struct udp_table udp_table;
82
void udp_table_init(struct udp_table *, const char *);
83
static inline struct udp_hslot *udp_hashslot(struct udp_table *table,
84
					     struct net *net, unsigned int num)
85 86 87
{
	return &table->hash[udp_hashfn(net, num, table->mask)];
}
88 89 90 91 92 93 94 95 96
/*
 * 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];
}
L
Linus Torvalds 已提交
97 98 99

extern struct proto udp_prot;

E
Eric Dumazet 已提交
100
extern atomic_long_t udp_memory_allocated;
H
Hideo Aoki 已提交
101 102

/* sysctl variables for udp */
E
Eric Dumazet 已提交
103
extern long sysctl_udp_mem[3];
H
Hideo Aoki 已提交
104 105 106
extern int sysctl_udp_rmem_min;
extern int sysctl_udp_wmem_min;

107
struct sk_buff;
L
Linus Torvalds 已提交
108

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

119
static inline int udp_lib_checksum_complete(struct sk_buff *skb)
120
{
121
	return !skb_csum_unnecessary(skb) &&
122 123 124 125 126 127 128 129 130
		__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)
 */
131
static inline __wsum udp_csum_outgoing(struct sock *sk, struct sk_buff *skb)
132
{
133 134
	__wsum csum = csum_partial(skb_transport_header(skb),
				   sizeof(struct udphdr), 0);
135 136 137 138 139 140
	skb_queue_walk(&sk->sk_write_queue, skb) {
		csum = csum_add(csum, skb->csum);
	}
	return csum;
}

H
Herbert Xu 已提交
141 142 143 144 145 146 147 148 149 150 151
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;
}

152 153 154 155 156 157 158 159 160
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);

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

170 171 172
typedef struct sock *(*udp_lookup_t)(struct sk_buff *skb, __be16 sport,
				     __be16 dport);

T
Tom Herbert 已提交
173
struct sk_buff **udp_gro_receive(struct sk_buff **head, struct sk_buff *skb,
174 175
				 struct udphdr *uh, udp_lookup_t lookup);
int udp_gro_complete(struct sk_buff *skb, int nhoff, udp_lookup_t lookup);
T
Tom Herbert 已提交
176 177 178 179 180 181 182 183 184 185 186 187 188 189 190

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;
}

191
/* hash routines shared between UDPv4/6 and UDP-Litev4/6 */
192
static inline int udp_lib_hash(struct sock *sk)
193 194
{
	BUG();
195
	return 0;
196 197
}

198 199
void udp_lib_unhash(struct sock *sk);
void udp_lib_rehash(struct sock *sk, u16 new_hash);
200 201 202 203 204 205

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

206 207
int udp_lib_get_port(struct sock *sk, unsigned short snum,
		     unsigned int hash2_nulladdr);
208

209 210
u32 udp_flow_hashrnd(void);

211 212 213 214 215 216 217 218 219 220 221
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);
222 223 224 225 226 227 228 229 230 231 232 233 234
	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();
		}
235 236 237 238 239 240 241 242 243 244 245 246
	}

	/* 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);
}

247
/* net/ipv4/udp.c */
248
void udp_destruct_sock(struct sock *sk);
249 250
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);
251
void udp_skb_destructor(struct sock *sk, struct sk_buff *skb);
252 253
struct sk_buff *__skb_recv_udp(struct sock *sk, unsigned int flags,
			       int noblock, int *peeked, int *off, int *err);
254 255 256 257 258 259 260
static inline struct sk_buff *skb_recv_udp(struct sock *sk, unsigned int flags,
					   int noblock, int *err)
{
	int peeked, off = 0;

	return __skb_recv_udp(sk, flags, noblock, &peeked, &off, err);
}
261

S
Shawn Bohrer 已提交
262
void udp_v4_early_demux(struct sk_buff *skb);
263
void udp_sk_rx_dst_set(struct sock *sk, struct dst_entry *dst);
264 265 266 267
int udp_get_port(struct sock *sk, unsigned short snum,
		 int (*saddr_cmp)(const struct sock *,
				  const struct sock *));
void udp_err(struct sk_buff *, u32);
268
int udp_abort(struct sock *sk, int err);
269
int udp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len);
270 271 272 273 274
int udp_push_pending_frames(struct sock *sk);
void udp_flush_pending_frames(struct sock *sk);
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);
275
int udp_init_sock(struct sock *sk);
276
int __udp_disconnect(struct sock *sk, int flags);
277 278 279
int udp_disconnect(struct sock *sk, int flags);
unsigned int udp_poll(struct file *file, struct socket *sock, poll_table *wait);
struct sk_buff *skb_udp_tunnel_segment(struct sk_buff *skb,
T
Tom Herbert 已提交
280 281
				       netdev_features_t features,
				       bool is_ipv6);
282 283 284 285 286 287 288 289 290
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,
			       __be32 daddr, __be16 dport, int dif,
291
			       struct udp_table *tbl, struct sk_buff *skb);
292 293
struct sock *udp4_lib_lookup_skb(struct sk_buff *skb,
				 __be16 sport, __be16 dport);
294 295 296 297 298 299 300
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,
301 302
			       int dif, struct udp_table *tbl,
			       struct sk_buff *skb);
303 304
struct sock *udp6_lib_lookup_skb(struct sk_buff *skb,
				 __be16 sport, __be16 dport);
305

306 307 308 309
/* UDP uses skb->dev_scratch to cache as much information as possible and avoid
 * possibly multiple cache miss on dequeue()
 */
struct udp_dev_scratch {
310 311 312 313 314 315 316 317 318 319 320 321
	/* 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.
	 */
322 323 324
	u16 len;
	bool is_linear;
	bool csum_unnecessary;
325
#endif
326 327
};

328 329 330 331 332 333
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
334 335
static inline unsigned int udp_skb_len(struct sk_buff *skb)
{
336
	return udp_skb_scratch(skb)->len;
337 338 339 340
}

static inline bool udp_skb_csum_unnecessary(struct sk_buff *skb)
{
341
	return udp_skb_scratch(skb)->csum_unnecessary;
342 343 344 345
}

static inline bool udp_skb_is_linear(struct sk_buff *skb)
{
346
	return udp_skb_scratch(skb)->is_linear;
347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377
}

#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)
{
	int n, copy = len - off;

	n = copy_to_iter(skb->data + off, copy, to);
	if (n == copy)
		return 0;

	return -EFAULT;
}

378 379 380
/*
 * 	SNMP statistics for UDP and UDP-Lite
 */
381 382 383
#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)
384
#define __UDP_INC_STATS(net, field, is_udplite) 	      do { \
E
Eric Dumazet 已提交
385 386
	if (is_udplite) __SNMP_INC_STATS((net)->mib.udplite_statistics, field);         \
	else		__SNMP_INC_STATS((net)->mib.udp_statistics, field);    }  while(0)
L
Linus Torvalds 已提交
387

388
#define __UDP6_INC_STATS(net, field, is_udplite)	    do { \
E
Eric Dumazet 已提交
389 390
	if (is_udplite) __SNMP_INC_STATS((net)->mib.udplite_stats_in6, field);\
	else		__SNMP_INC_STATS((net)->mib.udp_stats_in6, field);  \
391
} while(0)
392 393 394
#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);      \
395
} while(0)
396

E
Eric Dumazet 已提交
397
#if IS_ENABLED(CONFIG_IPV6)
398
#define __UDPX_INC_STATS(sk, field)					\
399 400
do {									\
	if ((sk)->sk_family == AF_INET)					\
401
		__UDP_INC_STATS(sock_net(sk), field, 0);		\
402
	else								\
403
		__UDP6_INC_STATS(sock_net(sk), field, 0);		\
404
} while (0)
405
#else
406
#define __UDPX_INC_STATS(sk, field) __UDP_INC_STATS(sock_net(sk), field, 0)
407 408
#endif

L
Linus Torvalds 已提交
409
/* /proc */
410 411
int udp_seq_open(struct inode *inode, struct file *file);

L
Linus Torvalds 已提交
412
struct udp_seq_afinfo {
413 414 415 416 417
	char				*name;
	sa_family_t			family;
	struct udp_table		*udp_table;
	const struct file_operations	*seq_fops;
	struct seq_operations		seq_ops;
L
Linus Torvalds 已提交
418 419 420
};

struct udp_iter_state {
421
	struct seq_net_private  p;
L
Linus Torvalds 已提交
422 423
	sa_family_t		family;
	int			bucket;
424
	struct udp_table	*udp_table;
L
Linus Torvalds 已提交
425 426
};

427
#ifdef CONFIG_PROC_FS
428 429
int udp_proc_register(struct net *net, struct udp_seq_afinfo *afinfo);
void udp_proc_unregister(struct net *net, struct udp_seq_afinfo *afinfo);
430

431 432
int udp4_proc_init(void);
void udp4_proc_exit(void);
433
#endif
H
Hideo Aoki 已提交
434

435
int udpv4_offload_init(void);
436

437
void udp_init(void);
438

439
void udp_encap_enable(void);
440
#if IS_ENABLED(CONFIG_IPV6)
441
void udpv6_encap_enable(void);
442
#endif
443

L
Linus Torvalds 已提交
444
#endif	/* _UDP_H */