net.h 11.1 KB
Newer Older
Linus Torvalds's avatar
Linus Torvalds committed
1 2 3 4 5 6 7 8 9
/*
 * NET		An implementation of the SOCKET network access protocol.
 *		This is the master header file for the Linux NET layer,
 *		or, in plain English: the networking handling part of the
 *		kernel.
 *
 * Version:	@(#)net.h	1.0.3	05/25/93
 *
 * Authors:	Orest Zborowski, <obz@Kodak.COM>
10
 *		Ross Biro
Linus Torvalds's avatar
Linus Torvalds committed
11 12 13 14 15 16 17 18 19 20
 *		Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
 *
 *		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 _LINUX_NET_H
#define _LINUX_NET_H

21
#include <linux/stringify.h>
22
#include <linux/random.h>
23 24
#include <linux/wait.h>
#include <linux/fcntl.h>	/* For O_CLOEXEC and O_NONBLOCK */
25
#include <linux/rcupdate.h>
26
#include <linux/once.h>
27
#include <linux/fs.h>
28

29
#include <uapi/linux/net.h>
30 31 32 33

struct poll_table_struct;
struct pipe_inode_info;
struct inode;
34
struct file;
35
struct net;
Linus Torvalds's avatar
Linus Torvalds committed
36

37 38
/* Historically, SOCKWQ_ASYNC_NOSPACE & SOCKWQ_ASYNC_WAITDATA were located
 * in sock->flags, but moved into sk->sk_wq->flags to be RCU protected.
39
 * Eventually all flags will be in sk->sk_wq->flags.
40
 */
41 42
#define SOCKWQ_ASYNC_NOSPACE	0
#define SOCKWQ_ASYNC_WAITDATA	1
Linus Torvalds's avatar
Linus Torvalds committed
43 44
#define SOCK_NOSPACE		2
#define SOCK_PASSCRED		3
45
#define SOCK_PASSSEC		4
Linus Torvalds's avatar
Linus Torvalds committed
46 47

#ifndef ARCH_HAS_SOCKET_TYPES
48 49 50 51 52 53 54
/**
 * enum sock_type - Socket types
 * @SOCK_STREAM: stream (connection) socket
 * @SOCK_DGRAM: datagram (conn.less) socket
 * @SOCK_RAW: raw socket
 * @SOCK_RDM: reliably-delivered message
 * @SOCK_SEQPACKET: sequential packet socket
55
 * @SOCK_DCCP: Datagram Congestion Control Protocol socket
56 57 58
 * @SOCK_PACKET: linux specific way of getting packets at the dev level.
 *		  For writing rarp and other similar things on the user level.
 *
Linus Torvalds's avatar
Linus Torvalds committed
59 60 61 62 63 64 65 66 67 68
 * When adding some new socket type please
 * grep ARCH_HAS_SOCKET_TYPE include/asm-* /socket.h, at least MIPS
 * overrides this enum for binary compat reasons.
 */
enum sock_type {
	SOCK_STREAM	= 1,
	SOCK_DGRAM	= 2,
	SOCK_RAW	= 3,
	SOCK_RDM	= 4,
	SOCK_SEQPACKET	= 5,
69
	SOCK_DCCP	= 6,
Linus Torvalds's avatar
Linus Torvalds committed
70 71 72 73
	SOCK_PACKET	= 10,
};

#define SOCK_MAX (SOCK_PACKET + 1)
74 75 76 77
/* Mask which covers at least up to SOCK_MASK-1.  The
 * remaining bits are used as flags. */
#define SOCK_TYPE_MASK 0xf

Ulrich Drepper's avatar
Ulrich Drepper committed
78
/* Flags for socket, socketpair, accept4 */
79
#define SOCK_CLOEXEC	O_CLOEXEC
80 81 82
#ifndef SOCK_NONBLOCK
#define SOCK_NONBLOCK	O_NONBLOCK
#endif
Linus Torvalds's avatar
Linus Torvalds committed
83 84 85

#endif /* ARCH_HAS_SOCKET_TYPES */

86
enum sock_shutdown_cmd {
87 88 89
	SHUT_RD,
	SHUT_WR,
	SHUT_RDWR,
90 91
};

