cregit-Linux how code gets into the kernel

Release 4.12 include/net/sock.h

Directory: include/net
/*
 * 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
 *
 * Authors:     Ross Biro
 *              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

#include <linux/hardirq.h>
#include <linux/kernel.h>
#include <linux/list.h>
#include <linux/list_nulls.h>
#include <linux/timer.h>
#include <linux/cache.h>
#include <linux/bitops.h>
#include <linux/lockdep.h>
#include <linux/netdevice.h>
#include <linux/skbuff.h>	/* struct sk_buff */
#include <linux/mm.h>
#include <linux/security.h>
#include <linux/slab.h>
#include <linux/uaccess.h>
#include <linux/page_counter.h>
#include <linux/memcontrol.h>
#include <linux/static_key.h>
#include <linux/sched.h>
#include <linux/wait.h>
#include <linux/cgroup-defs.h>

#include <linux/filter.h>
#include <linux/rculist_nulls.h>
#include <linux/poll.h>

#include <linux/atomic.h>
#include <net/dst.h>
#include <net/checksum.h>
#include <net/tcp_states.h>
#include <linux/net_tstamp.h>
#include <net/smc.h>

/*
 * 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
/* Validate arguments and do nothing */
static inline __printf(2, 3)

void SOCK_DEBUG(const struct sock *sk, const char *msg, ...)
{
}
#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.
 */
typedef struct {
	
spinlock_t		slock;
	
int			owned;
	
wait_queue_head_t	wq;
	/*
         * 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

} socket_lock_t;

struct sock;
struct proto;
struct net;


typedef __u32 __bitwise __portpair;

typedef __u64 __bitwise __addrpair;

/**
 *      struct sock_common - minimal network layer representation of sockets
 *      @skc_daddr: Foreign IPv4 addr
 *      @skc_rcv_saddr: Bound local IPv4 addr
 *      @skc_hash: hash value used with various protocol lookup tables
 *      @skc_u16hashes: two u16 hash values used by UDP lookup tables
 *      @skc_dport: placeholder for inet_dport/tw_dport
 *      @skc_num: placeholder for inet_num/tw_num
 *      @skc_family: network address family
 *      @skc_state: Connection state
 *      @skc_reuse: %SO_REUSEADDR setting
 *      @skc_reuseport: %SO_REUSEPORT setting
 *      @skc_bound_dev_if: bound device index if != 0
 *      @skc_bind_node: bind hash linkage for various protocol lookup tables
 *      @skc_portaddr_node: second hash linkage for UDP/UDP-Lite protocol
 *      @skc_prot: protocol handlers inside a network family
 *      @skc_net: reference to the network namespace of this socket
 *      @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
 *      @skc_flags: place holder for sk_flags
 *              %SO_LINGER (l_onoff), %SO_BROADCAST, %SO_KEEPALIVE,
 *              %SO_OOBINLINE settings, %SO_TIMESTAMPING settings
 *      @skc_incoming_cpu: record/match cpu processing incoming packets
 *      @skc_refcnt: reference count
 *
 *      This is the minimal network layer representation of sockets, the header
 *      for struct sock and struct inet_timewait_sock.
 */

struct sock_common {
	/* skc_daddr and skc_rcv_saddr must be grouped on a 8 bytes aligned
         * address on 64bit arches : cf INET_MATCH()
         */
	union {
		
__addrpair	skc_addrpair;
		struct {
			
__be32	skc_daddr;
			
__be32	skc_rcv_saddr;
		};
	};
	union  {
		
unsigned int	skc_hash;
		
__u16		skc_u16hashes[2];
	};
	/* skc_dport && skc_num must be grouped as well */
	union {
		
__portpair	skc_portpair;
		struct {
			
__be16	skc_dport;
			
__u16	skc_num;
		};
	};

	
unsigned short		skc_family;
	
volatile unsigned char	skc_state;
	
unsigned char		skc_reuse:4;
	
unsigned char		skc_reuseport:1;
	
unsigned char		skc_ipv6only:1;
	
unsigned char		skc_net_refcnt:1;
	
int			skc_bound_dev_if;
	union {
		
struct hlist_node	skc_bind_node;
		
struct hlist_node	skc_portaddr_node;
	};
	
struct proto		*skc_prot;
	
possible_net_t		skc_net;

#if IS_ENABLED(CONFIG_IPV6)
	
struct in6_addr		skc_v6_daddr;
	
struct in6_addr		skc_v6_rcv_saddr;
#endif

	
atomic64_t		skc_cookie;

	/* 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 */
	};
	/*
         * fields between dontcopy_begin/dontcopy_end
         * are not copied in sock_copy()
         */
	/* private: */
	
int			skc_dontcopy_begin[0];
	/* public: */
	union {
		
struct hlist_node	skc_node;
		
struct hlist_nulls_node skc_nulls_node;
	};
	
int			skc_tx_queue_mapping;
	union {
		
int		skc_incoming_cpu;
		
u32		skc_rcv_wnd;
		
u32		skc_tw_rcv_nxt; /* struct tcp_timewait_sock  */
	};

	
atomic_t		skc_refcnt;
	/* private: */
	
int                     skc_dontcopy_end[0];
	union {
		
u32		skc_rxhash;
		
u32		skc_window_clamp;
		
u32		skc_tw_snd_nxt; /* struct tcp_timewait_sock */
	};
	/* public: */
};

/**
  *     struct sock - network layer representation of sockets
  *     @__sk_common: shared layout with inet_timewait_sock
  *     @sk_shutdown: mask of %SEND_SHUTDOWN and/or %RCV_SHUTDOWN
  *     @sk_userlocks: %SO_SNDBUF and %SO_RCVBUF settings
  *     @sk_lock:       synchronizer
  *     @sk_kern_sock: True if sock is using kernel lock classes
  *     @sk_rcvbuf: size of receive buffer in bytes
  *     @sk_wq: sock wait queue and async head
  *     @sk_rx_dst: receive input route used by early demux
  *     @sk_dst_cache: destination cache
  *     @sk_dst_pending_confirm: need to confirm neighbour
  *     @sk_policy: flow policy
  *     @sk_receive_queue: incoming packets
  *     @sk_wmem_alloc: transmit queue bytes committed
  *     @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
  *     @sk_napi_id: id of the last napi context to receive data for sk
  *     @sk_ll_usec: usecs to busypoll when there is no data
  *     @sk_allocation: allocation mode
  *     @sk_pacing_rate: Pacing rate (if supported by transport/packet scheduler)
  *     @sk_max_pacing_rate: Maximum pacing rate (%SO_MAX_PACING_RATE)
  *     @sk_sndbuf: size of send buffer in bytes
  *     @sk_padding: unused element for alignment
  *     @sk_no_check_tx: %SO_NO_CHECK setting, set checksum in TX packets
  *     @sk_no_check_rx: allow zero checksum in RX packets
  *     @sk_route_caps: route capabilities (e.g. %NETIF_F_TSO)
  *     @sk_route_nocaps: forbidden route capabilities (e.g NETIF_F_GSO_MASK)
  *     @sk_gso_type: GSO type (e.g. %SKB_GSO_TCPV4)
  *     @sk_gso_max_size: Maximum GSO segment size to build
  *     @sk_gso_max_segs: Maximum number of GSO segments
  *     @sk_lingertime: %SO_LINGER l_linger setting
  *     @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
  *     @sk_prot_creator: sk_prot of original sock creator (see ipv6_setsockopt,
  *                       IPV6_ADDRFORM for instance)
  *     @sk_err: last error
  *     @sk_err_soft: errors that don't cause failure but are the cause of a
  *                   persistent failure not just 'timed out'
  *     @sk_drops: raw/udp drops counter
  *     @sk_ack_backlog: current listen backlog
  *     @sk_max_ack_backlog: listen backlog set in listen()
  *     @sk_priority: %SO_PRIORITY setting
  *     @sk_type: socket type (%SOCK_STREAM, etc)
  *     @sk_protocol: which protocol this socket belongs in this network family
  *     @sk_peer_pid: &struct pid for this socket's peer
  *     @sk_peer_cred: %SO_PEERCRED setting
  *     @sk_rcvlowat: %SO_RCVLOWAT setting
  *     @sk_rcvtimeo: %SO_RCVTIMEO setting
  *     @sk_sndtimeo: %SO_SNDTIMEO setting
  *     @sk_txhash: computed flow hash for use on transmit
  *     @sk_filter: socket filtering instructions
  *     @sk_timer: sock cleanup timer
  *     @sk_stamp: time stamp of last packet received
  *     @sk_tsflags: SO_TIMESTAMPING socket options
  *     @sk_tskey: counter to disambiguate concurrent tstamp requests
  *     @sk_socket: Identd and reporting IO signals
  *     @sk_user_data: RPC layer private data
  *     @sk_frag: cached page frag
  *     @sk_peek_off: current peek_offset value
  *     @sk_send_head: front of stuff to transmit
  *     @sk_security: used by security modules
  *     @sk_mark: generic packet mark
  *     @sk_cgrp_data: cgroup data for this cgroup
  *     @sk_memcg: this socket's memory cgroup association
  *     @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
  *     @sk_reuseport_cb: reuseport group container
  *     @sk_rcu: used during RCU grace period
  */

struct sock {
	/*
         * Now struct inet_timewait_sock also uses sock_common, so please just
         * don't add nothing before this first member (__sk_common) --acme
         */
	
struct sock_common	__sk_common;

#define sk_node			__sk_common.skc_node

#define sk_nulls_node		__sk_common.skc_nulls_node

#define sk_refcnt		__sk_common.skc_refcnt

#define sk_tx_queue_mapping	__sk_common.skc_tx_queue_mapping


#define sk_dontcopy_begin	__sk_common.skc_dontcopy_begin

#define sk_dontcopy_end		__sk_common.skc_dontcopy_end

#define sk_hash			__sk_common.skc_hash

#define sk_portpair		__sk_common.skc_portpair

#define sk_num			__sk_common.skc_num

#define sk_dport		__sk_common.skc_dport

#define sk_addrpair		__sk_common.skc_addrpair

#define sk_daddr		__sk_common.skc_daddr

#define sk_rcv_saddr		__sk_common.skc_rcv_saddr

#define sk_family		__sk_common.skc_family

#define sk_state		__sk_common.skc_state

#define sk_reuse		__sk_common.skc_reuse

#define sk_reuseport		__sk_common.skc_reuseport

#define sk_ipv6only		__sk_common.skc_ipv6only

#define sk_net_refcnt		__sk_common.skc_net_refcnt

#define sk_bound_dev_if		__sk_common.skc_bound_dev_if

#define sk_bind_node		__sk_common.skc_bind_node

#define sk_prot			__sk_common.skc_prot

#define sk_net			__sk_common.skc_net

#define sk_v6_daddr		__sk_common.skc_v6_daddr

#define sk_v6_rcv_saddr	__sk_common.skc_v6_rcv_saddr

#define sk_cookie		__sk_common.skc_cookie

#define sk_incoming_cpu		__sk_common.skc_incoming_cpu

#define sk_flags		__sk_common.skc_flags

#define sk_rxhash		__sk_common.skc_rxhash

	
socket_lock_t		sk_lock;
	
atomic_t		sk_drops;
	
int			sk_rcvlowat;
	
struct sk_buff_head	sk_error_queue;
	
struct sk_buff_head	sk_receive_queue;
	/*
         * 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.
         * Note : rmem_alloc is in this structure to fill a hole
         * on 64bit arches, not because its logically part of
         * backlog.
         */
	struct {
		
atomic_t	rmem_alloc;
		
int		len;
		
struct sk_buff	*head;
		
struct sk_buff	*tail;
	
} sk_backlog;

#define sk_rmem_alloc sk_backlog.rmem_alloc

	
int			sk_forward_alloc;
#ifdef CONFIG_NET_RX_BUSY_POLL
	
unsigned int		sk_ll_usec;
	/* ===== mostly read cache line ===== */
	
unsigned int		sk_napi_id;
#endif
	
int			sk_rcvbuf;

	
struct sk_filter __rcu	*sk_filter;
	union {
		
struct socket_wq __rcu	*sk_wq;
		
struct socket_wq	*sk_wq_raw;
	};
#ifdef CONFIG_XFRM
	
struct xfrm_policy __rcu *sk_policy[2];
#endif
	
struct dst_entry	*sk_rx_dst;
	
struct dst_entry __rcu	*sk_dst_cache;
	
atomic_t		sk_omem_alloc;
	
int			sk_sndbuf;

	/* ===== cache line for TX ===== */
	
int			sk_wmem_queued;
	
atomic_t		sk_wmem_alloc;
	
unsigned long		sk_tsq_flags;
	
struct sk_buff		*sk_send_head;
	
struct sk_buff_head	sk_write_queue;
	
__s32			sk_peek_off;
	
int			sk_write_pending;
	
__u32			sk_dst_pending_confirm;
	/* Note: 32bit hole on 64bit arches */
	
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;

	/*
         * Because of non atomicity rules, all
         * changes are protected by socket lock.
         */
	
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

	kmemcheck_bitfield_begin(flags);
	
unsigned int		sk_padding : 1,
				
sk_kern_sock : 1,
				
sk_no_check_tx : 1,
				
sk_no_check_rx : 1,
				
sk_userlocks : 4,
				
sk_protocol  : 8,
				
sk_type      : 16;

#define SK_PROTOCOL_MAX U8_MAX
	kmemcheck_bitfield_end(flags);

	
u16			sk_gso_max_segs;
	
unsigned long	        sk_lingertime;
	
struct proto		*sk_prot_creator;
	
rwlock_t		sk_callback_lock;
	
int			sk_err,
				
sk_err_soft;
	
u32			sk_ack_backlog;
	
u32			sk_max_ack_backlog;
	
kuid_t			sk_uid;
	
struct pid		*sk_peer_pid;
	
const struct cred	*sk_peer_cred;
	
long			sk_rcvtimeo;
	
ktime_t			sk_stamp;
	
u16			sk_tsflags;
	
u8			sk_shutdown;
	
u32			sk_tskey;
	
struct socket		*sk_socket;
	
void			*sk_user_data;
#ifdef CONFIG_SECURITY
	
void			*sk_security;
#endif
	
struct sock_cgroup_data	sk_cgrp_data;
	
struct mem_cgroup	*sk_memcg;
	
void			(*sk_state_change)(struct sock *sk);
	
void			(*sk_data_ready)(struct sock *sk);
	
void			(*sk_write_space)(struct sock *sk);
	
void			(*sk_error_report)(struct sock *sk);
	
int			(*sk_backlog_rcv)(struct sock *sk,
						  struct sk_buff *skb);
	
void                    (*sk_destruct)(struct sock *sk);
	
struct sock_reuseport __rcu	*sk_reuseport_cb;
	
struct rcu_head		sk_rcu;
};


#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)

/*
 * 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

int sk_set_peek_off(struct sock *sk, int val);


static inline int sk_peek_offset(struct sock *sk, int flags) { if (unlikely(flags & MSG_PEEK)) { s32 off = READ_ONCE(sk->sk_peek_off); if (off >= 0) return off; } return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Pavel Emelyanov3164.58%150.00%
Willem de Bruijn1735.42%150.00%
Total48100.00%2100.00%


static inline void sk_peek_offset_bwd(struct sock *sk, int val) { 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); } }

Contributors

PersonTokensPropCommitsCommitProp
Willem de Bruijn2950.00%150.00%
Pavel Emelyanov2950.00%150.00%
Total58100.00%2100.00%


static inline void sk_peek_offset_fwd(struct sock *sk, int val) { sk_peek_offset_bwd(sk, -val); }

Contributors

PersonTokensPropCommitsCommitProp
Pavel Emelyanov1878.26%150.00%
Willem de Bruijn521.74%150.00%
Total23100.00%2100.00%

/* * Hashed lists helper routines */
static inline struct sock *sk_entry(const struct hlist_node *node) { return hlist_entry(node, struct sock, sk_node); }

Contributors

PersonTokensPropCommitsCommitProp
Li Zefan26100.00%1100.00%
Total26100.00%1100.00%


static inline struct sock *__sk_head(const struct hlist_head *head) { return hlist_entry(head->first, struct sock, sk_node); }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo28100.00%2100.00%
Total28100.00%2100.00%


static inline struct sock *sk_head(const struct hlist_head *head) { return hlist_empty(head) ? NULL : __sk_head(head); }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo28100.00%2100.00%
Total28100.00%2100.00%


static inline struct sock *__sk_nulls_head(const struct hlist_nulls_head *head) { return hlist_nulls_entry(head->first, struct sock, sk_nulls_node); }

