📄 sock.h
字号:
/* * 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, <bir7@leland.Stanford.Edu> * 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 * * 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/config.h>#include <linux/timer.h>#include <linux/in.h> /* struct sockaddr_in */#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)#include <linux/in6.h> /* struct sockaddr_in6 */#include <linux/ipv6.h> /* dest_cache, inet6_options */#include <linux/icmpv6.h>#include <net/if_inet6.h> /* struct ipv6_mc_socklist */#endif#if defined(CONFIG_INET) || defined (CONFIG_INET_MODULE)#include <linux/icmp.h>#endif#include <linux/tcp.h> /* struct tcphdr */#include <linux/netdevice.h>#include <linux/skbuff.h> /* struct sk_buff */#include <net/protocol.h> /* struct inet_protocol */#if defined(CONFIG_X25) || defined(CONFIG_X25_MODULE)#include <net/x25.h>#endif#if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE)#include <net/ax25.h>#if defined(CONFIG_NETROM) || defined(CONFIG_NETROM_MODULE)#include <net/netrom.h>#endif#if defined(CONFIG_ROSE) || defined(CONFIG_ROSE_MODULE)#include <net/rose.h>#endif#endif#if defined(CONFIG_IPX) || defined(CONFIG_IPX_MODULE)#if defined(CONFIG_SPX) || defined(CONFIG_SPX_MODULE)#include <net/spx.h>#else#include <net/ipx.h>#endif /* CONFIG_SPX */#endif /* CONFIG_IPX */#if defined(CONFIG_ATALK) || defined(CONFIG_ATALK_MODULE)#include <linux/atalk.h>#endif#if defined(CONFIG_DECNET) || defined(CONFIG_DECNET_MODULE)#include <net/dn.h>#endif#if defined(CONFIG_IRDA) || defined(CONFIG_IRDA_MODULE)#include <net/irda/irda.h>#endif#ifdef CONFIG_FILTER#include <linux/filter.h>#endif#include <asm/atomic.h>#define MIN_WRITE_SPACE 2048/* The AF_UNIX specific socket options */struct unix_opt { int family; char * name; int locks; struct unix_address *addr; struct dentry * dentry; struct semaphore readsem; struct sock * other; struct sock ** list; struct sock * gc_tree; int inflight;};#ifdef CONFIG_NETLINKstruct netlink_callback;struct netlink_opt { pid_t pid; unsigned groups; pid_t dst_pid; unsigned dst_groups; int (*handler)(int unit, struct sk_buff *skb); atomic_t locks; struct netlink_callback *cb;};#endif/* Once the IPX ncpd patches are in these are going into protinfo. */#if defined(CONFIG_IPX) || defined(CONFIG_IPX_MODULE)struct ipx_opt { ipx_address dest_addr; ipx_interface *intrfc; unsigned short port;#ifdef CONFIG_IPX_INTERN unsigned char node[IPX_NODE_LEN];#endif unsigned short type;/* * To handle special ncp connection-handling sockets for mars_nwe, * the connection number must be stored in the socket. */ unsigned short ipx_ncp_conn;};#endif#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)struct ipv6_pinfo { struct in6_addr saddr; struct in6_addr rcv_saddr; struct in6_addr daddr; struct in6_addr *daddr_cache; __u32 flow_label; __u32 frag_size; int hop_limit; int mcast_hops; int mcast_oif; /* pktoption flags */ union { struct { __u8 srcrt:2, rxinfo:1, rxhlim:1, hopopts:1, dstopts:1, authhdr:1, rxflow:1; } bits; __u8 all; } rxopt; /* sockopt flags */ __u8 mc_loop:1, recverr:1, sndflow:1, pmtudisc:2; struct ipv6_mc_socklist *ipv6_mc_list; struct ipv6_fl_socklist *ipv6_fl_list; __u32 dst_cookie; struct ipv6_txoptions *opt; struct sk_buff *pktoptions;};struct raw6_opt { __u32 checksum; /* perform checksum */ __u32 offset; /* checksum offset */ struct icmp6_filter filter;};#endif /* IPV6 */#if defined(CONFIG_INET) || defined(CONFIG_INET_MODULE)struct raw_opt { struct icmp_filter filter;};#endif/* This defines a selective acknowledgement block. */struct tcp_sack_block { __u32 start_seq; __u32 end_seq;};struct tcp_opt { int tcp_header_len; /* Bytes of tcp header to send *//* * Header prediction flags * 0x5?10 << 16 + snd_wnd in net byte order */ __u32 pred_flags;/* * RFC793 variables by their proper names. This means you can * read the code and the spec side by side (and laugh ...) * See RFC793 and RFC1122. The RFC writes these in capitals. */ __u32 rcv_nxt; /* What we want to receive next */ __u32 snd_nxt; /* Next sequence we send */ __u32 snd_una; /* First byte we want an ack for */ __u32 rcv_tstamp; /* timestamp of last received packet */ __u32 lrcvtime; /* timestamp of last received data packet*/ __u32 srtt; /* smothed round trip time << 3 */ __u32 ato; /* delayed ack timeout */ __u32 snd_wl1; /* Sequence for window update */ __u32 snd_wl2; /* Ack sequence for update */ __u32 snd_wnd; /* The window we expect to receive */ __u32 max_window; __u32 pmtu_cookie; /* Last pmtu seen by socket */ __u16 mss_cache; /* Cached effective mss, not including SACKS */ __u16 mss_clamp; /* Maximal mss, negotiated at connection setup */ __u16 ext_header_len; /* Dave, do you allow mw to use this hole? 8) --ANK */ __u8 pending; /* pending events */ __u8 retransmits; __u32 last_ack_sent; /* last ack we sent */ __u32 backoff; /* backoff */ __u32 mdev; /* medium deviation */ __u32 snd_cwnd; /* Sending congestion window */ __u32 rto; /* retransmit timeout */ __u32 packets_out; /* Packets which are "in flight" */ __u32 fackets_out; /* Non-retrans SACK'd packets */ __u32 retrans_out; /* Fast-retransmitted packets out */ __u32 high_seq; /* snd_nxt at onset of congestion *//* * Slow start and congestion control (see also Nagle, and Karn & Partridge) */ __u32 snd_ssthresh; /* Slow start size threshold */ __u16 snd_cwnd_cnt; /* Linear increase counter */ __u8 dup_acks; /* Consequetive duplicate acks seen from other end */ __u8 delayed_acks; __u16 user_mss; /* mss requested by user in ioctl */ /* Two commonly used timers in both sender and receiver paths. */ struct timer_list retransmit_timer; /* Resend (no ack) */ struct timer_list delack_timer; /* Ack delay */ struct sk_buff_head out_of_order_queue; /* Out of order segments go here */ struct tcp_func *af_specific; /* Operations which are AF_INET{4,6} specific */ struct sk_buff *send_head; /* Front of stuff to transmit */ struct sk_buff *retrans_head; /* retrans head can be * different to the head of * write queue if we are doing * fast retransmit */ __u32 rcv_wnd; /* Current receiver window */ __u32 rcv_wup; /* rcv_nxt on last window update sent */ __u32 write_seq; __u32 copied_seq;/* * Options received (usually on last packet, some only on SYN packets). */ char tstamp_ok, /* TIMESTAMP seen on SYN packet */ wscale_ok, /* Wscale seen on SYN packet */ sack_ok; /* SACK seen on SYN packet */ char saw_tstamp; /* Saw TIMESTAMP on last packet */ __u8 snd_wscale; /* Window scaling received from sender */ __u8 rcv_wscale; /* Window scaling to send to receiver */ __u8 rexmt_done; /* Retransmitted up to send head? */ __u32 rcv_tsval; /* Time stamp value */ __u32 rcv_tsecr; /* Time stamp echo reply */ __u32 ts_recent; /* Time stamp to echo next */ __u32 ts_recent_stamp;/* Time we stored ts_recent (for aging) */ int num_sacks; /* Number of SACK blocks */ struct tcp_sack_block selective_acks[4]; /* The SACKS themselves*/ struct timer_list probe_timer; /* Probes */ __u32 window_clamp; /* XXX Document this... -DaveM */ __u32 probes_out; /* unanswered 0 window probes */ __u32 syn_seq; __u32 fin_seq; __u32 urg_seq; __u32 urg_data; __u32 last_seg_size; /* Size of last incoming segment */ __u32 rcv_mss; /* MSS used for delayed ACK decisions */ __u32 partial_writers; /* # of clients wanting at the head packet */ struct open_request *syn_wait_queue; struct open_request **syn_wait_last; int syn_backlog; /* Backlog of received SYNs */}; /* * This structure really needs to be cleaned up. * Most of it is for TCP, and not used by any of * the other protocols. *//* * The idea is to start moving to a newer struct gradualy * * IMHO the newer struct should have the following format: * * struct sock { * sockmem [mem, proto, callbacks] * * union or struct { * ax25; * } ll_pinfo; * * union { * ipv4; * ipv6; * ipx; * netrom; * rose; * x25; * } net_pinfo; * * union { * tcp; * udp; * spx; * netrom; * } tp_pinfo; * * } *//* Define this to get the sk->debug debugging facility. */#define SOCK_DEBUGGING#ifdef SOCK_DEBUGGING#define SOCK_DEBUG(sk, msg...) do { if((sk) && ((sk)->debug)) printk(KERN_DEBUG msg); } while (0)#else#define SOCK_DEBUG(sk, msg...) do { } while (0)#endifstruct sock { /* This must be first. */ struct sock *sklist_next; struct sock *sklist_prev; /* Local port binding hash linkage. */ struct sock *bind_next; struct sock **bind_pprev; /* Socket demultiplex comparisons on incoming packets. */ __u32 daddr; /* Foreign IPv4 addr */ __u32 rcv_saddr; /* Bound local IPv4 addr */ __u16 dport; /* Destination port */ unsigned short num; /* Local port */ int bound_dev_if; /* Bound device index if != 0 */ /* Main hash linkage for various protocol lookup tables. */ struct sock *next; struct sock **pprev; volatile unsigned char state, /* Connection state */ zapped; /* In ax25 & ipx means not linked */ __u16 sport; /* Source port */ unsigned short family; /* Address family */ unsigned char reuse, /* SO_REUSEADDR setting */ nonagle; /* Disable Nagle algorithm? */ atomic_t sock_readers; /* User count */ int rcvbuf; /* Size of receive buffer in bytes */ struct wait_queue **sleep; /* Sock wait queue */ struct dst_entry *dst_cache; /* Destination cache */ atomic_t rmem_alloc; /* Receive queue bytes committed */ struct sk_buff_head receive_queue; /* Incoming packets */ atomic_t wmem_alloc; /* Transmit queue bytes committed */ struct sk_buff_head write_queue; /* Packet sending queue */ atomic_t omem_alloc; /* "o" is "option" or "other" */ __u32 saddr; /* Sending source */ unsigned int allocation; /* Allocation mode */ int sndbuf; /* Size of send buffer in bytes */ struct sock *prev; /* Not all are volatile, but some are, so we might as well say they all are. * XXX Make this a flag word -DaveM */ volatile char dead, done, urginline, keepopen, linger, destroy, no_check, broadcast, bsdism; unsigned char debug; int proc; unsigned long lingertime; int hashent; struct sock *pair; /* Error and backlog packet queues, rarely used. */ struct sk_buff_head back_log, error_queue; struct proto *prot; unsigned short shutdown;#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE) union { struct ipv6_pinfo af_inet6; } net_pinfo;#endif union { struct tcp_opt af_tcp;#if defined(CONFIG_INET) || defined (CONFIG_INET_MODULE) struct raw_opt tp_raw4;#endif#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE) struct raw6_opt tp_raw;#endif /* CONFIG_IPV6 */#if defined(CONFIG_SPX) || defined (CONFIG_SPX_MODULE) struct spx_opt af_spx;#endif /* CONFIG_SPX */ } tp_pinfo; int err, err_soft; /* Soft holds errors that don't cause failure but are the cause of a persistent failure not just 'timed out' */ unsigned short ack_backlog; unsigned short max_ack_backlog; __u32 priority; unsigned short type; unsigned char localroute; /* Route locally only */ unsigned char protocol; struct ucred peercred;#ifdef CONFIG_FILTER /* Socket Filtering Instructions */ struct sk_filter *filter;#endif /* CONFIG_FILTER */ /* This is where all the private (optional) areas that don't * overlap will eventually live. */ union { void *destruct_hook; struct unix_opt af_unix;#if defined(CONFIG_ATALK) || defined(CONFIG_ATALK_MODULE) struct atalk_sock af_at;#endif#if defined(CONFIG_IPX) || defined(CONFIG_IPX_MODULE) struct ipx_opt af_ipx;#endif#if defined (CONFIG_DECNET) || defined(CONFIG_DECNET_MODULE)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -