Blame view

include/net/sock.h 67.5 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
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 AF_INET socket handler.
   *
   * Version:	@(#)sock.h	1.0.4	05/13/93
   *
02c30a84e   Jesper Juhl   [PATCH] update Ro...
10
   * Authors:	Ross Biro
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
   *		Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
   *		Corey Minyard <wf-rch!minyard@relay.EU.net>
   *		Florian La Roche <flla@stud.uni-sb.de>
   *
   * Fixes:
   *		Alan Cox	:	Volatiles in skbuff pointers. See
   *					skbuff comments. May be overdone,
   *					better to prove they can be removed
   *					than the reverse.
   *		Alan Cox	:	Added a zapped field for tcp to note
   *					a socket is reset and must stay shut up
   *		Alan Cox	:	New fields for options
   *	Pauline Middelink	:	identd support
   *		Alan Cox	:	Eliminate low level recv/recvfrom
   *		David S. Miller	:	New socket lookup architecture.
   *              Steve Whitehouse:       Default routines for sock_ops
   *              Arnaldo C. Melo :	removed net_pinfo, tp_pinfo and made
   *              			protinfo be just a void pointer, as the
   *              			protocol specific parts were moved to
   *              			respective headers and ipv4/v6, etc now
   *              			use private slabcaches for its socks
   *              Pedro Hortas	:	New flags field for socket options
   *
   *
   *		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 _SOCK_H
  #define _SOCK_H
a6b7a4078   Alexey Dobriyan   net: remove inter...
42
  #include <linux/hardirq.h>
172589ccd   Ilpo Järvinen   [NET]: DIV_ROUND_...
43
  #include <linux/kernel.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
44
  #include <linux/list.h>
88ab1932e   Eric Dumazet   udp: Use hlist_nu...
45
  #include <linux/list_nulls.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
46
47
  #include <linux/timer.h>
  #include <linux/cache.h>
3f1346193   Glauber Costa   memcg: decrement ...
48
  #include <linux/bitops.h>
a5b5bb9a0   Ingo Molnar   [PATCH] lockdep: ...
49
  #include <linux/lockdep.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
50
51
  #include <linux/netdevice.h>
  #include <linux/skbuff.h>	/* struct sk_buff */
d7fe0f241   Al Viro   [PATCH] severing ...
52
  #include <linux/mm.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
53
  #include <linux/security.h>
5a0e3ad6a   Tejun Heo   include cleanup: ...
54
  #include <linux/slab.h>
c6e1a0d12   Tom Herbert   net: Allow no-cac...
55
  #include <linux/uaccess.h>
3e32cb2e0   Johannes Weiner   mm: memcontrol: l...
56
  #include <linux/page_counter.h>
180d8cd94   Glauber Costa   foundations of pe...
57
  #include <linux/memcontrol.h>
c5905afb0   Ingo Molnar   static keys: Intr...
58
  #include <linux/static_key.h>
404015308   Al Viro   security: trim se...
59
  #include <linux/sched.h>
1ce0bf50a   Herbert Xu   net: Generalise w...
60
  #include <linux/wait.h>
2a56a1fec   Tejun Heo   net: wrap sock->s...
61
  #include <linux/cgroup-defs.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
62
63
  
  #include <linux/filter.h>
88ab1932e   Eric Dumazet   udp: Use hlist_nu...
64
  #include <linux/rculist_nulls.h>
a57de0b43   Jiri Olsa   net: adding memor...
65
  #include <linux/poll.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
66

c31504dc0   Eric Dumazet   udp: use atomic_i...
67
  #include <linux/atomic.h>
41c6d650f   Reshetova, Elena   net: convert sock...
68
  #include <linux/refcount.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
69
70
  #include <net/dst.h>
  #include <net/checksum.h>
1d0ab2538   Eric Dumazet   net: add sk_fulls...
71
  #include <net/tcp_states.h>
b9f40e21e   Willem de Bruijn   net-timestamp: mo...
72
  #include <linux/net_tstamp.h>
f16a7dd5c   Ursula Braun   smc: netlink inte...
73
  #include <net/smc.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
74
75
76
77
78
79
80
81
82
83
84
85
86
  
  /*
   * This structure really needs to be cleaned up.
   * Most of it is for TCP, and not used by any of
   * the other protocols.
   */
  
  /* Define this to get the SOCK_DBG debugging facility. */
  #define SOCK_DEBUGGING
  #ifdef SOCK_DEBUGGING
  #define SOCK_DEBUG(sk, msg...) do { if ((sk) && sock_flag((sk), SOCK_DBG)) \
  					printk(KERN_DEBUG msg); } while (0)
  #else
4cd9029d2   Stephen Hemminger   socket: SOCK_DEBU...
87
  /* Validate arguments and do nothing */
b9075fa96   Joe Perches   treewide: use __p...
88
  static inline __printf(2, 3)
dc6b9b782   Eric Dumazet   net: include/net/...
89
  void SOCK_DEBUG(const struct sock *sk, const char *msg, ...)
4cd9029d2   Stephen Hemminger   socket: SOCK_DEBU...
90
91
  {
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
92
93
94
95
96
97
  #endif
  
  /* This is the per-socket lock.  The spinlock provides a synchronization
   * between user contexts and software interrupt processing, whereas the
   * mini-semaphore synchronizes multiple users amongst themselves.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
98
99
  typedef struct {
  	spinlock_t		slock;
d2e9117c7   John Heffner   [NET]: Change typ...
100
  	int			owned;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
101
  	wait_queue_head_t	wq;
a5b5bb9a0   Ingo Molnar   [PATCH] lockdep: ...
102
103
104
105
106
107
108
109
110
  	/*
  	 * We express the mutex-alike socket_lock semantics
  	 * to the lock validator by explicitly managing
  	 * the slock as a lock variant (in addition to
  	 * the slock itself):
  	 */
  #ifdef CONFIG_DEBUG_LOCK_ALLOC
  	struct lockdep_map dep_map;
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
111
  } socket_lock_t;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
112
  struct sock;
8feaf0c0a   Arnaldo Carvalho de Melo   [INET]: Generalis...
113
  struct proto;
0eeb8ffcf   Denis V. Lunev   [NET]: netns comp...
114
  struct net;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
115

077b393d0   Eric Dumazet   net: fix sparse e...
116
117
  typedef __u32 __bitwise __portpair;
  typedef __u64 __bitwise __addrpair;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
118
  /**
4dc3b16ba   Pavel Pisa   [PATCH] DocBook: ...
119
   *	struct sock_common - minimal network layer representation of sockets
68835aba4   Eric Dumazet   net: optimize INE...
120
121
   *	@skc_daddr: Foreign IPv4 addr
   *	@skc_rcv_saddr: Bound local IPv4 addr
4dc6dc716   Eric Dumazet   net: sock_copy() ...
122
   *	@skc_hash: hash value used with various protocol lookup tables
d4cada4ae   Eric Dumazet   udp: split sk_has...
123
   *	@skc_u16hashes: two u16 hash values used by UDP lookup tables
ce43b03e8   Eric Dumazet   net: move inet_dp...
124
125
   *	@skc_dport: placeholder for inet_dport/tw_dport
   *	@skc_num: placeholder for inet_num/tw_num
4dc3b16ba   Pavel Pisa   [PATCH] DocBook: ...
126
127
128
   *	@skc_family: network address family
   *	@skc_state: Connection state
   *	@skc_reuse: %SO_REUSEADDR setting
055dc21a1   Tom Herbert   soreuseport: infr...
129
   *	@skc_reuseport: %SO_REUSEPORT setting
4dc3b16ba   Pavel Pisa   [PATCH] DocBook: ...
130
   *	@skc_bound_dev_if: bound device index if != 0
4dc3b16ba   Pavel Pisa   [PATCH] DocBook: ...
131
   *	@skc_bind_node: bind hash linkage for various protocol lookup tables
512615b6b   Eric Dumazet   udp: secondary ha...
132
   *	@skc_portaddr_node: second hash linkage for UDP/UDP-Lite protocol
8feaf0c0a   Arnaldo Carvalho de Melo   [INET]: Generalis...
133
   *	@skc_prot: protocol handlers inside a network family
07feaebfc   Eric W. Biederman   [NET]: Add a netw...
134
   *	@skc_net: reference to the network namespace of this socket
68835aba4   Eric Dumazet   net: optimize INE...
135
136
137
   *	@skc_node: main hash linkage for various protocol lookup tables
   *	@skc_nulls_node: main hash linkage for TCP/UDP/UDP-Lite protocol
   *	@skc_tx_queue_mapping: tx queue number for this connection
8e5eb54d3   Eric Dumazet   net: align sk_ref...
138
139
140
   *	@skc_flags: place holder for sk_flags
   *		%SO_LINGER (l_onoff), %SO_BROADCAST, %SO_KEEPALIVE,
   *		%SO_OOBINLINE settings, %SO_TIMESTAMPING settings
70da268b5   Eric Dumazet   net: SO_INCOMING_...
141
   *	@skc_incoming_cpu: record/match cpu processing incoming packets
68835aba4   Eric Dumazet   net: optimize INE...
142
   *	@skc_refcnt: reference count
4dc3b16ba   Pavel Pisa   [PATCH] DocBook: ...
143
144
   *
   *	This is the minimal network layer representation of sockets, the header
8feaf0c0a   Arnaldo Carvalho de Melo   [INET]: Generalis...
145
146
   *	for struct sock and struct inet_timewait_sock.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
147
  struct sock_common {
ce43b03e8   Eric Dumazet   net: move inet_dp...
148
  	/* skc_daddr and skc_rcv_saddr must be grouped on a 8 bytes aligned
05dbc7b59   Eric Dumazet   tcp/dccp: remove ...
149
  	 * address on 64bit arches : cf INET_MATCH()
4dc6dc716   Eric Dumazet   net: sock_copy() ...
150
  	 */
ce43b03e8   Eric Dumazet   net: move inet_dp...
151
  	union {
077b393d0   Eric Dumazet   net: fix sparse e...
152
  		__addrpair	skc_addrpair;
ce43b03e8   Eric Dumazet   net: move inet_dp...
153
154
155
156
157
  		struct {
  			__be32	skc_daddr;
  			__be32	skc_rcv_saddr;
  		};
  	};
d4cada4ae   Eric Dumazet   udp: split sk_has...
158
159
160
161
  	union  {
  		unsigned int	skc_hash;
  		__u16		skc_u16hashes[2];
  	};
ce43b03e8   Eric Dumazet   net: move inet_dp...
162
163
  	/* skc_dport && skc_num must be grouped as well */
  	union {
077b393d0   Eric Dumazet   net: fix sparse e...
164
  		__portpair	skc_portpair;
ce43b03e8   Eric Dumazet   net: move inet_dp...
165
166
167
168
169
  		struct {
  			__be16	skc_dport;
  			__u16	skc_num;
  		};
  	};
4dc6dc716   Eric Dumazet   net: sock_copy() ...
170
171
  	unsigned short		skc_family;
  	volatile unsigned char	skc_state;
055dc21a1   Tom Herbert   soreuseport: infr...
172
  	unsigned char		skc_reuse:4;
9fe516ba3   Eric Dumazet   inet: move ipv6on...
173
174
  	unsigned char		skc_reuseport:1;
  	unsigned char		skc_ipv6only:1;
26abe1437   Eric W. Biederman   net: Modify sk_al...
175
  	unsigned char		skc_net_refcnt:1;
4dc6dc716   Eric Dumazet   net: sock_copy() ...
176
  	int			skc_bound_dev_if;
512615b6b   Eric Dumazet   udp: secondary ha...
177
178
  	union {
  		struct hlist_node	skc_bind_node;
ca065d0cf   Eric Dumazet   udp: no longer us...
179
  		struct hlist_node	skc_portaddr_node;
512615b6b   Eric Dumazet   udp: secondary ha...
180
  	};
8feaf0c0a   Arnaldo Carvalho de Melo   [INET]: Generalis...
181
  	struct proto		*skc_prot;
0c5c9fb55   Eric W. Biederman   net: Introduce po...
182
  	possible_net_t		skc_net;
efe4208f4   Eric Dumazet   ipv6: make lookup...
183
184
185
186
187
  
  #if IS_ENABLED(CONFIG_IPV6)
  	struct in6_addr		skc_v6_daddr;
  	struct in6_addr		skc_v6_rcv_saddr;
  #endif
33cf7c90f   Eric Dumazet   net: add real soc...
188
  	atomic64_t		skc_cookie;
8e5eb54d3   Eric Dumazet   net: align sk_ref...
189
190
191
192
193
194
195
196
197
198
  	/* following fields are padding to force
  	 * offset(struct sock, sk_refcnt) == 128 on 64bit arches
  	 * assuming IPV6 is enabled. We use this padding differently
  	 * for different kind of 'sockets'
  	 */
  	union {
  		unsigned long	skc_flags;
  		struct sock	*skc_listener; /* request_sock */
  		struct inet_timewait_death_row *skc_tw_dr; /* inet_timewait_sock */
  	};
68835aba4   Eric Dumazet   net: optimize INE...
199
200
201
202
  	/*
  	 * fields between dontcopy_begin/dontcopy_end
  	 * are not copied in sock_copy()
  	 */
928c41e7a   Randy Dunlap   net/sock.h: make ...
203
  	/* private: */
68835aba4   Eric Dumazet   net: optimize INE...
204
  	int			skc_dontcopy_begin[0];
928c41e7a   Randy Dunlap   net/sock.h: make ...
205
  	/* public: */
68835aba4   Eric Dumazet   net: optimize INE...
206
207
208
209
210
  	union {
  		struct hlist_node	skc_node;
  		struct hlist_nulls_node skc_nulls_node;
  	};
  	int			skc_tx_queue_mapping;
ed53d0ab7   Eric Dumazet   net: shrink struc...
211
212
213
  	union {
  		int		skc_incoming_cpu;
  		u32		skc_rcv_wnd;
d475f090b   Eric Dumazet   tcp: shrink tcp_t...
214
  		u32		skc_tw_rcv_nxt; /* struct tcp_timewait_sock  */
ed53d0ab7   Eric Dumazet   net: shrink struc...
215
  	};
70da268b5   Eric Dumazet   net: SO_INCOMING_...
216

41c6d650f   Reshetova, Elena   net: convert sock...
217
  	refcount_t		skc_refcnt;
928c41e7a   Randy Dunlap   net/sock.h: make ...
218
  	/* private: */
68835aba4   Eric Dumazet   net: optimize INE...
219
  	int                     skc_dontcopy_end[0];
ed53d0ab7   Eric Dumazet   net: shrink struc...
220
221
222
  	union {
  		u32		skc_rxhash;
  		u32		skc_window_clamp;
d475f090b   Eric Dumazet   tcp: shrink tcp_t...
223
  		u32		skc_tw_snd_nxt; /* struct tcp_timewait_sock */
ed53d0ab7   Eric Dumazet   net: shrink struc...
224
  	};
928c41e7a   Randy Dunlap   net/sock.h: make ...
225
  	/* public: */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
226
227
228
229
  };
  
  /**
    *	struct sock - network layer representation of sockets
8feaf0c0a   Arnaldo Carvalho de Melo   [INET]: Generalis...
230
    *	@__sk_common: shared layout with inet_timewait_sock
4dc3b16ba   Pavel Pisa   [PATCH] DocBook: ...
231
232
233
    *	@sk_shutdown: mask of %SEND_SHUTDOWN and/or %RCV_SHUTDOWN
    *	@sk_userlocks: %SO_SNDBUF and %SO_RCVBUF settings
    *	@sk_lock:	synchronizer
cdfbabfb2   David Howells   net: Work around ...
234
    *	@sk_kern_sock: True if sock is using kernel lock classes
4dc3b16ba   Pavel Pisa   [PATCH] DocBook: ...
235
    *	@sk_rcvbuf: size of receive buffer in bytes
438154823   Eric Dumazet   net: sock_def_rea...
236
    *	@sk_wq: sock wait queue and async head
421b3885b   Shawn Bohrer   udp: ipv4: Add ud...
237
    *	@sk_rx_dst: receive input route used by early demux
4dc3b16ba   Pavel Pisa   [PATCH] DocBook: ...
238
    *	@sk_dst_cache: destination cache
9b8805a32   Julian Anastasov   sock: add sk_dst_...
239
    *	@sk_dst_pending_confirm: need to confirm neighbour
4dc3b16ba   Pavel Pisa   [PATCH] DocBook: ...
240
    *	@sk_policy: flow policy
4dc3b16ba   Pavel Pisa   [PATCH] DocBook: ...
241
242
    *	@sk_receive_queue: incoming packets
    *	@sk_wmem_alloc: transmit queue bytes committed
771edcafa   stephen hemminger   socket: add docum...
243
    *	@sk_tsq_flags: TCP Small Queues flags
4dc3b16ba   Pavel Pisa   [PATCH] DocBook: ...
244
245
246
247
    *	@sk_write_queue: Packet sending queue
    *	@sk_omem_alloc: "o" is "option" or "other"
    *	@sk_wmem_queued: persistent queue size
    *	@sk_forward_alloc: space allocated forward
060212928   Eliezer Tamir   net: add low late...
248
    *	@sk_napi_id: id of the last napi context to receive data for sk
dafcc4380   Eliezer Tamir   net: add socket o...
249
    *	@sk_ll_usec: usecs to busypoll when there is no data
4dc3b16ba   Pavel Pisa   [PATCH] DocBook: ...
250
    *	@sk_allocation: allocation mode
95bd09eb2   Eric Dumazet   tcp: TSO packets ...
251
    *	@sk_pacing_rate: Pacing rate (if supported by transport/packet scheduler)
218af599f   Eric Dumazet   tcp: internal imp...
252
    *	@sk_pacing_status: Pacing status (requested, handled by sch_fq)
c3f40d7c0   Eric Dumazet   net: add missing ...
253
    *	@sk_max_pacing_rate: Maximum pacing rate (%SO_MAX_PACING_RATE)
4dc3b16ba   Pavel Pisa   [PATCH] DocBook: ...
254
    *	@sk_sndbuf: size of send buffer in bytes
771edcafa   stephen hemminger   socket: add docum...
255
    *	@__sk_flags_offset: empty field used to determine location of bitfield
293de7dee   Stephen Hemminger   doc: update docbo...
256
    *	@sk_padding: unused element for alignment
28448b804   Tom Herbert   net: Split sk_no_...
257
258
    *	@sk_no_check_tx: %SO_NO_CHECK setting, set checksum in TX packets
    *	@sk_no_check_rx: allow zero checksum in RX packets
4dc3b16ba   Pavel Pisa   [PATCH] DocBook: ...
259
    *	@sk_route_caps: route capabilities (e.g. %NETIF_F_TSO)
a465419b1   Eric Dumazet   net: Introduce sk...
260
    *	@sk_route_nocaps: forbidden route capabilities (e.g NETIF_F_GSO_MASK)
bcd761111   Herbert Xu   [NET]: Generalise...
261
    *	@sk_gso_type: GSO type (e.g. %SKB_GSO_TCPV4)
82cc1a7a5   Peter P Waskiewicz Jr   [NET]: Add per-co...
262
    *	@sk_gso_max_size: Maximum GSO segment size to build
1485348d2   Ben Hutchings   tcp: Apply device...
263
    *	@sk_gso_max_segs: Maximum number of GSO segments
4dc3b16ba   Pavel Pisa   [PATCH] DocBook: ...
264
    *	@sk_lingertime: %SO_LINGER l_linger setting
4dc3b16ba   Pavel Pisa   [PATCH] DocBook: ...
265
266
267
    *	@sk_backlog: always used with the per-socket spinlock held
    *	@sk_callback_lock: used with the callbacks in the end of this struct
    *	@sk_error_queue: rarely used
33c732c36   Wang Chen   [IPV4]: Add raw d...
268
269
    *	@sk_prot_creator: sk_prot of original sock creator (see ipv6_setsockopt,
    *			  IPV6_ADDRFORM for instance)
4dc3b16ba   Pavel Pisa   [PATCH] DocBook: ...
270
    *	@sk_err: last error
33c732c36   Wang Chen   [IPV4]: Add raw d...
271
272
    *	@sk_err_soft: errors that don't cause failure but are the cause of a
    *		      persistent failure not just 'timed out'
cb61cb9b8   Eric Dumazet   udp: sk_drops han...
273
    *	@sk_drops: raw/udp drops counter
4dc3b16ba   Pavel Pisa   [PATCH] DocBook: ...
274
275
    *	@sk_ack_backlog: current listen backlog
    *	@sk_max_ack_backlog: listen backlog set in listen()
771edcafa   stephen hemminger   socket: add docum...
276
    *	@sk_uid: user id of owner
4dc3b16ba   Pavel Pisa   [PATCH] DocBook: ...
277
278
279
    *	@sk_priority: %SO_PRIORITY setting
    *	@sk_type: socket type (%SOCK_STREAM, etc)
    *	@sk_protocol: which protocol this socket belongs in this network family
53c3fa206   Randy Dunlap   net/sock.h: add m...
280
281
    *	@sk_peer_pid: &struct pid for this socket's peer
    *	@sk_peer_cred: %SO_PEERCRED setting
4dc3b16ba   Pavel Pisa   [PATCH] DocBook: ...
282
283
284
    *	@sk_rcvlowat: %SO_RCVLOWAT setting
    *	@sk_rcvtimeo: %SO_RCVTIMEO setting
    *	@sk_sndtimeo: %SO_SNDTIMEO setting
b73c3d0e4   Tom Herbert   net: Save TX flow...
285
    *	@sk_txhash: computed flow hash for use on transmit
4dc3b16ba   Pavel Pisa   [PATCH] DocBook: ...
286
    *	@sk_filter: socket filtering instructions
4dc3b16ba   Pavel Pisa   [PATCH] DocBook: ...
287
288
    *	@sk_timer: sock cleanup timer
    *	@sk_stamp: time stamp of last packet received
e5af70e98   Deepa Dinamani   sock: Make sock->...
289
    *	@sk_stamp_seq: lock for accessing sk_stamp on 32 bit architectures only
b9f40e21e   Willem de Bruijn   net-timestamp: mo...
290
    *	@sk_tsflags: SO_TIMESTAMPING socket options
09c2d251b   Willem de Bruijn   net-timestamp: ad...
291
    *	@sk_tskey: counter to disambiguate concurrent tstamp requests
52267790e   Willem de Bruijn   sock: add MSG_ZER...
292
    *	@sk_zckey: counter to order MSG_ZEROCOPY notifications
4dc3b16ba   Pavel Pisa   [PATCH] DocBook: ...
293
294
    *	@sk_socket: Identd and reporting IO signals
    *	@sk_user_data: RPC layer private data
5640f7685   Eric Dumazet   net: use a per ta...
295
    *	@sk_frag: cached page frag
d3d4f0a02   Randy Dunlap   net/sock.h: fix s...
296
    *	@sk_peek_off: current peek_offset value
4dc3b16ba   Pavel Pisa   [PATCH] DocBook: ...
297
    *	@sk_send_head: front of stuff to transmit
67be2dd1b   Martin Waitz   [PATCH] DocBook: ...
298
    *	@sk_security: used by security modules
317293634   Randy Dunlap   net: fix kernel-d...
299
    *	@sk_mark: generic packet mark
2a56a1fec   Tejun Heo   net: wrap sock->s...
300
    *	@sk_cgrp_data: cgroup data for this cgroup
baac50bbc   Johannes Weiner   net: tcp_memcontr...
301
    *	@sk_memcg: this socket's memory cgroup association
4dc3b16ba   Pavel Pisa   [PATCH] DocBook: ...
302
303
304
305
306
307
308
    *	@sk_write_pending: a write to stream socket waits to start
    *	@sk_state_change: callback to indicate change in the state of the sock
    *	@sk_data_ready: callback to indicate there is data to be processed
    *	@sk_write_space: callback to indicate there is bf sending space available
    *	@sk_error_report: callback to indicate errors (e.g. %MSG_ERRQUEUE)
    *	@sk_backlog_rcv: callback to process the backlog
    *	@sk_destruct: called at sock freeing time, i.e. when all refcnt == 0
ef456144d   Craig Gallek   soreuseport: defi...
309
    *	@sk_reuseport_cb: reuseport group container
293de7dee   Stephen Hemminger   doc: update docbo...
310
311
    *	@sk_rcu: used during RCU grace period
    */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