Contributors

PersonTokensPropCommitsCommitProp
Eric Dumazet28100.00%1100.00%
Total28100.00%1100.00%


static inline struct sock *sk_nulls_head(const struct hlist_nulls_head *head) { return hlist_nulls_empty(head) ? NULL : __sk_nulls_head(head); }

Contributors

PersonTokensPropCommitsCommitProp
Eric Dumazet28100.00%1100.00%
Total28100.00%1100.00%


static inline struct sock *sk_next(const struct sock *sk) { return hlist_entry_safe(sk->sk_node.next, struct sock, sk_node); }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo2996.67%266.67%
Geliang Tang13.33%133.33%
Total30100.00%3100.00%


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

Contributors

PersonTokensPropCommitsCommitProp
Eric Dumazet44100.00%1100.00%
Total44100.00%1100.00%


static inline bool sk_unhashed(const struct sock *sk) { return hlist_unhashed(&sk->sk_node); }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo2195.45%266.67%
Eric Dumazet14.55%133.33%
Total22100.00%3100.00%


static inline bool sk_hashed(const struct sock *sk) { return !sk_unhashed(sk); }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo1575.00%250.00%
Akinobu Mita420.00%125.00%
Eric Dumazet15.00%125.00%
Total20100.00%4100.00%


static inline void sk_node_init(struct hlist_node *node) { node->pprev = NULL; }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo1794.44%150.00%
Eric Dumazet15.56%150.00%
Total18100.00%2100.00%


static inline void sk_nulls_node_init(struct hlist_nulls_node *node) { node->pprev = NULL; }

Contributors

PersonTokensPropCommitsCommitProp
Eric Dumazet18100.00%2100.00%
Total18100.00%2100.00%


static inline void __sk_del_node(struct sock *sk) { __hlist_del(&sk->sk_node); }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo1995.00%150.00%
Eric Dumazet15.00%150.00%
Total20100.00%2100.00%

/* NB: equivalent to hlist_del_init_rcu */
static inline bool __sk_del_node_init(struct sock *sk) { if (sk_hashed(sk)) { __sk_del_node(sk); sk_node_init(&sk->sk_node); return true; } return false; }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo3690.00%266.67%
Eric Dumazet410.00%133.33%
Total40100.00%3100.00%

/* 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. */
static __always_inline void sock_hold(struct sock *sk) { atomic_inc(&sk->sk_refcnt); }

Contributors

PersonTokensPropCommitsCommitProp
Andrew Morton1995.00%150.00%
Denys Vlasenko15.00%150.00%
Total20100.00%2100.00%

/* Ungrab socket in the context, which assumes that socket refcnt cannot hit zero, f.e. it is true in context of any socketcall. */
static __always_inline void __sock_put(struct sock *sk) { atomic_dec(&sk->sk_refcnt); }

Contributors

PersonTokensPropCommitsCommitProp
Andrew Morton1050.00%133.33%
Arnaldo Carvalho de Melo945.00%133.33%
Denys Vlasenko15.00%133.33%
Total20100.00%3100.00%


static inline bool sk_del_node_init(struct sock *sk) { bool rc = __sk_del_node_init(sk); if (rc) { /* paranoid for a while -acme */ WARN_ON(atomic_read(&sk->sk_refcnt) == 1); __sock_put(sk); } return rc; }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo4593.75%150.00%
Eric Dumazet36.25%150.00%
Total48100.00%2100.00%

#define sk_del_node_init_rcu(sk) sk_del_node_init(sk)
static inline bool __sk_nulls_del_node_init_rcu(struct sock *sk) { if (sk_hashed(sk)) { hlist_nulls_del_init_rcu(&sk->sk_nulls_node); return true; } return false; }

Contributors

PersonTokensPropCommitsCommitProp
Eric Dumazet35100.00%3100.00%
Total35100.00%3100.00%


static inline bool sk_nulls_del_node_init_rcu(struct sock *sk) { bool rc = __sk_nulls_del_node_init_rcu(sk); if (rc) { /* paranoid for a while -acme */ WARN_ON(atomic_read(&sk->sk_refcnt) == 1); __sock_put(sk); } return rc; }

Contributors

PersonTokensPropCommitsCommitProp
Eric Dumazet48100.00%3100.00%
Total48100.00%3100.00%


static inline void __sk_add_node(struct sock *sk, struct hlist_head *list) { hlist_add_head(&sk->sk_node, list); }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo2696.30%266.67%
Eric Dumazet13.70%133.33%
Total27100.00%3100.00%


static inline void sk_add_node(struct sock *sk, struct hlist_head *list) { sock_hold(sk); __sk_add_node(sk, list); }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo2896.55%150.00%
Eric Dumazet13.45%150.00%
Total29100.00%2100.00%


static inline void sk_add_node_rcu(struct sock *sk, struct hlist_head *list) { sock_hold(sk); 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); }

Contributors

PersonTokensPropCommitsCommitProp
Stephen Hemminger3151.67%133.33%
Craig Gallek2846.67%133.33%
Eric Dumazet11.67%133.33%
Total60100.00%3100.00%


static inline void __sk_nulls_add_node_rcu(struct sock *sk, struct hlist_nulls_head *list) { if (IS_ENABLED(CONFIG_IPV6) && sk->sk_reuseport && sk->sk_family == AF_INET6) hlist_nulls_add_tail_rcu(&sk->sk_nulls_node, list); else hlist_nulls_add_head_rcu(&sk->sk_nulls_node, list); }

Contributors

PersonTokensPropCommitsCommitProp
Craig Gallek2850.91%125.00%
Eric Dumazet2749.09%375.00%
Total55100.00%4100.00%


static inline void sk_nulls_add_node_rcu(struct sock *sk, struct hlist_nulls_head *list) { sock_hold(sk); __sk_nulls_add_node_rcu(sk, list); }

Contributors

PersonTokensPropCommitsCommitProp
Eric Dumazet29100.00%3100.00%
Total29100.00%3100.00%


static inline void __sk_del_bind_node(struct sock *sk) { __hlist_del(&sk->sk_bind_node); }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo1995.00%150.00%
Eric Dumazet15.00%150.00%
Total20100.00%2100.00%


static inline void sk_add_bind_node(struct sock *sk, struct hlist_head *list) { hlist_add_head(&sk->sk_bind_node, list); }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo2696.30%150.00%
Eric Dumazet13.70%150.00%
Total27100.00%2100.00%

#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) #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) #define sk_for_each_from(__sk) \ hlist_for_each_entry_from(__sk, sk_node) #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) #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) /** * sk_for_each_entry_offset_rcu - iterate over a list at a given struct offset * @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. * */ #define sk_for_each_entry_offset_rcu(tpos, pos, head, offset) \ for (pos = rcu_dereference((head)->first); \ pos != NULL && \ ({ tpos = (typeof(*tpos) *)((void *)pos - offset); 1;}); \ pos = rcu_dereference(pos->next))
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; }

Contributors

PersonTokensPropCommitsCommitProp
Eric W. Biedermann26100.00%1100.00%
Total26100.00%1100.00%

/* 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 */ SOCK_RCVTSTAMPNS, /* %SO_TIMESTAMPNS setting */ SOCK_LOCALROUTE, /* route locally only, %SO_DONTROUTE setting */ SOCK_QUEUE_SHRUNK, /* write queue has been shrunk recently */ SOCK_MEMALLOC, /* VM depends on this socket for swapping */ SOCK_TIMESTAMPING_RX_SOFTWARE, /* %SOF_TIMESTAMPING_RX_SOFTWARE */ SOCK_FASYNC, /* fasync() active */ SOCK_RXQ_OVFL, SOCK_ZEROCOPY, /* buffers from userspace */ SOCK_WIFI_STATUS, /* push wifi status to userspace */ SOCK_NOFCS, /* Tell NIC not to do the Ethernet FCS. * Will use last 4 bytes of packet sent from * user-space instead. */ SOCK_FILTER_LOCKED, /* Filter cannot be changed anymore */ SOCK_SELECT_ERR_QUEUE, /* Wake select on error queue */ SOCK_RCU_FREE, /* wait rcu grace period in sk_destruct() */ }; #define SK_FLAGS_TIMESTAMP ((1UL << SOCK_TIMESTAMP) | (1UL << SOCK_TIMESTAMPING_RX_SOFTWARE))
static inline void sock_copy_flags(struct sock *nsk, struct sock *osk) { nsk->sk_flags = osk->sk_flags; }

Contributors

PersonTokensPropCommitsCommitProp
Ralf Bächle25100.00%1100.00%
Total25100.00%1100.00%


static inline void sock_set_flag(struct sock *sk, enum sock_flags flag) { __set_bit(flag, &sk->sk_flags); }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo26100.00%2100.00%
Total26100.00%2100.00%


static inline void sock_reset_flag(struct sock *sk, enum sock_flags flag) { __clear_bit(flag, &sk->sk_flags); }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo26100.00%2100.00%
Total26100.00%2100.00%


static inline bool sock_flag(const struct sock *sk, enum sock_flags flag) { return test_bit(flag, &sk->sk_flags); }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo2692.86%266.67%
Eric Dumazet27.14%133.33%
Total28100.00%3100.00%

#ifdef CONFIG_NET extern struct static_key memalloc_socks;
static inline int sk_memalloc_socks(void) { return static_key_false(&memalloc_socks); }

Contributors

PersonTokensPropCommitsCommitProp
Mel Gorman16100.00%1100.00%
Total16100.00%1100.00%

#else
static inline int sk_memalloc_socks(void) { return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Mel Gorman12100.00%1100.00%
Total12100.00%1100.00%

#endif
static inline gfp_t sk_gfp_mask(const struct sock *sk, gfp_t gfp_mask) { return gfp_mask | (sk->sk_allocation & __GFP_MEMALLOC); }

Contributors

PersonTokensPropCommitsCommitProp
Mel Gorman2488.89%250.00%
Eric Dumazet311.11%250.00%
Total27100.00%4100.00%


static inline void sk_acceptq_removed(struct sock *sk) { sk->sk_ack_backlog--; }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo17100.00%1100.00%
Total17100.00%1100.00%


static inline void sk_acceptq_added(struct sock *sk) { sk->sk_ack_backlog++; }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo17100.00%1100.00%
Total17100.00%1100.00%


static inline bool sk_acceptq_is_full(const struct sock *sk) { return sk->sk_ack_backlog > sk->sk_max_ack_backlog; }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo1986.36%133.33%
Eric Dumazet29.09%133.33%
David S. Miller14.55%133.33%
Total22100.00%3100.00%

/* * Compute minimal free write space needed to queue new packets. */
static inline int sk_stream_min_wspace(const struct sock *sk) { return sk->sk_wmem_queued >> 1; }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo1785.00%133.33%
Eric Dumazet315.00%266.67%
Total20100.00%3100.00%


static inline int sk_stream_wspace(const struct sock *sk) { return sk->sk_sndbuf - sk->sk_wmem_queued; }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo2195.45%150.00%
Eric Dumazet14.55%150.00%
Total22100.00%2100.00%

void sk_stream_write_space(struct sock *sk); /* OOB backlog add */
static inline void __sk_add_backlog(struct sock *sk, struct sk_buff *skb) { /* dont let skb dst not refcounted, we are going to leave rcu lock */ skb_dst_force_safe(skb); if (!sk->sk_backlog.tail) sk->sk_backlog.head = skb; else sk->sk_backlog.tail->next = skb; sk->sk_backlog.tail = skb; skb->next = NULL; }

Contributors

PersonTokensPropCommitsCommitProp
Stephen Hemminger5584.62%120.00%
Eric Dumazet69.23%240.00%
Linus Torvalds (pre-git)34.62%120.00%
Yi Zhu11.54%120.00%
Total65100.00%5100.00%

/* * Take into account size of receive queue and backlog queue * Do not take into account this skb truesize, * to allow even a single big packet to come. */
static inline bool sk_rcvqueues_full(const struct sock *sk, unsigned int limit) { unsigned int qsize = sk->sk_backlog.len + atomic_read(&sk->sk_rmem_alloc); return qsize > limit; }

Contributors

PersonTokensPropCommitsCommitProp
Eric Dumazet2255.00%266.67%
Yi Zhu1845.00%133.33%
Total40100.00%3100.00%

/* The per-socket spinlock must be held here. */
static inline __must_check int sk_add_backlog(struct sock *sk, struct sk_buff *skb, unsigned int limit) { if (sk_rcvqueues_full