xref: /linux/include/net/sock.h (revision 172589ccdde41b59861c92c4a971b95514ef24e3)
11da177e4SLinus Torvalds /*
21da177e4SLinus Torvalds  * INET		An implementation of the TCP/IP protocol suite for the LINUX
31da177e4SLinus Torvalds  *		operating system.  INET is implemented using the  BSD Socket
41da177e4SLinus Torvalds  *		interface as the means of communication with the user level.
51da177e4SLinus Torvalds  *
61da177e4SLinus Torvalds  *		Definitions for the AF_INET socket handler.
71da177e4SLinus Torvalds  *
81da177e4SLinus Torvalds  * Version:	@(#)sock.h	1.0.4	05/13/93
91da177e4SLinus Torvalds  *
1002c30a84SJesper Juhl  * Authors:	Ross Biro
111da177e4SLinus Torvalds  *		Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
121da177e4SLinus Torvalds  *		Corey Minyard <wf-rch!minyard@relay.EU.net>
131da177e4SLinus Torvalds  *		Florian La Roche <flla@stud.uni-sb.de>
141da177e4SLinus Torvalds  *
151da177e4SLinus Torvalds  * Fixes:
161da177e4SLinus Torvalds  *		Alan Cox	:	Volatiles in skbuff pointers. See
171da177e4SLinus Torvalds  *					skbuff comments. May be overdone,
181da177e4SLinus Torvalds  *					better to prove they can be removed
191da177e4SLinus Torvalds  *					than the reverse.
201da177e4SLinus Torvalds  *		Alan Cox	:	Added a zapped field for tcp to note
211da177e4SLinus Torvalds  *					a socket is reset and must stay shut up
221da177e4SLinus Torvalds  *		Alan Cox	:	New fields for options
231da177e4SLinus Torvalds  *	Pauline Middelink	:	identd support
241da177e4SLinus Torvalds  *		Alan Cox	:	Eliminate low level recv/recvfrom
251da177e4SLinus Torvalds  *		David S. Miller	:	New socket lookup architecture.
261da177e4SLinus Torvalds  *              Steve Whitehouse:       Default routines for sock_ops
271da177e4SLinus Torvalds  *              Arnaldo C. Melo :	removed net_pinfo, tp_pinfo and made
281da177e4SLinus Torvalds  *              			protinfo be just a void pointer, as the
291da177e4SLinus Torvalds  *              			protocol specific parts were moved to
301da177e4SLinus Torvalds  *              			respective headers and ipv4/v6, etc now
311da177e4SLinus Torvalds  *              			use private slabcaches for its socks
321da177e4SLinus Torvalds  *              Pedro Hortas	:	New flags field for socket options
331da177e4SLinus Torvalds  *
341da177e4SLinus Torvalds  *
351da177e4SLinus Torvalds  *		This program is free software; you can redistribute it and/or
361da177e4SLinus Torvalds  *		modify it under the terms of the GNU General Public License
371da177e4SLinus Torvalds  *		as published by the Free Software Foundation; either version
381da177e4SLinus Torvalds  *		2 of the License, or (at your option) any later version.
391da177e4SLinus Torvalds  */
401da177e4SLinus Torvalds #ifndef _SOCK_H
411da177e4SLinus Torvalds #define _SOCK_H
421da177e4SLinus Torvalds 
43*172589ccSIlpo Järvinen #include <linux/kernel.h>
441da177e4SLinus Torvalds #include <linux/list.h>
451da177e4SLinus Torvalds #include <linux/timer.h>
461da177e4SLinus Torvalds #include <linux/cache.h>
471da177e4SLinus Torvalds #include <linux/module.h>
48a5b5bb9aSIngo Molnar #include <linux/lockdep.h>
491da177e4SLinus Torvalds #include <linux/netdevice.h>
501da177e4SLinus Torvalds #include <linux/skbuff.h>	/* struct sk_buff */
51d7fe0f24SAl Viro #include <linux/mm.h>
521da177e4SLinus Torvalds #include <linux/security.h>
531da177e4SLinus Torvalds 
541da177e4SLinus Torvalds #include <linux/filter.h>
551da177e4SLinus Torvalds 
561da177e4SLinus Torvalds #include <asm/atomic.h>
571da177e4SLinus Torvalds #include <net/dst.h>
581da177e4SLinus Torvalds #include <net/checksum.h>
591da177e4SLinus Torvalds 
601da177e4SLinus Torvalds /*
611da177e4SLinus Torvalds  * This structure really needs to be cleaned up.
621da177e4SLinus Torvalds  * Most of it is for TCP, and not used by any of
631da177e4SLinus Torvalds  * the other protocols.
641da177e4SLinus Torvalds  */
651da177e4SLinus Torvalds 
661da177e4SLinus Torvalds /* Define this to get the SOCK_DBG debugging facility. */
671da177e4SLinus Torvalds #define SOCK_DEBUGGING
681da177e4SLinus Torvalds #ifdef SOCK_DEBUGGING
691da177e4SLinus Torvalds #define SOCK_DEBUG(sk, msg...) do { if ((sk) && sock_flag((sk), SOCK_DBG)) \
701da177e4SLinus Torvalds 					printk(KERN_DEBUG msg); } while (0)
711da177e4SLinus Torvalds #else
721da177e4SLinus Torvalds #define SOCK_DEBUG(sk, msg...) do { } while (0)
731da177e4SLinus Torvalds #endif
741da177e4SLinus Torvalds 
751da177e4SLinus Torvalds /* This is the per-socket lock.  The spinlock provides a synchronization
761da177e4SLinus Torvalds  * between user contexts and software interrupt processing, whereas the
771da177e4SLinus Torvalds  * mini-semaphore synchronizes multiple users amongst themselves.
781da177e4SLinus Torvalds  */
791da177e4SLinus Torvalds struct sock_iocb;
801da177e4SLinus Torvalds typedef struct {
811da177e4SLinus Torvalds 	spinlock_t		slock;
821da177e4SLinus Torvalds 	struct sock_iocb	*owner;
831da177e4SLinus Torvalds 	wait_queue_head_t	wq;
84a5b5bb9aSIngo Molnar 	/*
85a5b5bb9aSIngo Molnar 	 * We express the mutex-alike socket_lock semantics
86a5b5bb9aSIngo Molnar 	 * to the lock validator by explicitly managing
87a5b5bb9aSIngo Molnar 	 * the slock as a lock variant (in addition to
88a5b5bb9aSIngo Molnar 	 * the slock itself):
89a5b5bb9aSIngo Molnar 	 */
90a5b5bb9aSIngo Molnar #ifdef CONFIG_DEBUG_LOCK_ALLOC
91a5b5bb9aSIngo Molnar 	struct lockdep_map dep_map;
92a5b5bb9aSIngo Molnar #endif
931da177e4SLinus Torvalds } socket_lock_t;
941da177e4SLinus Torvalds 
951da177e4SLinus Torvalds struct sock;
968feaf0c0SArnaldo Carvalho de Melo struct proto;
971da177e4SLinus Torvalds 
981da177e4SLinus Torvalds /**
991da177e4SLinus Torvalds  *	struct sock_common - minimal network layer representation of sockets
1004dc3b16bSPavel Pisa  *	@skc_family: network address family
1014dc3b16bSPavel Pisa  *	@skc_state: Connection state
1024dc3b16bSPavel Pisa  *	@skc_reuse: %SO_REUSEADDR setting
1034dc3b16bSPavel Pisa  *	@skc_bound_dev_if: bound device index if != 0
1044dc3b16bSPavel Pisa  *	@skc_node: main hash linkage for various protocol lookup tables
1054dc3b16bSPavel Pisa  *	@skc_bind_node: bind hash linkage for various protocol lookup tables
1064dc3b16bSPavel Pisa  *	@skc_refcnt: reference count
10781c3d547SEric Dumazet  *	@skc_hash: hash value used with various protocol lookup tables
1088feaf0c0SArnaldo Carvalho de Melo  *	@skc_prot: protocol handlers inside a network family
1091da177e4SLinus Torvalds  *
1101da177e4SLinus Torvalds  *	This is the minimal network layer representation of sockets, the header
1118feaf0c0SArnaldo Carvalho de Melo  *	for struct sock and struct inet_timewait_sock.
1121da177e4SLinus Torvalds  */
1131da177e4SLinus Torvalds struct sock_common {
1141da177e4SLinus Torvalds 	unsigned short		skc_family;
1151da177e4SLinus Torvalds 	volatile unsigned char	skc_state;
1161da177e4SLinus Torvalds 	unsigned char		skc_reuse;
1171da177e4SLinus Torvalds 	int			skc_bound_dev_if;
1181da177e4SLinus Torvalds 	struct hlist_node	skc_node;
1191da177e4SLinus Torvalds 	struct hlist_node	skc_bind_node;
1201da177e4SLinus Torvalds 	atomic_t		skc_refcnt;
12181c3d547SEric Dumazet 	unsigned int		skc_hash;
1228feaf0c0SArnaldo Carvalho de Melo 	struct proto		*skc_prot;
1231da177e4SLinus Torvalds };
1241da177e4SLinus Torvalds 
1251da177e4SLinus Torvalds /**
1261da177e4SLinus Torvalds   *	struct sock - network layer representation of sockets
1278feaf0c0SArnaldo Carvalho de Melo   *	@__sk_common: shared layout with inet_timewait_sock
1284dc3b16bSPavel Pisa   *	@sk_shutdown: mask of %SEND_SHUTDOWN and/or %RCV_SHUTDOWN
1294dc3b16bSPavel Pisa   *	@sk_userlocks: %SO_SNDBUF and %SO_RCVBUF settings
1304dc3b16bSPavel Pisa   *	@sk_lock:	synchronizer
1314dc3b16bSPavel Pisa   *	@sk_rcvbuf: size of receive buffer in bytes
1324dc3b16bSPavel Pisa   *	@sk_sleep: sock wait queue
1334dc3b16bSPavel Pisa   *	@sk_dst_cache: destination cache
1344dc3b16bSPavel Pisa   *	@sk_dst_lock: destination cache lock
1354dc3b16bSPavel Pisa   *	@sk_policy: flow policy
1364dc3b16bSPavel Pisa   *	@sk_rmem_alloc: receive queue bytes committed
1374dc3b16bSPavel Pisa   *	@sk_receive_queue: incoming packets
1384dc3b16bSPavel Pisa   *	@sk_wmem_alloc: transmit queue bytes committed
1394dc3b16bSPavel Pisa   *	@sk_write_queue: Packet sending queue
14097fc2f08SChris Leech   *	@sk_async_wait_queue: DMA copied packets
1414dc3b16bSPavel Pisa   *	@sk_omem_alloc: "o" is "option" or "other"
1424dc3b16bSPavel Pisa   *	@sk_wmem_queued: persistent queue size
1434dc3b16bSPavel Pisa   *	@sk_forward_alloc: space allocated forward
1444dc3b16bSPavel Pisa   *	@sk_allocation: allocation mode
1454dc3b16bSPavel Pisa   *	@sk_sndbuf: size of send buffer in bytes
1464dc3b16bSPavel Pisa   *	@sk_flags: %SO_LINGER (l_onoff), %SO_BROADCAST, %SO_KEEPALIVE, %SO_OOBINLINE settings
1474dc3b16bSPavel Pisa   *	@sk_no_check: %SO_NO_CHECK setting, wether or not checkup packets
1484dc3b16bSPavel Pisa   *	@sk_route_caps: route capabilities (e.g. %NETIF_F_TSO)
149bcd76111SHerbert Xu   *	@sk_gso_type: GSO type (e.g. %SKB_GSO_TCPV4)
1504dc3b16bSPavel Pisa   *	@sk_lingertime: %SO_LINGER l_linger setting
1514dc3b16bSPavel Pisa   *	@sk_backlog: always used with the per-socket spinlock held
1524dc3b16bSPavel Pisa   *	@sk_callback_lock: used with the callbacks in the end of this struct
1534dc3b16bSPavel Pisa   *	@sk_error_queue: rarely used
154476e19cfSArnaldo Carvalho de Melo   *	@sk_prot_creator: sk_prot of original sock creator (see ipv6_setsockopt, IPV6_ADDRFORM for instance)
1554dc3b16bSPavel Pisa   *	@sk_err: last error
1564dc3b16bSPavel Pisa   *	@sk_err_soft: errors that don't cause failure but are the cause of a persistent failure not just 'timed out'
1574dc3b16bSPavel Pisa   *	@sk_ack_backlog: current listen backlog
1584dc3b16bSPavel Pisa   *	@sk_max_ack_backlog: listen backlog set in listen()
1594dc3b16bSPavel Pisa   *	@sk_priority: %SO_PRIORITY setting
1604dc3b16bSPavel Pisa   *	@sk_type: socket type (%SOCK_STREAM, etc)
1614dc3b16bSPavel Pisa   *	@sk_protocol: which protocol this socket belongs in this network family
1624dc3b16bSPavel Pisa   *	@sk_peercred: %SO_PEERCRED setting
1634dc3b16bSPavel Pisa   *	@sk_rcvlowat: %SO_RCVLOWAT setting
1644dc3b16bSPavel Pisa   *	@sk_rcvtimeo: %SO_RCVTIMEO setting
1654dc3b16bSPavel Pisa   *	@sk_sndtimeo: %SO_SNDTIMEO setting
1664dc3b16bSPavel Pisa   *	@sk_filter: socket filtering instructions
1674dc3b16bSPavel Pisa   *	@sk_protinfo: private area, net family specific, when not using slab
1684dc3b16bSPavel Pisa   *	@sk_timer: sock cleanup timer
1694dc3b16bSPavel Pisa   *	@sk_stamp: time stamp of last packet received
1704dc3b16bSPavel Pisa   *	@sk_socket: Identd and reporting IO signals
1714dc3b16bSPavel Pisa   *	@sk_user_data: RPC layer private data
1724dc3b16bSPavel Pisa   *	@sk_sndmsg_page: cached page for sendmsg
1734dc3b16bSPavel Pisa   *	@sk_sndmsg_off: cached offset for sendmsg
1744dc3b16bSPavel Pisa   *	@sk_send_head: front of stuff to transmit
17567be2dd1SMartin Waitz   *	@sk_security: used by security modules
1764dc3b16bSPavel Pisa   *	@sk_write_pending: a write to stream socket waits to start
1774dc3b16bSPavel Pisa   *	@sk_state_change: callback to indicate change in the state of the sock
1784dc3b16bSPavel Pisa   *	@sk_data_ready: callback to indicate there is data to be processed
1794dc3b16bSPavel Pisa   *	@sk_write_space: callback to indicate there is bf sending space available
1804dc3b16bSPavel Pisa   *	@sk_error_report: callback to indicate errors (e.g. %MSG_ERRQUEUE)
1814dc3b16bSPavel Pisa   *	@sk_backlog_rcv: callback to process the backlog
1824dc3b16bSPavel Pisa   *	@sk_destruct: called at sock freeing time, i.e. when all refcnt == 0
1831da177e4SLinus Torvalds  */
1841da177e4SLinus Torvalds struct sock {
1851da177e4SLinus Torvalds 	/*
1868feaf0c0SArnaldo Carvalho de Melo 	 * Now struct inet_timewait_sock also uses sock_common, so please just
1871da177e4SLinus Torvalds 	 * don't add nothing before this first member (__sk_common) --acme
1881da177e4SLinus Torvalds 	 */
1891da177e4SLinus Torvalds 	struct sock_common	__sk_common;
1901da177e4SLinus Torvalds #define sk_family		__sk_common.skc_family
1911da177e4SLinus Torvalds #define sk_state		__sk_common.skc_state
1921da177e4SLinus Torvalds #define sk_reuse		__sk_common.skc_reuse
1931da177e4SLinus Torvalds #define sk_bound_dev_if		__sk_common.skc_bound_dev_if
1941da177e4SLinus Torvalds #define sk_node			__sk_common.skc_node
1951da177e4SLinus Torvalds #define sk_bind_node		__sk_common.skc_bind_node
1961da177e4SLinus Torvalds #define sk_refcnt		__sk_common.skc_refcnt
19781c3d547SEric Dumazet #define sk_hash			__sk_common.skc_hash
1988feaf0c0SArnaldo Carvalho de Melo #define sk_prot			__sk_common.skc_prot
1991da177e4SLinus Torvalds 	unsigned char		sk_shutdown : 2,
2001da177e4SLinus Torvalds 				sk_no_check : 2,
2011da177e4SLinus Torvalds 				sk_userlocks : 4;
2021da177e4SLinus Torvalds 	unsigned char		sk_protocol;
2031da177e4SLinus Torvalds 	unsigned short		sk_type;
2041da177e4SLinus Torvalds 	int			sk_rcvbuf;
2051da177e4SLinus Torvalds 	socket_lock_t		sk_lock;
206fa438ccfSEric Dumazet 	/*
207fa438ccfSEric Dumazet 	 * The backlog queue is special, it is always used with
208fa438ccfSEric Dumazet 	 * the per-socket spinlock held and requires low latency
209fa438ccfSEric Dumazet 	 * access. Therefore we special case it's implementation.
210fa438ccfSEric Dumazet 	 */
211fa438ccfSEric Dumazet 	struct {
212fa438ccfSEric Dumazet 		struct sk_buff *head;
213fa438ccfSEric Dumazet 		struct sk_buff *tail;
214fa438ccfSEric Dumazet 	} sk_backlog;
2151da177e4SLinus Torvalds 	wait_queue_head_t	*sk_sleep;
2161da177e4SLinus Torvalds 	struct dst_entry	*sk_dst_cache;
2171da177e4SLinus Torvalds 	struct xfrm_policy	*sk_policy[2];
2181da177e4SLinus Torvalds 	rwlock_t		sk_dst_lock;
2191da177e4SLinus Torvalds 	atomic_t		sk_rmem_alloc;
2201da177e4SLinus Torvalds 	atomic_t		sk_wmem_alloc;
2211da177e4SLinus Torvalds 	atomic_t		sk_omem_alloc;
2224e07a91cSArnaldo Carvalho de Melo 	int			sk_sndbuf;
2231da177e4SLinus Torvalds 	struct sk_buff_head	sk_receive_queue;
2241da177e4SLinus Torvalds 	struct sk_buff_head	sk_write_queue;
22597fc2f08SChris Leech 	struct sk_buff_head	sk_async_wait_queue;
2261da177e4SLinus Torvalds 	int			sk_wmem_queued;
2271da177e4SLinus Torvalds 	int			sk_forward_alloc;
2287d877f3bSAl Viro 	gfp_t			sk_allocation;
2291da177e4SLinus Torvalds 	int			sk_route_caps;
230bcd76111SHerbert Xu 	int			sk_gso_type;
2319932cf95SDavid S. Miller 	int			sk_rcvlowat;
2321da177e4SLinus Torvalds 	unsigned long 		sk_flags;
2331da177e4SLinus Torvalds 	unsigned long	        sk_lingertime;
2341da177e4SLinus Torvalds 	struct sk_buff_head	sk_error_queue;
235476e19cfSArnaldo Carvalho de Melo 	struct proto		*sk_prot_creator;
2361da177e4SLinus Torvalds 	rwlock_t		sk_callback_lock;
2371da177e4SLinus Torvalds 	int			sk_err,
2381da177e4SLinus Torvalds 				sk_err_soft;
2391da177e4SLinus Torvalds 	unsigned short		sk_ack_backlog;
2401da177e4SLinus Torvalds 	unsigned short		sk_max_ack_backlog;
2411da177e4SLinus Torvalds 	__u32			sk_priority;
2421da177e4SLinus Torvalds 	struct ucred		sk_peercred;
2431da177e4SLinus Torvalds 	long			sk_rcvtimeo;
2441da177e4SLinus Torvalds 	long			sk_sndtimeo;
2451da177e4SLinus Torvalds 	struct sk_filter      	*sk_filter;
2461da177e4SLinus Torvalds 	void			*sk_protinfo;
2471da177e4SLinus Torvalds 	struct timer_list	sk_timer;
248b7aa0bf7SEric Dumazet 	ktime_t			sk_stamp;
2491da177e4SLinus Torvalds 	struct socket		*sk_socket;
2501da177e4SLinus Torvalds 	void			*sk_user_data;
2511da177e4SLinus Torvalds 	struct page		*sk_sndmsg_page;
2521da177e4SLinus Torvalds 	struct sk_buff		*sk_send_head;
2531da177e4SLinus Torvalds 	__u32			sk_sndmsg_off;
2541da177e4SLinus Torvalds 	int			sk_write_pending;
2551da177e4SLinus Torvalds 	void			*sk_security;
2561da177e4SLinus Torvalds 	void			(*sk_state_change)(struct sock *sk);
2571da177e4SLinus Torvalds 	void			(*sk_data_ready)(struct sock *sk, int bytes);
2581da177e4SLinus Torvalds 	void			(*sk_write_space)(struct sock *sk);
2591da177e4SLinus Torvalds 	void			(*sk_error_report)(struct sock *sk);
2601da177e4SLinus Torvalds   	int			(*sk_backlog_rcv)(struct sock *sk,
2611da177e4SLinus Torvalds 						  struct sk_buff *skb);
2621da177e4SLinus Torvalds 	void                    (*sk_destruct)(struct sock *sk);
2631da177e4SLinus Torvalds };
2641da177e4SLinus Torvalds 
2651da177e4SLinus Torvalds /*
2661da177e4SLinus Torvalds  * Hashed lists helper routines
2671da177e4SLinus Torvalds  */
268e48c414eSArnaldo Carvalho de Melo static inline struct sock *__sk_head(const struct hlist_head *head)
2691da177e4SLinus Torvalds {
2701da177e4SLinus Torvalds 	return hlist_entry(head->first, struct sock, sk_node);
2711da177e4SLinus Torvalds }
2721da177e4SLinus Torvalds 
273e48c414eSArnaldo Carvalho de Melo static inline struct sock *sk_head(const struct hlist_head *head)
2741da177e4SLinus Torvalds {
2751da177e4SLinus Torvalds 	return hlist_empty(head) ? NULL : __sk_head(head);
2761da177e4SLinus Torvalds }
2771da177e4SLinus Torvalds 
278e48c414eSArnaldo Carvalho de Melo static inline struct sock *sk_next(const struct sock *sk)
2791da177e4SLinus Torvalds {
2801da177e4SLinus Torvalds 	return sk->sk_node.next ?
2811da177e4SLinus Torvalds 		hlist_entry(sk->sk_node.next, struct sock, sk_node) : NULL;
2821da177e4SLinus Torvalds }
2831da177e4SLinus Torvalds 
284e48c414eSArnaldo Carvalho de Melo static inline int sk_unhashed(const struct sock *sk)
2851da177e4SLinus Torvalds {
2861da177e4SLinus Torvalds 	return hlist_unhashed(&sk->sk_node);
2871da177e4SLinus Torvalds }
2881da177e4SLinus Torvalds 
289e48c414eSArnaldo Carvalho de Melo static inline int sk_hashed(const struct sock *sk)
2901da177e4SLinus Torvalds {
291da753beaSAkinobu Mita 	return !sk_unhashed(sk);
2921da177e4SLinus Torvalds }
2931da177e4SLinus Torvalds 
2941da177e4SLinus Torvalds static __inline__ void sk_node_init(struct hlist_node *node)
2951da177e4SLinus Torvalds {
2961da177e4SLinus Torvalds 	node->pprev = NULL;
2971da177e4SLinus Torvalds }
2981da177e4SLinus Torvalds 
2991da177e4SLinus Torvalds static __inline__ void __sk_del_node(struct sock *sk)
3001da177e4SLinus Torvalds {
3011da177e4SLinus Torvalds 	__hlist_del(&sk->sk_node);
3021da177e4SLinus Torvalds }
3031da177e4SLinus Torvalds 
3041da177e4SLinus Torvalds static __inline__ int __sk_del_node_init(struct sock *sk)
3051da177e4SLinus Torvalds {
3061da177e4SLinus Torvalds 	if (sk_hashed(sk)) {
3071da177e4SLinus Torvalds 		__sk_del_node(sk);
3081da177e4SLinus Torvalds 		sk_node_init(&sk->sk_node);
3091da177e4SLinus Torvalds 		return 1;
3101da177e4SLinus Torvalds 	}
3111da177e4SLinus Torvalds 	return 0;
3121da177e4SLinus Torvalds }
3131da177e4SLinus Torvalds 
3141da177e4SLinus Torvalds /* Grab socket reference count. This operation is valid only
3151da177e4SLinus Torvalds    when sk is ALREADY grabbed f.e. it is found in hash table
3161da177e4SLinus Torvalds    or a list and the lookup is made under lock preventing hash table
3171da177e4SLinus Torvalds    modifications.
3181da177e4SLinus Torvalds  */
3191da177e4SLinus Torvalds 
3201da177e4SLinus Torvalds static inline void sock_hold(struct sock *sk)
3211da177e4SLinus Torvalds {
3221da177e4SLinus Torvalds 	atomic_inc(&sk->sk_refcnt);
3231da177e4SLinus Torvalds }
3241da177e4SLinus Torvalds 
3251da177e4SLinus Torvalds /* Ungrab socket in the context, which assumes that socket refcnt
3261da177e4SLinus Torvalds    cannot hit zero, f.e. it is true in context of any socketcall.
3271da177e4SLinus Torvalds  */
3281da177e4SLinus Torvalds static inline void __sock_put(struct sock *sk)
3291da177e4SLinus Torvalds {
3301da177e4SLinus Torvalds 	atomic_dec(&sk->sk_refcnt);
3311da177e4SLinus Torvalds }
3321da177e4SLinus Torvalds 
3331da177e4SLinus Torvalds static __inline__ int sk_del_node_init(struct sock *sk)
3341da177e4SLinus Torvalds {
3351da177e4SLinus Torvalds 	int rc = __sk_del_node_init(sk);
3361da177e4SLinus Torvalds 
3371da177e4SLinus Torvalds 	if (rc) {
3381da177e4SLinus Torvalds 		/* paranoid for a while -acme */
3391da177e4SLinus Torvalds 		WARN_ON(atomic_read(&sk->sk_refcnt) == 1);
3401da177e4SLinus Torvalds 		__sock_put(sk);
3411da177e4SLinus Torvalds 	}
3421da177e4SLinus Torvalds 	return rc;
3431da177e4SLinus Torvalds }
3441da177e4SLinus Torvalds 
3451da177e4SLinus Torvalds static __inline__ void __sk_add_node(struct sock *sk, struct hlist_head *list)
3461da177e4SLinus Torvalds {
3471da177e4SLinus Torvalds 	hlist_add_head(&sk->sk_node, list);
3481da177e4SLinus Torvalds }
3491da177e4SLinus Torvalds 
3501da177e4SLinus Torvalds static __inline__ void sk_add_node(struct sock *sk, struct hlist_head *list)
3511da177e4SLinus Torvalds {
3521da177e4SLinus Torvalds 	sock_hold(sk);
3531da177e4SLinus Torvalds 	__sk_add_node(sk, list);
3541da177e4SLinus Torvalds }
3551da177e4SLinus Torvalds 
3561da177e4SLinus Torvalds static __inline__ void __sk_del_bind_node(struct sock *sk)
3571da177e4SLinus Torvalds {
3581da177e4SLinus Torvalds 	__hlist_del(&sk->sk_bind_node);
3591da177e4SLinus Torvalds }
3601da177e4SLinus Torvalds 
3611da177e4SLinus Torvalds static __inline__ void sk_add_bind_node(struct sock *sk,
3621da177e4SLinus Torvalds 					struct hlist_head *list)
3631da177e4SLinus Torvalds {
3641da177e4SLinus Torvalds 	hlist_add_head(&sk->sk_bind_node, list);
3651da177e4SLinus Torvalds }
3661da177e4SLinus Torvalds 
3671da177e4SLinus Torvalds #define sk_for_each(__sk, node, list) \
3681da177e4SLinus Torvalds 	hlist_for_each_entry(__sk, node, list, sk_node)
3691da177e4SLinus Torvalds #define sk_for_each_from(__sk, node) \
3701da177e4SLinus Torvalds 	if (__sk && ({ node = &(__sk)->sk_node; 1; })) \
3711da177e4SLinus Torvalds 		hlist_for_each_entry_from(__sk, node, sk_node)
3721da177e4SLinus Torvalds #define sk_for_each_continue(__sk, node) \
3731da177e4SLinus Torvalds 	if (__sk && ({ node = &(__sk)->sk_node; 1; })) \
3741da177e4SLinus Torvalds 		hlist_for_each_entry_continue(__sk, node, sk_node)
3751da177e4SLinus Torvalds #define sk_for_each_safe(__sk, node, tmp, list) \
3761da177e4SLinus Torvalds 	hlist_for_each_entry_safe(__sk, node, tmp, list, sk_node)
3771da177e4SLinus Torvalds #define sk_for_each_bound(__sk, node, list) \
3781da177e4SLinus Torvalds 	hlist_for_each_entry(__sk, node, list, sk_bind_node)
3791da177e4SLinus Torvalds 
3801da177e4SLinus Torvalds /* Sock flags */
3811da177e4SLinus Torvalds enum sock_flags {
3821da177e4SLinus Torvalds 	SOCK_DEAD,
3831da177e4SLinus Torvalds 	SOCK_DONE,
3841da177e4SLinus Torvalds 	SOCK_URGINLINE,
3851da177e4SLinus Torvalds 	SOCK_KEEPOPEN,
3861da177e4SLinus Torvalds 	SOCK_LINGER,
3871da177e4SLinus Torvalds 	SOCK_DESTROY,
3881da177e4SLinus Torvalds 	SOCK_BROADCAST,
3891da177e4SLinus Torvalds 	SOCK_TIMESTAMP,
3901da177e4SLinus Torvalds 	SOCK_ZAPPED,
3911da177e4SLinus Torvalds 	SOCK_USE_WRITE_QUEUE, /* whether to call sk->sk_write_space in sock_wfree */
3921da177e4SLinus Torvalds 	SOCK_DBG, /* %SO_DEBUG setting */
3931da177e4SLinus Torvalds 	SOCK_RCVTSTAMP, /* %SO_TIMESTAMP setting */
39492f37fd2SEric Dumazet 	SOCK_RCVTSTAMPNS, /* %SO_TIMESTAMPNS setting */
3951da177e4SLinus Torvalds 	SOCK_LOCALROUTE, /* route locally only, %SO_DONTROUTE setting */
3961da177e4SLinus Torvalds 	SOCK_QUEUE_SHRUNK, /* write queue has been shrunk recently */
3971da177e4SLinus Torvalds };
3981da177e4SLinus Torvalds 
39953b924b3SRalf Baechle static inline void sock_copy_flags(struct sock *nsk, struct sock *osk)
40053b924b3SRalf Baechle {
40153b924b3SRalf Baechle 	nsk->sk_flags = osk->sk_flags;
40253b924b3SRalf Baechle }
40353b924b3SRalf Baechle 
4041da177e4SLinus Torvalds static inline void sock_set_flag(struct sock *sk, enum sock_flags flag)
4051da177e4SLinus Torvalds {
4061da177e4SLinus Torvalds 	__set_bit(flag, &sk->sk_flags);
4071da177e4SLinus Torvalds }
4081da177e4SLinus Torvalds 
4091da177e4SLinus Torvalds static inline void sock_reset_flag(struct sock *sk, enum sock_flags flag)
4101da177e4SLinus Torvalds {
4111da177e4SLinus Torvalds 	__clear_bit(flag, &sk->sk_flags);
4121da177e4SLinus Torvalds }
4131da177e4SLinus Torvalds 
4141da177e4SLinus Torvalds static inline int sock_flag(struct sock *sk, enum sock_flags flag)
4151da177e4SLinus Torvalds {
4161da177e4SLinus Torvalds 	return test_bit(flag, &sk->sk_flags);
4171da177e4SLinus Torvalds }
4181da177e4SLinus Torvalds 
4191da177e4SLinus Torvalds static inline void sk_acceptq_removed(struct sock *sk)
4201da177e4SLinus Torvalds {
4211da177e4SLinus Torvalds 	sk->sk_ack_backlog--;
4221da177e4SLinus Torvalds }
4231da177e4SLinus Torvalds 
4241da177e4SLinus Torvalds static inline void sk_acceptq_added(struct sock *sk)
4251da177e4SLinus Torvalds {
4261da177e4SLinus Torvalds 	sk->sk_ack_backlog++;
4271da177e4SLinus Torvalds }
4281da177e4SLinus Torvalds 
4291da177e4SLinus Torvalds static inline int sk_acceptq_is_full(struct sock *sk)
4301da177e4SLinus Torvalds {
43164a14651SDavid S. Miller 	return sk->sk_ack_backlog > sk->sk_max_ack_backlog;
4321da177e4SLinus Torvalds }
4331da177e4SLinus Torvalds 
4341da177e4SLinus Torvalds /*
4351da177e4SLinus Torvalds  * Compute minimal free write space needed to queue new packets.
4361da177e4SLinus Torvalds  */
4371da177e4SLinus Torvalds static inline int sk_stream_min_wspace(struct sock *sk)
4381da177e4SLinus Torvalds {
4391da177e4SLinus Torvalds 	return sk->sk_wmem_queued / 2;
4401da177e4SLinus Torvalds }
4411da177e4SLinus Torvalds 
4421da177e4SLinus Torvalds static inline int sk_stream_wspace(struct sock *sk)
4431da177e4SLinus Torvalds {
4441da177e4SLinus Torvalds 	return sk->sk_sndbuf - sk->sk_wmem_queued;
4451da177e4SLinus Torvalds }
4461da177e4SLinus Torvalds 
4471da177e4SLinus Torvalds extern void sk_stream_write_space(struct sock *sk);
4481da177e4SLinus Torvalds 
4491da177e4SLinus Torvalds static inline int sk_stream_memory_free(struct sock *sk)
4501da177e4SLinus Torvalds {
4511da177e4SLinus Torvalds 	return sk->sk_wmem_queued < sk->sk_sndbuf;
4521da177e4SLinus Torvalds }
4531da177e4SLinus Torvalds 
4541da177e4SLinus Torvalds extern void sk_stream_rfree(struct sk_buff *skb);
4551da177e4SLinus Torvalds 
4561da177e4SLinus Torvalds static inline void sk_stream_set_owner_r(struct sk_buff *skb, struct sock *sk)
4571da177e4SLinus Torvalds {
4581da177e4SLinus Torvalds 	skb->sk = sk;
4591da177e4SLinus Torvalds 	skb->destructor = sk_stream_rfree;
4601da177e4SLinus Torvalds 	atomic_add(skb->truesize, &sk->sk_rmem_alloc);
4611da177e4SLinus Torvalds 	sk->sk_forward_alloc -= skb->truesize;
4621da177e4SLinus Torvalds }
4631da177e4SLinus Torvalds 
4641da177e4SLinus Torvalds static inline void sk_stream_free_skb(struct sock *sk, struct sk_buff *skb)
4651da177e4SLinus Torvalds {
466dc6de336SDavid S. Miller 	skb_truesize_check(skb);
4671da177e4SLinus Torvalds 	sock_set_flag(sk, SOCK_QUEUE_SHRUNK);
4681da177e4SLinus Torvalds 	sk->sk_wmem_queued   -= skb->truesize;
4691da177e4SLinus Torvalds 	sk->sk_forward_alloc += skb->truesize;
4701da177e4SLinus Torvalds 	__kfree_skb(skb);
4711da177e4SLinus Torvalds }
4721da177e4SLinus Torvalds 
4731da177e4SLinus Torvalds /* The per-socket spinlock must be held here. */
4749ee6b535SStephen Hemminger static inline void sk_add_backlog(struct sock *sk, struct sk_buff *skb)
4759ee6b535SStephen Hemminger {
4769ee6b535SStephen Hemminger 	if (!sk->sk_backlog.tail) {
4779ee6b535SStephen Hemminger 		sk->sk_backlog.head = sk->sk_backlog.tail = skb;
4789ee6b535SStephen Hemminger 	} else {
4799ee6b535SStephen Hemminger 		sk->sk_backlog.tail->next = skb;
4809ee6b535SStephen Hemminger 		sk->sk_backlog.tail = skb;
4819ee6b535SStephen Hemminger 	}
4829ee6b535SStephen Hemminger 	skb->next = NULL;
4839ee6b535SStephen Hemminger }
4841da177e4SLinus Torvalds 
4851da177e4SLinus Torvalds #define sk_wait_event(__sk, __timeo, __condition)		\
4861da177e4SLinus Torvalds ({	int rc;							\
4871da177e4SLinus Torvalds 	release_sock(__sk);					\
4881da177e4SLinus Torvalds 	rc = __condition;					\
4891da177e4SLinus Torvalds 	if (!rc) {						\
4901da177e4SLinus Torvalds 		*(__timeo) = schedule_timeout(*(__timeo));	\
4911da177e4SLinus Torvalds 	}							\
4921da177e4SLinus Torvalds 	lock_sock(__sk);					\
493265a9285SAlexey Kuznetsov 	rc = __condition;					\
4941da177e4SLinus Torvalds 	rc;							\
4951da177e4SLinus Torvalds })
4961da177e4SLinus Torvalds 
4971da177e4SLinus Torvalds extern int sk_stream_wait_connect(struct sock *sk, long *timeo_p);
4981da177e4SLinus Torvalds extern int sk_stream_wait_memory(struct sock *sk, long *timeo_p);
4991da177e4SLinus Torvalds extern void sk_stream_wait_close(struct sock *sk, long timeo_p);
5001da177e4SLinus Torvalds extern int sk_stream_error(struct sock *sk, int flags, int err);
5011da177e4SLinus Torvalds extern void sk_stream_kill_queues(struct sock *sk);
5021da177e4SLinus Torvalds 
5031da177e4SLinus Torvalds extern int sk_wait_data(struct sock *sk, long *timeo);
5041da177e4SLinus Torvalds 
50560236fddSArnaldo Carvalho de Melo struct request_sock_ops;
5066d6ee43eSArnaldo Carvalho de Melo struct timewait_sock_ops;
5072e6599cbSArnaldo Carvalho de Melo 
5081da177e4SLinus Torvalds /* Networking protocol blocks we attach to sockets.
5091da177e4SLinus Torvalds  * socket layer -> transport layer interface
5101da177e4SLinus Torvalds  * transport -> network interface is defined by struct inet_proto
5111da177e4SLinus Torvalds  */
5121da177e4SLinus Torvalds struct proto {
5131da177e4SLinus Torvalds 	void			(*close)(struct sock *sk,
5141da177e4SLinus Torvalds 					long timeout);
5151da177e4SLinus Torvalds 	int			(*connect)(struct sock *sk,
5161da177e4SLinus Torvalds 				        struct sockaddr *uaddr,
5171da177e4SLinus Torvalds 					int addr_len);
5181da177e4SLinus Torvalds 	int			(*disconnect)(struct sock *sk, int flags);
5191da177e4SLinus Torvalds 
5201da177e4SLinus Torvalds 	struct sock *		(*accept) (struct sock *sk, int flags, int *err);
5211da177e4SLinus Torvalds 
5221da177e4SLinus Torvalds 	int			(*ioctl)(struct sock *sk, int cmd,
5231da177e4SLinus Torvalds 					 unsigned long arg);
5241da177e4SLinus Torvalds 	int			(*init)(struct sock *sk);
5251da177e4SLinus Torvalds 	int			(*destroy)(struct sock *sk);
5261da177e4SLinus Torvalds 	void			(*shutdown)(struct sock *sk, int how);
5271da177e4SLinus Torvalds 	int			(*setsockopt)(struct sock *sk, int level,
5281da177e4SLinus Torvalds 					int optname, char __user *optval,
5291da177e4SLinus Torvalds 					int optlen);
5301da177e4SLinus Torvalds 	int			(*getsockopt)(struct sock *sk, int level,
5311da177e4SLinus Torvalds 					int optname, char __user *optval,
5321da177e4SLinus Torvalds 					int __user *option);
5333fdadf7dSDmitry Mishin 	int			(*compat_setsockopt)(struct sock *sk,
5343fdadf7dSDmitry Mishin 					int level,
5353fdadf7dSDmitry Mishin 					int optname, char __user *optval,
5363fdadf7dSDmitry Mishin 					int optlen);
5373fdadf7dSDmitry Mishin 	int			(*compat_getsockopt)(struct sock *sk,
5383fdadf7dSDmitry Mishin 					int level,
5393fdadf7dSDmitry Mishin 					int optname, char __user *optval,
5403fdadf7dSDmitry Mishin 					int __user *option);
5411da177e4SLinus Torvalds 	int			(*sendmsg)(struct kiocb *iocb, struct sock *sk,
5421da177e4SLinus Torvalds 					   struct msghdr *msg, size_t len);
5431da177e4SLinus Torvalds 	int			(*recvmsg)(struct kiocb *iocb, struct sock *sk,
5441da177e4SLinus Torvalds 					   struct msghdr *msg,
5451da177e4SLinus Torvalds 					size_t len, int noblock, int flags,
5461da177e4SLinus Torvalds 					int *addr_len);
5471da177e4SLinus Torvalds 	int			(*sendpage)(struct sock *sk, struct page *page,
5481da177e4SLinus Torvalds 					int offset, size_t size, int flags);
5491da177e4SLinus Torvalds 	int			(*bind)(struct sock *sk,
5501da177e4SLinus Torvalds 					struct sockaddr *uaddr, int addr_len);
5511da177e4SLinus Torvalds 
5521da177e4SLinus Torvalds 	int			(*backlog_rcv) (struct sock *sk,
5531da177e4SLinus Torvalds 						struct sk_buff *skb);
5541da177e4SLinus Torvalds 
5551da177e4SLinus Torvalds 	/* Keeping track of sk's, looking them up, and port selection methods. */
5561da177e4SLinus Torvalds 	void			(*hash)(struct sock *sk);
5571da177e4SLinus Torvalds 	void			(*unhash)(struct sock *sk);
5581da177e4SLinus Torvalds 	int			(*get_port)(struct sock *sk, unsigned short snum);
5591da177e4SLinus Torvalds 
5601da177e4SLinus Torvalds 	/* Memory pressure */
5611da177e4SLinus Torvalds 	void			(*enter_memory_pressure)(void);
5621da177e4SLinus Torvalds 	atomic_t		*memory_allocated;	/* Current allocated memory. */
5631da177e4SLinus Torvalds 	atomic_t		*sockets_allocated;	/* Current number of sockets. */
5641da177e4SLinus Torvalds 	/*
5651da177e4SLinus Torvalds 	 * Pressure flag: try to collapse.
5661da177e4SLinus Torvalds 	 * Technical note: it is used by multiple contexts non atomically.
5671da177e4SLinus Torvalds 	 * All the sk_stream_mem_schedule() is of this nature: accounting
5681da177e4SLinus Torvalds 	 * is strict, actions are advisory and have some latency.
5691da177e4SLinus Torvalds 	 */
5701da177e4SLinus Torvalds 	int			*memory_pressure;
5711da177e4SLinus Torvalds 	int			*sysctl_mem;
5721da177e4SLinus Torvalds 	int			*sysctl_wmem;
5731da177e4SLinus Torvalds 	int			*sysctl_rmem;
5741da177e4SLinus Torvalds 	int			max_header;
5751da177e4SLinus Torvalds 
576e18b890bSChristoph Lameter 	struct kmem_cache		*slab;
5771da177e4SLinus Torvalds 	unsigned int		obj_size;
5781da177e4SLinus Torvalds 
5790a5578cfSArnaldo Carvalho de Melo 	atomic_t		*orphan_count;
5808feaf0c0SArnaldo Carvalho de Melo 
58160236fddSArnaldo Carvalho de Melo 	struct request_sock_ops	*rsk_prot;
5826d6ee43eSArnaldo Carvalho de Melo 	struct timewait_sock_ops *twsk_prot;
5832e6599cbSArnaldo Carvalho de Melo 
5841da177e4SLinus Torvalds 	struct module		*owner;
5851da177e4SLinus Torvalds 
5861da177e4SLinus Torvalds 	char			name[32];
5871da177e4SLinus Torvalds 
5881da177e4SLinus Torvalds 	struct list_head	node;
589e6848976SArnaldo Carvalho de Melo #ifdef SOCK_REFCNT_DEBUG
590e6848976SArnaldo Carvalho de Melo 	atomic_t		socks;
591e6848976SArnaldo Carvalho de Melo #endif
5921da177e4SLinus Torvalds 	struct {
5931da177e4SLinus Torvalds 		int inuse;
5941da177e4SLinus Torvalds 		u8  __pad[SMP_CACHE_BYTES - sizeof(int)];
5951da177e4SLinus Torvalds 	} stats[NR_CPUS];
5961da177e4SLinus Torvalds };
5971da177e4SLinus Torvalds 
5981da177e4SLinus Torvalds extern int proto_register(struct proto *prot, int alloc_slab);
5991da177e4SLinus Torvalds extern void proto_unregister(struct proto *prot);
6001da177e4SLinus Torvalds 
601e6848976SArnaldo Carvalho de Melo #ifdef SOCK_REFCNT_DEBUG
602e6848976SArnaldo Carvalho de Melo static inline void sk_refcnt_debug_inc(struct sock *sk)
603e6848976SArnaldo Carvalho de Melo {
604e6848976SArnaldo Carvalho de Melo 	atomic_inc(&sk->sk_prot->socks);
605e6848976SArnaldo Carvalho de Melo }
606e6848976SArnaldo Carvalho de Melo 
607e6848976SArnaldo Carvalho de Melo static inline void sk_refcnt_debug_dec(struct sock *sk)
608e6848976SArnaldo Carvalho de Melo {
609e6848976SArnaldo Carvalho de Melo 	atomic_dec(&sk->sk_prot->socks);
610e6848976SArnaldo Carvalho de Melo 	printk(KERN_DEBUG "%s socket %p released, %d are still alive\n",
611e6848976SArnaldo Carvalho de Melo 	       sk->sk_prot->name, sk, atomic_read(&sk->sk_prot->socks));
612e6848976SArnaldo Carvalho de Melo }
613e6848976SArnaldo Carvalho de Melo 
614e6848976SArnaldo Carvalho de Melo static inline void sk_refcnt_debug_release(const struct sock *sk)
615e6848976SArnaldo Carvalho de Melo {
616e6848976SArnaldo Carvalho de Melo 	if (atomic_read(&sk->sk_refcnt) != 1)
617e6848976SArnaldo Carvalho de Melo 		printk(KERN_DEBUG "Destruction of the %s socket %p delayed, refcnt=%d\n",
618e6848976SArnaldo Carvalho de Melo 		       sk->sk_prot->name, sk, atomic_read(&sk->sk_refcnt));
619e6848976SArnaldo Carvalho de Melo }
620e6848976SArnaldo Carvalho de Melo #else /* SOCK_REFCNT_DEBUG */
621e6848976SArnaldo Carvalho de Melo #define sk_refcnt_debug_inc(sk) do { } while (0)
622e6848976SArnaldo Carvalho de Melo #define sk_refcnt_debug_dec(sk) do { } while (0)
623e6848976SArnaldo Carvalho de Melo #define sk_refcnt_debug_release(sk) do { } while (0)
624e6848976SArnaldo Carvalho de Melo #endif /* SOCK_REFCNT_DEBUG */
625e6848976SArnaldo Carvalho de Melo 
6261da177e4SLinus Torvalds /* Called with local bh disabled */
6271da177e4SLinus Torvalds static __inline__ void sock_prot_inc_use(struct proto *prot)
6281da177e4SLinus Torvalds {
6291da177e4SLinus Torvalds 	prot->stats[smp_processor_id()].inuse++;
6301da177e4SLinus Torvalds }
6311da177e4SLinus Torvalds 
6321da177e4SLinus Torvalds static __inline__ void sock_prot_dec_use(struct proto *prot)
6331da177e4SLinus Torvalds {
6341da177e4SLinus Torvalds 	prot->stats[smp_processor_id()].inuse--;
6351da177e4SLinus Torvalds }
6361da177e4SLinus Torvalds 
637614c6cb4SArnaldo Carvalho de Melo /* With per-bucket locks this operation is not-atomic, so that
638614c6cb4SArnaldo Carvalho de Melo  * this version is not worse.
639614c6cb4SArnaldo Carvalho de Melo  */
640614c6cb4SArnaldo Carvalho de Melo static inline void __sk_prot_rehash(struct sock *sk)
641614c6cb4SArnaldo Carvalho de Melo {
642614c6cb4SArnaldo Carvalho de Melo 	sk->sk_prot->unhash(sk);
643614c6cb4SArnaldo Carvalho de Melo 	sk->sk_prot->hash(sk);
644614c6cb4SArnaldo Carvalho de Melo }
645614c6cb4SArnaldo Carvalho de Melo 
6461da177e4SLinus Torvalds /* About 10 seconds */
6471da177e4SLinus Torvalds #define SOCK_DESTROY_TIME (10*HZ)
6481da177e4SLinus Torvalds 
6491da177e4SLinus Torvalds /* Sockets 0-1023 can't be bound to unless you are superuser */
6501da177e4SLinus Torvalds #define PROT_SOCK	1024
6511da177e4SLinus Torvalds 
6521da177e4SLinus Torvalds #define SHUTDOWN_MASK	3
6531da177e4SLinus Torvalds #define RCV_SHUTDOWN	1
6541da177e4SLinus Torvalds #define SEND_SHUTDOWN	2
6551da177e4SLinus Torvalds 
6561da177e4SLinus Torvalds #define SOCK_SNDBUF_LOCK	1
6571da177e4SLinus Torvalds #define SOCK_RCVBUF_LOCK	2
6581da177e4SLinus Torvalds #define SOCK_BINDADDR_LOCK	4
6591da177e4SLinus Torvalds #define SOCK_BINDPORT_LOCK	8
6601da177e4SLinus Torvalds 
6611da177e4SLinus Torvalds /* sock_iocb: used to kick off async processing of socket ios */
6621da177e4SLinus Torvalds struct sock_iocb {
6631da177e4SLinus Torvalds 	struct list_head	list;
6641da177e4SLinus Torvalds 
6651da177e4SLinus Torvalds 	int			flags;
6661da177e4SLinus Torvalds 	int			size;
6671da177e4SLinus Torvalds 	struct socket		*sock;
6681da177e4SLinus Torvalds 	struct sock		*sk;
6691da177e4SLinus Torvalds 	struct scm_cookie	*scm;
6701da177e4SLinus Torvalds 	struct msghdr		*msg, async_msg;
6711da177e4SLinus Torvalds 	struct kiocb		*kiocb;
6721da177e4SLinus Torvalds };
6731da177e4SLinus Torvalds 
6741da177e4SLinus Torvalds static inline struct sock_iocb *kiocb_to_siocb(struct kiocb *iocb)
6751da177e4SLinus Torvalds {
6761da177e4SLinus Torvalds 	return (struct sock_iocb *)iocb->private;
6771da177e4SLinus Torvalds }
6781da177e4SLinus Torvalds 
6791da177e4SLinus Torvalds static inline struct kiocb *siocb_to_kiocb(struct sock_iocb *si)
6801da177e4SLinus Torvalds {
6811da177e4SLinus Torvalds 	return si->kiocb;
6821da177e4SLinus Torvalds }
6831da177e4SLinus Torvalds 
6841da177e4SLinus Torvalds struct socket_alloc {
6851da177e4SLinus Torvalds 	struct socket socket;
6861da177e4SLinus Torvalds 	struct inode vfs_inode;
6871da177e4SLinus Torvalds };
6881da177e4SLinus Torvalds 
6891da177e4SLinus Torvalds static inline struct socket *SOCKET_I(struct inode *inode)
6901da177e4SLinus Torvalds {
6911da177e4SLinus Torvalds 	return &container_of(inode, struct socket_alloc, vfs_inode)->socket;
6921da177e4SLinus Torvalds }
6931da177e4SLinus Torvalds 
6941da177e4SLinus Torvalds static inline struct inode *SOCK_INODE(struct socket *socket)
6951da177e4SLinus Torvalds {
6961da177e4SLinus Torvalds 	return &container_of(socket, struct socket_alloc, socket)->vfs_inode;
6971da177e4SLinus Torvalds }
6981da177e4SLinus Torvalds 
6991da177e4SLinus Torvalds extern void __sk_stream_mem_reclaim(struct sock *sk);
7001da177e4SLinus Torvalds extern int sk_stream_mem_schedule(struct sock *sk, int size, int kind);
7011da177e4SLinus Torvalds 
7021da177e4SLinus Torvalds #define SK_STREAM_MEM_QUANTUM ((int)PAGE_SIZE)
7031da177e4SLinus Torvalds 
7041da177e4SLinus Torvalds static inline int sk_stream_pages(int amt)
7051da177e4SLinus Torvalds {
706*172589ccSIlpo Järvinen 	return DIV_ROUND_UP(amt, SK_STREAM_MEM_QUANTUM);
7071da177e4SLinus Torvalds }
7081da177e4SLinus Torvalds 
7091da177e4SLinus Torvalds static inline void sk_stream_mem_reclaim(struct sock *sk)
7101da177e4SLinus Torvalds {
7111da177e4SLinus Torvalds 	if (sk->sk_forward_alloc >= SK_STREAM_MEM_QUANTUM)
7121da177e4SLinus Torvalds 		__sk_stream_mem_reclaim(sk);
7131da177e4SLinus Torvalds }
7141da177e4SLinus Torvalds 
7151da177e4SLinus Torvalds static inline int sk_stream_rmem_schedule(struct sock *sk, struct sk_buff *skb)
7161da177e4SLinus Torvalds {
7171da177e4SLinus Torvalds 	return (int)skb->truesize <= sk->sk_forward_alloc ||
7181da177e4SLinus Torvalds 		sk_stream_mem_schedule(sk, skb->truesize, 1);
7191da177e4SLinus Torvalds }
7201da177e4SLinus Torvalds 
721d80d99d6SHerbert Xu static inline int sk_stream_wmem_schedule(struct sock *sk, int size)
722d80d99d6SHerbert Xu {
723d80d99d6SHerbert Xu 	return size <= sk->sk_forward_alloc ||
724d80d99d6SHerbert Xu 	       sk_stream_mem_schedule(sk, size, 0);
725d80d99d6SHerbert Xu }
726d80d99d6SHerbert Xu 
7271da177e4SLinus Torvalds /* Used by processes to "lock" a socket state, so that
7281da177e4SLinus Torvalds  * interrupts and bottom half handlers won't change it
7291da177e4SLinus Torvalds  * from under us. It essentially blocks any incoming
7301da177e4SLinus Torvalds  * packets, so that we won't get any new data or any
7311da177e4SLinus Torvalds  * packets that change the state of the socket.
7321da177e4SLinus Torvalds  *
7331da177e4SLinus Torvalds  * While locked, BH processing will add new packets to
7341da177e4SLinus Torvalds  * the backlog queue.  This queue is processed by the
7351da177e4SLinus Torvalds  * owner of the socket lock right before it is released.
7361da177e4SLinus Torvalds  *
7371da177e4SLinus Torvalds  * Since ~2.3.5 it is also exclusive sleep lock serializing
7381da177e4SLinus Torvalds  * accesses from user process context.
7391da177e4SLinus Torvalds  */
7401da177e4SLinus Torvalds #define sock_owned_by_user(sk)	((sk)->sk_lock.owner)
7411da177e4SLinus Torvalds 
742ed07536eSPeter Zijlstra /*
743ed07536eSPeter Zijlstra  * Macro so as to not evaluate some arguments when
744ed07536eSPeter Zijlstra  * lockdep is not enabled.
745ed07536eSPeter Zijlstra  *
746ed07536eSPeter Zijlstra  * Mark both the sk_lock and the sk_lock.slock as a
747ed07536eSPeter Zijlstra  * per-address-family lock class.
748ed07536eSPeter Zijlstra  */
749ed07536eSPeter Zijlstra #define sock_lock_init_class_and_name(sk, sname, skey, name, key) 	\
750ed07536eSPeter Zijlstra do {									\
751ed07536eSPeter Zijlstra 	sk->sk_lock.owner = NULL;					\
752ed07536eSPeter Zijlstra 	init_waitqueue_head(&sk->sk_lock.wq);				\
753ed07536eSPeter Zijlstra 	spin_lock_init(&(sk)->sk_lock.slock);				\
754ed07536eSPeter Zijlstra 	debug_check_no_locks_freed((void *)&(sk)->sk_lock,		\
755ed07536eSPeter Zijlstra 			sizeof((sk)->sk_lock));				\
756ed07536eSPeter Zijlstra 	lockdep_set_class_and_name(&(sk)->sk_lock.slock,		\
757ed07536eSPeter Zijlstra 		       	(skey), (sname));				\
758ed07536eSPeter Zijlstra 	lockdep_init_map(&(sk)->sk_lock.dep_map, (name), (key), 0);	\
759ed07536eSPeter Zijlstra } while (0)
760ed07536eSPeter Zijlstra 
761fcc70d5fSPeter Zijlstra extern void FASTCALL(lock_sock_nested(struct sock *sk, int subclass));
762fcc70d5fSPeter Zijlstra 
763fcc70d5fSPeter Zijlstra static inline void lock_sock(struct sock *sk)
764fcc70d5fSPeter Zijlstra {
765fcc70d5fSPeter Zijlstra 	lock_sock_nested(sk, 0);
766fcc70d5fSPeter Zijlstra }
767fcc70d5fSPeter Zijlstra 
7681da177e4SLinus Torvalds extern void FASTCALL(release_sock(struct sock *sk));
7691da177e4SLinus Torvalds 
7701da177e4SLinus Torvalds /* BH context may only use the following locking interface. */
7711da177e4SLinus Torvalds #define bh_lock_sock(__sk)	spin_lock(&((__sk)->sk_lock.slock))
772c6366184SIngo Molnar #define bh_lock_sock_nested(__sk) \
773c6366184SIngo Molnar 				spin_lock_nested(&((__sk)->sk_lock.slock), \
774c6366184SIngo Molnar 				SINGLE_DEPTH_NESTING)
7751da177e4SLinus Torvalds #define bh_unlock_sock(__sk)	spin_unlock(&((__sk)->sk_lock.slock))
7761da177e4SLinus Torvalds 
77786a76cafSVictor Fusco extern struct sock		*sk_alloc(int family,
778dd0fc66fSAl Viro 					  gfp_t priority,
7791da177e4SLinus Torvalds 					  struct proto *prot, int zero_it);
7801da177e4SLinus Torvalds extern void			sk_free(struct sock *sk);
78187d11cebSArnaldo Carvalho de Melo extern struct sock		*sk_clone(const struct sock *sk,
782dd0fc66fSAl Viro 					  const gfp_t priority);
7831da177e4SLinus Torvalds 
7841da177e4SLinus Torvalds extern struct sk_buff		*sock_wmalloc(struct sock *sk,
7851da177e4SLinus Torvalds 					      unsigned long size, int force,
786dd0fc66fSAl Viro 					      gfp_t priority);
7871da177e4SLinus Torvalds extern struct sk_buff		*sock_rmalloc(struct sock *sk,
7881da177e4SLinus Torvalds 					      unsigned long size, int force,
789dd0fc66fSAl Viro 					      gfp_t priority);
7901da177e4SLinus Torvalds extern void			sock_wfree(struct sk_buff *skb);
7911da177e4SLinus Torvalds extern void			sock_rfree(struct sk_buff *skb);
7921da177e4SLinus Torvalds 
7931da177e4SLinus Torvalds extern int			sock_setsockopt(struct socket *sock, int level,
7941da177e4SLinus Torvalds 						int op, char __user *optval,
7951da177e4SLinus Torvalds 						int optlen);
7961da177e4SLinus Torvalds 
7971da177e4SLinus Torvalds extern int			sock_getsockopt(struct socket *sock, int level,
7981da177e4SLinus Torvalds 						int op, char __user *optval,
7991da177e4SLinus Torvalds 						int __user *optlen);
8001da177e4SLinus Torvalds extern struct sk_buff 		*sock_alloc_send_skb(struct sock *sk,
8011da177e4SLinus Torvalds 						     unsigned long size,
8021da177e4SLinus Torvalds 						     int noblock,
8031da177e4SLinus Torvalds 						     int *errcode);
80486a76cafSVictor Fusco extern void *sock_kmalloc(struct sock *sk, int size,
805dd0fc66fSAl Viro 			  gfp_t priority);
8061da177e4SLinus Torvalds extern void sock_kfree_s(struct sock *sk, void *mem, int size);
8071da177e4SLinus Torvalds extern void sk_send_sigurg(struct sock *sk);
8081da177e4SLinus Torvalds 
8091da177e4SLinus Torvalds /*
8101da177e4SLinus Torvalds  * Functions to fill in entries in struct proto_ops when a protocol
8111da177e4SLinus Torvalds  * does not implement a particular function.
8121da177e4SLinus Torvalds  */
8131da177e4SLinus Torvalds extern int                      sock_no_bind(struct socket *,
8141da177e4SLinus Torvalds 					     struct sockaddr *, int);
8151da177e4SLinus Torvalds extern int                      sock_no_connect(struct socket *,
8161da177e4SLinus Torvalds 						struct sockaddr *, int, int);
8171da177e4SLinus Torvalds extern int                      sock_no_socketpair(struct socket *,
8181da177e4SLinus Torvalds 						   struct socket *);
8191da177e4SLinus Torvalds extern int                      sock_no_accept(struct socket *,
8201da177e4SLinus Torvalds 					       struct socket *, int);
8211da177e4SLinus Torvalds extern int                      sock_no_getname(struct socket *,
8221da177e4SLinus Torvalds 						struct sockaddr *, int *, int);
8231da177e4SLinus Torvalds extern unsigned int             sock_no_poll(struct file *, struct socket *,
8241da177e4SLinus Torvalds 					     struct poll_table_struct *);
8251da177e4SLinus Torvalds extern int                      sock_no_ioctl(struct socket *, unsigned int,
8261da177e4SLinus Torvalds 					      unsigned long);
8271da177e4SLinus Torvalds extern int			sock_no_listen(struct socket *, int);
8281da177e4SLinus Torvalds extern int                      sock_no_shutdown(struct socket *, int);
8291da177e4SLinus Torvalds extern int			sock_no_getsockopt(struct socket *, int , int,
8301da177e4SLinus Torvalds 						   char __user *, int __user *);
8311da177e4SLinus Torvalds extern int			sock_no_setsockopt(struct socket *, int, int,
8321da177e4SLinus Torvalds 						   char __user *, int);
8331da177e4SLinus Torvalds extern int                      sock_no_sendmsg(struct kiocb *, struct socket *,
8341da177e4SLinus Torvalds 						struct msghdr *, size_t);
8351da177e4SLinus Torvalds extern int                      sock_no_recvmsg(struct kiocb *, struct socket *,
8361da177e4SLinus Torvalds 						struct msghdr *, size_t, int);
8371da177e4SLinus Torvalds extern int			sock_no_mmap(struct file *file,
8381da177e4SLinus Torvalds 					     struct socket *sock,
8391da177e4SLinus Torvalds 					     struct vm_area_struct *vma);
8401da177e4SLinus Torvalds extern ssize_t			sock_no_sendpage(struct socket *sock,
8411da177e4SLinus Torvalds 						struct page *page,
8421da177e4SLinus Torvalds 						int offset, size_t size,
8431da177e4SLinus Torvalds 						int flags);
8441da177e4SLinus Torvalds 
8451da177e4SLinus Torvalds /*
8461da177e4SLinus Torvalds  * Functions to fill in entries in struct proto_ops when a protocol
8471da177e4SLinus Torvalds  * uses the inet style.
8481da177e4SLinus Torvalds  */
8491da177e4SLinus Torvalds extern int sock_common_getsockopt(struct socket *sock, int level, int optname,
8501da177e4SLinus Torvalds 				  char __user *optval, int __user *optlen);
8511da177e4SLinus Torvalds extern int sock_common_recvmsg(struct kiocb *iocb, struct socket *sock,
8521da177e4SLinus Torvalds 			       struct msghdr *msg, size_t size, int flags);
8531da177e4SLinus Torvalds extern int sock_common_setsockopt(struct socket *sock, int level, int optname,
8541da177e4SLinus Torvalds 				  char __user *optval, int optlen);
8553fdadf7dSDmitry Mishin extern int compat_sock_common_getsockopt(struct socket *sock, int level,
8563fdadf7dSDmitry Mishin 		int optname, char __user *optval, int __user *optlen);
8573fdadf7dSDmitry Mishin extern int compat_sock_common_setsockopt(struct socket *sock, int level,
8583fdadf7dSDmitry Mishin 		int optname, char __user *optval, int optlen);
8591da177e4SLinus Torvalds 
8601da177e4SLinus Torvalds extern void sk_common_release(struct sock *sk);
8611da177e4SLinus Torvalds 
8621da177e4SLinus Torvalds /*
8631da177e4SLinus Torvalds  *	Default socket callbacks and setup code
8641da177e4SLinus Torvalds  */
8651da177e4SLinus Torvalds 
8661da177e4SLinus Torvalds /* Initialise core socket variables */
8671da177e4SLinus Torvalds extern void sock_init_data(struct socket *sock, struct sock *sk);
8681da177e4SLinus Torvalds 
8691da177e4SLinus Torvalds /**
8701da177e4SLinus Torvalds  *	sk_filter - run a packet through a socket filter
8711da177e4SLinus Torvalds  *	@sk: sock associated with &sk_buff
8721da177e4SLinus Torvalds  *	@skb: buffer to filter
8731da177e4SLinus Torvalds  *	@needlock: set to 1 if the sock is not locked by caller.
8741da177e4SLinus Torvalds  *
8751da177e4SLinus Torvalds  * Run the filter code and then cut skb->data to correct size returned by
8761da177e4SLinus Torvalds  * sk_run_filter. If pkt_len is 0 we toss packet. If skb->len is smaller
8771da177e4SLinus Torvalds  * than pkt_len we keep whole skb->data. This is the socket level
8781da177e4SLinus Torvalds  * wrapper to sk_run_filter. It returns 0 if the packet should
8791da177e4SLinus Torvalds  * be accepted or -EPERM if the packet should be tossed.
8801da177e4SLinus Torvalds  *
8811da177e4SLinus Torvalds  */
8821da177e4SLinus Torvalds 
883fda9ef5dSDmitry Mishin static inline int sk_filter(struct sock *sk, struct sk_buff *skb)
8841da177e4SLinus Torvalds {
8851da177e4SLinus Torvalds 	int err;
886fda9ef5dSDmitry Mishin 	struct sk_filter *filter;
8871da177e4SLinus Torvalds 
8881da177e4SLinus Torvalds 	err = security_sock_rcv_skb(sk, skb);
8891da177e4SLinus Torvalds 	if (err)
8901da177e4SLinus Torvalds 		return err;
8911da177e4SLinus Torvalds 
892fda9ef5dSDmitry Mishin 	rcu_read_lock_bh();
8931da177e4SLinus Torvalds 	filter = sk->sk_filter;
8941da177e4SLinus Torvalds 	if (filter) {
8954bad4dc9SKris Katterjohn 		unsigned int pkt_len = sk_run_filter(skb, filter->insns,
8961da177e4SLinus Torvalds 				filter->len);
897b38dfee3SHerbert Xu 		err = pkt_len ? pskb_trim(skb, pkt_len) : -EPERM;
8981da177e4SLinus Torvalds 	}
899fda9ef5dSDmitry Mishin  	rcu_read_unlock_bh();
9001da177e4SLinus Torvalds 
9011da177e4SLinus Torvalds 	return err;
9021da177e4SLinus Torvalds }
9031da177e4SLinus Torvalds 
9041da177e4SLinus Torvalds /**
905dc9b3346SPaul Bonser  * 	sk_filter_rcu_free: Free a socket filter
906dc9b3346SPaul Bonser  *	@rcu: rcu_head that contains the sk_filter to free
9071da177e4SLinus Torvalds  */
908fda9ef5dSDmitry Mishin static inline void sk_filter_rcu_free(struct rcu_head *rcu)
909fda9ef5dSDmitry Mishin {
910fda9ef5dSDmitry Mishin 	struct sk_filter *fp = container_of(rcu, struct sk_filter, rcu);
911fda9ef5dSDmitry Mishin 	kfree(fp);
912fda9ef5dSDmitry Mishin }
913fda9ef5dSDmitry Mishin 
914dc9b3346SPaul Bonser /**
915dc9b3346SPaul Bonser  *	sk_filter_release: Release a socket filter
916dc9b3346SPaul Bonser  *	@sk: socket
917dc9b3346SPaul Bonser  *	@fp: filter to remove
918dc9b3346SPaul Bonser  *
919dc9b3346SPaul Bonser  *	Remove a filter from a socket and release its resources.
920dc9b3346SPaul Bonser  */
921dc9b3346SPaul Bonser 
9221da177e4SLinus Torvalds static inline void sk_filter_release(struct sock *sk, struct sk_filter *fp)
9231da177e4SLinus Torvalds {
9241da177e4SLinus Torvalds 	unsigned int size = sk_filter_len(fp);
9251da177e4SLinus Torvalds 
9261da177e4SLinus Torvalds 	atomic_sub(size, &sk->sk_omem_alloc);
9271da177e4SLinus Torvalds 
9281da177e4SLinus Torvalds 	if (atomic_dec_and_test(&fp->refcnt))
929fda9ef5dSDmitry Mishin 		call_rcu_bh(&fp->rcu, sk_filter_rcu_free);
9301da177e4SLinus Torvalds }
9311da177e4SLinus Torvalds 
9321da177e4SLinus Torvalds static inline void sk_filter_charge(struct sock *sk, struct sk_filter *fp)
9331da177e4SLinus Torvalds {
9341da177e4SLinus Torvalds 	atomic_inc(&fp->refcnt);
9351da177e4SLinus Torvalds 	atomic_add(sk_filter_len(fp), &sk->sk_omem_alloc);
9361da177e4SLinus Torvalds }
9371da177e4SLinus Torvalds 
9381da177e4SLinus Torvalds /*
9391da177e4SLinus Torvalds  * Socket reference counting postulates.
9401da177e4SLinus Torvalds  *
9411da177e4SLinus Torvalds  * * Each user of socket SHOULD hold a reference count.
9421da177e4SLinus Torvalds  * * Each access point to socket (an hash table bucket, reference from a list,
9431da177e4SLinus Torvalds  *   running timer, skb in flight MUST hold a reference count.
9441da177e4SLinus Torvalds  * * When reference count hits 0, it means it will never increase back.
9451da177e4SLinus Torvalds  * * When reference count hits 0, it means that no references from
9461da177e4SLinus Torvalds  *   outside exist to this socket and current process on current CPU
9471da177e4SLinus Torvalds  *   is last user and may/should destroy this socket.
9481da177e4SLinus Torvalds  * * sk_free is called from any context: process, BH, IRQ. When
9491da177e4SLinus Torvalds  *   it is called, socket has no references from outside -> sk_free
9501da177e4SLinus Torvalds  *   may release descendant resources allocated by the socket, but
9511da177e4SLinus Torvalds  *   to the time when it is called, socket is NOT referenced by any
9521da177e4SLinus Torvalds  *   hash tables, lists etc.
9531da177e4SLinus Torvalds  * * Packets, delivered from outside (from network or from another process)
9541da177e4SLinus Torvalds  *   and enqueued on receive/error queues SHOULD NOT grab reference count,
9551da177e4SLinus Torvalds  *   when they sit in queue. Otherwise, packets will leak to hole, when
9561da177e4SLinus Torvalds  *   socket is looked up by one cpu and unhasing is made by another CPU.
9571da177e4SLinus Torvalds  *   It is true for udp/raw, netlink (leak to receive and error queues), tcp
9581da177e4SLinus Torvalds  *   (leak to backlog). Packet socket does all the processing inside
9591da177e4SLinus Torvalds  *   BR_NETPROTO_LOCK, so that it has not this race condition. UNIX sockets
9601da177e4SLinus Torvalds  *   use separate SMP lock, so that they are prone too.
9611da177e4SLinus Torvalds  */
9621da177e4SLinus Torvalds 
9631da177e4SLinus Torvalds /* Ungrab socket and destroy it, if it was the last reference. */
9641da177e4SLinus Torvalds static inline void sock_put(struct sock *sk)
9651da177e4SLinus Torvalds {
9661da177e4SLinus Torvalds 	if (atomic_dec_and_test(&sk->sk_refcnt))
9671da177e4SLinus Torvalds 		sk_free(sk);
9681da177e4SLinus Torvalds }
9691da177e4SLinus Torvalds 
97058a5a7b9SArnaldo Carvalho de Melo extern int sk_receive_skb(struct sock *sk, struct sk_buff *skb,
97158a5a7b9SArnaldo Carvalho de Melo 			  const int nested);
97225995ff5SArnaldo Carvalho de Melo 
9731da177e4SLinus Torvalds /* Detach socket from process context.
9741da177e4SLinus Torvalds  * Announce socket dead, detach it from wait queue and inode.
9751da177e4SLinus Torvalds  * Note that parent inode held reference count on this struct sock,
9761da177e4SLinus Torvalds  * we do not release it in this function, because protocol
9771da177e4SLinus Torvalds  * probably wants some additional cleanups or even continuing
9781da177e4SLinus Torvalds  * to work with this socket (TCP).
9791da177e4SLinus Torvalds  */
9801da177e4SLinus Torvalds static inline void sock_orphan(struct sock *sk)
9811da177e4SLinus Torvalds {
9821da177e4SLinus Torvalds 	write_lock_bh(&sk->sk_callback_lock);
9831da177e4SLinus Torvalds 	sock_set_flag(sk, SOCK_DEAD);
9841da177e4SLinus Torvalds 	sk->sk_socket = NULL;
9851da177e4SLinus Torvalds 	sk->sk_sleep  = NULL;
9861da177e4SLinus Torvalds 	write_unlock_bh(&sk->sk_callback_lock);
9871da177e4SLinus Torvalds }
9881da177e4SLinus Torvalds 
9891da177e4SLinus Torvalds static inline void sock_graft(struct sock *sk, struct socket *parent)
9901da177e4SLinus Torvalds {
9911da177e4SLinus Torvalds 	write_lock_bh(&sk->sk_callback_lock);
9921da177e4SLinus Torvalds 	sk->sk_sleep = &parent->wait;
9931da177e4SLinus Torvalds 	parent->sk = sk;
9941da177e4SLinus Torvalds 	sk->sk_socket = parent;
9954237c75cSVenkat Yekkirala 	security_sock_graft(sk, parent);
9961da177e4SLinus Torvalds 	write_unlock_bh(&sk->sk_callback_lock);
9971da177e4SLinus Torvalds }
9981da177e4SLinus Torvalds 
999892c141eSVenkat Yekkirala static inline void sock_copy(struct sock *nsk, const struct sock *osk)
1000892c141eSVenkat Yekkirala {
1001892c141eSVenkat Yekkirala #ifdef CONFIG_SECURITY_NETWORK
1002892c141eSVenkat Yekkirala 	void *sptr = nsk->sk_security;
1003892c141eSVenkat Yekkirala #endif
1004892c141eSVenkat Yekkirala 
1005892c141eSVenkat Yekkirala 	memcpy(nsk, osk, osk->sk_prot->obj_size);
1006892c141eSVenkat Yekkirala #ifdef CONFIG_SECURITY_NETWORK
1007892c141eSVenkat Yekkirala 	nsk->sk_security = sptr;
1008892c141eSVenkat Yekkirala 	security_sk_clone(osk, nsk);
1009892c141eSVenkat Yekkirala #endif
1010892c141eSVenkat Yekkirala }
1011892c141eSVenkat Yekkirala 
10121da177e4SLinus Torvalds extern int sock_i_uid(struct sock *sk);
10131da177e4SLinus Torvalds extern unsigned long sock_i_ino(struct sock *sk);
10141da177e4SLinus Torvalds 
10151da177e4SLinus Torvalds static inline struct dst_entry *
10161da177e4SLinus Torvalds __sk_dst_get(struct sock *sk)
10171da177e4SLinus Torvalds {
10181da177e4SLinus Torvalds 	return sk->sk_dst_cache;
10191da177e4SLinus Torvalds }
10201da177e4SLinus Torvalds 
10211da177e4SLinus Torvalds static inline struct dst_entry *
10221da177e4SLinus Torvalds sk_dst_get(struct sock *sk)
10231da177e4SLinus Torvalds {
10241da177e4SLinus Torvalds 	struct dst_entry *dst;
10251da177e4SLinus Torvalds 
10261da177e4SLinus Torvalds 	read_lock(&sk->sk_dst_lock);
10271da177e4SLinus Torvalds 	dst = sk->sk_dst_cache;
10281da177e4SLinus Torvalds 	if (dst)
10291da177e4SLinus Torvalds 		dst_hold(dst);
10301da177e4SLinus Torvalds 	read_unlock(&sk->sk_dst_lock);
10311da177e4SLinus Torvalds 	return dst;
10321da177e4SLinus Torvalds }
10331da177e4SLinus Torvalds 
10341da177e4SLinus Torvalds static inline void
10351da177e4SLinus Torvalds __sk_dst_set(struct sock *sk, struct dst_entry *dst)
10361da177e4SLinus Torvalds {
10371da177e4SLinus Torvalds 	struct dst_entry *old_dst;
10381da177e4SLinus Torvalds 
10391da177e4SLinus Torvalds 	old_dst = sk->sk_dst_cache;
10401da177e4SLinus Torvalds 	sk->sk_dst_cache = dst;
10411da177e4SLinus Torvalds 	dst_release(old_dst);
10421da177e4SLinus Torvalds }
10431da177e4SLinus Torvalds 
10441da177e4SLinus Torvalds static inline void
10451da177e4SLinus Torvalds sk_dst_set(struct sock *sk, struct dst_entry *dst)
10461da177e4SLinus Torvalds {
10471da177e4SLinus Torvalds 	write_lock(&sk->sk_dst_lock);
10481da177e4SLinus Torvalds 	__sk_dst_set(sk, dst);
10491da177e4SLinus Torvalds 	write_unlock(&sk->sk_dst_lock);
10501da177e4SLinus Torvalds }
10511da177e4SLinus Torvalds 
10521da177e4SLinus Torvalds static inline void
10531da177e4SLinus Torvalds __sk_dst_reset(struct sock *sk)
10541da177e4SLinus Torvalds {
10551da177e4SLinus Torvalds 	struct dst_entry *old_dst;
10561da177e4SLinus Torvalds 
10571da177e4SLinus Torvalds 	old_dst = sk->sk_dst_cache;
10581da177e4SLinus Torvalds 	sk->sk_dst_cache = NULL;
10591da177e4SLinus Torvalds 	dst_release(old_dst);
10601da177e4SLinus Torvalds }
10611da177e4SLinus Torvalds 
10621da177e4SLinus Torvalds static inline void
10631da177e4SLinus Torvalds sk_dst_reset(struct sock *sk)
10641da177e4SLinus Torvalds {
10651da177e4SLinus Torvalds 	write_lock(&sk->sk_dst_lock);
10661da177e4SLinus Torvalds 	__sk_dst_reset(sk);
10671da177e4SLinus Torvalds 	write_unlock(&sk->sk_dst_lock);
10681da177e4SLinus Torvalds }
10691da177e4SLinus Torvalds 
1070f0088a50SDenis Vlasenko extern struct dst_entry *__sk_dst_check(struct sock *sk, u32 cookie);
10711da177e4SLinus Torvalds 
1072f0088a50SDenis Vlasenko extern struct dst_entry *sk_dst_check(struct sock *sk, u32 cookie);
10731da177e4SLinus Torvalds 
1074bcd76111SHerbert Xu static inline int sk_can_gso(const struct sock *sk)
1075bcd76111SHerbert Xu {
1076bcd76111SHerbert Xu 	return net_gso_ok(sk->sk_route_caps, sk->sk_gso_type);
1077bcd76111SHerbert Xu }
1078bcd76111SHerbert Xu 
10799958089aSAndi Kleen extern void sk_setup_caps(struct sock *sk, struct dst_entry *dst);
10806cbb0df7SArnaldo Carvalho de Melo 
10811da177e4SLinus Torvalds static inline void sk_charge_skb(struct sock *sk, struct sk_buff *skb)
10821da177e4SLinus Torvalds {
10831da177e4SLinus Torvalds 	sk->sk_wmem_queued   += skb->truesize;
10841da177e4SLinus Torvalds 	sk->sk_forward_alloc -= skb->truesize;
10851da177e4SLinus Torvalds }
10861da177e4SLinus Torvalds 
10871da177e4SLinus Torvalds static inline int skb_copy_to_page(struct sock *sk, char __user *from,
10881da177e4SLinus Torvalds 				   struct sk_buff *skb, struct page *page,
10891da177e4SLinus Torvalds 				   int off, int copy)
10901da177e4SLinus Torvalds {
10911da177e4SLinus Torvalds 	if (skb->ip_summed == CHECKSUM_NONE) {
10921da177e4SLinus Torvalds 		int err = 0;
10935084205fSAl Viro 		__wsum csum = csum_and_copy_from_user(from,
10941da177e4SLinus Torvalds 						     page_address(page) + off,
10951da177e4SLinus Torvalds 							    copy, 0, &err);
10961da177e4SLinus Torvalds 		if (err)
10971da177e4SLinus Torvalds 			return err;
10981da177e4SLinus Torvalds 		skb->csum = csum_block_add(skb->csum, csum, skb->len);
10991da177e4SLinus Torvalds 	} else if (copy_from_user(page_address(page) + off, from, copy))
11001da177e4SLinus Torvalds 		return -EFAULT;
11011da177e4SLinus Torvalds 
11021da177e4SLinus Torvalds 	skb->len	     += copy;
11031da177e4SLinus Torvalds 	skb->data_len	     += copy;
11041da177e4SLinus Torvalds 	skb->truesize	     += copy;
11051da177e4SLinus Torvalds 	sk->sk_wmem_queued   += copy;
11061da177e4SLinus Torvalds 	sk->sk_forward_alloc -= copy;
11071da177e4SLinus Torvalds 	return 0;
11081da177e4SLinus Torvalds }
11091da177e4SLinus Torvalds 
11101da177e4SLinus Torvalds /*
11111da177e4SLinus Torvalds  * 	Queue a received datagram if it will fit. Stream and sequenced
11121da177e4SLinus Torvalds  *	protocols can't normally use this as they need to fit buffers in
11131da177e4SLinus Torvalds  *	and play with them.
11141da177e4SLinus Torvalds  *
11151da177e4SLinus Torvalds  * 	Inlined as it's very short and called for pretty much every
11161da177e4SLinus Torvalds  *	packet ever received.
11171da177e4SLinus Torvalds  */
11181da177e4SLinus Torvalds 
11191da177e4SLinus Torvalds static inline void skb_set_owner_w(struct sk_buff *skb, struct sock *sk)
11201da177e4SLinus Torvalds {
11211da177e4SLinus Torvalds 	sock_hold(sk);
11221da177e4SLinus Torvalds 	skb->sk = sk;
11231da177e4SLinus Torvalds 	skb->destructor = sock_wfree;
11241da177e4SLinus Torvalds 	atomic_add(skb->truesize, &sk->sk_wmem_alloc);
11251da177e4SLinus Torvalds }
11261da177e4SLinus Torvalds 
11271da177e4SLinus Torvalds static inline void skb_set_owner_r(struct sk_buff *skb, struct sock *sk)
11281da177e4SLinus Torvalds {
11291da177e4SLinus Torvalds 	skb->sk = sk;
11301da177e4SLinus Torvalds 	skb->destructor = sock_rfree;
11311da177e4SLinus Torvalds 	atomic_add(skb->truesize, &sk->sk_rmem_alloc);
11321da177e4SLinus Torvalds }
11331da177e4SLinus Torvalds 
11341da177e4SLinus Torvalds extern void sk_reset_timer(struct sock *sk, struct timer_list* timer,
11351da177e4SLinus Torvalds 			   unsigned long expires);
11361da177e4SLinus Torvalds 
11371da177e4SLinus Torvalds extern void sk_stop_timer(struct sock *sk, struct timer_list* timer);
11381da177e4SLinus Torvalds 
1139f0088a50SDenis Vlasenko extern int sock_queue_rcv_skb(struct sock *sk, struct sk_buff *skb);
11401da177e4SLinus Torvalds 
11411da177e4SLinus Torvalds static inline int sock_queue_err_skb(struct sock *sk, struct sk_buff *skb)
11421da177e4SLinus Torvalds {
11431da177e4SLinus Torvalds 	/* Cast skb->rcvbuf to unsigned... It's pointless, but reduces
11441da177e4SLinus Torvalds 	   number of warnings when compiling with -W --ANK
11451da177e4SLinus Torvalds 	 */
11461da177e4SLinus Torvalds 	if (atomic_read(&sk->sk_rmem_alloc) + skb->truesize >=
11471da177e4SLinus Torvalds 	    (unsigned)sk->sk_rcvbuf)
11481da177e4SLinus Torvalds 		return -ENOMEM;
11491da177e4SLinus Torvalds 	skb_set_owner_r(skb, sk);
11501da177e4SLinus Torvalds 	skb_queue_tail(&sk->sk_error_queue, skb);
11511da177e4SLinus Torvalds 	if (!sock_flag(sk, SOCK_DEAD))
11521da177e4SLinus Torvalds 		sk->sk_data_ready(sk, skb->len);
11531da177e4SLinus Torvalds 	return 0;
11541da177e4SLinus Torvalds }
11551da177e4SLinus Torvalds 
11561da177e4SLinus Torvalds /*
11571da177e4SLinus Torvalds  *	Recover an error report and clear atomically
11581da177e4SLinus Torvalds  */
11591da177e4SLinus Torvalds 
11601da177e4SLinus Torvalds static inline int sock_error(struct sock *sk)
11611da177e4SLinus Torvalds {
1162c1cbe4b7SBenjamin LaHaise 	int err;
1163c1cbe4b7SBenjamin LaHaise 	if (likely(!sk->sk_err))
1164c1cbe4b7SBenjamin LaHaise 		return 0;
1165c1cbe4b7SBenjamin LaHaise 	err = xchg(&sk->sk_err, 0);
11661da177e4SLinus Torvalds 	return -err;
11671da177e4SLinus Torvalds }
11681da177e4SLinus Torvalds 
11691da177e4SLinus Torvalds static inline unsigned long sock_wspace(struct sock *sk)
11701da177e4SLinus Torvalds {
11711da177e4SLinus Torvalds 	int amt = 0;
11721da177e4SLinus Torvalds 
11731da177e4SLinus Torvalds 	if (!(sk->sk_shutdown & SEND_SHUTDOWN)) {
11741da177e4SLinus Torvalds 		amt = sk->sk_sndbuf - atomic_read(&sk->sk_wmem_alloc);
11751da177e4SLinus Torvalds 		if (amt < 0)
11761da177e4SLinus Torvalds 			amt = 0;
11771da177e4SLinus Torvalds 	}
11781da177e4SLinus Torvalds 	return amt;
11791da177e4SLinus Torvalds }
11801da177e4SLinus Torvalds 
11811da177e4SLinus Torvalds static inline void sk_wake_async(struct sock *sk, int how, int band)
11821da177e4SLinus Torvalds {
11831da177e4SLinus Torvalds 	if (sk->sk_socket && sk->sk_socket->fasync_list)
11841da177e4SLinus Torvalds 		sock_wake_async(sk->sk_socket, how, band);
11851da177e4SLinus Torvalds }
11861da177e4SLinus Torvalds 
11871da177e4SLinus Torvalds #define SOCK_MIN_SNDBUF 2048
11881da177e4SLinus Torvalds #define SOCK_MIN_RCVBUF 256
11891da177e4SLinus Torvalds 
11901da177e4SLinus Torvalds static inline void sk_stream_moderate_sndbuf(struct sock *sk)
11911da177e4SLinus Torvalds {
11921da177e4SLinus Torvalds 	if (!(sk->sk_userlocks & SOCK_SNDBUF_LOCK)) {
11931da177e4SLinus Torvalds 		sk->sk_sndbuf = min(sk->sk_sndbuf, sk->sk_wmem_queued / 2);
11941da177e4SLinus Torvalds 		sk->sk_sndbuf = max(sk->sk_sndbuf, SOCK_MIN_SNDBUF);
11951da177e4SLinus Torvalds 	}
11961da177e4SLinus Torvalds }
11971da177e4SLinus Torvalds 
11981da177e4SLinus Torvalds static inline struct sk_buff *sk_stream_alloc_pskb(struct sock *sk,
119986a76cafSVictor Fusco 						   int size, int mem,
1200dd0fc66fSAl Viro 						   gfp_t gfp)
12011da177e4SLinus Torvalds {
1202c65f7f00SDavid S. Miller 	struct sk_buff *skb;
1203c65f7f00SDavid S. Miller 	int hdr_len;
12041da177e4SLinus Torvalds 
1205c65f7f00SDavid S. Miller 	hdr_len = SKB_DATA_ALIGN(sk->sk_prot->max_header);
1206d179cd12SDavid S. Miller 	skb = alloc_skb_fclone(size + hdr_len, gfp);
12071da177e4SLinus Torvalds 	if (skb) {
12081da177e4SLinus Torvalds 		skb->truesize += mem;
1209d80d99d6SHerbert Xu 		if (sk_stream_wmem_schedule(sk, skb->truesize)) {
1210c65f7f00SDavid S. Miller 			skb_reserve(skb, hdr_len);
12111da177e4SLinus Torvalds 			return skb;
12121da177e4SLinus Torvalds 		}
12131da177e4SLinus Torvalds 		__kfree_skb(skb);
12141da177e4SLinus Torvalds 	} else {
12151da177e4SLinus Torvalds 		sk->sk_prot->enter_memory_pressure();
12161da177e4SLinus Torvalds 		sk_stream_moderate_sndbuf(sk);
12171da177e4SLinus Torvalds 	}
12181da177e4SLinus Torvalds 	return NULL;
12191da177e4SLinus Torvalds }
12201da177e4SLinus Torvalds 
12211da177e4SLinus Torvalds static inline struct sk_buff *sk_stream_alloc_skb(struct sock *sk,
122286a76cafSVictor Fusco 						  int size,
1223dd0fc66fSAl Viro 						  gfp_t gfp)
12241da177e4SLinus Torvalds {
12251da177e4SLinus Torvalds 	return sk_stream_alloc_pskb(sk, size, 0, gfp);
12261da177e4SLinus Torvalds }
12271da177e4SLinus Torvalds 
12281da177e4SLinus Torvalds static inline struct page *sk_stream_alloc_page(struct sock *sk)
12291da177e4SLinus Torvalds {
12301da177e4SLinus Torvalds 	struct page *page = NULL;
12311da177e4SLinus Torvalds 
12321da177e4SLinus Torvalds 	page = alloc_pages(sk->sk_allocation, 0);
1233ef015786SHerbert Xu 	if (!page) {
12341da177e4SLinus Torvalds 		sk->sk_prot->enter_memory_pressure();
12351da177e4SLinus Torvalds 		sk_stream_moderate_sndbuf(sk);
12361da177e4SLinus Torvalds 	}
12371da177e4SLinus Torvalds 	return page;
12381da177e4SLinus Torvalds }
12391da177e4SLinus Torvalds 
12401da177e4SLinus Torvalds /*
12411da177e4SLinus Torvalds  *	Default write policy as shown to user space via poll/select/SIGIO
12421da177e4SLinus Torvalds  */
12431da177e4SLinus Torvalds static inline int sock_writeable(const struct sock *sk)
12441da177e4SLinus Torvalds {
12451da177e4SLinus Torvalds 	return atomic_read(&sk->sk_wmem_alloc) < (sk->sk_sndbuf / 2);
12461da177e4SLinus Torvalds }
12471da177e4SLinus Torvalds 
1248dd0fc66fSAl Viro static inline gfp_t gfp_any(void)
12491da177e4SLinus Torvalds {
12504498121cSPatrick McHardy 	return in_atomic() ? GFP_ATOMIC : GFP_KERNEL;
12511da177e4SLinus Torvalds }
12521da177e4SLinus Torvalds 
12531da177e4SLinus Torvalds static inline long sock_rcvtimeo(const struct sock *sk, int noblock)
12541da177e4SLinus Torvalds {
12551da177e4SLinus Torvalds 	return noblock ? 0 : sk->sk_rcvtimeo;
12561da177e4SLinus Torvalds }
12571da177e4SLinus Torvalds 
12581da177e4SLinus Torvalds static inline long sock_sndtimeo(const struct sock *sk, int noblock)
12591da177e4SLinus Torvalds {
12601da177e4SLinus Torvalds 	return noblock ? 0 : sk->sk_sndtimeo;
12611da177e4SLinus Torvalds }
12621da177e4SLinus Torvalds 
12631da177e4SLinus Torvalds static inline int sock_rcvlowat(const struct sock *sk, int waitall, int len)
12641da177e4SLinus Torvalds {
12651da177e4SLinus Torvalds 	return (waitall ? len : min_t(int, sk->sk_rcvlowat, len)) ? : 1;
12661da177e4SLinus Torvalds }
12671da177e4SLinus Torvalds 
12681da177e4SLinus Torvalds /* Alas, with timeout socket operations are not restartable.
12691da177e4SLinus Torvalds  * Compare this to poll().
12701da177e4SLinus Torvalds  */
12711da177e4SLinus Torvalds static inline int sock_intr_errno(long timeo)
12721da177e4SLinus Torvalds {
12731da177e4SLinus Torvalds 	return timeo == MAX_SCHEDULE_TIMEOUT ? -ERESTARTSYS : -EINTR;
12741da177e4SLinus Torvalds }
12751da177e4SLinus Torvalds 
127692f37fd2SEric Dumazet extern void __sock_recv_timestamp(struct msghdr *msg, struct sock *sk,
127792f37fd2SEric Dumazet 	struct sk_buff *skb);
127892f37fd2SEric Dumazet 
12791da177e4SLinus Torvalds static __inline__ void
12801da177e4SLinus Torvalds sock_recv_timestamp(struct msghdr *msg, struct sock *sk, struct sk_buff *skb)
12811da177e4SLinus Torvalds {
1282b7aa0bf7SEric Dumazet 	ktime_t kt = skb->tstamp;
1283a61bbcf2SPatrick McHardy 
128492f37fd2SEric Dumazet 	if (sock_flag(sk, SOCK_RCVTSTAMP))
128592f37fd2SEric Dumazet 		__sock_recv_timestamp(msg, sk, skb);
128692f37fd2SEric Dumazet 	else
1287b7aa0bf7SEric Dumazet 		sk->sk_stamp = kt;
12881da177e4SLinus Torvalds }
12891da177e4SLinus Torvalds 
12901da177e4SLinus Torvalds /**
12911da177e4SLinus Torvalds  * sk_eat_skb - Release a skb if it is no longer needed
12924dc3b16bSPavel Pisa  * @sk: socket to eat this skb from
12934dc3b16bSPavel Pisa  * @skb: socket buffer to eat
1294f4b8ea78SRandy Dunlap  * @copied_early: flag indicating whether DMA operations copied this data early
12951da177e4SLinus Torvalds  *
12961da177e4SLinus Torvalds  * This routine must be called with interrupts disabled or with the socket
12971da177e4SLinus Torvalds  * locked so that the sk_buff queue operation is ok.
12981da177e4SLinus Torvalds */
1299624d1164SChris Leech #ifdef CONFIG_NET_DMA
1300624d1164SChris Leech static inline void sk_eat_skb(struct sock *sk, struct sk_buff *skb, int copied_early)
1301624d1164SChris Leech {
1302624d1164SChris Leech 	__skb_unlink(skb, &sk->sk_receive_queue);
1303624d1164SChris Leech 	if (!copied_early)
1304624d1164SChris Leech 		__kfree_skb(skb);
1305624d1164SChris Leech 	else
1306624d1164SChris Leech 		__skb_queue_tail(&sk->sk_async_wait_queue, skb);
1307624d1164SChris Leech }
1308624d1164SChris Leech #else
1309624d1164SChris Leech static inline void sk_eat_skb(struct sock *sk, struct sk_buff *skb, int copied_early)
13101da177e4SLinus Torvalds {
13111da177e4SLinus Torvalds 	__skb_unlink(skb, &sk->sk_receive_queue);
13121da177e4SLinus Torvalds 	__kfree_skb(skb);
13131da177e4SLinus Torvalds }
1314624d1164SChris Leech #endif
13151da177e4SLinus Torvalds 
13161da177e4SLinus Torvalds extern void sock_enable_timestamp(struct sock *sk);
13171da177e4SLinus Torvalds extern int sock_get_timestamp(struct sock *, struct timeval __user *);
1318ae40eb1eSEric Dumazet extern int sock_get_timestampns(struct sock *, struct timespec __user *);
13191da177e4SLinus Torvalds 
13201da177e4SLinus Torvalds /*
13211da177e4SLinus Torvalds  *	Enable debug/info messages
13221da177e4SLinus Torvalds  */
1323a2a316fdSStephen Hemminger extern int net_msg_warn;
1324a2a316fdSStephen Hemminger #define NETDEBUG(fmt, args...) \
1325a2a316fdSStephen Hemminger 	do { if (net_msg_warn) printk(fmt,##args); } while (0)
13261da177e4SLinus Torvalds 
1327a2a316fdSStephen Hemminger #define LIMIT_NETDEBUG(fmt, args...) \
1328a2a316fdSStephen Hemminger 	do { if (net_msg_warn && net_ratelimit()) printk(fmt,##args); } while(0)
13291da177e4SLinus Torvalds 
13301da177e4SLinus Torvalds /*
13311da177e4SLinus Torvalds  * Macros for sleeping on a socket. Use them like this:
13321da177e4SLinus Torvalds  *
13331da177e4SLinus Torvalds  * SOCK_SLEEP_PRE(sk)
13341da177e4SLinus Torvalds  * if (condition)
13351da177e4SLinus Torvalds  * 	schedule();
13361da177e4SLinus Torvalds  * SOCK_SLEEP_POST(sk)
13371da177e4SLinus Torvalds  *
13381da177e4SLinus Torvalds  * N.B. These are now obsolete and were, afaik, only ever used in DECnet
13391da177e4SLinus Torvalds  * and when the last use of them in DECnet has gone, I'm intending to
13401da177e4SLinus Torvalds  * remove them.
13411da177e4SLinus Torvalds  */
13421da177e4SLinus Torvalds 
13431da177e4SLinus Torvalds #define SOCK_SLEEP_PRE(sk) 	{ struct task_struct *tsk = current; \
13441da177e4SLinus Torvalds 				DECLARE_WAITQUEUE(wait, tsk); \
13451da177e4SLinus Torvalds 				tsk->state = TASK_INTERRUPTIBLE; \
13461da177e4SLinus Torvalds 				add_wait_queue((sk)->sk_sleep, &wait); \
13471da177e4SLinus Torvalds 				release_sock(sk);
13481da177e4SLinus Torvalds 
13491da177e4SLinus Torvalds #define SOCK_SLEEP_POST(sk)	tsk->state = TASK_RUNNING; \
13501da177e4SLinus Torvalds 				remove_wait_queue((sk)->sk_sleep, &wait); \
13511da177e4SLinus Torvalds 				lock_sock(sk); \
13521da177e4SLinus Torvalds 				}
13531da177e4SLinus Torvalds 
13541da177e4SLinus Torvalds static inline void sock_valbool_flag(struct sock *sk, int bit, int valbool)
13551da177e4SLinus Torvalds {
13561da177e4SLinus Torvalds 	if (valbool)
13571da177e4SLinus Torvalds 		sock_set_flag(sk, bit);
13581da177e4SLinus Torvalds 	else
13591da177e4SLinus Torvalds 		sock_reset_flag(sk, bit);
13601da177e4SLinus Torvalds }
13611da177e4SLinus Torvalds 
13621da177e4SLinus Torvalds extern __u32 sysctl_wmem_max;
13631da177e4SLinus Torvalds extern __u32 sysctl_rmem_max;
13641da177e4SLinus Torvalds 
136520380731SArnaldo Carvalho de Melo extern void sk_init(void);
136620380731SArnaldo Carvalho de Melo 
136720380731SArnaldo Carvalho de Melo #ifdef CONFIG_SYSCTL
136820380731SArnaldo Carvalho de Melo extern struct ctl_table core_table[];
136920380731SArnaldo Carvalho de Melo #endif
137020380731SArnaldo Carvalho de Melo 
13716baf1f41SDavid S. Miller extern int sysctl_optmem_max;
13726baf1f41SDavid S. Miller 
137320380731SArnaldo Carvalho de Melo extern __u32 sysctl_wmem_default;
137420380731SArnaldo Carvalho de Melo extern __u32 sysctl_rmem_default;
137520380731SArnaldo Carvalho de Melo 
13761da177e4SLinus Torvalds #endif	/* _SOCK_H */
1377