92
struct socket_wq {
93
	/* Note: wait MUST be first field of socket_wq */
94 95
	wait_queue_head_t	wait;
	struct fasync_struct	*fasync_list;
96
	unsigned long		flags; /* %SOCKWQ_ASYNC_NOSPACE, etc */
97 98 99
	struct rcu_head		rcu;
} ____cacheline_aligned_in_smp;

Linus Torvalds's avatar
Linus Torvalds committed
100 101
/**
 *  struct socket - general BSD socket
102
 *  @state: socket state (%SS_CONNECTED, etc)
103
 *  @type: socket type (%SOCK_STREAM, etc)
104
 *  @flags: socket flags (%SOCK_NOSPACE, etc)
105 106 107
 *  @ops: protocol specific socket operations
 *  @file: File back pointer for gc
 *  @sk: internal networking protocol agnostic socket representation
108
 *  @wq: wait queue for several uses
Linus Torvalds's avatar
Linus Torvalds committed
109 110 111
 */
struct socket {
	socket_state		state;
112

113
	short			type;
114

Linus Torvalds's avatar
Linus Torvalds committed
115
	unsigned long		flags;
116

117
	struct socket_wq	*wq;
118

Linus Torvalds's avatar
Linus Torvalds committed
119 120
	struct file		*file;
	struct sock		*sk;
121
	const struct proto_ops	*ops;
Linus Torvalds's avatar
Linus Torvalds committed
122 123 124 125 126 127 128
};

struct vm_area_struct;
struct page;
struct sockaddr;
struct msghdr;
struct module;
129 130 131
struct sk_buff;
typedef int (*sk_read_actor_t)(read_descriptor_t *, struct sk_buff *,
			       unsigned int, size_t);
Linus Torvalds's avatar
Linus Torvalds committed
132 133 134 135 136 137 138 139 140 141 142 143 144 145

struct proto_ops {
	int		family;
	struct module	*owner;
	int		(*release)   (struct socket *sock);
	int		(*bind)	     (struct socket *sock,
				      struct sockaddr *myaddr,
				      int sockaddr_len);
	int		(*connect)   (struct socket *sock,
				      struct sockaddr *vaddr,
				      int sockaddr_len, int flags);
	int		(*socketpair)(struct socket *sock1,
				      struct socket *sock2);
	int		(*accept)    (struct socket *sock,
146
				      struct socket *newsock, int flags, bool kern);
Linus Torvalds's avatar
Linus Torvalds committed
147 148
	int		(*getname)   (struct socket *sock,
				      struct sockaddr *addr,
149
				      int peer);
150
	__poll_t	(*poll)	     (struct file *file, struct socket *sock,
Linus Torvalds's avatar
Linus Torvalds committed
151 152 153
				      struct poll_table_struct *wait);
	int		(*ioctl)     (struct socket *sock, unsigned int cmd,
				      unsigned long arg);
154
#ifdef CONFIG_COMPAT
155 156
	int	 	(*compat_ioctl) (struct socket *sock, unsigned int cmd,
				      unsigned long arg);
157
#endif
Linus Torvalds's avatar
Linus Torvalds committed
158 159 160
	int		(*listen)    (struct socket *sock, int len);
	int		(*shutdown)  (struct socket *sock, int flags);
	int		(*setsockopt)(struct socket *sock, int level,
161
				      int optname, char __user *optval, unsigned int optlen);
Linus Torvalds's avatar
Linus Torvalds committed
162 163
	int		(*getsockopt)(struct socket *sock, int level,
				      int optname, char __user *optval, int __user *optlen);
164
#ifdef CONFIG_COMPAT
165
	int		(*compat_setsockopt)(struct socket *sock, int level,
166
				      int optname, char __user *optval, unsigned int optlen);
167 168
	int		(*compat_getsockopt)(struct socket *sock, int level,
				      int optname, char __user *optval, int __user *optlen);
169
#endif
170 171
	int		(*sendmsg)   (struct socket *sock, struct msghdr *m,
				      size_t total_len);
172 173 174 175 176 177 178 179
	/* Notes for implementing recvmsg:
	 * ===============================
	 * msg->msg_namelen should get updated by the recvmsg handlers
	 * iff msg_name != NULL. It is by default 0 to prevent
	 * returning uninitialized memory to user space.  The recvfrom
	 * handlers can assume that msg.msg_name is either NULL or has
	 * a minimum size of sizeof(struct sockaddr_storage).
	 */
180 181
	int		(*recvmsg)   (struct socket *sock, struct msghdr *m,
				      size_t total_len, int flags);
Linus Torvalds's avatar
Linus Torvalds committed
182 183 184 185
	int		(*mmap)	     (struct file *file, struct socket *sock,
				      struct vm_area_struct * vma);
	ssize_t		(*sendpage)  (struct socket *sock, struct page *page,
				      int offset, size_t size, int flags);
186 187
	ssize_t 	(*splice_read)(struct socket *sock,  loff_t *ppos,
				       struct pipe_inode_info *pipe, size_t len, unsigned int flags);
188
	int		(*set_peek_off)(struct sock *sk, int val);
189
	int		(*peek_len)(struct socket *sock);
190 191 192 193

	/* The following functions are called internally by kernel with
	 * sock lock already held.
	 */
194 195
	int		(*read_sock)(struct sock *sk, read_descriptor_t *desc,
				     sk_read_actor_t recv_actor);
196 197 198 199
	int		(*sendpage_locked)(struct sock *sk, struct page *page,
					   int offset, size_t size, int flags);
	int		(*sendmsg_locked)(struct sock *sk, struct msghdr *msg,
					  size_t size);
200
	int		(*set_rcvlowat)(struct sock *sk, int val);
Linus Torvalds's avatar
Linus Torvalds committed
201 202
};

203 204 205
#define DECLARE_SOCKADDR(type, dst, src)	\
	type dst = ({ __sockaddr_check_size(sizeof(*dst)); (type) src; })

Linus Torvalds's avatar
Linus Torvalds committed
206 207
struct net_proto_family {
	int		family;
208 209
	int		(*create)(struct net *net, struct socket *sock,
				  int protocol, int kern);
Linus Torvalds's avatar
Linus Torvalds committed
210 211 212 213 214 215
	struct module	*owner;
};

struct iovec;
struct kvec;

216 217 218 219 220 221 222
enum {
	SOCK_WAKE_IO,
	SOCK_WAKE_WAITD,
	SOCK_WAKE_SPACE,
	SOCK_WAKE_URG,
};

223
int sock_wake_async(struct socket_wq *sk_wq, int how, int band);
224 225
int sock_register(const struct net_proto_family *fam);
void sock_unregister(int family);
226
bool sock_is_registered(int family);
227 228 229
int __sock_create(struct net *net, int family, int type, int proto,
		  struct socket **res, int kern);
int sock_create(int family, int type, int proto, struct socket **res);
230
int sock_create_kern(struct net *net, int family, int type, int proto, struct socket **res);
231
int sock_create_lite(int family, int type, int proto, struct socket **res);
232
struct socket *sock_alloc(void);
233
void sock_release(struct socket *sock);
234
int sock_sendmsg(struct socket *sock, struct msghdr *msg);
235
int sock_recvmsg(struct socket *sock, struct msghdr *msg, int flags);
236 237 238
struct file *sock_alloc_file(struct socket *sock, int flags, const char *dname);
struct socket *sockfd_lookup(int fd, int *err);
struct socket *sock_from_file(struct file *file, int *err);
Linus Torvalds's avatar
Linus Torvalds committed
239
#define		     sockfd_put(sock) fput(sock->file)
240
int net_ratelimit(void);
241

242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261
#define net_ratelimited_function(function, ...)			\
do {								\
	if (net_ratelimit())					\
		function(__VA_ARGS__);				\
} while (0)

#define net_emerg_ratelimited(fmt, ...)				\
	net_ratelimited_function(pr_emerg, fmt, ##__VA_ARGS__)
#define net_alert_ratelimited(fmt, ...)				\
	net_ratelimited_function(pr_alert, fmt, ##__VA_ARGS__)
#define net_crit_ratelimited(fmt, ...)				\
	net_ratelimited_function(pr_crit, fmt, ##__VA_ARGS__)
#define net_err_ratelimited(fmt, ...)				\
	net_ratelimited_function(pr_err, fmt, ##__VA_ARGS__)
#define net_notice_ratelimited(fmt, ...)			\
	net_ratelimited_function(pr_notice, fmt, ##__VA_ARGS__)
#define net_warn_ratelimited(fmt, ...)				\
	net_ratelimited_function(pr_warn, fmt, ##__VA_ARGS__)
#define net_info_ratelimited(fmt, ...)				\
	net_ratelimited_function(pr_info, fmt, ##__VA_ARGS__)
262 263 264 265 266 267
#if defined(CONFIG_DYNAMIC_DEBUG)
#define net_dbg_ratelimited(fmt, ...)					\
do {									\
	DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt);			\
	if (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT) &&	\
	    net_ratelimit())						\
268 269
		__dynamic_pr_debug(&descriptor, pr_fmt(fmt),		\
		                   ##__VA_ARGS__);			\
270 271
} while (0)
#elif defined(DEBUG)
272 273
#define net_dbg_ratelimited(fmt, ...)				\
	net_ratelimited_function(pr_debug, fmt, ##__VA_ARGS__)
274 275 276 277 278 279 280
#else
#define net_dbg_ratelimited(fmt, ...)				\
	do {							\
		if (0)						\
			no_printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__); \
	} while (0)
#endif
281

282 283
#define net_get_random_once(buf, nbytes)			\
	get_random_once((buf), (nbytes))
284 285
#define net_get_random_once_wait(buf, nbytes)			\
	get_random_once_wait((buf), (nbytes))
286

287 288
int kernel_sendmsg(struct socket *sock, struct msghdr *msg, struct kvec *vec,
		   size_t num, size_t len);
289 290
int kernel_sendmsg_locked(struct sock *sk, struct msghdr *msg,
			  struct kvec *vec, size_t num, size_t len);
291 292
int kernel_recvmsg(struct socket *sock, struct msghdr *msg, struct kvec *vec,
		   size_t num, size_t len, int flags);
Linus Torvalds's avatar
Linus Torvalds committed
293

294 295 296 297 298
int kernel_bind(struct socket *sock, struct sockaddr *addr, int addrlen);
int kernel_listen(struct socket *sock, int backlog);
int kernel_accept(struct socket *sock, struct socket **newsock, int flags);
int kernel_connect(struct socket *sock, struct sockaddr *addr, int addrlen,
		   int flags);
299 300
int kernel_getsockname(struct socket *sock, struct sockaddr *addr);
int kernel_getpeername(struct socket *sock, struct sockaddr *addr);
301 302 303 304 305 306
int kernel_getsockopt(struct socket *sock, int level, int optname, char *optval,
		      int *optlen);
int kernel_setsockopt(struct socket *sock, int level, int optname, char *optval,
		      unsigned int optlen);
int kernel_sendpage(struct socket *sock, struct page *page, int offset,
		    size_t size, int flags);
307 308
int kernel_sendpage_locked(struct sock *sk, struct page *page, int offset,
			   size_t size, int flags);
309
int kernel_sock_shutdown(struct socket *sock, enum sock_shutdown_cmd how);
310

311
/* Routine returns the IP overhead imposed by a (caller-protected) socket. */
312 313
u32 kernel_sock_ip_overhead(struct sock *sk);

Linus Torvalds's avatar
Linus Torvalds committed
314 315 316
#define MODULE_ALIAS_NETPROTO(proto) \
	MODULE_ALIAS("net-pf-" __stringify(proto))

317 318 319
#define MODULE_ALIAS_NET_PF_PROTO(pf, proto) \
	MODULE_ALIAS("net-pf-" __stringify(pf) "-proto-" __stringify(proto))

320 321 322 323
#define MODULE_ALIAS_NET_PF_PROTO_TYPE(pf, proto, type) \
	MODULE_ALIAS("net-pf-" __stringify(pf) "-proto-" __stringify(proto) \
		     "-type-" __stringify(type))

324 325 326
#define MODULE_ALIAS_NET_PF_PROTO_NAME(pf, proto, name) \
	MODULE_ALIAS("net-pf-" __stringify(pf) "-proto-" __stringify(proto) \
		     name)
Linus Torvalds's avatar
Linus Torvalds committed
327
#endif	/* _LINUX_NET_H */