📄 tcp.h
字号:
* binary search. */#define BICTCP_FUNC_OF_MIN_INCR 11 /* * log(B/Smin)/log(B/(B-1))+1, * Smin:min increment * B:log factor */#define BICTCP_B 4 /* * In binary search, * go to point (max+min)/N *//* * TCP option */ #define TCPOPT_NOP 1 /* Padding */#define TCPOPT_EOL 0 /* End of options */#define TCPOPT_MSS 2 /* Segment size negotiating */#define TCPOPT_WINDOW 3 /* Window scaling */#define TCPOPT_SACK_PERM 4 /* SACK Permitted */#define TCPOPT_SACK 5 /* SACK Block */#define TCPOPT_TIMESTAMP 8 /* Better RTT estimations/PAWS *//* * TCP option lengths */#define TCPOLEN_MSS 4#define TCPOLEN_WINDOW 3#define TCPOLEN_SACK_PERM 2#define TCPOLEN_TIMESTAMP 10/* But this is what stacks really send out. */#define TCPOLEN_TSTAMP_ALIGNED 12#define TCPOLEN_WSCALE_ALIGNED 4#define TCPOLEN_SACKPERM_ALIGNED 4#define TCPOLEN_SACK_BASE 2#define TCPOLEN_SACK_BASE_ALIGNED 4#define TCPOLEN_SACK_PERBLOCK 8#define TCP_TIME_RETRANS 1 /* Retransmit timer */#define TCP_TIME_DACK 2 /* Delayed ack timer */#define TCP_TIME_PROBE0 3 /* Zero window probe timer */#define TCP_TIME_KEEPOPEN 4 /* Keepalive timer *//* Flags in tp->nonagle */#define TCP_NAGLE_OFF 1 /* Nagle's algo is disabled */#define TCP_NAGLE_CORK 2 /* Socket is corked */#define TCP_NAGLE_PUSH 4 /* Cork is overriden for already queued data *//* sysctl variables for tcp */extern int sysctl_max_syn_backlog;extern int sysctl_tcp_timestamps;extern int sysctl_tcp_window_scaling;extern int sysctl_tcp_sack;extern int sysctl_tcp_fin_timeout;extern int sysctl_tcp_tw_recycle;extern int sysctl_tcp_keepalive_time;extern int sysctl_tcp_keepalive_probes;extern int sysctl_tcp_keepalive_intvl;extern int sysctl_tcp_syn_retries;extern int sysctl_tcp_synack_retries;extern int sysctl_tcp_retries1;extern int sysctl_tcp_retries2;extern int sysctl_tcp_orphan_retries;extern int sysctl_tcp_syncookies;extern int sysctl_tcp_retrans_collapse;extern int sysctl_tcp_stdurg;extern int sysctl_tcp_rfc1337;extern int sysctl_tcp_abort_on_overflow;extern int sysctl_tcp_max_orphans;extern int sysctl_tcp_max_tw_buckets;extern int sysctl_tcp_fack;extern int sysctl_tcp_reordering;extern int sysctl_tcp_ecn;extern int sysctl_tcp_dsack;extern int sysctl_tcp_mem[3];extern int sysctl_tcp_wmem[3];extern int sysctl_tcp_rmem[3];extern int sysctl_tcp_app_win;extern int sysctl_tcp_adv_win_scale;extern int sysctl_tcp_tw_reuse;extern int sysctl_tcp_frto;extern int sysctl_tcp_low_latency;extern int sysctl_tcp_westwood;extern int sysctl_tcp_vegas_cong_avoid;extern int sysctl_tcp_vegas_alpha;extern int sysctl_tcp_vegas_beta;extern int sysctl_tcp_vegas_gamma;extern int sysctl_tcp_nometrics_save;extern int sysctl_tcp_bic;extern int sysctl_tcp_bic_fast_convergence;extern int sysctl_tcp_bic_low_window;extern int sysctl_tcp_moderate_rcvbuf;extern int sysctl_tcp_tso_win_divisor;extern atomic_t tcp_memory_allocated;extern atomic_t tcp_sockets_allocated;extern int tcp_memory_pressure;struct open_request;struct or_calltable { int family; int (*rtx_syn_ack) (struct sock *sk, struct open_request *req, struct dst_entry*); void (*send_ack) (struct sk_buff *skb, struct open_request *req); void (*destructor) (struct open_request *req); void (*send_reset) (struct sk_buff *skb);};struct tcp_v4_open_req { __u32 loc_addr; __u32 rmt_addr; struct ip_options *opt;};#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)struct tcp_v6_open_req { struct in6_addr loc_addr; struct in6_addr rmt_addr; struct sk_buff *pktopts; int iif;};#endif/* this structure is too big */struct open_request { struct open_request *dl_next; /* Must be first member! */ __u32 rcv_isn; __u32 snt_isn; __u16 rmt_port; __u16 mss; __u8 retrans; __u8 __pad; __u16 snd_wscale : 4, rcv_wscale : 4, tstamp_ok : 1, sack_ok : 1, wscale_ok : 1, ecn_ok : 1, acked : 1; /* The following two fields can be easily recomputed I think -AK */ __u32 window_clamp; /* window clamp at creation time */ __u32 rcv_wnd; /* rcv_wnd offered first time */ __u32 ts_recent; unsigned long expires; struct or_calltable *class; struct sock *sk; union { struct tcp_v4_open_req v4_req;#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE) struct tcp_v6_open_req v6_req;#endif } af;};/* SLAB cache for open requests. */extern kmem_cache_t *tcp_openreq_cachep;#define tcp_openreq_alloc() kmem_cache_alloc(tcp_openreq_cachep, SLAB_ATOMIC)#define tcp_openreq_fastfree(req) kmem_cache_free(tcp_openreq_cachep, req)static inline void tcp_openreq_free(struct open_request *req){ req->class->destructor(req); tcp_openreq_fastfree(req);}#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)#define TCP_INET_FAMILY(fam) ((fam) == AF_INET)#else#define TCP_INET_FAMILY(fam) 1#endif/* * Pointers to address related TCP functions * (i.e. things that depend on the address family) */struct tcp_func { int (*queue_xmit) (struct sk_buff *skb, int ipfragok); void (*send_check) (struct sock *sk, struct tcphdr *th, int len, struct sk_buff *skb); int (*rebuild_header) (struct sock *sk); int (*conn_request) (struct sock *sk, struct sk_buff *skb); struct sock * (*syn_recv_sock) (struct sock *sk, struct sk_buff *skb, struct open_request *req, struct dst_entry *dst); int (*remember_stamp) (struct sock *sk); __u16 net_header_len; int (*setsockopt) (struct sock *sk, int level, int optname, char __user *optval, int optlen); int (*getsockopt) (struct sock *sk, int level, int optname, char __user *optval, int __user *optlen); void (*addr2sockaddr) (struct sock *sk, struct sockaddr *); int sockaddr_len;};/* * The next routines deal with comparing 32 bit unsigned ints * and worry about wraparound (automatic with unsigned arithmetic). */static inline int before(__u32 seq1, __u32 seq2){ return (__s32)(seq1-seq2) < 0;}static inline int after(__u32 seq1, __u32 seq2){ return (__s32)(seq2-seq1) < 0;}/* is s2<=s1<=s3 ? */static inline int between(__u32 seq1, __u32 seq2, __u32 seq3){ return seq3 - seq2 >= seq1 - seq2;}extern struct proto tcp_prot;DECLARE_SNMP_STAT(struct tcp_mib, tcp_statistics);#define TCP_INC_STATS(field) SNMP_INC_STATS(tcp_statistics, field)#define TCP_INC_STATS_BH(field) SNMP_INC_STATS_BH(tcp_statistics, field)#define TCP_INC_STATS_USER(field) SNMP_INC_STATS_USER(tcp_statistics, field)#define TCP_DEC_STATS(field) SNMP_DEC_STATS(tcp_statistics, field)#define TCP_ADD_STATS_BH(field, val) SNMP_ADD_STATS_BH(tcp_statistics, field, val)#define TCP_ADD_STATS_USER(field, val) SNMP_ADD_STATS_USER(tcp_statistics, field, val)extern void tcp_put_port(struct sock *sk);extern void tcp_inherit_port(struct sock *sk, struct sock *child);extern void tcp_v4_err(struct sk_buff *skb, u32);extern void tcp_shutdown (struct sock *sk, int how);extern int tcp_v4_rcv(struct sk_buff *skb);extern int tcp_v4_remember_stamp(struct sock *sk);extern int tcp_v4_tw_remember_stamp(struct tcp_tw_bucket *tw);extern int tcp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, size_t size);extern ssize_t tcp_sendpage(struct socket *sock, struct page *page, int offset, size_t size, int flags);extern int tcp_ioctl(struct sock *sk, int cmd, unsigned long arg);extern int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb, struct tcphdr *th, unsigned len);extern int tcp_rcv_established(struct sock *sk, struct sk_buff *skb, struct tcphdr *th, unsigned len);extern void tcp_rcv_space_adjust(struct sock *sk);enum tcp_ack_state_t{ TCP_ACK_SCHED = 1, TCP_ACK_TIMER = 2, TCP_ACK_PUSHED= 4};static inline void tcp_schedule_ack(struct tcp_opt *tp){ tp->ack.pending |= TCP_ACK_SCHED;}static inline int tcp_ack_scheduled(struct tcp_opt *tp){ return tp->ack.pending&TCP_ACK_SCHED;}static __inline__ void tcp_dec_quickack_mode(struct tcp_opt *tp){ if (tp->ack.quick && --tp->ack.quick == 0) { /* Leaving quickack mode we deflate ATO. */ tp->ack.ato = TCP_ATO_MIN; }}extern void tcp_enter_quickack_mode(struct tcp_opt *tp);static __inline__ void tcp_delack_init(struct tcp_opt *tp){ memset(&tp->ack, 0, sizeof(tp->ack));}static inline void tcp_clear_options(struct tcp_opt *tp){ tp->tstamp_ok = tp->sack_ok = tp->wscale_ok = tp->snd_wscale = 0;}enum tcp_tw_status{ TCP_TW_SUCCESS = 0, TCP_TW_RST = 1, TCP_TW_ACK = 2, TCP_TW_SYN = 3};extern enum tcp_tw_status tcp_timewait_state_process(struct tcp_tw_bucket *tw, struct sk_buff *skb, struct tcphdr *th, unsigned len);extern struct sock * tcp_check_req(struct sock *sk,struct sk_buff *skb, struct open_request *req, struct open_request **prev);extern int tcp_child_process(struct sock *parent, struct sock *child, struct sk_buff *skb);extern void tcp_enter_frto(struct sock *sk);extern void tcp_enter_loss(struct sock *sk, int how);extern void tcp_clear_retrans(struct tcp_opt *tp);extern void tcp_update_metrics(struct sock *sk);extern void tcp_close(struct sock *sk, long timeout);extern struct sock * tcp_accept(struct sock *sk, int flags, int *err);extern unsigned int tcp_poll(struct file * file, struct socket *sock, struct poll_table_struct *wait);extern int tcp_getsockopt(struct sock *sk, int level, int optname, char __user *optval, int __user *optlen);extern int tcp_setsockopt(struct sock *sk, int level, int optname, char __user *optval, int optlen);extern void tcp_set_keepalive(struct sock *sk, int val);extern int tcp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, size_t len, int nonblock, int flags, int *addr_len);extern int tcp_listen_start(struct sock *sk);extern void tcp_parse_options(struct sk_buff *skb, struct tcp_opt *tp, int estab);/* * TCP v4 functions exported for the inet6 API */extern int tcp_v4_rebuild_header(struct sock *sk);extern int tcp_v4_build_header(struct sock *sk, struct sk_buff *skb);extern void tcp_v4_send_check(struct sock *sk, struct tcphdr *th, int len, struct sk_buff *skb);extern int tcp_v4_conn_request(struct sock *sk, struct sk_buff *skb);extern struct sock * tcp_create_openreq_child(struct sock *sk, struct open_request *req, struct sk_buff *skb);extern struct sock * tcp_v4_syn_recv_sock(struct sock *sk, struct sk_buff *skb, struct open_request *req, struct dst_entry *dst);extern int tcp_v4_do_rcv(struct sock *sk, struct sk_buff *skb);extern int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len);extern int tcp_connect(struct sock *sk);extern struct sk_buff * tcp_make_synack(struct sock *sk, struct dst_entry *dst, struct open_request *req);extern int tcp_disconnect(struct sock *sk, int flags);extern void tcp_unhash(struct sock *sk);extern int tcp_v4_hash_connecting(struct sock *sk);/* From syncookies.c */extern struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb, struct ip_options *opt);extern __u32 cookie_v4_init_sequence(struct sock *sk, struct sk_buff *skb, __u16 *mss);/* tcp_output.c */extern int tcp_write_xmit(struct sock *, int nonagle);extern int tcp_retransmit_skb(struct sock *, struct sk_buff *);extern void tcp_xmit_retransmit_queue(struct sock *);extern void tcp_simple_retransmit(struct sock *);extern int tcp_trim_head(struct sock *, struct sk_buff *, u32);extern void tcp_send_probe0(struct sock *);extern void tcp_send_partial(struct sock *);extern int tcp_write_wakeup(struct sock *);extern void tcp_send_fin(struct sock *sk);extern void tcp_send_active_reset(struct sock *sk, int priority);extern int tcp_send_synack(struct sock *);extern void tcp_push_one(struct sock *, unsigned mss_now);extern void tcp_send_ack(struct sock *sk);extern void tcp_send_delayed_ack(struct sock *sk);/* tcp_timer.c */extern void tcp_init_xmit_timers(struct sock *);extern void tcp_clear_xmit_timers(struct sock *);extern void tcp_delete_keepalive_timer (struct sock *);extern void tcp_reset_keepalive_timer (struct sock *, unsigned long);extern unsigned int tcp_sync_mss(struct sock *sk, u32 pmtu);extern unsigned int tcp_current_mss(struct sock *sk, int large);extern const char timer_bug_msg[];/* tcp_diag.c */extern void tcp_get_info(struct sock *, struct tcp_info *);/* Read 'sendfile()'-style from a TCP socket */typedef int (*sk_read_actor_t)(read_descriptor_t *, struct sk_buff *, unsigned int, size_t);extern int tcp_read_sock(struct sock *sk, read_descriptor_t *desc, sk_read_actor_t recv_actor);static inline void tcp_clear_xmit_timer(struct sock *sk, int what){ struct tcp_opt *tp = tcp_sk(sk); switch (what) { case TCP_TIME_RETRANS: case TCP_TIME_PROBE0: tp->pending = 0;#ifdef TCP_CLEAR_TIMERS sk_stop_timer(sk, &tp->retransmit_timer);#endif break; case TCP_TIME_DACK: tp->ack.blocked = 0; tp->ack.pending = 0;#ifdef TCP_CLEAR_TIMERS sk_stop_timer(sk, &tp->delack_timer);#endif break; default: printk(timer_bug_msg); return; };}/* * Reset the retransmission timer */static inline void tcp_reset_xmit_timer(struct sock *sk, int what, unsigned long when){ struct tcp_opt *tp = tcp_sk(sk); if (when > TCP_RTO_MAX) {#ifdef TCP_DEBUG printk(KERN_DEBUG "reset_xmit_timer sk=%p %d when=0x%lx, caller=%p\n", sk, what, when, current_text_addr());#endif when = TCP_RTO_MAX; } switch (what) { case TCP_TIME_RETRANS: case TCP_TIME_PROBE0: tp->pending = what; tp->timeout = jiffies+when; sk_reset_timer(sk, &tp->retransmit_timer, tp->timeout); break; case TCP_TIME_DACK: tp->ack.pending |= TCP_ACK_TIMER; tp->ack.timeout = jiffies+when;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -