struct sock — network layer representation of sockets
struct sock { 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; struct sk_buff_head sk_receive_queue; struct {unnamed_struct}; #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_wmem_alloc; atomic_t sk_omem_alloc; int sk_sndbuf; struct sk_buff_head sk_write_queue; unsigned int sk_shutdown:2; unsigned int sk_no_check_tx:1; unsigned int sk_no_check_rx:1; unsigned int sk_userlocks:4; unsigned int sk_protocol:8; unsigned int sk_type:16; #define SK_PROTOCOL_MAX U8_MAX int sk_wmem_queued; gfp_t sk_allocation; u32 sk_pacing_rate; u32 sk_max_pacing_rate; netdev_features_t sk_route_caps; netdev_features_t sk_route_nocaps; int sk_gso_type; unsigned int sk_gso_max_size; u16 sk_gso_max_segs; int sk_rcvlowat; unsigned long sk_lingertime; struct sk_buff_head sk_error_queue; struct proto * sk_prot_creator; rwlock_t sk_callback_lock; int sk_err; int sk_err_soft; u32 sk_ack_backlog; u32 sk_max_ack_backlog; __u32 sk_priority; #if IS_ENABLED(CONFIG_CGROUP_NET_PRIO) __u32 sk_cgrp_prioidx; #endif struct pid * sk_peer_pid; const struct cred * sk_peer_cred; long sk_rcvtimeo; long sk_sndtimeo; struct timer_list sk_timer; ktime_t sk_stamp; u16 sk_tsflags; u32 sk_tskey; struct socket * sk_socket; void * sk_user_data; struct page_frag sk_frag; struct sk_buff * sk_send_head; __s32 sk_peek_off; int sk_write_pending; #ifdef CONFIG_SECURITY void * sk_security; #endif __u32 sk_mark; #ifdef CONFIG_CGROUP_NET_CLASSID u32 sk_classid; #endif struct cg_proto * sk_cgrp; 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); };
shared layout with inet_timewait_sock
synchronizer
incoming packets
anonymous
flow policy
receive input route used by early demux
destination cache
transmit queue bytes committed
"o“ is ”option“ or ”other"
size of send buffer in bytes
Packet sending queue
mask of SEND_SHUTDOWN
and/or RCV_SHUTDOWN
SO_NO_CHECK
setting, set checksum in TX packets
allow zero checksum in RX packets
SO_SNDBUF
and SO_RCVBUF
settings
which protocol this socket belongs in this network family
socket type (SOCK_STREAM
, etc)
persistent queue size
allocation mode
Pacing rate (if supported by transport/packet scheduler)
Maximum pacing rate (SO_MAX_PACING_RATE
)
route capabilities (e.g. NETIF_F_TSO
)
forbidden route capabilities (e.g NETIF_F_GSO_MASK)
GSO type (e.g. SKB_GSO_TCPV4
)
Maximum GSO segment size to build
Maximum number of GSO segments
SO_RCVLOWAT
setting
SO_LINGER
l_linger setting
rarely used
sk_prot of original sock creator (see ipv6_setsockopt, IPV6_ADDRFORM for instance)
used with the callbacks in the end of this struct
last error
errors that don't cause failure but are the cause of a persistent failure not just 'timed out'
current listen backlog
listen backlog set in listen
SO_PRIORITY
setting
socket group's priority map index
struct pid for this socket's peer
SO_PEERCRED
setting
SO_RCVTIMEO
setting
SO_SNDTIMEO
setting
sock cleanup timer
time stamp of last packet received
SO_TIMESTAMPING socket options
counter to disambiguate concurrent tstamp requests
Identd and reporting IO signals
RPC layer private data
cached page frag
front of stuff to transmit
current peek_offset value
a write to stream socket waits to start
used by security modules
generic packet mark
this socket's cgroup classid
this socket's cgroup-specific proto data
callback to indicate change in the state of the sock
callback to indicate there is data to be processed
callback to indicate there is bf sending space available
callback to indicate errors (e.g. MSG_ERRQUEUE
)
callback to process the backlog
called at sock freeing time, i.e. when all refcnt == 0