312
313
  struct sock {
  	/*
8feaf0c0a   Arnaldo Carvalho de Melo   [INET]: Generalis...
314
  	 * Now struct inet_timewait_sock also uses sock_common, so please just
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
315
316
317
  	 * don't add nothing before this first member (__sk_common) --acme
  	 */
  	struct sock_common	__sk_common;
4dc6dc716   Eric Dumazet   net: sock_copy() ...
318
319
320
  #define sk_node			__sk_common.skc_node
  #define sk_nulls_node		__sk_common.skc_nulls_node
  #define sk_refcnt		__sk_common.skc_refcnt
e022f0b4a   Krishna Kumar   net: Introduce sk...
321
  #define sk_tx_queue_mapping	__sk_common.skc_tx_queue_mapping
4dc6dc716   Eric Dumazet   net: sock_copy() ...
322

68835aba4   Eric Dumazet   net: optimize INE...
323
324
  #define sk_dontcopy_begin	__sk_common.skc_dontcopy_begin
  #define sk_dontcopy_end		__sk_common.skc_dontcopy_end
4dc6dc716   Eric Dumazet   net: sock_copy() ...
325
  #define sk_hash			__sk_common.skc_hash
508054668   Eric Dumazet   inet: consolidate...
326
  #define sk_portpair		__sk_common.skc_portpair
05dbc7b59   Eric Dumazet   tcp/dccp: remove ...
327
328
  #define sk_num			__sk_common.skc_num
  #define sk_dport		__sk_common.skc_dport
508054668   Eric Dumazet   inet: consolidate...
329
330
331
  #define sk_addrpair		__sk_common.skc_addrpair
  #define sk_daddr		__sk_common.skc_daddr
  #define sk_rcv_saddr		__sk_common.skc_rcv_saddr
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
332
333
334
  #define sk_family		__sk_common.skc_family
  #define sk_state		__sk_common.skc_state
  #define sk_reuse		__sk_common.skc_reuse
055dc21a1   Tom Herbert   soreuseport: infr...
335
  #define sk_reuseport		__sk_common.skc_reuseport
9fe516ba3   Eric Dumazet   inet: move ipv6on...
336
  #define sk_ipv6only		__sk_common.skc_ipv6only
26abe1437   Eric W. Biederman   net: Modify sk_al...
337
  #define sk_net_refcnt		__sk_common.skc_net_refcnt
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
338
  #define sk_bound_dev_if		__sk_common.skc_bound_dev_if
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
339
  #define sk_bind_node		__sk_common.skc_bind_node
8feaf0c0a   Arnaldo Carvalho de Melo   [INET]: Generalis...
340
  #define sk_prot			__sk_common.skc_prot
07feaebfc   Eric W. Biederman   [NET]: Add a netw...
341
  #define sk_net			__sk_common.skc_net
efe4208f4   Eric Dumazet   ipv6: make lookup...
342
343
  #define sk_v6_daddr		__sk_common.skc_v6_daddr
  #define sk_v6_rcv_saddr	__sk_common.skc_v6_rcv_saddr
33cf7c90f   Eric Dumazet   net: add real soc...
344
  #define sk_cookie		__sk_common.skc_cookie
70da268b5   Eric Dumazet   net: SO_INCOMING_...
345
  #define sk_incoming_cpu		__sk_common.skc_incoming_cpu
8e5eb54d3   Eric Dumazet   net: align sk_ref...
346
  #define sk_flags		__sk_common.skc_flags
ed53d0ab7   Eric Dumazet   net: shrink struc...
347
  #define sk_rxhash		__sk_common.skc_rxhash
efe4208f4   Eric Dumazet   ipv6: make lookup...
348

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
349
  	socket_lock_t		sk_lock;
9115e8cd2   Eric Dumazet   net: reorganize s...
350
351
352
  	atomic_t		sk_drops;
  	int			sk_rcvlowat;
  	struct sk_buff_head	sk_error_queue;
b178bb3df   Eric Dumazet   net: reorder stru...
353
  	struct sk_buff_head	sk_receive_queue;
fa438ccfd   Eric Dumazet   [NET]: Keep sk_ba...
354
355
356
357
  	/*
  	 * The backlog queue is special, it is always used with
  	 * the per-socket spinlock held and requires low latency
  	 * access. Therefore we special case it's implementation.
b178bb3df   Eric Dumazet   net: reorder stru...
358
359
360
  	 * Note : rmem_alloc is in this structure to fill a hole
  	 * on 64bit arches, not because its logically part of
  	 * backlog.
fa438ccfd   Eric Dumazet   [NET]: Keep sk_ba...
361
362
  	 */
  	struct {
b178bb3df   Eric Dumazet   net: reorder stru...
363
364
365
366
  		atomic_t	rmem_alloc;
  		int		len;
  		struct sk_buff	*head;
  		struct sk_buff	*tail;
fa438ccfd   Eric Dumazet   [NET]: Keep sk_ba...
367
  	} sk_backlog;
b178bb3df   Eric Dumazet   net: reorder stru...
368
  #define sk_rmem_alloc sk_backlog.rmem_alloc
2c8c56e15   Eric Dumazet   net: introduce SO...
369

9115e8cd2   Eric Dumazet   net: reorganize s...
370
  	int			sk_forward_alloc;
e0d1095ae   Cong Wang   net: rename CONFI...
371
  #ifdef CONFIG_NET_RX_BUSY_POLL
dafcc4380   Eliezer Tamir   net: add socket o...
372
  	unsigned int		sk_ll_usec;
9115e8cd2   Eric Dumazet   net: reorganize s...
373
374
  	/* ===== mostly read cache line ===== */
  	unsigned int		sk_napi_id;
060212928   Eliezer Tamir   net: add low late...
375
  #endif
b178bb3df   Eric Dumazet   net: reorder stru...
376
377
378
  	int			sk_rcvbuf;
  
  	struct sk_filter __rcu	*sk_filter;
ceb5d58b2   Eric Dumazet   net: fix sock_wak...
379
380
381
382
  	union {
  		struct socket_wq __rcu	*sk_wq;
  		struct socket_wq	*sk_wq_raw;
  	};
def8b4faf   Alexey Dobriyan   net: reduce struc...
383
  #ifdef CONFIG_XFRM
d188ba86d   Eric Dumazet   xfrm: add rcu pro...
384
  	struct xfrm_policy __rcu *sk_policy[2];
def8b4faf   Alexey Dobriyan   net: reduce struc...
385
  #endif
deaa58542   Eric Dumazet   net: struct sock ...
386
  	struct dst_entry	*sk_rx_dst;
0e36cbb34   Cong Wang   net: add RCU anno...
387
  	struct dst_entry __rcu	*sk_dst_cache;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
388
  	atomic_t		sk_omem_alloc;
4e07a91c3   Arnaldo Carvalho de Melo   [SOCK]: Shrink st...
389
  	int			sk_sndbuf;
9115e8cd2   Eric Dumazet   net: reorganize s...
390
391
392
  
  	/* ===== cache line for TX ===== */
  	int			sk_wmem_queued;
14afee4b6   Reshetova, Elena   net: convert sock...
393
  	refcount_t		sk_wmem_alloc;
9115e8cd2   Eric Dumazet   net: reorganize s...
394
395
  	unsigned long		sk_tsq_flags;
  	struct sk_buff		*sk_send_head;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
396
  	struct sk_buff_head	sk_write_queue;
9115e8cd2   Eric Dumazet   net: reorganize s...
397
398
  	__s32			sk_peek_off;
  	int			sk_write_pending;
9b8805a32   Julian Anastasov   sock: add sk_dst_...
399
  	__u32			sk_dst_pending_confirm;
218af599f   Eric Dumazet   tcp: internal imp...
400
  	u32			sk_pacing_status; /* see enum sk_pacing */
9115e8cd2   Eric Dumazet   net: reorganize s...
401
402
403
404
405
406
407
408
409
410
411
412
413
  	long			sk_sndtimeo;
  	struct timer_list	sk_timer;
  	__u32			sk_priority;
  	__u32			sk_mark;
  	u32			sk_pacing_rate; /* bytes per second */
  	u32			sk_max_pacing_rate;
  	struct page_frag	sk_frag;
  	netdev_features_t	sk_route_caps;
  	netdev_features_t	sk_route_nocaps;
  	int			sk_gso_type;
  	unsigned int		sk_gso_max_size;
  	gfp_t			sk_allocation;
  	__u32			sk_txhash;
fc64869c4   Andrey Ryabinin   net: sock: move -...
414
415
416
417
418
  
  	/*
  	 * Because of non atomicity rules, all
  	 * changes are protected by socket lock.
  	 */
aa4c1037a   David Ahern   bpf: Add support ...
419
420
421
422
423
424
425
426
427
428
429
430
431
432
  	unsigned int		__sk_flags_offset[0];
  #ifdef __BIG_ENDIAN_BITFIELD
  #define SK_FL_PROTO_SHIFT  16
  #define SK_FL_PROTO_MASK   0x00ff0000
  
  #define SK_FL_TYPE_SHIFT   0
  #define SK_FL_TYPE_MASK    0x0000ffff
  #else
  #define SK_FL_PROTO_SHIFT  8
  #define SK_FL_PROTO_MASK   0x0000ff00
  
  #define SK_FL_TYPE_SHIFT   16
  #define SK_FL_TYPE_MASK    0xffff0000
  #endif
cdfbabfb2   David Howells   net: Work around ...
433
434
  	unsigned int		sk_padding : 1,
  				sk_kern_sock : 1,
28448b804   Tom Herbert   net: Split sk_no_...
435
436
  				sk_no_check_tx : 1,
  				sk_no_check_rx : 1,
b178bb3df   Eric Dumazet   net: reorder stru...
437
438
439
  				sk_userlocks : 4,
  				sk_protocol  : 8,
  				sk_type      : 16;
7bbadd2d1   Hannes Frederic Sowa   net: fix warnings...
440
  #define SK_PROTOCOL_MAX U8_MAX
1485348d2   Ben Hutchings   tcp: Apply device...
441
  	u16			sk_gso_max_segs;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
442
  	unsigned long	        sk_lingertime;
476e19cfa   Arnaldo Carvalho de Melo   [IPV6]: Fix OOPS ...
443
  	struct proto		*sk_prot_creator;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
444
445
446
  	rwlock_t		sk_callback_lock;
  	int			sk_err,
  				sk_err_soft;
becb74f0a   Eric Dumazet   net: increase sk_...
447
448
  	u32			sk_ack_backlog;
  	u32			sk_max_ack_backlog;
86741ec25   Lorenzo Colitti   net: core: Add a ...
449
  	kuid_t			sk_uid;
109f6e39f   Eric W. Biederman   af_unix: Allow SO...
450
451
  	struct pid		*sk_peer_pid;
  	const struct cred	*sk_peer_cred;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
452
  	long			sk_rcvtimeo;
b7aa0bf70   Eric Dumazet   [NET]: convert ne...
453
  	ktime_t			sk_stamp;
e5af70e98   Deepa Dinamani   sock: Make sock->...
454
455
456
  #if BITS_PER_LONG==32
  	seqlock_t		sk_stamp_seq;
  #endif
b9f40e21e   Willem de Bruijn   net-timestamp: mo...
457
  	u16			sk_tsflags;
fc64869c4   Andrey Ryabinin   net: sock: move -...
458
  	u8			sk_shutdown;
09c2d251b   Willem de Bruijn   net-timestamp: ad...
459
  	u32			sk_tskey;
52267790e   Willem de Bruijn   sock: add MSG_ZER...
460
  	atomic_t		sk_zckey;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
461
462
  	struct socket		*sk_socket;
  	void			*sk_user_data;
d5f642384   Alexey Dobriyan   net: #ifdef ->sk_...
463
  #ifdef CONFIG_SECURITY
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
464
  	void			*sk_security;
d5f642384   Alexey Dobriyan   net: #ifdef ->sk_...
465
  #endif
2a56a1fec   Tejun Heo   net: wrap sock->s...
466
  	struct sock_cgroup_data	sk_cgrp_data;
baac50bbc   Johannes Weiner   net: tcp_memcontr...
467
  	struct mem_cgroup	*sk_memcg;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
468
  	void			(*sk_state_change)(struct sock *sk);
676d23690   David S. Miller   net: Fix use afte...
469
  	void			(*sk_data_ready)(struct sock *sk);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
470
471
  	void			(*sk_write_space)(struct sock *sk);
  	void			(*sk_error_report)(struct sock *sk);
dc6b9b782   Eric Dumazet   net: include/net/...
472
473
  	int			(*sk_backlog_rcv)(struct sock *sk,
  						  struct sk_buff *skb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
474
  	void                    (*sk_destruct)(struct sock *sk);
ef456144d   Craig Gallek   soreuseport: defi...
475
  	struct sock_reuseport __rcu	*sk_reuseport_cb;
a4298e452   Eric Dumazet   net: add SOCK_RCU...
476
  	struct rcu_head		sk_rcu;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
477
  };
218af599f   Eric Dumazet   tcp: internal imp...
478
479
480
481
482
  enum sk_pacing {
  	SK_PACING_NONE		= 0,
  	SK_PACING_NEEDED	= 1,
  	SK_PACING_FQ		= 2,
  };
559835ea7   Pravin B Shelar   vxlan: Use RCU ap...
483
484
485
486
  #define __sk_user_data(sk) ((*((void __rcu **)&(sk)->sk_user_data)))
  
  #define rcu_dereference_sk_user_data(sk)	rcu_dereference(__sk_user_data((sk)))
  #define rcu_assign_sk_user_data(sk, ptr)	rcu_assign_pointer(__sk_user_data((sk)), ptr)
4a17fd522   Pavel Emelyanov   sock: Introduce n...
487
488
489
490
491
492
493
494
495
496
  /*
   * SK_CAN_REUSE and SK_NO_REUSE on a socket mean that the socket is OK
   * or not whether his port will be reused by someone else. SK_FORCE_REUSE
   * on a socket means that the socket will reuse everybody else's port
   * without looking at the other's sk_reuse value.
   */
  
  #define SK_NO_REUSE	0
  #define SK_CAN_REUSE	1
  #define SK_FORCE_REUSE	2
627d2d6b5   samanthakumar   udp: enable MSG_P...
497
  int sk_set_peek_off(struct sock *sk, int val);
ef64a54f6   Pavel Emelyanov   sock: Introduce t...
498
499
  static inline int sk_peek_offset(struct sock *sk, int flags)
  {
b9bb53f38   Willem de Bruijn   sock: convert sk_...
500
  	if (unlikely(flags & MSG_PEEK)) {
a0917e0bc   Matthew Dawson   datagram: When pe...
501
  		return READ_ONCE(sk->sk_peek_off);
b9bb53f38   Willem de Bruijn   sock: convert sk_...
502
503
504
  	}
  
  	return 0;
ef64a54f6   Pavel Emelyanov   sock: Introduce t...
505
506
507
508
  }
  
  static inline void sk_peek_offset_bwd(struct sock *sk, int val)
  {
b9bb53f38   Willem de Bruijn   sock: convert sk_...
509
510
511
512
513
  	s32 off = READ_ONCE(sk->sk_peek_off);
  
  	if (unlikely(off >= 0)) {
  		off = max_t(s32, off - val, 0);
  		WRITE_ONCE(sk->sk_peek_off, off);
ef64a54f6   Pavel Emelyanov   sock: Introduce t...
514
515
516
517
518
  	}
  }
  
  static inline void sk_peek_offset_fwd(struct sock *sk, int val)
  {
b9bb53f38   Willem de Bruijn   sock: convert sk_...
519
  	sk_peek_offset_bwd(sk, -val);
ef64a54f6   Pavel Emelyanov   sock: Introduce t...
520
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
521
522
523
  /*
   * Hashed lists helper routines
   */
c4146644a   Li Zefan   net: add a wrappe...
524
525
526
527
  static inline struct sock *sk_entry(const struct hlist_node *node)
  {
  	return hlist_entry(node, struct sock, sk_node);
  }
e48c414ee   Arnaldo Carvalho de Melo   [INET]: Generalis...
528
  static inline struct sock *__sk_head(const struct hlist_head *head)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
529
530
531
  {
  	return hlist_entry(head->first, struct sock, sk_node);
  }
e48c414ee   Arnaldo Carvalho de Melo   [INET]: Generalis...
532
  static inline struct sock *sk_head(const struct hlist_head *head)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
533
534
535
  {
  	return hlist_empty(head) ? NULL : __sk_head(head);
  }
88ab1932e   Eric Dumazet   udp: Use hlist_nu...
536
537
538
539
540
541
542
543
544
  static inline struct sock *__sk_nulls_head(const struct hlist_nulls_head *head)
  {
  	return hlist_nulls_entry(head->first, struct sock, sk_nulls_node);
  }
  
  static inline struct sock *sk_nulls_head(const struct hlist_nulls_head *head)
  {
  	return hlist_nulls_empty(head) ? NULL : __sk_nulls_head(head);
  }
e48c414ee   Arnaldo Carvalho de Melo   [INET]: Generalis...
545
  static inline struct sock *sk_next(const struct sock *sk)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
546
  {
6c59ebd35   Geliang Tang   sock: use hlist_e...
547
  	return hlist_entry_safe(sk->sk_node.next, struct sock, sk_node);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
548
  }
88ab1932e   Eric Dumazet   udp: Use hlist_nu...
549
550
551
552
553
554
555
  static inline struct sock *sk_nulls_next(const struct sock *sk)
  {
  	return (!is_a_nulls(sk->sk_nulls_node.next)) ?
  		hlist_nulls_entry(sk->sk_nulls_node.next,
  				  struct sock, sk_nulls_node) :
  		NULL;
  }
dc6b9b782   Eric Dumazet   net: include/net/...
556
  static inline bool sk_unhashed(const struct sock *sk)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
557
558
559
  {
  	return hlist_unhashed(&sk->sk_node);
  }
dc6b9b782   Eric Dumazet   net: include/net/...
560
  static inline bool sk_hashed(const struct sock *sk)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
561
  {
da753beae   Akinobu Mita   [NET]: use hlist_...
562
  	return !sk_unhashed(sk);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
563
  }
dc6b9b782   Eric Dumazet   net: include/net/...
564
  static inline void sk_node_init(struct hlist_node *node)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
565
566
567
  {
  	node->pprev = NULL;
  }
dc6b9b782   Eric Dumazet   net: include/net/...
568
  static inline void sk_nulls_node_init(struct hlist_nulls_node *node)
88ab1932e   Eric Dumazet   udp: Use hlist_nu...
569
570
571
  {
  	node->pprev = NULL;
  }
dc6b9b782   Eric Dumazet   net: include/net/...
572
  static inline void __sk_del_node(struct sock *sk)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
573
574
575
  {
  	__hlist_del(&sk->sk_node);
  }
808f5114a   stephen hemminger   packet: convert s...
576
  /* NB: equivalent to hlist_del_init_rcu */
dc6b9b782   Eric Dumazet   net: include/net/...
577
  static inline bool __sk_del_node_init(struct sock *sk)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
578
579
580
581
  {
  	if (sk_hashed(sk)) {
  		__sk_del_node(sk);
  		sk_node_init(&sk->sk_node);
dc6b9b782   Eric Dumazet   net: include/net/...
582
  		return true;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
583
  	}
dc6b9b782   Eric Dumazet   net: include/net/...
584
  	return false;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
585
586
587
588
589
590
591
  }
  
  /* Grab socket reference count. This operation is valid only
     when sk is ALREADY grabbed f.e. it is found in hash table
     or a list and the lookup is made under lock preventing hash table
     modifications.
   */
f9a7cbbf1   Denys Vlasenko   net: force inlini...
592
  static __always_inline void sock_hold(struct sock *sk)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
593
  {
41c6d650f   Reshetova, Elena   net: convert sock...
594
  	refcount_inc(&sk->sk_refcnt);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
595
596
597
598
599
  }
  
  /* Ungrab socket in the context, which assumes that socket refcnt
     cannot hit zero, f.e. it is true in context of any socketcall.
   */
f9a7cbbf1   Denys Vlasenko   net: force inlini...
600
  static __always_inline void __sock_put(struct sock *sk)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
601
  {
41c6d650f   Reshetova, Elena   net: convert sock...
602
  	refcount_dec(&sk->sk_refcnt);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
603
  }
dc6b9b782   Eric Dumazet   net: include/net/...
604
  static inline bool sk_del_node_init(struct sock *sk)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
605
  {
dc6b9b782   Eric Dumazet   net: include/net/...
606
  	bool rc = __sk_del_node_init(sk);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
607
608
609
  
  	if (rc) {
  		/* paranoid for a while -acme */
41c6d650f   Reshetova, Elena   net: convert sock...
610
  		WARN_ON(refcount_read(&sk->sk_refcnt) == 1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
611
612
613
614
  		__sock_put(sk);
  	}
  	return rc;
  }
808f5114a   stephen hemminger   packet: convert s...
615
  #define sk_del_node_init_rcu(sk)	sk_del_node_init(sk)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
616

dc6b9b782   Eric Dumazet   net: include/net/...
617
  static inline bool __sk_nulls_del_node_init_rcu(struct sock *sk)
271b72c7f   Eric Dumazet   udp: RCU handling...
618
619
  {
  	if (sk_hashed(sk)) {
88ab1932e   Eric Dumazet   udp: Use hlist_nu...
620
  		hlist_nulls_del_init_rcu(&sk->sk_nulls_node);
dc6b9b782   Eric Dumazet   net: include/net/...
621
  		return true;
271b72c7f   Eric Dumazet   udp: RCU handling...
622
  	}
dc6b9b782   Eric Dumazet   net: include/net/...
623
  	return false;
271b72c7f   Eric Dumazet   udp: RCU handling...
624
  }
dc6b9b782   Eric Dumazet   net: include/net/...
625
  static inline bool sk_nulls_del_node_init_rcu(struct sock *sk)
271b72c7f   Eric Dumazet   udp: RCU handling...
626
  {
dc6b9b782   Eric Dumazet   net: include/net/...
627
  	bool rc = __sk_nulls_del_node_init_rcu(sk);
271b72c7f   Eric Dumazet   udp: RCU handling...
628
629
630
  
  	if (rc) {
  		/* paranoid for a while -acme */
41c6d650f   Reshetova, Elena   net: convert sock...
631
  		WARN_ON(refcount_read(&sk->sk_refcnt) == 1);
271b72c7f   Eric Dumazet   udp: RCU handling...
632
633
634
635
  		__sock_put(sk);
  	}
  	return rc;
  }
dc6b9b782   Eric Dumazet   net: include/net/...
636
  static inline void __sk_add_node(struct sock *sk, struct hlist_head *list)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
637
638
639
  {
  	hlist_add_head(&sk->sk_node, list);
  }
dc6b9b782   Eric Dumazet   net: include/net/...
640
  static inline void sk_add_node(struct sock *sk, struct hlist_head *list)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
641
642
643
644
  {
  	sock_hold(sk);
  	__sk_add_node(sk, list);
  }
dc6b9b782   Eric Dumazet   net: include/net/...
645
  static inline void sk_add_node_rcu(struct sock *sk, struct hlist_head *list)
808f5114a   stephen hemminger   packet: convert s...
646
647
  {
  	sock_hold(sk);
d296ba60d   Craig Gallek   soreuseport: Reso...
648
649
650
651
652
  	if (IS_ENABLED(CONFIG_IPV6) && sk->sk_reuseport &&
  	    sk->sk_family == AF_INET6)
  		hlist_add_tail_rcu(&sk->sk_node, list);
  	else
  		hlist_add_head_rcu(&sk->sk_node, list);
808f5114a   stephen hemminger   packet: convert s...
653
  }
dc6b9b782   Eric Dumazet   net: include/net/...
654
  static inline void __sk_nulls_add_node_rcu(struct sock *sk, struct hlist_nulls_head *list)
271b72c7f   Eric Dumazet   udp: RCU handling...
655
  {
6878a0635   Eric Dumazet   net: remove hlist...
656
  	hlist_nulls_add_head_rcu(&sk->sk_nulls_node, list);
271b72c7f   Eric Dumazet   udp: RCU handling...
657
  }
dc6b9b782   Eric Dumazet   net: include/net/...
658
  static inline void sk_nulls_add_node_rcu(struct sock *sk, struct hlist_nulls_head *list)
271b72c7f   Eric Dumazet   udp: RCU handling...
659
660
  {
  	sock_hold(sk);
88ab1932e   Eric Dumazet   udp: Use hlist_nu...
661
  	__sk_nulls_add_node_rcu(sk, list);
271b72c7f   Eric Dumazet   udp: RCU handling...
662
  }
dc6b9b782   Eric Dumazet   net: include/net/...
663
  static inline void __sk_del_bind_node(struct sock *sk)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
664
665
666
  {
  	__hlist_del(&sk->sk_bind_node);
  }
dc6b9b782   Eric Dumazet   net: include/net/...
667
  static inline void sk_add_bind_node(struct sock *sk,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
668
669
670
671
  					struct hlist_head *list)
  {
  	hlist_add_head(&sk->sk_bind_node, list);
  }
b67bfe0d4   Sasha Levin   hlist: drop the n...
672
673
674
675
  #define sk_for_each(__sk, list) \
  	hlist_for_each_entry(__sk, list, sk_node)
  #define sk_for_each_rcu(__sk, list) \
  	hlist_for_each_entry_rcu(__sk, list, sk_node)
88ab1932e   Eric Dumazet   udp: Use hlist_nu...
676
677
678
679
  #define sk_nulls_for_each(__sk, node, list) \
  	hlist_nulls_for_each_entry(__sk, node, list, sk_nulls_node)
  #define sk_nulls_for_each_rcu(__sk, node, list) \
  	hlist_nulls_for_each_entry_rcu(__sk, node, list, sk_nulls_node)
b67bfe0d4   Sasha Levin   hlist: drop the n...
680
681
  #define sk_for_each_from(__sk) \
  	hlist_for_each_entry_from(__sk, sk_node)
88ab1932e   Eric Dumazet   udp: Use hlist_nu...
682
683
684
  #define sk_nulls_for_each_from(__sk, node) \
  	if (__sk && ({ node = &(__sk)->sk_nulls_node; 1; })) \
  		hlist_nulls_for_each_entry_from(__sk, node, sk_nulls_node)
b67bfe0d4   Sasha Levin   hlist: drop the n...
685
686
687
688
  #define sk_for_each_safe(__sk, tmp, list) \
  	hlist_for_each_entry_safe(__sk, tmp, list, sk_node)
  #define sk_for_each_bound(__sk, list) \
  	hlist_for_each_entry(__sk, list, sk_bind_node)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
689

2dc41cff7   David Held   udp: Use hash2 fo...
690
  /**
ca065d0cf   Eric Dumazet   udp: no longer us...
691
   * sk_for_each_entry_offset_rcu - iterate over a list at a given struct offset
2dc41cff7   David Held   udp: Use hash2 fo...
692
693
694
695
696
697
   * @tpos:	the type * to use as a loop cursor.
   * @pos:	the &struct hlist_node to use as a loop cursor.
   * @head:	the head for your list.
   * @offset:	offset of hlist_node within the struct.
   *
   */
ca065d0cf   Eric Dumazet   udp: no longer us...
698
699
700
  #define sk_for_each_entry_offset_rcu(tpos, pos, head, offset)		       \
  	for (pos = rcu_dereference((head)->first);			       \
  	     pos != NULL &&						       \
2dc41cff7   David Held   udp: Use hash2 fo...
701
  		({ tpos = (typeof(*tpos) *)((void *)pos - offset); 1;});       \
ca065d0cf   Eric Dumazet   udp: no longer us...
702
  	     pos = rcu_dereference(pos->next))
2dc41cff7   David Held   udp: Use hash2 fo...
703

c336d148a   Eric W. Biederman   userns: Implement...
704
705
706
707
708
709
710
711
  static inline struct user_namespace *sk_user_ns(struct sock *sk)
  {
  	/* Careful only use this in a context where these parameters
  	 * can not change and must all be valid, such as recvmsg from
  	 * userspace.
  	 */
  	return sk->sk_socket->file->f_cred->user_ns;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
712
713
714
715
716
717
718
719
720
721
722
723
724
725
  /* Sock flags */
  enum sock_flags {
  	SOCK_DEAD,
  	SOCK_DONE,
  	SOCK_URGINLINE,
  	SOCK_KEEPOPEN,
  	SOCK_LINGER,
  	SOCK_DESTROY,
  	SOCK_BROADCAST,
  	SOCK_TIMESTAMP,
  	SOCK_ZAPPED,
  	SOCK_USE_WRITE_QUEUE, /* whether to call sk->sk_write_space in sock_wfree */
  	SOCK_DBG, /* %SO_DEBUG setting */
  	SOCK_RCVTSTAMP, /* %SO_TIMESTAMP setting */
92f37fd2e   Eric Dumazet   [NET]: Adding SO_...
726
  	SOCK_RCVTSTAMPNS, /* %SO_TIMESTAMPNS setting */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
727
728
  	SOCK_LOCALROUTE, /* route locally only, %SO_DONTROUTE setting */
  	SOCK_QUEUE_SHRUNK, /* write queue has been shrunk recently */
7cb024049   Mel Gorman   netvm: allow the ...
729
  	SOCK_MEMALLOC, /* VM depends on this socket for swapping */
20d494735   Patrick Ohly   net: socket infra...
730
  	SOCK_TIMESTAMPING_RX_SOFTWARE,  /* %SOF_TIMESTAMPING_RX_SOFTWARE */
bcdce7195   Eric Dumazet   net: speedup sk_w...
731
  	SOCK_FASYNC, /* fasync() active */
3b885787e   Neil Horman   net: Generalize s...
732
  	SOCK_RXQ_OVFL,
1cdebb423   Shirley Ma   sock.h: Add a new...
733
  	SOCK_ZEROCOPY, /* buffers from userspace */
6e3e939f3   Johannes Berg   net: add wireless...
734
  	SOCK_WIFI_STATUS, /* push wifi status to userspace */
3bdc0eba0   Ben Greear   net: Add framewor...
735
736
737
738
  	SOCK_NOFCS, /* Tell NIC not to do the Ethernet FCS.
  		     * Will use last 4 bytes of packet sent from
  		     * user-space instead.
  		     */
d59577b6f   Vincent Bernat   sk-filter: Add ab...
739
  	SOCK_FILTER_LOCKED, /* Filter cannot be changed anymore */
7d4c04fc1   Keller, Jacob E   net: add option t...
740
  	SOCK_SELECT_ERR_QUEUE, /* Wake select on error queue */
a4298e452   Eric Dumazet   net: add SOCK_RCU...
741
  	SOCK_RCU_FREE, /* wait rcu grace period in sk_destruct() */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
742
  };
01ce63c90   Marcelo Ricardo Leitner   sctp: update the ...
743
  #define SK_FLAGS_TIMESTAMP ((1UL << SOCK_TIMESTAMP) | (1UL << SOCK_TIMESTAMPING_RX_SOFTWARE))
53b924b31   Ralf Baechle   [NET]: Fix socket...
744
745
746
747
  static inline void sock_copy_flags(struct sock *nsk, struct sock *osk)
  {
  	nsk->sk_flags = osk->sk_flags;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
748
749
750
751
752
753
754
755
756
  static inline void sock_set_flag(struct sock *sk, enum sock_flags flag)
  {
  	__set_bit(flag, &sk->sk_flags);
  }
  
  static inline void sock_reset_flag(struct sock *sk, enum sock_flags flag)
  {
  	__clear_bit(flag, &sk->sk_flags);
  }
1b23a5dfc   Eric Dumazet   net: sock_flag() ...
757
  static inline bool sock_flag(const struct sock *sk, enum sock_flags flag)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
758
759
760
  {
  	return test_bit(flag, &sk->sk_flags);
  }
c93bdd0e0   Mel Gorman   netvm: allow skb ...
761
762
763
764
765
766
767
768
769
770
771
772
773
774
  #ifdef CONFIG_NET
  extern struct static_key memalloc_socks;
  static inline int sk_memalloc_socks(void)
  {
  	return static_key_false(&memalloc_socks);
  }
  #else
  
  static inline int sk_memalloc_socks(void)
  {
  	return 0;
  }
  
  #endif
7450aaf61   Eric Dumazet   tcp: suppress too...
775
  static inline gfp_t sk_gfp_mask(const struct sock *sk, gfp_t gfp_mask)
99a1dec70   Mel Gorman   net: introduce sk...
776
  {
7450aaf61   Eric Dumazet   tcp: suppress too...
777
  	return gfp_mask | (sk->sk_allocation & __GFP_MEMALLOC);
99a1dec70   Mel Gorman   net: introduce sk...
778
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
779
780
781
782
783
784
785
786
787
  static inline void sk_acceptq_removed(struct sock *sk)
  {
  	sk->sk_ack_backlog--;
  }
  
  static inline void sk_acceptq_added(struct sock *sk)
  {
  	sk->sk_ack_backlog++;
  }
dc6b9b782   Eric Dumazet   net: include/net/...
788
  static inline bool sk_acceptq_is_full(const struct sock *sk)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
789
  {
64a146513   David S. Miller   [NET]: Revert inc...
790
  	return sk->sk_ack_backlog > sk->sk_max_ack_backlog;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
791
792
793
794
795
  }
  
  /*
   * Compute minimal free write space needed to queue new packets.
   */
dc6b9b782   Eric Dumazet   net: include/net/...
796
  static inline int sk_stream_min_wspace(const struct sock *sk)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
797
  {
8df09ea3b   Eric Dumazet   [SOCK] Avoid inte...
798
  	return sk->sk_wmem_queued >> 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
799
  }
dc6b9b782   Eric Dumazet   net: include/net/...
800
  static inline int sk_stream_wspace(const struct sock *sk)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
801
802
803
  {
  	return sk->sk_sndbuf - sk->sk_wmem_queued;
  }
69336bd2d   Joe Perches   sock.h: Remove ex...
804
  void sk_stream_write_space(struct sock *sk);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
805

8eae939f1   Zhu Yi   net: add limit fo...
806
  /* OOB backlog add */
a3a858ff1   Zhu Yi   net: backlog func...
807
  static inline void __sk_add_backlog(struct sock *sk, struct sk_buff *skb)
9ee6b535a   Stephen Hemminger   [NET]: sk_add_bac...
808
  {
7fee226ad   Eric Dumazet   net: add a noref ...
809
  	/* dont let skb dst not refcounted, we are going to leave rcu lock */
222d7dbd2   Eric Dumazet   net: prevent dst ...
810
  	skb_dst_force(skb);
7fee226ad   Eric Dumazet   net: add a noref ...
811
812
813
814
  
  	if (!sk->sk_backlog.tail)
  		sk->sk_backlog.head = skb;
  	else
9ee6b535a   Stephen Hemminger   [NET]: sk_add_bac...
815
  		sk->sk_backlog.tail->next = skb;
7fee226ad   Eric Dumazet   net: add a noref ...
816
817
  
  	sk->sk_backlog.tail = skb;
9ee6b535a   Stephen Hemminger   [NET]: sk_add_bac...
818
819
  	skb->next = NULL;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
820

c377411f2   Eric Dumazet   net: sk_add_backl...
821
822
  /*
   * Take into account size of receive queue and backlog queue
0fd7bac6b   Eric Dumazet   net: relax rcvbuf...
823
824
   * Do not take into account this skb truesize,
   * to allow even a single big packet to come.
c377411f2   Eric Dumazet   net: sk_add_backl...
825
   */
274f482d3   Sorin Dumitru   sock: remove skb ...
826
  static inline bool sk_rcvqueues_full(const struct sock *sk, unsigned int limit)
c377411f2   Eric Dumazet   net: sk_add_backl...
827
828
  {
  	unsigned int qsize = sk->sk_backlog.len + atomic_read(&sk->sk_rmem_alloc);
f545a38f7   Eric Dumazet   net: add a limit ...
829
  	return qsize > limit;
c377411f2   Eric Dumazet   net: sk_add_backl...
830
  }
8eae939f1   Zhu Yi   net: add limit fo...
831
  /* The per-socket spinlock must be held here. */
f545a38f7   Eric Dumazet   net: add a limit ...
832
833
  static inline __must_check int sk_add_backlog(struct sock *sk, struct sk_buff *skb,
  					      unsigned int limit)
8eae939f1   Zhu Yi   net: add limit fo...
834
  {
274f482d3   Sorin Dumitru   sock: remove skb ...
835
  	if (sk_rcvqueues_full(sk, limit))
8eae939f1   Zhu Yi   net: add limit fo...
836
  		return -ENOBUFS;
c7c49b8fd   Eric Dumazet   net: add pfmemall...
837
838
839
840
841
842
843
  	/*
  	 * If the skb was allocated from pfmemalloc reserves, only
  	 * allow SOCK_MEMALLOC sockets to use it as this socket is
  	 * helping free memory
  	 */
  	if (skb_pfmemalloc(skb) && !sock_flag(sk, SOCK_MEMALLOC))
  		return -ENOMEM;
a3a858ff1   Zhu Yi   net: backlog func...
844
  	__sk_add_backlog(sk, skb);
8eae939f1   Zhu Yi   net: add limit fo...
845
846
847
  	sk->sk_backlog.len += skb->truesize;
  	return 0;
  }
69336bd2d   Joe Perches   sock.h: Remove ex...
848
  int __sk_backlog_rcv(struct sock *sk, struct sk_buff *skb);
b4b9e3558   Mel Gorman   netvm: set PF_MEM...
849

c57943a1c   Peter Zijlstra   net: wrap sk->sk_...
850
851
  static inline int sk_backlog_rcv(struct sock *sk, struct sk_buff *skb)
  {
b4b9e3558   Mel Gorman   netvm: set PF_MEM...
852
853
  	if (sk_memalloc_socks() && skb_pfmemalloc(skb))
  		return __sk_backlog_rcv(sk, skb);
c57943a1c   Peter Zijlstra   net: wrap sk->sk_...
854
855
  	return sk->sk_backlog_rcv(sk, skb);
  }
2c8c56e15   Eric Dumazet   net: introduce SO...
856
857
  static inline void sk_incoming_cpu_update(struct sock *sk)
  {
34cfb542b   Paolo Abeni   sock: avoid dirty...
858
859
860
861
  	int cpu = raw_smp_processor_id();
  
  	if (unlikely(sk->sk_incoming_cpu != cpu))
  		sk->sk_incoming_cpu = cpu;
2c8c56e15   Eric Dumazet   net: introduce SO...
862
  }
fe4775585   Tom Herbert   net: Allow settin...
863
  static inline void sock_rps_record_flow_hash(__u32 hash)
c58dc01ba   David S. Miller   net: Make RFS soc...
864
865
866
867
868
869
  {
  #ifdef CONFIG_RPS
  	struct rps_sock_flow_table *sock_flow_table;
  
  	rcu_read_lock();
  	sock_flow_table = rcu_dereference(rps_sock_flow_table);
fe4775585   Tom Herbert   net: Allow settin...
870
  	rps_record_sock_flow(sock_flow_table, hash);
c58dc01ba   David S. Miller   net: Make RFS soc...
871
872
873
  	rcu_read_unlock();
  #endif
  }
fe4775585   Tom Herbert   net: Allow settin...
874
875
  static inline void sock_rps_record_flow(const struct sock *sk)
  {
c9d8ca045   Zhi Yong Wu   net, rps: fix bui...
876
  #ifdef CONFIG_RPS
13bfff25c   Eric Dumazet   net: rfs: add a j...
877
878
879
880
881
882
883
884
885
886
887
888
889
890
  	if (static_key_false(&rfs_needed)) {
  		/* Reading sk->sk_rxhash might incur an expensive cache line
  		 * miss.
  		 *
  		 * TCP_ESTABLISHED does cover almost all states where RFS
  		 * might be useful, and is cheaper [1] than testing :
  		 *	IPv4: inet_sk(sk)->inet_daddr
  		 * 	IPv6: ipv6_addr_any(&sk->sk_v6_daddr)
  		 * OR	an additional socket flag
  		 * [1] : sk_state and sk_prot are in the same cache line.
  		 */
  		if (sk->sk_state == TCP_ESTABLISHED)
  			sock_rps_record_flow_hash(sk->sk_rxhash);
  	}
c9d8ca045   Zhi Yong Wu   net, rps: fix bui...
891
  #endif
fe4775585   Tom Herbert   net: Allow settin...
892
  }
bdeab9919   Tom Herbert   rps: Add flag to ...
893
894
  static inline void sock_rps_save_rxhash(struct sock *sk,
  					const struct sk_buff *skb)
c58dc01ba   David S. Miller   net: Make RFS soc...
895
896
  {
  #ifdef CONFIG_RPS
567e4b797   Eric Dumazet   net: rfs: add has...
897
  	if (unlikely(sk->sk_rxhash != skb->hash))
61b905da3   Tom Herbert   net: Rename skb->...
898
  		sk->sk_rxhash = skb->hash;
c58dc01ba   David S. Miller   net: Make RFS soc...
899
900
  #endif
  }
bdeab9919   Tom Herbert   rps: Add flag to ...
901
902
903
  static inline void sock_rps_reset_rxhash(struct sock *sk)
  {
  #ifdef CONFIG_RPS
bdeab9919   Tom Herbert   rps: Add flag to ...
904
905
906
  	sk->sk_rxhash = 0;
  #endif
  }
d9dc8b0f8   WANG Cong   net: fix sleeping...
907
  #define sk_wait_event(__sk, __timeo, __condition, __wait)		\
cfcabdcc2   Stephen Hemminger   [NET]: sparse war...
908
909
910
911
  	({	int __rc;						\
  		release_sock(__sk);					\
  		__rc = __condition;					\
  		if (!__rc) {						\
d9dc8b0f8   WANG Cong   net: fix sleeping...
912
913
914
  			*(__timeo) = wait_woken(__wait,			\
  						TASK_INTERRUPTIBLE,	\
  						*(__timeo));		\
cfcabdcc2   Stephen Hemminger   [NET]: sparse war...
915
  		}							\
d9dc8b0f8   WANG Cong   net: fix sleeping...
916
  		sched_annotate_sleep();					\
cfcabdcc2   Stephen Hemminger   [NET]: sparse war...
917
918
919
920
  		lock_sock(__sk);					\
  		__rc = __condition;					\
  		__rc;							\
  	})
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
921

69336bd2d   Joe Perches   sock.h: Remove ex...
922
923
924
925
926
927
928
  int sk_stream_wait_connect(struct sock *sk, long *timeo_p);
  int sk_stream_wait_memory(struct sock *sk, long *timeo_p);
  void sk_stream_wait_close(struct sock *sk, long timeo_p);
  int sk_stream_error(struct sock *sk, int flags, int err);
  void sk_stream_kill_queues(struct sock *sk);
  void sk_set_memalloc(struct sock *sk);
  void sk_clear_memalloc(struct sock *sk);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
929

d41a69f1d   Eric Dumazet   tcp: make tcp_sen...
930
931
932
933
934
935
936
937
938
939
  void __sk_flush_backlog(struct sock *sk);
  
  static inline bool sk_flush_backlog(struct sock *sk)
  {
  	if (unlikely(READ_ONCE(sk->sk_backlog.tail))) {
  		__sk_flush_backlog(sk);
  		return true;
  	}
  	return false;
  }
dfbafc995   Sabrina Dubroca   tcp: fix recv wit...
940
  int sk_wait_data(struct sock *sk, long *timeo, const struct sk_buff *skb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
941

60236fdd0   Arnaldo Carvalho de Melo   [NET] Rename open...
942
  struct request_sock_ops;
6d6ee43e0   Arnaldo Carvalho de Melo   [TWSK]: Introduce...
943
  struct timewait_sock_ops;
ab1e0a13d   Arnaldo Carvalho de Melo   [SOCK] proto: Add...
944
  struct inet_hashinfo;
fc8717baa   Pavel Emelyanov   [RAW]: Add raw_ha...
945
  struct raw_hashinfo;
f16a7dd5c   Ursula Braun   smc: netlink inte...
946
  struct smc_hashinfo;
de4772542   Paul Gortmaker   include: replace ...
947
  struct module;
2e6599cb8   Arnaldo Carvalho de Melo   [NET] Generalise ...
948

f77d60212   Eric Dumazet   ipv6: do not clea...
949
  /*
5f0d5a3ae   Paul E. McKenney   mm: Rename SLAB_D...
950
   * caches using SLAB_TYPESAFE_BY_RCU should let .next pointer from nulls nodes
f77d60212   Eric Dumazet   ipv6: do not clea...
951
952
953
954
955
956
957
958
959
   * un-modified. Special care is taken when initializing object to zero.
   */
  static inline void sk_prot_clear_nulls(struct sock *sk, int size)
  {
  	if (offsetof(struct sock, sk_node.next) != 0)
  		memset(sk, 0, offsetof(struct sock, sk_node.next));
  	memset(&sk->sk_node.pprev, 0,
  	       size - offsetof(struct sock, sk_node.pprev));
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
960
961
  /* Networking protocol blocks we attach to sockets.
   * socket layer -> transport layer interface
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
962
963
   */
  struct proto {
dc6b9b782   Eric Dumazet   net: include/net/...
964
  	void			(*close)(struct sock *sk,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
965
966
  					long timeout);
  	int			(*connect)(struct sock *sk,
dc6b9b782   Eric Dumazet   net: include/net/...
967
  					struct sockaddr *uaddr,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
968
969
  					int addr_len);
  	int			(*disconnect)(struct sock *sk, int flags);
cdfbabfb2   David Howells   net: Work around ...
970
971
  	struct sock *		(*accept)(struct sock *sk, int flags, int *err,
  					  bool kern);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
972
973
974
975
  
  	int			(*ioctl)(struct sock *sk, int cmd,
  					 unsigned long arg);
  	int			(*init)(struct sock *sk);
7d06b2e05   Brian Haley   net: change proto...
976
  	void			(*destroy)(struct sock *sk);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
977
  	void			(*shutdown)(struct sock *sk, int how);
dc6b9b782   Eric Dumazet   net: include/net/...
978
  	int			(*setsockopt)(struct sock *sk, int level,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
979
  					int optname, char __user *optval,
b7058842c   David S. Miller   net: Make setsock...
980
  					unsigned int optlen);
dc6b9b782   Eric Dumazet   net: include/net/...
981
982
983
  	int			(*getsockopt)(struct sock *sk, int level,
  					int optname, char __user *optval,
  					int __user *option);
4b9d07a44   Ursula Braun   net: introduce ke...
984
  	void			(*keepalive)(struct sock *sk, int valbool);
af01d5374   Alexey Dobriyan   net: more #ifdef ...
985
  #ifdef CONFIG_COMPAT
3fdadf7d2   Dmitry Mishin   [NET]: {get|set}s...
986
987
988
  	int			(*compat_setsockopt)(struct sock *sk,
  					int level,
  					int optname, char __user *optval,
b7058842c   David S. Miller   net: Make setsock...
989
  					unsigned int optlen);
3fdadf7d2   Dmitry Mishin   [NET]: {get|set}s...
990
991
992
993
  	int			(*compat_getsockopt)(struct sock *sk,
  					int level,
  					int optname, char __user *optval,
  					int __user *option);
709b46e8d   Eric W. Biederman   net: Add compat i...
994
995
  	int			(*compat_ioctl)(struct sock *sk,
  					unsigned int cmd, unsigned long arg);
af01d5374   Alexey Dobriyan   net: more #ifdef ...
996
  #endif
1b7841404   Ying Xue   net: Remove iocb ...
997
998
999
  	int			(*sendmsg)(struct sock *sk, struct msghdr *msg,
  					   size_t len);
  	int			(*recvmsg)(struct sock *sk, struct msghdr *msg,
dc6b9b782   Eric Dumazet   net: include/net/...
1000
1001
  					   size_t len, int noblock, int flags,
  					   int *addr_len);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1002
1003
  	int			(*sendpage)(struct sock *sk, struct page *page,
  					int offset, size_t size, int flags);
dc6b9b782   Eric Dumazet   net: include/net/...
1004
  	int			(*bind)(struct sock *sk,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1005
  					struct sockaddr *uaddr, int addr_len);
dc6b9b782   Eric Dumazet   net: include/net/...
1006
  	int			(*backlog_rcv) (struct sock *sk,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1007
  						struct sk_buff *skb);
46d3ceabd   Eric Dumazet   tcp: TCP Small Qu...
1008
  	void		(*release_cb)(struct sock *sk);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1009
  	/* Keeping track of sk's, looking them up, and port selection methods. */
086c653f5   Craig Gallek   sock: struct prot...
1010
  	int			(*hash)(struct sock *sk);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1011
  	void			(*unhash)(struct sock *sk);
719f83585   Eric Dumazet   udp: add rehash o...
1012
  	void			(*rehash)(struct sock *sk);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1013
  	int			(*get_port)(struct sock *sk, unsigned short snum);
286ab3d46   Eric Dumazet   [NET]: Define inf...
1014
  	/* Keeping track of sockets in use */
65f765178   Eric Dumazet   [NET]: prot_inuse...
1015
  #ifdef CONFIG_PROC_FS
13ff3d6fa   Pavel Emelyanov   [SOCK]: Enumerate...
1016
  	unsigned int		inuse_idx;
65f765178   Eric Dumazet   [NET]: prot_inuse...
1017
  #endif
ebb53d756   Arnaldo Carvalho de Melo   [NET] proto: Use ...
1018

c9bee3b7f   Eric Dumazet   tcp: TCP_NOTSENT_...
1019
  	bool			(*stream_memory_free)(const struct sock *sk);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1020
  	/* Memory pressure */
5c52ba170   Pavel Emelyanov   sock: add net to ...
1021
  	void			(*enter_memory_pressure)(struct sock *sk);
060447511   Eric Dumazet   tcp: add TCPMemor...
1022
  	void			(*leave_memory_pressure)(struct sock *sk);
8d987e5c7   Eric Dumazet   net: avoid limits...
1023
  	atomic_long_t		*memory_allocated;	/* Current allocated memory. */
1748376b6   Eric Dumazet   net: Use a percpu...
1024
  	struct percpu_counter	*sockets_allocated;	/* Current number of sockets. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1025
1026
1027
  	/*
  	 * Pressure flag: try to collapse.
  	 * Technical note: it is used by multiple contexts non atomically.
3ab224be6   Hideo Aoki   [NET] CORE: Intro...
1028
  	 * All the __sk_mem_schedule() is of this nature: accounting
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1029
1030
  	 * is strict, actions are advisory and have some latency.
  	 */
060447511   Eric Dumazet   tcp: add TCPMemor...
1031
  	unsigned long		*memory_pressure;
8d987e5c7   Eric Dumazet   net: avoid limits...
1032
  	long			*sysctl_mem;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1033
1034
1035
  	int			*sysctl_wmem;
  	int			*sysctl_rmem;
  	int			max_header;
7ba429100   Changli Gao   inet, inet6: make...
1036
  	bool			no_autobind;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1037

271b72c7f   Eric Dumazet   udp: RCU handling...
1038
  	struct kmem_cache	*slab;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1039
  	unsigned int		obj_size;
271b72c7f   Eric Dumazet   udp: RCU handling...
1040
  	int			slab_flags;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1041

dd24c0019   Eric Dumazet   net: Use a percpu...
1042
  	struct percpu_counter	*orphan_count;
8feaf0c0a   Arnaldo Carvalho de Melo   [INET]: Generalis...
1043

60236fdd0   Arnaldo Carvalho de Melo   [NET] Rename open...
1044
  	struct request_sock_ops	*rsk_prot;
6d6ee43e0   Arnaldo Carvalho de Melo   [TWSK]: Introduce...
1045
  	struct timewait_sock_ops *twsk_prot;
2e6599cb8   Arnaldo Carvalho de Melo   [NET] Generalise ...
1046

39d8cda76   Pavel Emelyanov   [SOCK]: Add udp_h...
1047
1048
  	union {
  		struct inet_hashinfo	*hashinfo;
645ca708f   Eric Dumazet   udp: introduce st...
1049
  		struct udp_table	*udp_table;
fc8717baa   Pavel Emelyanov   [RAW]: Add raw_ha...
1050
  		struct raw_hashinfo	*raw_hash;
f16a7dd5c   Ursula Braun   smc: netlink inte...
1051
  		struct smc_hashinfo	*smc_hash;
39d8cda76   Pavel Emelyanov   [SOCK]: Add udp_h...
1052
  	} h;
ab1e0a13d   Arnaldo Carvalho de Melo   [SOCK] proto: Add...
1053

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1054
1055
1056
1057
1058
  	struct module		*owner;
  
  	char			name[32];
  
  	struct list_head	node;
e6848976b   Arnaldo Carvalho de Melo   [NET]: Cleanup IN...
1059
1060
1061
  #ifdef SOCK_REFCNT_DEBUG
  	atomic_t		socks;
  #endif
64be0aed5   Lorenzo Colitti   net: diag: Add th...
1062
  	int			(*diag_destroy)(struct sock *sk, int err);
3859a271a   Kees Cook   randstruct: Mark ...
1063
  } __randomize_layout;
e1aab161e   Glauber Costa   socket: initial c...
1064

69336bd2d   Joe Perches   sock.h: Remove ex...
1065
1066
  int proto_register(struct proto *prot, int alloc_slab);
  void proto_unregister(struct proto *prot);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1067

e6848976b   Arnaldo Carvalho de Melo   [NET]: Cleanup IN...
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
  #ifdef SOCK_REFCNT_DEBUG
  static inline void sk_refcnt_debug_inc(struct sock *sk)
  {
  	atomic_inc(&sk->sk_prot->socks);
  }
  
  static inline void sk_refcnt_debug_dec(struct sock *sk)
  {
  	atomic_dec(&sk->sk_prot->socks);
  	printk(KERN_DEBUG "%s socket %p released, %d are still alive
  ",
  	       sk->sk_prot->name, sk, atomic_read(&sk->sk_prot->socks));
  }
dec34fb0f   Ying Xue   net: fix a compil...
1081
  static inline void sk_refcnt_debug_release(const struct sock *sk)
e6848976b   Arnaldo Carvalho de Melo   [NET]: Cleanup IN...
1082
  {
41c6d650f   Reshetova, Elena   net: convert sock...
1083
  	if (refcount_read(&sk->sk_refcnt) != 1)
e6848976b   Arnaldo Carvalho de Melo   [NET]: Cleanup IN...
1084
1085
  		printk(KERN_DEBUG "Destruction of the %s socket %p delayed, refcnt=%d
  ",
41c6d650f   Reshetova, Elena   net: convert sock...
1086
  		       sk->sk_prot->name, sk, refcount_read(&sk->sk_refcnt));
e6848976b   Arnaldo Carvalho de Melo   [NET]: Cleanup IN...
1087
1088
1089
1090
1091
1092
  }
  #else /* SOCK_REFCNT_DEBUG */
  #define sk_refcnt_debug_inc(sk) do { } while (0)
  #define sk_refcnt_debug_dec(sk) do { } while (0)
  #define sk_refcnt_debug_release(sk) do { } while (0)
  #endif /* SOCK_REFCNT_DEBUG */
c9bee3b7f   Eric Dumazet   tcp: TCP_NOTSENT_...
1093
1094
1095
1096
1097
1098
1099
1100
  static inline bool sk_stream_memory_free(const struct sock *sk)
  {
  	if (sk->sk_wmem_queued >= sk->sk_sndbuf)
  		return false;
  
  	return sk->sk_prot->stream_memory_free ?
  		sk->sk_prot->stream_memory_free(sk) : true;
  }
64dc61306   Eric Dumazet   net: add sk_strea...
1101
1102
  static inline bool sk_stream_is_writeable(const struct sock *sk)
  {
c9bee3b7f   Eric Dumazet   tcp: TCP_NOTSENT_...
1103
1104
  	return sk_stream_wspace(sk) >= sk_stream_min_wspace(sk) &&
  	       sk_stream_memory_free(sk);
64dc61306   Eric Dumazet   net: add sk_strea...
1105
  }
e1aab161e   Glauber Costa   socket: initial c...
1106

54fd9c2df   Daniel Borkmann   bpf: get rid of c...
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
  static inline int sk_under_cgroup_hierarchy(struct sock *sk,
  					    struct cgroup *ancestor)
  {
  #ifdef CONFIG_SOCK_CGROUP_DATA
  	return cgroup_is_descendant(sock_cgroup_ptr(&sk->sk_cgrp_data),
  				    ancestor);
  #else
  	return -ENOTSUPP;
  #endif
  }
c9bee3b7f   Eric Dumazet   tcp: TCP_NOTSENT_...
1117

180d8cd94   Glauber Costa   foundations of pe...
1118
1119
1120
1121
1122
1123
1124
1125
1126
  static inline bool sk_has_memory_pressure(const struct sock *sk)
  {
  	return sk->sk_prot->memory_pressure != NULL;
  }
  
  static inline bool sk_under_memory_pressure(const struct sock *sk)
  {
  	if (!sk->sk_prot->memory_pressure)
  		return false;
e1aab161e   Glauber Costa   socket: initial c...
1127

baac50bbc   Johannes Weiner   net: tcp_memcontr...
1128
1129
  	if (mem_cgroup_sockets_enabled && sk->sk_memcg &&
  	    mem_cgroup_under_socket_pressure(sk->sk_memcg))
e805605c7   Johannes Weiner   net: tcp_memcontr...
1130
  		return true;
e1aab161e   Glauber Costa   socket: initial c...
1131

35b87f6c1   Christoph Paasch   net: Dereference ...
1132
  	return !!*sk->sk_prot->memory_pressure;
180d8cd94   Glauber Costa   foundations of pe...
1133
  }
180d8cd94   Glauber Costa   foundations of pe...
1134
1135
1136
  static inline long
  sk_memory_allocated(const struct sock *sk)
  {
e805605c7   Johannes Weiner   net: tcp_memcontr...
1137
  	return atomic_long_read(sk->sk_prot->memory_allocated);
180d8cd94   Glauber Costa   foundations of pe...
1138
1139
1140
  }
  
  static inline long
e805605c7   Johannes Weiner   net: tcp_memcontr...
1141
  sk_memory_allocated_add(struct sock *sk, int amt)
180d8cd94   Glauber Costa   foundations of pe...
1142
  {
e805605c7   Johannes Weiner   net: tcp_memcontr...
1143
  	return atomic_long_add_return(amt, sk->sk_prot->memory_allocated);
180d8cd94   Glauber Costa   foundations of pe...
1144
1145
1146
  }
  
  static inline void
0e90b31f4   Glauber Costa   net: introduce re...
1147
  sk_memory_allocated_sub(struct sock *sk, int amt)
180d8cd94   Glauber Costa   foundations of pe...
1148
  {
e805605c7   Johannes Weiner   net: tcp_memcontr...
1149
  	atomic_long_sub(amt, sk->sk_prot->memory_allocated);
180d8cd94   Glauber Costa   foundations of pe...
1150
1151
1152
1153
  }
  
  static inline void sk_sockets_allocated_dec(struct sock *sk)
  {
af95d7df4   Johannes Weiner   net: tcp_memcontr...
1154
  	percpu_counter_dec(sk->sk_prot->sockets_allocated);
180d8cd94   Glauber Costa   foundations of pe...
1155
1156
1157
1158
  }
  
  static inline void sk_sockets_allocated_inc(struct sock *sk)
  {
af95d7df4   Johannes Weiner   net: tcp_memcontr...
1159
  	percpu_counter_inc(sk->sk_prot->sockets_allocated);
180d8cd94   Glauber Costa   foundations of pe...
1160
1161
1162
1163
1164
  }
  
  static inline int
  sk_sockets_allocated_read_positive(struct sock *sk)
  {
af95d7df4   Johannes Weiner   net: tcp_memcontr...
1165
  	return percpu_counter_read_positive(sk->sk_prot->sockets_allocated);
180d8cd94   Glauber Costa   foundations of pe...
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
  }
  
  static inline int
  proto_sockets_allocated_sum_positive(struct proto *prot)
  {
  	return percpu_counter_sum_positive(prot->sockets_allocated);
  }
  
  static inline long
  proto_memory_allocated(struct proto *prot)
  {
  	return atomic_long_read(prot->memory_allocated);
  }
  
  static inline bool
  proto_memory_pressure(struct proto *prot)
  {
  	if (!prot->memory_pressure)
  		return false;
  	return !!*prot->memory_pressure;
  }
65f765178   Eric Dumazet   [NET]: prot_inuse...
1187
1188
  
  #ifdef CONFIG_PROC_FS
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1189
  /* Called with local bh disabled */
69336bd2d   Joe Perches   sock.h: Remove ex...
1190
1191
  void sock_prot_inuse_add(struct net *net, struct proto *prot, int inc);
  int sock_prot_inuse_get(struct net *net, struct proto *proto);
65f765178   Eric Dumazet   [NET]: prot_inuse...
1192
  #else
dc6b9b782   Eric Dumazet   net: include/net/...
1193
  static inline void sock_prot_inuse_add(struct net *net, struct proto *prot,
c29a0bc4d   Pavel Emelyanov   [SOCK][NETNS]: Ad...
1194
  		int inc)
65f765178   Eric Dumazet   [NET]: prot_inuse...
1195
1196
  {
  }
65f765178   Eric Dumazet   [NET]: prot_inuse...
1197
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1198

614c6cb4f   Arnaldo Carvalho de Melo   [SOCK]: Rename __...
1199
1200
1201
  /* With per-bucket locks this operation is not-atomic, so that
   * this version is not worse.
   */
086c653f5   Craig Gallek   sock: struct prot...
1202
  static inline int __sk_prot_rehash(struct sock *sk)
614c6cb4f   Arnaldo Carvalho de Melo   [SOCK]: Rename __...
1203
1204
  {
  	sk->sk_prot->unhash(sk);
086c653f5   Craig Gallek   sock: struct prot...
1205
  	return sk->sk_prot->hash(sk);
614c6cb4f   Arnaldo Carvalho de Melo   [SOCK]: Rename __...
1206
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
  /* About 10 seconds */
  #define SOCK_DESTROY_TIME (10*HZ)
  
  /* Sockets 0-1023 can't be bound to unless you are superuser */
  #define PROT_SOCK	1024
  
  #define SHUTDOWN_MASK	3
  #define RCV_SHUTDOWN	1
  #define SEND_SHUTDOWN	2
  
  #define SOCK_SNDBUF_LOCK	1
  #define SOCK_RCVBUF_LOCK	2
  #define SOCK_BINDADDR_LOCK	4
  #define SOCK_BINDPORT_LOCK	8
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
  struct socket_alloc {
  	struct socket socket;
  	struct inode vfs_inode;
  };
  
  static inline struct socket *SOCKET_I(struct inode *inode)
  {
  	return &container_of(inode, struct socket_alloc, vfs_inode)->socket;
  }
  
  static inline struct inode *SOCK_INODE(struct socket *socket)
  {
  	return &container_of(socket, struct socket_alloc, socket)->vfs_inode;
  }
3ab224be6   Hideo Aoki   [NET] CORE: Intro...
1235
1236
1237
  /*
   * Functions for memory accounting
   */
f8c3bf00d   Paolo Abeni   net/socket: facto...
1238
  int __sk_mem_raise_allocated(struct sock *sk, int size, int amt, int kind);
69336bd2d   Joe Perches   sock.h: Remove ex...
1239
  int __sk_mem_schedule(struct sock *sk, int size, int kind);
f8c3bf00d   Paolo Abeni   net/socket: facto...
1240
  void __sk_mem_reduce_allocated(struct sock *sk, int amount);
1a24e04e4   Eric Dumazet   net: fix sk_mem_r...
1241
  void __sk_mem_reclaim(struct sock *sk, int amount);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1242

bd68a2a85   Eric Dumazet   net: set SK_MEM_Q...
1243
1244
1245
1246
  /* We used to have PAGE_SIZE here, but systems with 64KB pages
   * do not necessarily have 16x time more memory than 4KB ones.
   */
  #define SK_MEM_QUANTUM 4096
3ab224be6   Hideo Aoki   [NET] CORE: Intro...
1247
1248
1249
  #define SK_MEM_QUANTUM_SHIFT ilog2(SK_MEM_QUANTUM)
  #define SK_MEM_SEND	0
  #define SK_MEM_RECV	1
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1250

bd68a2a85   Eric Dumazet   net: set SK_MEM_Q...
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
  /* sysctl_mem values are in pages, we convert them in SK_MEM_QUANTUM units */
  static inline long sk_prot_mem_limits(const struct sock *sk, int index)
  {
  	long val = sk->sk_prot->sysctl_mem[index];
  
  #if PAGE_SIZE > SK_MEM_QUANTUM
  	val <<= PAGE_SHIFT - SK_MEM_QUANTUM_SHIFT;
  #elif PAGE_SIZE < SK_MEM_QUANTUM
  	val >>= SK_MEM_QUANTUM_SHIFT - PAGE_SHIFT;
  #endif
  	return val;
  }
3ab224be6   Hideo Aoki   [NET] CORE: Intro...
1263
  static inline int sk_mem_pages(int amt)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1264
  {
3ab224be6   Hideo Aoki   [NET] CORE: Intro...
1265
  	return (amt + SK_MEM_QUANTUM - 1) >> SK_MEM_QUANTUM_SHIFT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1266
  }
dc6b9b782   Eric Dumazet   net: include/net/...
1267
  static inline bool sk_has_account(struct sock *sk)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1268
  {
3ab224be6   Hideo Aoki   [NET] CORE: Intro...
1269
1270
  	/* return true if protocol supports memory accounting */
  	return !!sk->sk_prot->memory_allocated;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1271
  }
dc6b9b782   Eric Dumazet   net: include/net/...
1272
  static inline bool sk_wmem_schedule(struct sock *sk, int size)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1273
  {
3ab224be6   Hideo Aoki   [NET] CORE: Intro...
1274
  	if (!sk_has_account(sk))
dc6b9b782   Eric Dumazet   net: include/net/...
1275
  		return true;
3ab224be6   Hideo Aoki   [NET] CORE: Intro...
1276
1277
  	return size <= sk->sk_forward_alloc ||
  		__sk_mem_schedule(sk, size, SK_MEM_SEND);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1278
  }
c76562b67   Mel Gorman   netvm: prevent a ...
1279
  static inline bool
35c448a8a   Chuck Lever   include/net/sock....
1280
  sk_rmem_schedule(struct sock *sk, struct sk_buff *skb, int size)
d80d99d64   Herbert Xu   [NET]: Add sk_str...
1281
  {
3ab224be6   Hideo Aoki   [NET] CORE: Intro...
1282
  	if (!sk_has_account(sk))
dc6b9b782   Eric Dumazet   net: include/net/...
1283
  		return true;
c76562b67   Mel Gorman   netvm: prevent a ...
1284
1285
1286
  	return size<= sk->sk_forward_alloc ||
  		__sk_mem_schedule(sk, size, SK_MEM_RECV) ||
  		skb_pfmemalloc(skb);
3ab224be6   Hideo Aoki   [NET] CORE: Intro...
1287
1288
1289
1290
1291
1292
1293
  }
  
  static inline void sk_mem_reclaim(struct sock *sk)
  {
  	if (!sk_has_account(sk))
  		return;
  	if (sk->sk_forward_alloc >= SK_MEM_QUANTUM)
1a24e04e4   Eric Dumazet   net: fix sk_mem_r...
1294
  		__sk_mem_reclaim(sk, sk->sk_forward_alloc);
3ab224be6   Hideo Aoki   [NET] CORE: Intro...
1295
  }
9993e7d31   David S. Miller   [TCP]: Do not pur...
1296
1297
1298
1299
1300
  static inline void sk_mem_reclaim_partial(struct sock *sk)
  {
  	if (!sk_has_account(sk))
  		return;
  	if (sk->sk_forward_alloc > SK_MEM_QUANTUM)
1a24e04e4   Eric Dumazet   net: fix sk_mem_r...
1301
  		__sk_mem_reclaim(sk, sk->sk_forward_alloc - 1);
9993e7d31   David S. Miller   [TCP]: Do not pur...
1302
  }
3ab224be6   Hideo Aoki   [NET] CORE: Intro...
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
  static inline void sk_mem_charge(struct sock *sk, int size)
  {
  	if (!sk_has_account(sk))
  		return;
  	sk->sk_forward_alloc -= size;
  }
  
  static inline void sk_mem_uncharge(struct sock *sk, int size)
  {
  	if (!sk_has_account(sk))
  		return;
  	sk->sk_forward_alloc += size;
20c64d5cd   Eric Dumazet   net: avoid sk_for...
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
  
  	/* Avoid a possible overflow.
  	 * TCP send queues can make this happen, if sk_mem_reclaim()
  	 * is not called and more than 2 GBytes are released at once.
  	 *
  	 * If we reach 2 MBytes, reclaim 1 MBytes right now, there is
  	 * no need to hold that much forward allocation anyway.
  	 */
  	if (unlikely(sk->sk_forward_alloc >= 1 << 21))
  		__sk_mem_reclaim(sk, 1 << 20);
3ab224be6   Hideo Aoki   [NET] CORE: Intro...
1325
1326
1327
1328
  }
  
  static inline void sk_wmem_free_skb(struct sock *sk, struct sk_buff *skb)
  {
3ab224be6   Hideo Aoki   [NET] CORE: Intro...
1329
1330
1331
1332
  	sock_set_flag(sk, SOCK_QUEUE_SHRUNK);
  	sk->sk_wmem_queued -= skb->truesize;
  	sk_mem_uncharge(sk, skb->truesize);
  	__kfree_skb(skb);
d80d99d64   Herbert Xu   [NET]: Add sk_str...
1333
  }
c3f9b0184   Eric Dumazet   tcp: tcp_release_...
1334
1335
  static inline void sock_release_ownership(struct sock *sk)
  {
61881cfb5   Hannes Frederic Sowa   sock: fix lockdep...
1336
1337
1338
1339
1340
1341
  	if (sk->sk_lock.owned) {
  		sk->sk_lock.owned = 0;
  
  		/* The sk_lock has mutex_unlock() semantics: */
  		mutex_release(&sk->sk_lock.dep_map, 1, _RET_IP_);
  	}
c3f9b0184   Eric Dumazet   tcp: tcp_release_...
1342
  }
ed07536ed   Peter Zijlstra   [PATCH] lockdep: ...
1343
1344
1345
1346
1347
1348
1349
  /*
   * Macro so as to not evaluate some arguments when
   * lockdep is not enabled.
   *
   * Mark both the sk_lock and the sk_lock.slock as a
   * per-address-family lock class.
   */
dc6b9b782   Eric Dumazet   net: include/net/...
1350
  #define sock_lock_init_class_and_name(sk, sname, skey, name, key)	\
ed07536ed   Peter Zijlstra   [PATCH] lockdep: ...
1351
  do {									\
e8f6fbf62   Ingo Molnar   lockdep: include/...
1352
  	sk->sk_lock.owned = 0;						\
ed07536ed   Peter Zijlstra   [PATCH] lockdep: ...
1353
1354
1355
1356
1357
  	init_waitqueue_head(&sk->sk_lock.wq);				\
  	spin_lock_init(&(sk)->sk_lock.slock);				\
  	debug_check_no_locks_freed((void *)&(sk)->sk_lock,		\
  			sizeof((sk)->sk_lock));				\
  	lockdep_set_class_and_name(&(sk)->sk_lock.slock,		\
dc6b9b782   Eric Dumazet   net: include/net/...
1358
  				(skey), (sname));				\
ed07536ed   Peter Zijlstra   [PATCH] lockdep: ...
1359
1360
  	lockdep_init_map(&(sk)->sk_lock.dep_map, (name), (key), 0);	\
  } while (0)
b33b0a1bf   David S. Miller   net: Fix build fa...
1361
  #ifdef CONFIG_LOCKDEP
03be98226   Hannes Frederic Sowa   sock: make lockde...
1362
  static inline bool lockdep_sock_is_held(const struct sock *csk)
1e1d04e67   Hannes Frederic Sowa   net: introduce lo...
1363
1364
1365
1366
1367
1368
  {
  	struct sock *sk = (struct sock *)csk;
  
  	return lockdep_is_held(&sk->sk_lock) ||
  	       lockdep_is_held(&sk->sk_lock.slock);
  }
b33b0a1bf   David S. Miller   net: Fix build fa...
1369
  #endif
1e1d04e67   Hannes Frederic Sowa   net: introduce lo...
1370

69336bd2d   Joe Perches   sock.h: Remove ex...
1371
  void lock_sock_nested(struct sock *sk, int subclass);
fcc70d5fd   Peter Zijlstra   [BLUETOOTH] lockd...
1372
1373
1374
1375
1376
  
  static inline void lock_sock(struct sock *sk)
  {
  	lock_sock_nested(sk, 0);
  }
e6ddc2c3d   Eric Dumazet   tcp: do not relea...
1377
  void __release_sock(struct sock *sk);
69336bd2d   Joe Perches   sock.h: Remove ex...
1378
  void release_sock(struct sock *sk);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1379
1380
1381
  
  /* BH context may only use the following locking interface. */
  #define bh_lock_sock(__sk)	spin_lock(&((__sk)->sk_lock.slock))
c63661848   Ingo Molnar   [PATCH] lockdep: ...
1382
1383
1384
  #define bh_lock_sock_nested(__sk) \
  				spin_lock_nested(&((__sk)->sk_lock.slock), \
  				SINGLE_DEPTH_NESTING)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1385
  #define bh_unlock_sock(__sk)	spin_unlock(&((__sk)->sk_lock.slock))
69336bd2d   Joe Perches   sock.h: Remove ex...
1386
  bool lock_sock_fast(struct sock *sk);
8a74ad60a   Eric Dumazet   net: fix lock_soc...
1387
1388
1389
1390
1391
1392
1393
1394
1395
  /**
   * unlock_sock_fast - complement of lock_sock_fast
   * @sk: socket
   * @slow: slow mode
   *
   * fast unlock socket for user context.
   * If slow mode is on, we call regular release_sock()
   */
  static inline void unlock_sock_fast(struct sock *sk, bool slow)
4b0b72f7d   Eric Dumazet   net: speedup udp ...
1396
  {
8a74ad60a   Eric Dumazet   net: fix lock_soc...
1397
1398
1399
1400
  	if (slow)
  		release_sock(sk);
  	else
  		spin_unlock_bh(&sk->sk_lock.slock);
4b0b72f7d   Eric Dumazet   net: speedup udp ...
1401
  }
fafc4e1ea   Hannes Frederic Sowa   sock: tigthen loc...
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
  /* Used by processes to "lock" a socket state, so that
   * interrupts and bottom half handlers won't change it
   * from under us. It essentially blocks any incoming
   * packets, so that we won't get any new data or any
   * packets that change the state of the socket.
   *
   * While locked, BH processing will add new packets to
   * the backlog queue.  This queue is processed by the
   * owner of the socket lock right before it is released.
   *
   * Since ~2.3.5 it is also exclusive sleep lock serializing
   * accesses from user process context.
   */
46cc6e497   Eric Dumazet   tcp: fix lockdep ...
1415
  static inline void sock_owned_by_me(const struct sock *sk)
fafc4e1ea   Hannes Frederic Sowa   sock: tigthen loc...
1416
1417
  {
  #ifdef CONFIG_LOCKDEP
5e91f6ce4   Eric Dumazet   sock: relax WARN_...
1418
  	WARN_ON_ONCE(!lockdep_sock_is_held(sk) && debug_locks);
fafc4e1ea   Hannes Frederic Sowa   sock: tigthen loc...
1419
  #endif
46cc6e497   Eric Dumazet   tcp: fix lockdep ...
1420
1421
1422
1423
1424
  }
  
  static inline bool sock_owned_by_user(const struct sock *sk)
  {
  	sock_owned_by_me(sk);
fafc4e1ea   Hannes Frederic Sowa   sock: tigthen loc...
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
  	return sk->sk_lock.owned;
  }
  
  /* no reclassification while locks are held */
  static inline bool sock_allow_reclassification(const struct sock *csk)
  {
  	struct sock *sk = (struct sock *)csk;
  
  	return !sk->sk_lock.owned && !spin_is_locked(&sk->sk_lock.slock);
  }
4b0b72f7d   Eric Dumazet   net: speedup udp ...
1435

69336bd2d   Joe Perches   sock.h: Remove ex...
1436
  struct sock *sk_alloc(struct net *net, int family, gfp_t priority,
11aa9c28b   Eric W. Biederman   net: Pass kern fr...
1437
  		      struct proto *prot, int kern);
69336bd2d   Joe Perches   sock.h: Remove ex...
1438
  void sk_free(struct sock *sk);
eb4cb0085   Craig Gallek   sock_diag: define...
1439
  void sk_destruct(struct sock *sk);
69336bd2d   Joe Perches   sock.h: Remove ex...
1440
  struct sock *sk_clone_lock(const struct sock *sk, const gfp_t priority);
94352d450   Arnaldo Carvalho de Melo   net: Introduce sk...
1441
  void sk_free_unlock_clone(struct sock *sk);
69336bd2d   Joe Perches   sock.h: Remove ex...
1442
1443
1444
  
  struct sk_buff *sock_wmalloc(struct sock *sk, unsigned long size, int force,
  			     gfp_t priority);
1d2077ac0   Eric Dumazet   net: add __sock_w...
1445
  void __sock_wfree(struct sk_buff *skb);
69336bd2d   Joe Perches   sock.h: Remove ex...
1446
  void sock_wfree(struct sk_buff *skb);
98ba0bd55   Willem de Bruijn   sock: allocate sk...
1447
1448
  struct sk_buff *sock_omalloc(struct sock *sk, unsigned long size,
  			     gfp_t priority);
69336bd2d   Joe Perches   sock.h: Remove ex...
1449
1450
  void skb_orphan_partial(struct sk_buff *skb);
  void sock_rfree(struct sk_buff *skb);
62bccb8cd   Alexander Duyck   net-timestamp: Ma...
1451
  void sock_efree(struct sk_buff *skb);
82eabd9eb   Alexander Duyck   net: merge cases ...
1452
  #ifdef CONFIG_INET
69336bd2d   Joe Perches   sock.h: Remove ex...
1453
  void sock_edemux(struct sk_buff *skb);
82eabd9eb   Alexander Duyck   net: merge cases ...
1454
  #else
158f323b9   Eric Dumazet   net: adjust skb->...
1455
  #define sock_edemux sock_efree
82eabd9eb   Alexander Duyck   net: merge cases ...
1456
  #endif
69336bd2d   Joe Perches   sock.h: Remove ex...
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
  
  int sock_setsockopt(struct socket *sock, int level, int op,
  		    char __user *optval, unsigned int optlen);
  
  int sock_getsockopt(struct socket *sock, int level, int op,
  		    char __user *optval, int __user *optlen);
  struct sk_buff *sock_alloc_send_skb(struct sock *sk, unsigned long size,
  				    int noblock, int *errcode);
  struct sk_buff *sock_alloc_send_pskb(struct sock *sk, unsigned long header_len,
  				     unsigned long data_len, int noblock,
  				     int *errcode, int max_page_order);
  void *sock_kmalloc(struct sock *sk, int size, gfp_t priority);
  void sock_kfree_s(struct sock *sk, void *mem, int size);
79e886599   Daniel Borkmann   crypto: algif - a...
1470
  void sock_kzfree_s(struct sock *sk, void *mem, int size);
69336bd2d   Joe Perches   sock.h: Remove ex...
1471
  void sk_send_sigurg(struct sock *sk);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1472

f28ea365c   Edward Jee   sock: support per...
1473
1474
  struct sockcm_cookie {
  	u32 mark;
3dd17e63f   Soheil Hassas Yeganeh   sock: accept SO_T...
1475
  	u16 tsflags;
f28ea365c   Edward Jee   sock: support per...
1476
  };
39771b127   Willem de Bruijn   sock: break up so...
1477
1478
  int __sock_cmsg_send(struct sock *sk, struct msghdr *msg, struct cmsghdr *cmsg,
  		     struct sockcm_cookie *sockc);
f28ea365c   Edward Jee   sock: support per...
1479
1480
  int sock_cmsg_send(struct sock *sk, struct msghdr *msg,
  		   struct sockcm_cookie *sockc);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1481
1482
1483
1484
  /*
   * Functions to fill in entries in struct proto_ops when a protocol
   * does not implement a particular function.
   */
69336bd2d   Joe Perches   sock.h: Remove ex...
1485
1486
1487
  int sock_no_bind(struct socket *, struct sockaddr *, int);
  int sock_no_connect(struct socket *, struct sockaddr *, int, int);
  int sock_no_socketpair(struct socket *, struct socket *);
cdfbabfb2   David Howells   net: Work around ...
1488
  int sock_no_accept(struct socket *, struct socket *, int, bool);
69336bd2d   Joe Perches   sock.h: Remove ex...
1489
1490
1491
1492
1493
1494
1495
1496
  int sock_no_getname(struct socket *, struct sockaddr *, int *, int);
  unsigned int sock_no_poll(struct file *, struct socket *,
  			  struct poll_table_struct *);
  int sock_no_ioctl(struct socket *, unsigned int, unsigned long);
  int sock_no_listen(struct socket *, int);
  int sock_no_shutdown(struct socket *, int);
  int sock_no_getsockopt(struct socket *, int , int, char __user *, int __user *);
  int sock_no_setsockopt(struct socket *, int, int, char __user *, unsigned int);
1b7841404   Ying Xue   net: Remove iocb ...
1497
  int sock_no_sendmsg(struct socket *, struct msghdr *, size_t);
306b13eb3   Tom Herbert   proto_ops: Add lo...
1498
  int sock_no_sendmsg_locked(struct sock *sk, struct msghdr *msg, size_t len);
1b7841404   Ying Xue   net: Remove iocb ...
1499
  int sock_no_recvmsg(struct socket *, struct msghdr *, size_t, int);
69336bd2d   Joe Perches   sock.h: Remove ex...
1500
1501
1502
1503
  int sock_no_mmap(struct file *file, struct socket *sock,
  		 struct vm_area_struct *vma);
  ssize_t sock_no_sendpage(struct socket *sock, struct page *page, int offset,
  			 size_t size, int flags);
306b13eb3   Tom Herbert   proto_ops: Add lo...
1504
1505
  ssize_t sock_no_sendpage_locked(struct sock *sk, struct page *page,
  				int offset, size_t size, int flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1506
1507
1508
1509
1510
  
  /*
   * Functions to fill in entries in struct proto_ops when a protocol
   * uses the inet style.
   */
69336bd2d   Joe Perches   sock.h: Remove ex...
1511
  int sock_common_getsockopt(struct socket *sock, int level, int optname,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1512
  				  char __user *optval, int __user *optlen);
1b7841404   Ying Xue   net: Remove iocb ...
1513
1514
  int sock_common_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
  			int flags);
69336bd2d   Joe Perches   sock.h: Remove ex...
1515
  int sock_common_setsockopt(struct socket *sock, int level, int optname,
b7058842c   David S. Miller   net: Make setsock...
1516
  				  char __user *optval, unsigned int optlen);
69336bd2d   Joe Perches   sock.h: Remove ex...
1517
  int compat_sock_common_getsockopt(struct socket *sock, int level,
3fdadf7d2   Dmitry Mishin   [NET]: {get|set}s...
1518
  		int optname, char __user *optval, int __user *optlen);
69336bd2d   Joe Perches   sock.h: Remove ex...
1519
  int compat_sock_common_setsockopt(struct socket *sock, int level,
b7058842c   David S. Miller   net: Make setsock...
1520
  		int optname, char __user *optval, unsigned int optlen);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1521

69336bd2d   Joe Perches   sock.h: Remove ex...
1522
  void sk_common_release(struct sock *sk);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1523
1524
1525
1526
  
  /*
   *	Default socket callbacks and setup code
   */
dc6b9b782   Eric Dumazet   net: include/net/...
1527

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1528
  /* Initialise core socket variables */
69336bd2d   Joe Perches   sock.h: Remove ex...
1529
  void sock_init_data(struct socket *sock, struct sock *sk);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1530

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
  /*
   * Socket reference counting postulates.
   *
   * * Each user of socket SHOULD hold a reference count.
   * * Each access point to socket (an hash table bucket, reference from a list,
   *   running timer, skb in flight MUST hold a reference count.
   * * When reference count hits 0, it means it will never increase back.
   * * When reference count hits 0, it means that no references from
   *   outside exist to this socket and current process on current CPU
   *   is last user and may/should destroy this socket.
   * * sk_free is called from any context: process, BH, IRQ. When
   *   it is called, socket has no references from outside -> sk_free
   *   may release descendant resources allocated by the socket, but
   *   to the time when it is called, socket is NOT referenced by any
   *   hash tables, lists etc.
   * * Packets, delivered from outside (from network or from another process)
   *   and enqueued on receive/error queues SHOULD NOT grab reference count,
   *   when they sit in queue. Otherwise, packets will leak to hole, when
   *   socket is looked up by one cpu and unhasing is made by another CPU.
   *   It is true for udp/raw, netlink (leak to receive and error queues), tcp
   *   (leak to backlog). Packet socket does all the processing inside
   *   BR_NETPROTO_LOCK, so that it has not this race condition. UNIX sockets
   *   use separate SMP lock, so that they are prone too.
   */
  
  /* Ungrab socket and destroy it, if it was the last reference. */
  static inline void sock_put(struct sock *sk)
  {
41c6d650f   Reshetova, Elena   net: convert sock...
1559
  	if (refcount_dec_and_test(&sk->sk_refcnt))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1560
1561
  		sk_free(sk);
  }
05dbc7b59   Eric Dumazet   tcp/dccp: remove ...
1562
  /* Generic version of sock_put(), dealing with all sockets
41b822c59   Eric Dumazet   inet: prepare soc...
1563
   * (TCP_TIMEWAIT, TCP_NEW_SYN_RECV, ESTABLISHED...)
05dbc7b59   Eric Dumazet   tcp/dccp: remove ...
1564
1565
   */
  void sock_gen_put(struct sock *sk);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1566

4f0c40d94   Willem de Bruijn   dccp: limit sk_fi...
1567
  int __sk_receive_skb(struct sock *sk, struct sk_buff *skb, const int nested,
c3f24cfb3   Eric Dumazet   dccp: do not rele...
1568
  		     unsigned int trim_cap, bool refcounted);
4f0c40d94   Willem de Bruijn   dccp: limit sk_fi...
1569
1570
1571
  static inline int sk_receive_skb(struct sock *sk, struct sk_buff *skb,
  				 const int nested)
  {
c3f24cfb3   Eric Dumazet   dccp: do not rele...
1572
  	return __sk_receive_skb(sk, skb, nested, 1, true);
4f0c40d94   Willem de Bruijn   dccp: limit sk_fi...
1573
  }
25995ff57   Arnaldo Carvalho de Melo   [SOCK]: Introduce...
1574

e022f0b4a   Krishna Kumar   net: Introduce sk...
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
  static inline void sk_tx_queue_set(struct sock *sk, int tx_queue)
  {
  	sk->sk_tx_queue_mapping = tx_queue;
  }
  
  static inline void sk_tx_queue_clear(struct sock *sk)
  {
  	sk->sk_tx_queue_mapping = -1;
  }
  
  static inline int sk_tx_queue_get(const struct sock *sk)
  {
b0f77d0ea   Tom Herbert   net: fix problem ...
1587
  	return sk ? sk->sk_tx_queue_mapping : -1;
e022f0b4a   Krishna Kumar   net: Introduce sk...
1588
  }
972692e0d   David S. Miller   net: Add sk_set_s...
1589
1590
  static inline void sk_set_socket(struct sock *sk, struct socket *sock)
  {
e022f0b4a   Krishna Kumar   net: Introduce sk...
1591
  	sk_tx_queue_clear(sk);
972692e0d   David S. Miller   net: Add sk_set_s...
1592
1593
  	sk->sk_socket = sock;
  }
aa3951451   Eric Dumazet   net: sk_sleep() h...
1594
1595
  static inline wait_queue_head_t *sk_sleep(struct sock *sk)
  {
eaefd1105   Eric Dumazet   net: add __rcu an...
1596
1597
  	BUILD_BUG_ON(offsetof(struct socket_wq, wait) != 0);
  	return &rcu_dereference_raw(sk->sk_wq)->wait;
aa3951451   Eric Dumazet   net: sk_sleep() h...
1598
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
  /* Detach socket from process context.
   * Announce socket dead, detach it from wait queue and inode.
   * Note that parent inode held reference count on this struct sock,
   * we do not release it in this function, because protocol
   * probably wants some additional cleanups or even continuing
   * to work with this socket (TCP).
   */
  static inline void sock_orphan(struct sock *sk)
  {
  	write_lock_bh(&sk->sk_callback_lock);
  	sock_set_flag(sk, SOCK_DEAD);
972692e0d   David S. Miller   net: Add sk_set_s...
1610
  	sk_set_socket(sk, NULL);
438154823   Eric Dumazet   net: sock_def_rea...
1611
  	sk->sk_wq  = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1612
1613
1614
1615
1616
  	write_unlock_bh(&sk->sk_callback_lock);
  }
  
  static inline void sock_graft(struct sock *sk, struct socket *parent)
  {
0ffdaf5b4   Sowmini Varadhan   net/sock: add WAR...
1617
  	WARN_ON(parent->sk);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1618
  	write_lock_bh(&sk->sk_callback_lock);
eaefd1105   Eric Dumazet   net: add __rcu an...
1619
  	sk->sk_wq = parent->wq;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1620
  	parent->sk = sk;
972692e0d   David S. Miller   net: Add sk_set_s...
1621
  	sk_set_socket(sk, parent);
86741ec25   Lorenzo Colitti   net: core: Add a ...
1622
  	sk->sk_uid = SOCK_INODE(parent)->i_uid;
4237c75c0   Venkat Yekkirala   [MLSXFRM]: Auto-l...
1623
  	security_sock_graft(sk, parent);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1624
1625
  	write_unlock_bh(&sk->sk_callback_lock);
  }
69336bd2d   Joe Perches   sock.h: Remove ex...
1626
1627
  kuid_t sock_i_uid(struct sock *sk);
  unsigned long sock_i_ino(struct sock *sk);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1628

86741ec25   Lorenzo Colitti   net: core: Add a ...
1629
1630
1631
1632
  static inline kuid_t sock_net_uid(const struct net *net, const struct sock *sk)
  {
  	return sk ? sk->sk_uid : make_kuid(net->user_ns, 0);
  }
58d607d3e   Eric Dumazet   tcp: provide skb-...
1633
  static inline u32 net_tx_rndhash(void)
877d1f629   Tom Herbert   net: Set sk_txhas...
1634
  {
58d607d3e   Eric Dumazet   tcp: provide skb-...
1635
1636
1637
1638
  	u32 v = prandom_u32();
  
  	return v ?: 1;
  }
877d1f629   Tom Herbert   net: Set sk_txhas...
1639

58d607d3e   Eric Dumazet   tcp: provide skb-...
1640
1641
1642
  static inline void sk_set_txhash(struct sock *sk)
  {
  	sk->sk_txhash = net_tx_rndhash();
877d1f629   Tom Herbert   net: Set sk_txhas...
1643
  }
265f94ff5   Tom Herbert   net: Recompute sk...
1644
1645
1646
1647
1648
  static inline void sk_rethink_txhash(struct sock *sk)
  {
  	if (sk->sk_txhash)
  		sk_set_txhash(sk);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1649
1650
1651
  static inline struct dst_entry *
  __sk_dst_get(struct sock *sk)
  {
1e1d04e67   Hannes Frederic Sowa   net: introduce lo...
1652
1653
  	return rcu_dereference_check(sk->sk_dst_cache,
  				     lockdep_sock_is_held(sk));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1654
1655
1656
1657
1658
1659
  }
  
  static inline struct dst_entry *
  sk_dst_get(struct sock *sk)
  {
  	struct dst_entry *dst;
b6c6712a4   Eric Dumazet   net: sk_dst_cache...
1660
1661
  	rcu_read_lock();
  	dst = rcu_dereference(sk->sk_dst_cache);
f88649721   Eric Dumazet   ipv4: fix dst rac...
1662
1663
  	if (dst && !atomic_inc_not_zero(&dst->__refcnt))
  		dst = NULL;
b6c6712a4   Eric Dumazet   net: sk_dst_cache...
1664
  	rcu_read_unlock();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1665
1666
  	return dst;
  }
b6c6712a4   Eric Dumazet   net: sk_dst_cache...
1667
1668
1669
  static inline void dst_negative_advice(struct sock *sk)
  {
  	struct dst_entry *ndst, *dst = __sk_dst_get(sk);
265f94ff5   Tom Herbert   net: Recompute sk...
1670
  	sk_rethink_txhash(sk);
b6c6712a4   Eric Dumazet   net: sk_dst_cache...
1671
1672
1673
1674
1675
  	if (dst && dst->ops->negative_advice) {
  		ndst = dst->ops->negative_advice(dst);
  
  		if (ndst != dst) {
  			rcu_assign_pointer(sk->sk_dst_cache, ndst);
0a6957e7d   ZHAO Gang   net: remove funct...
1676
  			sk_tx_queue_clear(sk);
9b8805a32   Julian Anastasov   sock: add sk_dst_...
1677
  			sk->sk_dst_pending_confirm = 0;
b6c6712a4   Eric Dumazet   net: sk_dst_cache...
1678
1679
1680
  		}
  	}
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1681
1682
1683
1684
  static inline void
  __sk_dst_set(struct sock *sk, struct dst_entry *dst)
  {
  	struct dst_entry *old_dst;
e022f0b4a   Krishna Kumar   net: Introduce sk...
1685
  	sk_tx_queue_clear(sk);
9b8805a32   Julian Anastasov   sock: add sk_dst_...
1686
  	sk->sk_dst_pending_confirm = 0;
95964c6de   Eric Dumazet   net: use proper l...
1687
1688
  	old_dst = rcu_dereference_protected(sk->sk_dst_cache,
  					    lockdep_sock_is_held(sk));
b6c6712a4   Eric Dumazet   net: sk_dst_cache...
1689
  	rcu_assign_pointer(sk->sk_dst_cache, dst);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1690
1691
1692
1693
1694
1695
  	dst_release(old_dst);
  }
  
  static inline void
  sk_dst_set(struct sock *sk, struct dst_entry *dst)
  {
7f5023615   Eric Dumazet   ipv4: irq safe sk...
1696
1697
1698
  	struct dst_entry *old_dst;
  
  	sk_tx_queue_clear(sk);
9b8805a32   Julian Anastasov   sock: add sk_dst_...
1699
  	sk->sk_dst_pending_confirm = 0;
5925a0555   Eric Dumazet   net: fix sparse w...
1700
  	old_dst = xchg((__force struct dst_entry **)&sk->sk_dst_cache, dst);
7f5023615   Eric Dumazet   ipv4: irq safe sk...
1701
  	dst_release(old_dst);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1702
1703
1704
1705
1706
  }
  
  static inline void
  __sk_dst_reset(struct sock *sk)
  {
b6c6712a4   Eric Dumazet   net: sk_dst_cache...
1707
  	__sk_dst_set(sk, NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1708
1709
1710
1711
1712
  }
  
  static inline void
  sk_dst_reset(struct sock *sk)
  {
7f5023615   Eric Dumazet   ipv4: irq safe sk...
1713
  	sk_dst_set(sk, NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1714
  }
69336bd2d   Joe Perches   sock.h: Remove ex...
1715
  struct dst_entry *__sk_dst_check(struct sock *sk, u32 cookie);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1716

69336bd2d   Joe Perches   sock.h: Remove ex...
1717
  struct dst_entry *sk_dst_check(struct sock *sk, u32 cookie);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1718

9b8805a32   Julian Anastasov   sock: add sk_dst_...
1719
1720
1721
1722
1723
  static inline void sk_dst_confirm(struct sock *sk)
  {
  	if (!sk->sk_dst_pending_confirm)
  		sk->sk_dst_pending_confirm = 1;
  }
4ff062035   Julian Anastasov   net: add dst_pend...
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
  static inline void sock_confirm_neigh(struct sk_buff *skb, struct neighbour *n)
  {
  	if (skb_get_dst_pending_confirm(skb)) {
  		struct sock *sk = skb->sk;
  		unsigned long now = jiffies;
  
  		/* avoid dirtying neighbour */
  		if (n->confirmed != now)
  			n->confirmed = now;
  		if (sk && sk->sk_dst_pending_confirm)
  			sk->sk_dst_pending_confirm = 0;
  	}
  }
f60e5990d   hannes@stressinduktion.org   ipv6: protect skb...
1737
  bool sk_mc_loop(struct sock *sk);
dc6b9b782   Eric Dumazet   net: include/net/...
1738
  static inline bool sk_can_gso(const struct sock *sk)
bcd761111   Herbert Xu   [NET]: Generalise...
1739
1740
1741
  {
  	return net_gso_ok(sk->sk_route_caps, sk->sk_gso_type);
  }
69336bd2d   Joe Perches   sock.h: Remove ex...
1742
  void sk_setup_caps(struct sock *sk, struct dst_entry *dst);
6cbb0df78   Arnaldo Carvalho de Melo   [SOCK]: Introduce...
1743

c8f44affb   Michał Mirosław   net: introduce an...
1744
  static inline void sk_nocaps_add(struct sock *sk, netdev_features_t flags)
a465419b1   Eric Dumazet   net: Introduce sk...
1745
1746
1747
1748
  {
  	sk->sk_route_nocaps |= flags;
  	sk->sk_route_caps &= ~flags;
  }
9a49850d0   Tom Herbert   tcp: Fix conditio...
1749
1750
1751
1752
1753
1754
1755
1756
  static inline bool sk_check_csum_caps(struct sock *sk)
  {
  	return (sk->sk_route_caps & NETIF_F_HW_CSUM) ||
  	       (sk->sk_family == PF_INET &&
  		(sk->sk_route_caps & NETIF_F_IP_CSUM)) ||
  	       (sk->sk_family == PF_INET6 &&
  		(sk->sk_route_caps & NETIF_F_IPV6_CSUM));
  }
c6e1a0d12   Tom Herbert   net: Allow no-cac...
1757
  static inline int skb_do_copy_data_nocache(struct sock *sk, struct sk_buff *skb,
57be5bdad   Al Viro   ip: convert tcp_s...
1758
  					   struct iov_iter *from, char *to,
912d398d2   Wei Yongjun   net: fix skb_add_...
1759
  					   int copy, int offset)
c6e1a0d12   Tom Herbert   net: Allow no-cac...
1760
1761
  {
  	if (skb->ip_summed == CHECKSUM_NONE) {
57be5bdad   Al Viro   ip: convert tcp_s...
1762
  		__wsum csum = 0;
15e6cb46c   Al Viro   make skb_add_data...
1763
  		if (!csum_and_copy_from_iter_full(to, copy, &csum, from))
57be5bdad   Al Viro   ip: convert tcp_s...
1764
  			return -EFAULT;
912d398d2   Wei Yongjun   net: fix skb_add_...
1765
  		skb->csum = csum_block_add(skb->csum, csum, offset);
c6e1a0d12   Tom Herbert   net: Allow no-cac...
1766
  	} else if (sk->sk_route_caps & NETIF_F_NOCACHE_COPY) {
15e6cb46c   Al Viro   make skb_add_data...
1767
  		if (!copy_from_iter_full_nocache(to, copy, from))
c6e1a0d12   Tom Herbert   net: Allow no-cac...
1768
  			return -EFAULT;
15e6cb46c   Al Viro   make skb_add_data...
1769
  	} else if (!copy_from_iter_full(to, copy, from))
c6e1a0d12   Tom Herbert   net: Allow no-cac...
1770
1771
1772
1773
1774
1775
  		return -EFAULT;
  
  	return 0;
  }
  
  static inline int skb_add_data_nocache(struct sock *sk, struct sk_buff *skb,
57be5bdad   Al Viro   ip: convert tcp_s...
1776
  				       struct iov_iter *from, int copy)
c6e1a0d12   Tom Herbert   net: Allow no-cac...
1777
  {
912d398d2   Wei Yongjun   net: fix skb_add_...
1778
  	int err, offset = skb->len;
c6e1a0d12   Tom Herbert   net: Allow no-cac...
1779

912d398d2   Wei Yongjun   net: fix skb_add_...
1780
1781
  	err = skb_do_copy_data_nocache(sk, skb, from, skb_put(skb, copy),
  				       copy, offset);
c6e1a0d12   Tom Herbert   net: Allow no-cac...
1782
  	if (err)
912d398d2   Wei Yongjun   net: fix skb_add_...
1783
  		__skb_trim(skb, offset);
c6e1a0d12   Tom Herbert   net: Allow no-cac...
1784
1785
1786
  
  	return err;
  }
57be5bdad   Al Viro   ip: convert tcp_s...
1787
  static inline int skb_copy_to_page_nocache(struct sock *sk, struct iov_iter *from,
c6e1a0d12   Tom Herbert   net: Allow no-cac...
1788
1789
1790
1791
1792
  					   struct sk_buff *skb,
  					   struct page *page,
  					   int off, int copy)
  {
  	int err;
912d398d2   Wei Yongjun   net: fix skb_add_...
1793
1794
  	err = skb_do_copy_data_nocache(sk, skb, from, page_address(page) + off,
  				       copy, skb->len);
c6e1a0d12   Tom Herbert   net: Allow no-cac...
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
  	if (err)
  		return err;
  
  	skb->len	     += copy;
  	skb->data_len	     += copy;
  	skb->truesize	     += copy;
  	sk->sk_wmem_queued   += copy;
  	sk_mem_charge(sk, copy);
  	return 0;
  }
c564039fd   Eric Dumazet   net: sk_wmem_allo...
1805
1806
1807
1808
1809
1810
1811
1812
  /**
   * sk_wmem_alloc_get - returns write allocations
   * @sk: socket
   *
   * Returns sk_wmem_alloc minus initial offset of one
   */
  static inline int sk_wmem_alloc_get(const struct sock *sk)
  {
14afee4b6   Reshetova, Elena   net: convert sock...
1813
  	return refcount_read(&sk->sk_wmem_alloc) - 1;
c564039fd   Eric Dumazet   net: sk_wmem_allo...
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
  }
  
  /**
   * sk_rmem_alloc_get - returns read allocations
   * @sk: socket
   *
   * Returns sk_rmem_alloc
   */
  static inline int sk_rmem_alloc_get(const struct sock *sk)
  {
  	return atomic_read(&sk->sk_rmem_alloc);
  }
  
  /**
   * sk_has_allocations - check if allocations are outstanding
   * @sk: socket
   *
   * Returns true if socket has write or read allocations
   */
dc6b9b782   Eric Dumazet   net: include/net/...
1833
  static inline bool sk_has_allocations(const struct sock *sk)
c564039fd   Eric Dumazet   net: sk_wmem_allo...
1834
1835
1836
  {
  	return sk_wmem_alloc_get(sk) || sk_rmem_alloc_get(sk);
  }
a57de0b43   Jiri Olsa   net: adding memor...
1837
  /**
1ce0bf50a   Herbert Xu   net: Generalise w...
1838
   * skwq_has_sleeper - check if there are any waiting processes
acfbe96a3   Randy Dunlap   sock.h: fix kerne...
1839
   * @wq: struct socket_wq
a57de0b43   Jiri Olsa   net: adding memor...
1840
   *
438154823   Eric Dumazet   net: sock_def_rea...
1841
   * Returns true if socket_wq has waiting processes
a57de0b43   Jiri Olsa   net: adding memor...
1842
   *
1ce0bf50a   Herbert Xu   net: Generalise w...
1843
   * The purpose of the skwq_has_sleeper and sock_poll_wait is to wrap the memory
a57de0b43   Jiri Olsa   net: adding memor...
1844
1845
   * barrier call. They were added due to the race found within the tcp code.
   *
d651983dd   Mauro Carvalho Chehab   net: fix some ide...
1846
   * Consider following tcp code paths::
a57de0b43   Jiri Olsa   net: adding memor...
1847
   *
d651983dd   Mauro Carvalho Chehab   net: fix some ide...
1848
1849
   *   CPU1                CPU2
   *   sys_select          receive packet
a57de0b43   Jiri Olsa   net: adding memor...
1850
1851
1852
1853
1854
   *   ...                 ...
   *   __add_wait_queue    update tp->rcv_nxt
   *   ...                 ...
   *   tp->rcv_nxt check   sock_def_readable
   *   ...                 {
438154823   Eric Dumazet   net: sock_def_rea...
1855
1856
1857
1858
   *   schedule               rcu_read_lock();
   *                          wq = rcu_dereference(sk->sk_wq);
   *                          if (wq && waitqueue_active(&wq->wait))
   *                              wake_up_interruptible(&wq->wait)
a57de0b43   Jiri Olsa   net: adding memor...
1859
1860
1861
1862
1863
1864
1865
   *                          ...
   *                       }
   *
   * The race for tcp fires when the __add_wait_queue changes done by CPU1 stay
   * in its cache, and so does the tp->rcv_nxt update on CPU2 side.  The CPU1
   * could then endup calling schedule and sleep forever if there are no more
   * data on the socket.
ad4627695   Jiri Olsa   memory barrier: a...
1866
   *
a57de0b43   Jiri Olsa   net: adding memor...
1867
   */
1ce0bf50a   Herbert Xu   net: Generalise w...
1868
  static inline bool skwq_has_sleeper(struct socket_wq *wq)
a57de0b43   Jiri Olsa   net: adding memor...
1869
  {
1ce0bf50a   Herbert Xu   net: Generalise w...
1870
  	return wq && wq_has_sleeper(&wq->wait);
a57de0b43   Jiri Olsa   net: adding memor...
1871
1872
1873
1874
1875
1876
1877
1878
  }
  
  /**
   * sock_poll_wait - place memory barrier behind the poll_wait call.
   * @filp:           file
   * @wait_address:   socket wait queue
   * @p:              poll_table
   *
438154823   Eric Dumazet   net: sock_def_rea...
1879
   * See the comments in the wq_has_sleeper function.
a57de0b43   Jiri Olsa   net: adding memor...
1880
1881
1882
1883
   */
  static inline void sock_poll_wait(struct file *filp,
  		wait_queue_head_t *wait_address, poll_table *p)
  {
626cf2366   Hans Verkuil   poll: add poll_re...
1884
  	if (!poll_does_not_wait(p) && wait_address) {
a57de0b43   Jiri Olsa   net: adding memor...
1885
  		poll_wait(filp, wait_address, p);
dc6b9b782   Eric Dumazet   net: include/net/...
1886
  		/* We need to be sure we are in sync with the
a57de0b43   Jiri Olsa   net: adding memor...
1887
1888
  		 * socket flags modification.
  		 *
438154823   Eric Dumazet   net: sock_def_rea...
1889
  		 * This memory barrier is paired in the wq_has_sleeper.
dc6b9b782   Eric Dumazet   net: include/net/...
1890
  		 */
a57de0b43   Jiri Olsa   net: adding memor...
1891
1892
1893
  		smp_mb();
  	}
  }
b73c3d0e4   Tom Herbert   net: Save TX flow...
1894
1895
1896
1897
1898
1899
1900
  static inline void skb_set_hash_from_sk(struct sk_buff *skb, struct sock *sk)
  {
  	if (sk->sk_txhash) {
  		skb->l4_hash = 1;
  		skb->hash = sk->sk_txhash;
  	}
  }
9e17f8a47   Eric Dumazet   net: make skb_set...
1901
  void skb_set_owner_w(struct sk_buff *skb, struct sock *sk);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1902
  /*
dc6b9b782   Eric Dumazet   net: include/net/...
1903
   *	Queue a received datagram if it will fit. Stream and sequenced
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1904
1905
1906
   *	protocols can't normally use this as they need to fit buffers in
   *	and play with them.
   *
dc6b9b782   Eric Dumazet   net: include/net/...
1907
   *	Inlined as it's very short and called for pretty much every
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1908
1909
   *	packet ever received.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1910
1911
  static inline void skb_set_owner_r(struct sk_buff *skb, struct sock *sk)
  {
d55d87fdf   Herbert Xu   net: Move rx skb_...
1912
  	skb_orphan(skb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1913
1914
1915
  	skb->sk = sk;
  	skb->destructor = sock_rfree;
  	atomic_add(skb->truesize, &sk->sk_rmem_alloc);
3ab224be6   Hideo Aoki   [NET] CORE: Intro...
1916
  	sk_mem_charge(sk, skb->truesize);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1917
  }
69336bd2d   Joe Perches   sock.h: Remove ex...
1918
1919
  void sk_reset_timer(struct sock *sk, struct timer_list *timer,
  		    unsigned long expires);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1920

69336bd2d   Joe Perches   sock.h: Remove ex...
1921
  void sk_stop_timer(struct sock *sk, struct timer_list *timer);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1922

65101aeca   Paolo Abeni   net/sock: factor ...
1923
1924
  int __sk_queue_drop_skb(struct sock *sk, struct sk_buff_head *sk_queue,
  			struct sk_buff *skb, unsigned int flags,
69629464e   Eric Dumazet   udp: properly cop...
1925
1926
  			void (*destructor)(struct sock *sk,
  					   struct sk_buff *skb));
e6afc8ace   samanthakumar   udp: remove heade...
1927
  int __sock_queue_rcv_skb(struct sock *sk, struct sk_buff *skb);
69336bd2d   Joe Perches   sock.h: Remove ex...
1928
  int sock_queue_rcv_skb(struct sock *sk, struct sk_buff *skb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1929

69336bd2d   Joe Perches   sock.h: Remove ex...
1930
  int sock_queue_err_skb(struct sock *sk, struct sk_buff *skb);
364a9e932   Willem de Bruijn   sock: deduplicate...
1931
  struct sk_buff *sock_dequeue_err_skb(struct sock *sk);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1932
1933
1934
1935
  
  /*
   *	Recover an error report and clear atomically
   */
dc6b9b782   Eric Dumazet   net: include/net/...
1936

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1937
1938
  static inline int sock_error(struct sock *sk)
  {
c1cbe4b7a   Benjamin LaHaise   [NET]: Avoid atom...
1939
1940
1941
1942
  	int err;
  	if (likely(!sk->sk_err))
  		return 0;
  	err = xchg(&sk->sk_err, 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1943
1944
1945
1946
1947
1948
1949
1950
  	return -err;
  }
  
  static inline unsigned long sock_wspace(struct sock *sk)
  {
  	int amt = 0;
  
  	if (!(sk->sk_shutdown & SEND_SHUTDOWN)) {
14afee4b6   Reshetova, Elena   net: convert sock...
1951
  		amt = sk->sk_sndbuf - refcount_read(&sk->sk_wmem_alloc);
dc6b9b782   Eric Dumazet   net: include/net/...
1952
  		if (amt < 0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1953
1954
1955
1956
  			amt = 0;
  	}
  	return amt;
  }
ceb5d58b2   Eric Dumazet   net: fix sock_wak...
1957
1958
1959
1960
  /* Note:
   *  We use sk->sk_wq_raw, from contexts knowing this
   *  pointer is not NULL and cannot disappear/change.
   */
9cd3e072b   Eric Dumazet   net: rename SOCK_...
1961
  static inline void sk_set_bit(int nr, struct sock *sk)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1962
  {
4be735225   Eric Dumazet   net: SOCKWQ_ASYNC...
1963
1964
  	if ((nr == SOCKWQ_ASYNC_NOSPACE || nr == SOCKWQ_ASYNC_WAITDATA) &&
  	    !sock_flag(sk, SOCK_FASYNC))
9317bb698   Eric Dumazet   net: SOCKWQ_ASYNC...
1965
  		return;
ceb5d58b2   Eric Dumazet   net: fix sock_wak...
1966
  	set_bit(nr, &sk->sk_wq_raw->flags);
9cd3e072b   Eric Dumazet   net: rename SOCK_...
1967
1968
1969
1970
  }
  
  static inline void sk_clear_bit(int nr, struct sock *sk)
  {
4be735225   Eric Dumazet   net: SOCKWQ_ASYNC...
1971
1972
  	if ((nr == SOCKWQ_ASYNC_NOSPACE || nr == SOCKWQ_ASYNC_WAITDATA) &&
  	    !sock_flag(sk, SOCK_FASYNC))
9317bb698   Eric Dumazet   net: SOCKWQ_ASYNC...
1973
  		return;
ceb5d58b2   Eric Dumazet   net: fix sock_wak...
1974
  	clear_bit(nr, &sk->sk_wq_raw->flags);
9cd3e072b   Eric Dumazet   net: rename SOCK_...
1975
  }
ceb5d58b2   Eric Dumazet   net: fix sock_wak...
1976
  static inline void sk_wake_async(const struct sock *sk, int how, int band)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1977
  {
ceb5d58b2   Eric Dumazet   net: fix sock_wak...
1978
1979
1980
1981
1982
  	if (sock_flag(sk, SOCK_FASYNC)) {
  		rcu_read_lock();
  		sock_wake_async(rcu_dereference(sk->sk_wq), how, band);
  		rcu_read_unlock();
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1983
  }
eea86af6b   Daniel Borkmann   net: sock: adapt ...
1984
1985
1986
1987
  /* Since sk_{r,w}mem_alloc sums skb->truesize, even a small frame might
   * need sizeof(sk_buff) + MTU + padding, unless net driver perform copybreak.
   * Note: for send buffers, TCP works better if we can build two skbs at
   * minimum.
7a91b434e   Eric Dumazet   net: update SOCK_...
1988
   */
9eb5bf838   Eric Dumazet   net: sock: fix TC...
1989
  #define TCP_SKB_MIN_TRUESIZE	(2048 + SKB_DATA_ALIGN(sizeof(struct sk_buff)))
eea86af6b   Daniel Borkmann   net: sock: adapt ...
1990
1991
1992
  
  #define SOCK_MIN_SNDBUF		(TCP_SKB_MIN_TRUESIZE * 2)
  #define SOCK_MIN_RCVBUF		 TCP_SKB_MIN_TRUESIZE
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1993
1994
1995
1996
  
  static inline void sk_stream_moderate_sndbuf(struct sock *sk)
  {
  	if (!(sk->sk_userlocks & SOCK_SNDBUF_LOCK)) {
8df09ea3b   Eric Dumazet   [SOCK] Avoid inte...
1997
  		sk->sk_sndbuf = min(sk->sk_sndbuf, sk->sk_wmem_queued >> 1);
eea86af6b   Daniel Borkmann   net: sock: adapt ...
1998
  		sk->sk_sndbuf = max_t(u32, sk->sk_sndbuf, SOCK_MIN_SNDBUF);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1999
2000
  	}
  }
eb9344781   Eric Dumazet   tcp: add a force_...
2001
2002
  struct sk_buff *sk_stream_alloc_skb(struct sock *sk, int size, gfp_t gfp,
  				    bool force_schedule);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2003

5640f7685   Eric Dumazet   net: use a per ta...
2004
2005
2006
2007
2008
2009
2010
2011
  /**
   * sk_page_frag - return an appropriate page_frag
   * @sk: socket
   *
   * If socket allocation mode allows current thread to sleep, it means its
   * safe to use the per task page_frag instead of the per socket one.
   */
  static inline struct page_frag *sk_page_frag(struct sock *sk)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2012
  {
d0164adc8   Mel Gorman   mm, page_alloc: d...
2013
  	if (gfpflags_allow_blocking(sk->sk_allocation))
5640f7685   Eric Dumazet   net: use a per ta...
2014
  		return &current->task_frag;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2015

5640f7685   Eric Dumazet   net: use a per ta...
2016
  	return &sk->sk_frag;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2017
  }
69336bd2d   Joe Perches   sock.h: Remove ex...
2018
  bool sk_page_frag_refill(struct sock *sk, struct page_frag *pfrag);
5640f7685   Eric Dumazet   net: use a per ta...
2019

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2020
2021
2022
  /*
   *	Default write policy as shown to user space via poll/select/SIGIO
   */
dc6b9b782   Eric Dumazet   net: include/net/...
2023
  static inline bool sock_writeable(const struct sock *sk)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2024
  {
14afee4b6   Reshetova, Elena   net: convert sock...
2025
  	return refcount_read(&sk->sk_wmem_alloc) < (sk->sk_sndbuf >> 1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2026
  }
dd0fc66fb   Al Viro   [PATCH] gfp flags...
2027
  static inline gfp_t gfp_any(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2028
  {
997093727   Andrew Morton   net: don't use in...
2029
  	return in_softirq() ? GFP_ATOMIC : GFP_KERNEL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2030
  }
dc6b9b782   Eric Dumazet   net: include/net/...
2031
  static inline long sock_rcvtimeo(const struct sock *sk, bool noblock)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2032
2033
2034
  {
  	return noblock ? 0 : sk->sk_rcvtimeo;
  }
dc6b9b782   Eric Dumazet   net: include/net/...
2035
  static inline long sock_sndtimeo(const struct sock *sk, bool noblock)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
  {
  	return noblock ? 0 : sk->sk_sndtimeo;
  }
  
  static inline int sock_rcvlowat(const struct sock *sk, int waitall, int len)
  {
  	return (waitall ? len : min_t(int, sk->sk_rcvlowat, len)) ? : 1;
  }
  
  /* Alas, with timeout socket operations are not restartable.
   * Compare this to poll().
   */
  static inline int sock_intr_errno(long timeo)
  {
  	return timeo == MAX_SCHEDULE_TIMEOUT ? -ERESTARTSYS : -EINTR;
  }
744d5a3e9   Eyal Birger   net: move skb->dr...
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
  struct sock_skb_cb {
  	u32 dropcount;
  };
  
  /* Store sock_skb_cb at the end of skb->cb[] so protocol families
   * using skb->cb[] would keep using it directly and utilize its
   * alignement guarantee.
   */
  #define SOCK_SKB_CB_OFFSET ((FIELD_SIZEOF(struct sk_buff, cb) - \
  			    sizeof(struct sock_skb_cb)))
  
  #define SOCK_SKB_CB(__skb) ((struct sock_skb_cb *)((__skb)->cb + \
  			    SOCK_SKB_CB_OFFSET))
b4772ef87   Eyal Birger   net: use common m...
2065
  #define sock_skb_cb_check_size(size) \
744d5a3e9   Eyal Birger   net: move skb->dr...
2066
  	BUILD_BUG_ON((size) > SOCK_SKB_CB_OFFSET)
b4772ef87   Eyal Birger   net: use common m...
2067

3bc3b96f3   Eyal Birger   net: add common a...
2068
2069
2070
  static inline void
  sock_skb_set_dropcount(const struct sock *sk, struct sk_buff *skb)
  {
3665f3817   Eric Dumazet   net: do not read ...
2071
2072
  	SOCK_SKB_CB(skb)->dropcount = sock_flag(sk, SOCK_RXQ_OVFL) ?
  						atomic_read(&sk->sk_drops) : 0;
3bc3b96f3   Eyal Birger   net: add common a...
2073
  }
532182cd6   Eric Dumazet   tcp: increment sk...
2074
2075
2076
2077
2078
2079
  static inline void sk_drops_add(struct sock *sk, const struct sk_buff *skb)
  {
  	int segs = max_t(u16, 1, skb_shinfo(skb)->gso_segs);
  
  	atomic_add(segs, &sk->sk_drops);
  }
e5af70e98   Deepa Dinamani   sock: Make sock->...
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
  static inline ktime_t sock_read_timestamp(struct sock *sk)
  {
  #if BITS_PER_LONG==32
  	unsigned int seq;
  	ktime_t kt;
  
  	do {
  		seq = read_seqbegin(&sk->sk_stamp_seq);
  		kt = sk->sk_stamp;
  	} while (read_seqretry(&sk->sk_stamp_seq, seq));
  
  	return kt;
  #else
  	return sk->sk_stamp;
  #endif
  }
  
  static inline void sock_write_timestamp(struct sock *sk, ktime_t kt)
  {
  #if BITS_PER_LONG==32
  	write_seqlock(&sk->sk_stamp_seq);
  	sk->sk_stamp = kt;
  	write_sequnlock(&sk->sk_stamp_seq);
  #else
  	sk->sk_stamp = kt;
  #endif
  }
69336bd2d   Joe Perches   sock.h: Remove ex...
2107
2108
2109
2110
  void __sock_recv_timestamp(struct msghdr *msg, struct sock *sk,
  			   struct sk_buff *skb);
  void __sock_recv_wifi_status(struct msghdr *msg, struct sock *sk,
  			     struct sk_buff *skb);
92f37fd2e   Eric Dumazet   [NET]: Adding SO_...
2111

dc6b9b782   Eric Dumazet   net: include/net/...
2112
  static inline void
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2113
2114
  sock_recv_timestamp(struct msghdr *msg, struct sock *sk, struct sk_buff *skb)
  {
b7aa0bf70   Eric Dumazet   [NET]: convert ne...
2115
  	ktime_t kt = skb->tstamp;
20d494735   Patrick Ohly   net: socket infra...
2116
  	struct skb_shared_hwtstamps *hwtstamps = skb_hwtstamps(skb);
a61bbcf28   Patrick McHardy   [NET]: Store skb-...
2117

20d494735   Patrick Ohly   net: socket infra...
2118
2119
  	/*
  	 * generate control messages if
b9f40e21e   Willem de Bruijn   net-timestamp: mo...
2120
  	 * - receive time stamping in software requested
20d494735   Patrick Ohly   net: socket infra...
2121
  	 * - software time stamp available and wanted
20d494735   Patrick Ohly   net: socket infra...
2122
  	 * - hardware time stamps available and wanted
20d494735   Patrick Ohly   net: socket infra...
2123
2124
  	 */
  	if (sock_flag(sk, SOCK_RCVTSTAMP) ||
b9f40e21e   Willem de Bruijn   net-timestamp: mo...
2125
  	    (sk->sk_tsflags & SOF_TIMESTAMPING_RX_SOFTWARE) ||
2456e8553   Thomas Gleixner   ktime: Get rid of...
2126
2127
  	    (kt && sk->sk_tsflags & SOF_TIMESTAMPING_SOFTWARE) ||
  	    (hwtstamps->hwtstamp &&
b9f40e21e   Willem de Bruijn   net-timestamp: mo...
2128
  	     (sk->sk_tsflags & SOF_TIMESTAMPING_RAW_HARDWARE)))
92f37fd2e   Eric Dumazet   [NET]: Adding SO_...
2129
2130
  		__sock_recv_timestamp(msg, sk, skb);
  	else
e5af70e98   Deepa Dinamani   sock: Make sock->...
2131
  		sock_write_timestamp(sk, kt);
6e3e939f3   Johannes Berg   net: add wireless...
2132
2133
2134
  
  	if (sock_flag(sk, SOCK_WIFI_STATUS) && skb->wifi_acked_valid)
  		__sock_recv_wifi_status(msg, sk, skb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2135
  }
69336bd2d   Joe Perches   sock.h: Remove ex...
2136
2137
  void __sock_recv_ts_and_drops(struct msghdr *msg, struct sock *sk,
  			      struct sk_buff *skb);
767dd0336   Eric Dumazet   net: speedup sock...
2138

6c7c98bad   Paolo Abeni   sock: avoid dirty...
2139
  #define SK_DEFAULT_STAMP (-1L * NSEC_PER_SEC)
767dd0336   Eric Dumazet   net: speedup sock...
2140
2141
2142
2143
  static inline void sock_recv_ts_and_drops(struct msghdr *msg, struct sock *sk,
  					  struct sk_buff *skb)
  {
  #define FLAGS_TS_OR_DROPS ((1UL << SOCK_RXQ_OVFL)			| \
b9f40e21e   Willem de Bruijn   net-timestamp: mo...
2144
2145
2146
  			   (1UL << SOCK_RCVTSTAMP))
  #define TSFLAGS_ANY	  (SOF_TIMESTAMPING_SOFTWARE			| \
  			   SOF_TIMESTAMPING_RAW_HARDWARE)
767dd0336   Eric Dumazet   net: speedup sock...
2147

b9f40e21e   Willem de Bruijn   net-timestamp: mo...
2148
  	if (sk->sk_flags & FLAGS_TS_OR_DROPS || sk->sk_tsflags & TSFLAGS_ANY)
767dd0336   Eric Dumazet   net: speedup sock...
2149
  		__sock_recv_ts_and_drops(msg, sk, skb);
d3fbff306   Eric Dumazet   sock: correctly t...
2150
  	else if (unlikely(sock_flag(sk, SOCK_TIMESTAMP)))
e5af70e98   Deepa Dinamani   sock: Make sock->...
2151
  		sock_write_timestamp(sk, skb->tstamp);
6c7c98bad   Paolo Abeni   sock: avoid dirty...
2152
  	else if (unlikely(sk->sk_stamp == SK_DEFAULT_STAMP))
e5af70e98   Deepa Dinamani   sock: Make sock->...
2153
  		sock_write_timestamp(sk, 0);
767dd0336   Eric Dumazet   net: speedup sock...
2154
  }
3b885787e   Neil Horman   net: Generalize s...
2155

c14ac9451   Soheil Hassas Yeganeh   sock: enable time...
2156
  void __sock_tx_timestamp(__u16 tsflags, __u8 *tx_flags);
67cc0d407   Willem de Bruijn   net-timestamp: op...
2157

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2158
  /**
20d494735   Patrick Ohly   net: socket infra...
2159
   * sock_tx_timestamp - checks whether the outgoing packet is to be time stamped
20d494735   Patrick Ohly   net: socket infra...
2160
   * @sk:		socket sending this packet
c14ac9451   Soheil Hassas Yeganeh   sock: enable time...
2161
   * @tsflags:	timestamping flags to use
140c55d4b   Eric Dumazet   net-timestamp: so...
2162
2163
   * @tx_flags:	completed with instructions for time stamping
   *
d651983dd   Mauro Carvalho Chehab   net: fix some ide...
2164
   * Note: callers should take care of initial ``*tx_flags`` value (usually 0)
20d494735   Patrick Ohly   net: socket infra...
2165
   */
c14ac9451   Soheil Hassas Yeganeh   sock: enable time...
2166
2167
  static inline void sock_tx_timestamp(const struct sock *sk, __u16 tsflags,
  				     __u8 *tx_flags)
67cc0d407   Willem de Bruijn   net-timestamp: op...
2168
  {
c14ac9451   Soheil Hassas Yeganeh   sock: enable time...
2169
2170
  	if (unlikely(tsflags))
  		__sock_tx_timestamp(tsflags, tx_flags);
67cc0d407   Willem de Bruijn   net-timestamp: op...
2171
2172
2173
  	if (unlikely(sock_flag(sk, SOCK_WIFI_STATUS)))
  		*tx_flags |= SKBTX_WIFI_STATUS;
  }
20d494735   Patrick Ohly   net: socket infra...
2174
2175
  
  /**
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2176
   * sk_eat_skb - Release a skb if it is no longer needed
4dc3b16ba   Pavel Pisa   [PATCH] DocBook: ...
2177
2178
   * @sk: socket to eat this skb from
   * @skb: socket buffer to eat
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2179
2180
2181
2182
   *
   * This routine must be called with interrupts disabled or with the socket
   * locked so that the sk_buff queue operation is ok.
  */
7bced3975   Dan Williams   net_dma: simple r...
2183
  static inline void sk_eat_skb(struct sock *sk, struct sk_buff *skb)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2184
2185
2186
2187
  {
  	__skb_unlink(skb, &sk->sk_receive_queue);
  	__kfree_skb(skb);
  }
3b1e0a655   YOSHIFUJI Hideaki   [NET] NETNS: Omit...
2188
2189
2190
  static inline
  struct net *sock_net(const struct sock *sk)
  {
c2d9ba9bc   Eric Dumazet   net: CONFIG_NET_N...
2191
  	return read_pnet(&sk->sk_net);
3b1e0a655   YOSHIFUJI Hideaki   [NET] NETNS: Omit...
2192
2193
2194
  }
  
  static inline
f5aa23fd4   Denis V. Lunev   [NETNS]: Compilat...
2195
  void sock_net_set(struct sock *sk, struct net *net)
3b1e0a655   YOSHIFUJI Hideaki   [NET] NETNS: Omit...
2196
  {
c2d9ba9bc   Eric Dumazet   net: CONFIG_NET_N...
2197
  	write_pnet(&sk->sk_net, net);
3b1e0a655   YOSHIFUJI Hideaki   [NET] NETNS: Omit...
2198
  }
23542618d   KOVACS Krisztian   inet: Don't looku...
2199
2200
  static inline struct sock *skb_steal_sock(struct sk_buff *skb)
  {
efc27f8ce   Vijay Subramanian   net: Remove 'unli...
2201
  	if (skb->sk) {
23542618d   KOVACS Krisztian   inet: Don't looku...
2202
2203
2204
2205
2206
2207
2208
2209
  		struct sock *sk = skb->sk;
  
  		skb->destructor = NULL;
  		skb->sk = NULL;
  		return sk;
  	}
  	return NULL;
  }
1d0ab2538   Eric Dumazet   net: add sk_fulls...
2210
2211
2212
2213
2214
2215
2216
  /* This helper checks if a socket is a full socket,
   * ie _not_ a timewait or request socket.
   */
  static inline bool sk_fullsock(const struct sock *sk)
  {
  	return (1 << sk->sk_state) & ~(TCPF_TIME_WAIT | TCPF_NEW_SYN_RECV);
  }
e446f9dfe   Eric Dumazet   net: synack packe...
2217
2218
2219
2220
2221
2222
2223
  /* This helper checks if a socket is a LISTEN or NEW_SYN_RECV
   * SYNACK messages can be attached to either ones (depending on SYNCOOKIE)
   */
  static inline bool sk_listener(const struct sock *sk)
  {
  	return (1 << sk->sk_state) & (TCPF_LISTEN | TCPF_NEW_SYN_RECV);
  }
00fd38d93   Eric Dumazet   tcp: ensure prope...
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
  /**
   * sk_state_load - read sk->sk_state for lockless contexts
   * @sk: socket pointer
   *
   * Paired with sk_state_store(). Used in places we do not hold socket lock :
   * tcp_diag_get_info(), tcp_get_info(), tcp_poll(), get_tcp4_sock() ...
   */
  static inline int sk_state_load(const struct sock *sk)
  {
  	return smp_load_acquire(&sk->sk_state);
  }
  
  /**
   * sk_state_store - update sk->sk_state
   * @sk: socket pointer
   * @newstate: new state
   *
   * Paired with sk_state_load(). Should be used in contexts where
   * state change might impact lockless readers.
   */
  static inline void sk_state_store(struct sock *sk, int newstate)
  {
  	smp_store_release(&sk->sk_state, newstate);
  }
69336bd2d   Joe Perches   sock.h: Remove ex...
2248
2249
2250
2251
2252
  void sock_enable_timestamp(struct sock *sk, int flag);
  int sock_get_timestamp(struct sock *, struct timeval __user *);
  int sock_get_timestampns(struct sock *, struct timespec __user *);
  int sock_recv_errqueue(struct sock *sk, struct msghdr *msg, int len, int level,
  		       int type);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2253

a3b299da8   Eric W. Biederman   net: Add variants...
2254
2255
2256
2257
  bool sk_ns_capable(const struct sock *sk,
  		   struct user_namespace *user_ns, int cap);
  bool sk_capable(const struct sock *sk, int cap);
  bool sk_net_capable(const struct sock *sk, int cap);
a2d133b1d   Josh Hunt   sock: introduce S...
2258
  void sk_get_meminfo(const struct sock *sk, u32 *meminfo);
eaa72dc47   Eric Dumazet   neigh: increase q...
2259
2260
2261
2262
2263
2264
2265
2266
2267
  /* Take into consideration the size of the struct sk_buff overhead in the
   * determination of these values, since that is non-constant across
   * platforms.  This makes socket queueing behavior and performance
   * not depend upon such differences.
   */
  #define _SK_MEM_PACKETS		256
  #define _SK_MEM_OVERHEAD	SKB_TRUESIZE(256)
  #define SK_WMEM_MAX		(_SK_MEM_OVERHEAD * _SK_MEM_PACKETS)
  #define SK_RMEM_MAX		(_SK_MEM_OVERHEAD * _SK_MEM_PACKETS)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2268
2269
  extern __u32 sysctl_wmem_max;
  extern __u32 sysctl_rmem_max;
b245be1f4   Willem de Bruijn   net-timestamp: no...
2270
  extern int sysctl_tstamp_allow_data;
6baf1f417   David S. Miller   [NET]: Do not pro...
2271
  extern int sysctl_optmem_max;
20380731b   Arnaldo Carvalho de Melo   [NET]: Fix sparse...
2272
2273
  extern __u32 sysctl_wmem_default;
  extern __u32 sysctl_rmem_default;
20380731b   Arnaldo Carvalho de Melo   [NET]: Fix sparse...
2274

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2275
  #endif	/* _SOCK_H */