static inline void tcp_prequeue_init(struct tcp_sock *tp)
{
	tp->ucopy.task = NULL;
	tp->ucopy.len = 0;
	tp->ucopy.memory = 0;
	skb_queue_head_init(&tp->ucopy.prequeue);
}

extern struct inet_hashinfo tcp_hashinfo;

extern struct percpu_counter tcp_orphan_count;

void tcp_time_wait(struct sock *sk, int state, int timeo);

extern struct inet_timewait_death_row tcp_death_row;

extern struct percpu_counter tcp_sockets_allocated;

void sk_forced_mem_schedule(struct sock *sk, int size);

bool tcp_check_oom(struct sock *sk, int shift);

extern struct proto tcp_prot;

void tcp_tasklet_init(void);

void tcp_v4_err(struct sk_buff *skb, u32);

void tcp_shutdown(struct sock *sk, int how);

void tcp_v4_early_demux(struct sk_buff *skb);

int tcp_v4_rcv(struct sk_buff *skb);

int tcp_v4_tw_remember_stamp(struct inet_timewait_sock *tw);

int tcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t size);

int tcp_sendpage(struct sock *sk, struct page *page, int offset, size_t size,
		 int flags);

void tcp_release_cb(struct sock *sk);

void tcp_wfree(struct sk_buff *skb);

void tcp_write_timer_handler(struct sock *sk);

void tcp_delack_timer_handler(struct sock *sk);

int tcp_ioctl(struct sock *sk, int cmd, unsigned long arg);

int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb);

void tcp_rcv_established(struct sock *sk, struct sk_buff *skb,
			 const struct tcphdr *th, unsigned int len);

void tcp_rcv_space_adjust(struct sock *sk);

int tcp_twsk_unique(struct sock *sk, struct sock *sktw, void *twp);

void tcp_twsk_destructor(struct sock *sk);

ssize_t tcp_splice_read(struct socket *sk, loff_t *ppos,
			struct pipe_inode_info *pipe, size_t len,
			unsigned int flags);

enum tcp_tw_status tcp_timewait_state_process(struct inet_timewait_sock *tw,
					      struct sk_buff *skb,
					      const struct tcphdr *th);

struct sock *tcp_check_req(struct sock *sk, struct sk_buff *skb,
			   struct request_sock *req, bool fastopen);

int tcp_child_process(struct sock *parent, struct sock *child,
		      struct sk_buff *skb);

void tcp_enter_loss(struct sock *sk);

void tcp_clear_retrans(struct tcp_sock *tp);

void tcp_update_metrics(struct sock *sk);

void tcp_init_metrics(struct sock *sk);

void tcp_metrics_init(void);

bool tcp_peer_is_proven(struct request_sock *req, struct dst_entry *dst,
			bool paws_check, bool timestamps);

bool tcp_remember_stamp(struct sock *sk);

bool tcp_tw_remember_stamp(struct inet_timewait_sock *tw);

void tcp_fetch_timewait_stamp(struct sock *sk, struct dst_entry *dst);

void tcp_disable_fack(struct tcp_sock *tp);

void tcp_close(struct sock *sk, long timeout);

void tcp_init_sock(struct sock *sk);

unsigned int tcp_poll(struct file *file, struct socket *sock,
		      struct poll_table_struct *wait);

int tcp_getsockopt(struct sock *sk, int level, int optname,
		   char __user *optval, int __user *optlen);

int tcp_setsockopt(struct sock *sk, int level, int optname,
		   char __user *optval, unsigned int optlen);

int compat_tcp_getsockopt(struct sock *sk, int level, int optname,
			  char __user *optval, int __user *optlen);

int compat_tcp_setsockopt(struct sock *sk, int level, int optname,
			  char __user *optval, unsigned int optlen);

void tcp_set_keepalive(struct sock *sk, int val);

void tcp_syn_ack_timeout(const struct request_sock *req);


static inline int tcp_inq(struct sock *sk)
{
	struct tcp_sock *tp = tcp_sk(sk);
	int answ;

	if ((1 << sk->sk_state) & (TCPF_SYN_SENT | TCPF_SYN_RECV)) {
		answ = 0;
	} else if (sock_flag(sk, SOCK_URGINLINE) ||
		   !tp->urg_data ||
		   before(tp->urg_seq, tp->copied_seq) ||
		   !before(tp->urg_seq, tp->rcv_nxt)) {

		answ = tp->rcv_nxt - tp->copied_seq;

		/* Subtract 1, if FIN was received */
		if (answ && sock_flag(sk, SOCK_DONE))
			answ--;
	} else {
		answ = tp->urg_seq - tp->copied_seq;
	}

	return answ;
}

tcp: fix use after free in tcp_xmit_retransmit_queue()

When tcp_sendmsg() allocates a fresh and empty skb, it puts it at the
tail of the write queue using tcp_add_write_queue_tail()

Then it attempts to copy user data into this fresh skb.

If the copy fails, we undo the work and remove the fresh skb.

Unfortunately, this undo lacks the change done to tp->highest_sack and
we can leave a dangling pointer (to a freed skb)

Later, tcp_xmit_retransmit_queue() can dereference this pointer and
access freed memory. For regular kernels where memory is not unmapped,
this might cause SACK bugs because tcp_highest_sack_seq() is buggy,
returning garbage instead of tp->snd_nxt, but with various debug
features like CONFIG_DEBUG_PAGEALLOC, this can crash the kernel.

This bug was found by Marco Grassi thanks to syzkaller.

Fixes: 6859d49475d4 ("[TCP]: Abstract tp->highest_sack accessing & point to next skb")
Reported-by: Marco Grassi <marco.gra@gmail.com>
Signed-off-by: Eric Dumazet <edumazet@google.com>
Cc: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi>
Cc: Yuchung Cheng <ycheng@google.com>
Cc: Neal Cardwell <ncardwell@google.com>
Acked-by: Neal Cardwell <ncardwell@google.com>
Reviewed-by: Cong Wang <xiyou.wangcong@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

extern struct inet_hashinfo tcp_hashinfo;

extern struct percpu_counter tcp_orphan_count;

void tcp_time_wait(struct sock *sk, int state, int timeo);

#define TCP_RETR1	3	/*
				 * This is how many retries it does before it
				 * tries to figure out if the gateway is
				 * down. Minimal RFC value is 3; it corresponds
				 * to ~3sec-8min depending on RTO.
				 */

#define TCP_DELACK_MAX	((unsigned)(HZ/5))	/* maximal time to delay before sending an ACK */

#define TCP_DELACK_MIN	((unsigned)(HZ/25))	/* minimal time to delay before sending an ACK */

extern struct inet_timewait_death_row tcp_death_row;

extern int sysctl_tcp_timestamps;

extern int sysctl_tcp_window_scaling;

extern int sysctl_tcp_sack;

extern int sysctl_tcp_fastopen;

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

extern int sysctl_tcp_reordering;

extern int sysctl_tcp_max_reordering;

extern int sysctl_tcp_dsack;

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

extern int sysctl_tcp_moderate_rcvbuf;

extern int sysctl_tcp_tso_win_divisor;

extern int sysctl_tcp_workaround_signed_windows;

extern int sysctl_tcp_slow_start_after_idle;

extern int sysctl_tcp_thin_linear_timeouts;

extern int sysctl_tcp_thin_dupack;

extern int sysctl_tcp_early_retrans;

extern int sysctl_tcp_limit_output_bytes;

extern int sysctl_tcp_challenge_ack_limit;

extern int sysctl_tcp_min_tso_segs;

extern int sysctl_tcp_min_rtt_wlen;

extern int sysctl_tcp_autocorking;

extern int sysctl_tcp_invalid_ratelimit;

extern int sysctl_tcp_pacing_ss_ratio;

extern int sysctl_tcp_pacing_ca_ratio;

extern struct percpu_counter tcp_sockets_allocated;

extern int tcp_memory_pressure;

#define after(seq2, seq1) 	before(seq1, seq2)

void sk_forced_mem_schedule(struct sock *sk, int size);

bool tcp_check_oom(struct sock *sk, int shift);

extern struct proto tcp_prot;

void tcp_v4_err(struct sk_buff *skb, u32);

void tcp_shutdown(struct sock *sk, int how);

void tcp_v4_early_demux(struct sk_buff *skb);

int tcp_v4_rcv(struct sk_buff *skb);

int tcp_v4_tw_remember_stamp(struct inet_timewait_sock *tw);

int tcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t size);

int tcp_sendpage(struct sock *sk, struct page *page, int offset, size_t size,
		 int flags);

void tcp_release_cb(struct sock *sk);

void tcp_wfree(struct sk_buff *skb);

void tcp_write_timer_handler(struct sock *sk);

void tcp_delack_timer_handler(struct sock *sk);

int tcp_ioctl(struct sock *sk, int cmd, unsigned long arg);

int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb);

void tcp_rcv_established(struct sock *sk, struct sk_buff *skb,
			 const struct tcphdr *th, unsigned int len);

void tcp_rcv_space_adjust(struct sock *sk);


static inline void tcp_synq_overflow(const struct sock *sk)
{
	unsigned long last_overflow = tcp_sk(sk)->rx_opt.ts_recent_stamp;
	unsigned long now = jiffies;

	if (time_after(now, last_overflow + HZ))
		tcp_sk(sk)->rx_opt.ts_recent_stamp = now;
}

extern struct inet_hashinfo tcp_hashinfo;

extern struct percpu_counter tcp_orphan_count;

void tcp_time_wait(struct sock *sk, int state, int timeo);

#define TCP_TIMEWAIT_LEN (60*HZ) /* how long to wait to destroy TIME-WAIT
				  * state, about 60 seconds	*/

#define TCP_DELACK_MAX	((unsigned)(HZ/5))	/* maximal time to delay before sending an ACK */

#define TCP_DELACK_MIN	((unsigned)(HZ/25))	/* minimal time to delay before sending an ACK */

#define TCP_ATO_MIN	((unsigned)(HZ/25))

#define TCP_RTO_MAX	((unsigned)(120*HZ))

#define TCP_RTO_MIN	((unsigned)(HZ/5))

#define TCP_TIMEOUT_INIT ((unsigned)(1*HZ))	/* RFC6298 2.1 initial RTO value	*/

#define TCP_TIMEOUT_FALLBACK ((unsigned)(3*HZ))	/* RFC 1122 initial RTO value, now
						 * used as a fallback RTO for the
						 * initial data transmission if no
						 * valid RTT sample has been acquired,
						 * most likely due to retrans in 3WHS.
						 */

#define TCP_RESOURCE_PROBE_INTERVAL ((unsigned)(HZ/2U)) /* Maximal interval between probes
					                 * for local resources.
					                 */

extern struct inet_timewait_death_row tcp_death_row;

extern long sysctl_tcp_mem[3];

extern struct percpu_counter tcp_sockets_allocated;

void sk_forced_mem_schedule(struct sock *sk, int size);

bool tcp_check_oom(struct sock *sk, int shift);

extern struct proto tcp_prot;

void tcp_tasklet_init(void);

void tcp_v4_err(struct sk_buff *skb, u32);

void tcp_shutdown(struct sock *sk, int how);

void tcp_v4_early_demux(struct sk_buff *skb);

int tcp_v4_rcv(struct sk_buff *skb);

int tcp_v4_tw_remember_stamp(struct inet_timewait_sock *tw);

int tcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t size);

int tcp_sendpage(struct sock *sk, struct page *page, int offset, size_t size,
		 int flags);

void tcp_release_cb(struct sock *sk);

void tcp_wfree(struct sk_buff *skb);

void tcp_write_timer_handler(struct sock *sk);

void tcp_delack_timer_handler(struct sock *sk);

int tcp_ioctl(struct sock *sk, int cmd, unsigned long arg);

int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb);

void tcp_rcv_established(struct sock *sk, struct sk_buff *skb,
			 const struct tcphdr *th, unsigned int len);

void tcp_rcv_space_adjust(struct sock *sk);

int tcp_twsk_unique(struct sock *sk, struct sock *sktw, void *twp);

void tcp_twsk_destructor(struct sock *sk);

ssize_t tcp_splice_read(struct socket *sk, loff_t *ppos,
			struct pipe_inode_info *pipe, size_t len,
			unsigned int flags);

enum tcp_tw_status tcp_timewait_state_process(struct inet_timewait_sock *tw,
					      struct sk_buff *skb,
					      const struct tcphdr *th);

struct sock *tcp_check_req(struct sock *sk, struct sk_buff *skb,
			   struct request_sock *req, bool fastopen);

int tcp_child_process(struct sock *parent, struct sock *child,
		      struct sk_buff *skb);

void tcp_enter_loss(struct sock *sk);

void tcp_clear_retrans(struct tcp_sock *tp);

void tcp_update_metrics(struct sock *sk);

void tcp_init_metrics(struct sock *sk);

void tcp_metrics_init(void);


static inline int keepalive_probes(const struct tcp_sock *tp)
{
	struct net *net = sock_net((struct sock *)tp);

	return tp->keepalive_probes ? : net->ipv4.sysctl_tcp_keepalive_probes;
}

extern struct inet_hashinfo tcp_hashinfo;

extern struct percpu_counter tcp_orphan_count;

void tcp_time_wait(struct sock *sk, int state, int timeo);

extern struct inet_timewait_death_row tcp_death_row;

extern int sysctl_tcp_timestamps;

extern int sysctl_tcp_window_scaling;

extern int sysctl_tcp_sack;

extern int sysctl_tcp_fastopen;

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

extern int sysctl_tcp_reordering;

extern int sysctl_tcp_max_reordering;

extern int sysctl_tcp_dsack;

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

extern int sysctl_tcp_moderate_rcvbuf;

extern int sysctl_tcp_tso_win_divisor;

extern int sysctl_tcp_workaround_signed_windows;

extern int sysctl_tcp_slow_start_after_idle;

extern int sysctl_tcp_thin_linear_timeouts;

extern int sysctl_tcp_thin_dupack;

extern int sysctl_tcp_early_retrans;

extern int sysctl_tcp_limit_output_bytes;

extern int sysctl_tcp_challenge_ack_limit;

extern int sysctl_tcp_min_tso_segs;

extern int sysctl_tcp_min_rtt_wlen;

extern int sysctl_tcp_autocorking;

extern int sysctl_tcp_invalid_ratelimit;

extern int sysctl_tcp_pacing_ss_ratio;

extern int sysctl_tcp_pacing_ca_ratio;

extern struct percpu_counter tcp_sockets_allocated;

extern int tcp_memory_pressure;

void sk_forced_mem_schedule(struct sock *sk, int size);

bool tcp_check_oom(struct sock *sk, int shift);

extern struct proto tcp_prot;

#define TCP_INC_STATS(net, field)	SNMP_INC_STATS((net)->mib.tcp_statistics, field)

#define __TCP_INC_STATS(net, field)	__SNMP_INC_STATS((net)->mib.tcp_statistics, field)

#define TCP_DEC_STATS(net, field)	SNMP_DEC_STATS((net)->mib.tcp_statistics, field)

#define TCP_ADD_STATS(net, field, val)	SNMP_ADD_STATS((net)->mib.tcp_statistics, field, val)

void tcp_v4_err(struct sk_buff *skb, u32);

void tcp_shutdown(struct sock *sk, int how);

void tcp_v4_early_demux(struct sk_buff *skb);

int tcp_v4_rcv(struct sk_buff *skb);

int tcp_v4_tw_remember_stamp(struct inet_timewait_sock *tw);

int tcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t size);

int tcp_sendpage(struct sock *sk, struct page *page, int offset, size_t size,
		 int flags);

void tcp_release_cb(struct sock *sk);

void tcp_wfree(struct sk_buff *skb);

void tcp_write_timer_handler(struct sock *sk);

void tcp_delack_timer_handler(struct sock *sk);

int tcp_ioctl(struct sock *sk, int cmd, unsigned long arg);

int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb);

void tcp_rcv_established(struct sock *sk, struct sk_buff *skb,
			 const struct tcphdr *th, unsigned int len);

void tcp_rcv_space_adjust(struct sock *sk);

int tcp_twsk_unique(struct sock *sk, struct sock *sktw, void *twp);

void tcp_twsk_destructor(struct sock *sk);


static inline struct sk_buff *tcp_write_queue_head(const struct sock *sk)
{
	return skb_peek(&sk->sk_write_queue);
}

extern struct inet_hashinfo tcp_hashinfo;

extern struct percpu_counter tcp_orphan_count;

void tcp_time_wait(struct sock *sk, int state, int timeo);

extern struct inet_timewait_death_row tcp_death_row;

extern struct percpu_counter tcp_sockets_allocated;

void sk_forced_mem_schedule(struct sock *sk, int size);

bool tcp_check_oom(struct sock *sk, int shift);

extern struct proto tcp_prot;

void tcp_v4_err(struct sk_buff *skb, u32);

void tcp_shutdown(struct sock *sk, int how);

void tcp_v4_early_demux(struct sk_buff *skb);

int tcp_v4_rcv(struct sk_buff *skb);

int tcp_v4_tw_remember_stamp(struct inet_timewait_sock *tw);

int tcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t size);

int tcp_sendpage(struct sock *sk, struct page *page, int offset, size_t size,
		 int flags);

void tcp_release_cb(struct sock *sk);

void tcp_wfree(struct sk_buff *skb);

void tcp_write_timer_handler(struct sock *sk);

void tcp_delack_timer_handler(struct sock *sk);

int tcp_ioctl(struct sock *sk, int cmd, unsigned long arg);

int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb);

void tcp_rcv_established(struct sock *sk, struct sk_buff *skb,
			 const struct tcphdr *th, unsigned int len);

void tcp_rcv_space_adjust(struct sock *sk);

int tcp_twsk_unique(struct sock *sk, struct sock *sktw, void *twp);

void tcp_twsk_destructor(struct sock *sk);

ssize_t tcp_splice_read(struct socket *sk, loff_t *ppos,
			struct pipe_inode_info *pipe, size_t len,
			unsigned int flags);

enum tcp_tw_status tcp_timewait_state_process(struct inet_timewait_sock *tw,
					      struct sk_buff *skb,
					      const struct tcphdr *th);

struct sock *tcp_check_req(struct sock *sk, struct sk_buff *skb,
			   struct request_sock *req, bool fastopen);

int tcp_child_process(struct sock *parent, struct sock *child,
		      struct sk_buff *skb);

void tcp_enter_loss(struct sock *sk);

void tcp_clear_retrans(struct tcp_sock *tp);

void tcp_update_metrics(struct sock *sk);

void tcp_init_metrics(struct sock *sk);

bool tcp_peer_is_proven(struct request_sock *req, struct dst_entry *dst,
			bool paws_check, bool timestamps);

bool tcp_remember_stamp(struct sock *sk);

bool tcp_tw_remember_stamp(struct inet_timewait_sock *tw);

void tcp_fetch_timewait_stamp(struct sock *sk, struct dst_entry *dst);

void tcp_disable_fack(struct tcp_sock *tp);

void tcp_close(struct sock *sk, long timeout);

void tcp_init_sock(struct sock *sk);

unsigned int tcp_poll(struct file *file, struct socket *sock,
		      struct poll_table_struct *wait);

int tcp_getsockopt(struct sock *sk, int level, int optname,
		   char __user *optval, int __user *optlen);

int tcp_setsockopt(struct sock *sk, int level, int optname,
		   char __user *optval, unsigned int optlen);

int compat_tcp_getsockopt(struct sock *sk, int level, int optname,
			  char __user *optval, int __user *optlen);

int compat_tcp_setsockopt(struct sock *sk, int level, int optname,
			  char __user *optval, unsigned int optlen);

void tcp_set_keepalive(struct sock *sk, int val);

void tcp_syn_ack_timeout(const struct request_sock *req);


static inline void tcp_skb_pcount_set(struct sk_buff *skb, int segs)
{
	TCP_SKB_CB(skb)->tcp_gso_segs = segs;
}

extern struct inet_hashinfo tcp_hashinfo;

extern struct percpu_counter tcp_orphan_count;

void tcp_time_wait(struct sock *sk, int state, int timeo);

extern struct inet_timewait_death_row tcp_death_row;

extern int sysctl_tcp_timestamps;

extern int sysctl_tcp_window_scaling;

extern int sysctl_tcp_sack;

extern int sysctl_tcp_fastopen;

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

extern int sysctl_tcp_reordering;

extern int sysctl_tcp_max_reordering;

extern int sysctl_tcp_dsack;

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

extern int sysctl_tcp_moderate_rcvbuf;

extern int sysctl_tcp_tso_win_divisor;

extern int sysctl_tcp_workaround_signed_windows;

extern int sysctl_tcp_slow_start_after_idle;

extern int sysctl_tcp_thin_linear_timeouts;

extern int sysctl_tcp_thin_dupack;

extern int sysctl_tcp_early_retrans;

extern int sysctl_tcp_limit_output_bytes;

extern int sysctl_tcp_challenge_ack_limit;

extern int sysctl_tcp_min_tso_segs;

extern int sysctl_tcp_min_rtt_wlen;

extern int sysctl_tcp_autocorking;

extern int sysctl_tcp_invalid_ratelimit;

extern int sysctl_tcp_pacing_ss_ratio;

extern int sysctl_tcp_pacing_ca_ratio;

extern struct percpu_counter tcp_sockets_allocated;

extern int tcp_memory_pressure;

void sk_forced_mem_schedule(struct sock *sk, int size);

bool tcp_check_oom(struct sock *sk, int shift);

extern struct proto tcp_prot;

void tcp_tasklet_init(void);

void tcp_v4_err(struct sk_buff *skb, u32);

void tcp_shutdown(struct sock *sk, int how);

void tcp_v4_early_demux(struct sk_buff *skb);

int tcp_v4_rcv(struct sk_buff *skb);

int tcp_v4_tw_remember_stamp(struct inet_timewait_sock *tw);

int tcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t size);

int tcp_sendpage(struct sock *sk, struct page *page, int offset, size_t size,
		 int flags);

void tcp_release_cb(struct sock *sk);

void tcp_wfree(struct sk_buff *skb);

void tcp_write_timer_handler(struct sock *sk);

void tcp_delack_timer_handler(struct sock *sk);

int tcp_ioctl(struct sock *sk, int cmd, unsigned long arg);

int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb);

void tcp_rcv_established(struct sock *sk, struct sk_buff *skb,
			 const struct tcphdr *th, unsigned int len);

void tcp_rcv_space_adjust(struct sock *sk);

int tcp_twsk_unique(struct sock *sk, struct sock *sktw, void *twp);

void tcp_twsk_destructor(struct sock *sk);

ssize_t tcp_splice_read(struct socket *sk, loff_t *ppos,
			struct pipe_inode_info *pipe, size_t len,
			unsigned int flags);

enum tcp_tw_status tcp_timewait_state_process(struct inet_timewait_sock *tw,
					      struct sk_buff *skb,
					      const struct tcphdr *th);

struct sock *tcp_check_req(struct sock *sk, struct sk_buff *skb,
			   struct request_sock *req, bool fastopen);


static inline void tcp_check_send_head(struct sock *sk, struct sk_buff *skb_unlinked)
{
	if (sk->sk_send_head == skb_unlinked)
		sk->sk_send_head = NULL;
	if (tcp_sk(sk)->highest_sack == skb_unlinked)
		tcp_sk(sk)->highest_sack = NULL;
}


static inline void tcp_write_queue_purge(struct sock *sk)
{
	struct sk_buff *skb;

	while ((skb = __skb_dequeue(&sk->sk_write_queue)) != NULL)
		sk_wmem_free_skb(sk, skb);
	sk_mem_reclaim(sk);
	tcp_clear_all_retrans_hints(tcp_sk(sk));
}


static inline void tcp_clear_all_retrans_hints(struct tcp_sock *tp)
{
	tcp_clear_retrans_hints_partial(tp);
	tp->retransmit_skb_hint = NULL;
}


static inline void tcp_clear_xmit_timers(struct sock *sk)
{
	inet_csk_clear_xmit_timers(sk);
}


static inline void tcp_unlink_write_queue(struct sk_buff *skb, struct sock *sk)
{
	__skb_unlink(skb, &sk->sk_write_queue);
}


static inline bool tcp_checksum_complete(struct sk_buff *skb)
{
	return !skb_csum_unnecessary(skb) &&
		__tcp_checksum_complete(skb);
}


static inline void tcp_highest_sack_reset(struct sock *sk)
{
	tcp_sk(sk)->highest_sack = tcp_write_queue_head(sk);
}


static inline u32 __tcp_set_rto(const struct tcp_sock *tp)
{
	return usecs_to_jiffies((tp->srtt_us >> 3) + tp->rttvar_us);
}


static inline bool tcp_too_many_orphans(struct sock *sk, int shift)
{
	struct percpu_counter *ocp = sk->sk_prot->orphan_count;
	int orphans = percpu_counter_read_positive(ocp);

	if (orphans << shift > sysctl_tcp_max_orphans) {
		orphans = percpu_counter_sum_positive(ocp);
		if (orphans << shift > sysctl_tcp_max_orphans)
			return true;
	}
	return false;
}

extern struct inet_hashinfo tcp_hashinfo;

extern struct percpu_counter tcp_orphan_count;

void tcp_time_wait(struct sock *sk, int state, int timeo);

extern struct inet_timewait_death_row tcp_death_row;

extern int sysctl_tcp_timestamps;

extern int sysctl_tcp_window_scaling;

extern int sysctl_tcp_sack;

extern int sysctl_tcp_fastopen;

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

extern int sysctl_tcp_reordering;

extern int sysctl_tcp_max_reordering;

extern int sysctl_tcp_dsack;

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

extern int sysctl_tcp_moderate_rcvbuf;

extern int sysctl_tcp_tso_win_divisor;

extern int sysctl_tcp_workaround_signed_windows;

extern int sysctl_tcp_slow_start_after_idle;

extern int sysctl_tcp_thin_linear_timeouts;

extern int sysctl_tcp_thin_dupack;

extern int sysctl_tcp_early_retrans;

extern int sysctl_tcp_limit_output_bytes;

extern int sysctl_tcp_challenge_ack_limit;

extern int sysctl_tcp_min_tso_segs;

extern int sysctl_tcp_min_rtt_wlen;

extern int sysctl_tcp_autocorking;

extern int sysctl_tcp_invalid_ratelimit;

extern int sysctl_tcp_pacing_ss_ratio;

extern int sysctl_tcp_pacing_ca_ratio;

extern struct percpu_counter tcp_sockets_allocated;

extern int tcp_memory_pressure;

void sk_forced_mem_schedule(struct sock *sk, int size);

bool tcp_check_oom(struct sock *sk, int shift);

extern struct proto tcp_prot;

void tcp_v4_err(struct sk_buff *skb, u32);

void tcp_shutdown(struct sock *sk, int how);

void tcp_v4_early_demux(struct sk_buff *skb);

int tcp_v4_rcv(struct sk_buff *skb);

int tcp_v4_tw_remember_stamp(struct inet_timewait_sock *tw);

int tcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t size);

int tcp_sendpage(struct sock *sk, struct page *page, int offset, size_t size,
		 int flags);

void tcp_release_cb(struct sock *sk);

void tcp_wfree(struct sk_buff *skb);

void tcp_write_timer_handler(struct sock *sk);

void tcp_delack_timer_handler(struct sock *sk);

int tcp_ioctl(struct sock *sk, int cmd, unsigned long arg);

int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb);

void tcp_rcv_established(struct sock *sk, struct sk_buff *skb,
			 const struct tcphdr *th, unsigned int len);

void tcp_rcv_space_adjust(struct sock *sk);

int tcp_twsk_unique(struct sock *sk, struct sock *sktw, void *twp);

void tcp_twsk_destructor(struct sock *sk);

ssize_t tcp_splice_read(struct socket *sk, loff_t *ppos,
			struct pipe_inode_info *pipe, size_t len,
			unsigned int flags);

enum tcp_tw_status tcp_timewait_state_process(struct inet_timewait_sock *tw,
					      struct sk_buff *skb,
					      const struct tcphdr *th);

struct sock *tcp_check_req(struct sock *sk, struct sk_buff *skb,
			   struct request_sock *req, bool fastopen);


static inline u32 tcp_receive_window(const struct tcp_sock *tp)
{
	s32 win = tp->rcv_wup + tp->rcv_wnd - tp->rcv_nxt;

	if (win < 0)
		win = 0;
	return (u32) win;
}


static inline bool tcp_is_fack(const struct tcp_sock *tp)
{
	return tp->rx_opt.sack_ok & TCP_FACK_ENABLED;
}


static inline void tcp_init_wl(struct tcp_sock *tp, u32 seq)
{
	tp->snd_wl1 = seq;
}


static inline __sum16 tcp_v4_check(int len, __be32 saddr,
				   __be32 daddr, __wsum base)
{
	return csum_tcpudp_magic(saddr,daddr,len,IPPROTO_TCP,base);
}

void tcp_time_wait(struct sock *sk, int state, int timeo);

extern int sysctl_tcp_timestamps;

extern int sysctl_tcp_window_scaling;

extern int sysctl_tcp_sack;

extern int sysctl_tcp_fastopen;

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

extern int sysctl_tcp_reordering;

extern int sysctl_tcp_max_reordering;

extern int sysctl_tcp_dsack;

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

extern int sysctl_tcp_moderate_rcvbuf;

extern int sysctl_tcp_tso_win_divisor;

extern int sysctl_tcp_workaround_signed_windows;

extern int sysctl_tcp_slow_start_after_idle;

extern int sysctl_tcp_thin_linear_timeouts;

extern int sysctl_tcp_thin_dupack;

extern int sysctl_tcp_early_retrans;

extern int sysctl_tcp_limit_output_bytes;

extern int sysctl_tcp_challenge_ack_limit;

extern int sysctl_tcp_min_tso_segs;

extern int sysctl_tcp_min_rtt_wlen;

extern int sysctl_tcp_autocorking;

extern int sysctl_tcp_invalid_ratelimit;

extern int sysctl_tcp_pacing_ss_ratio;

extern int sysctl_tcp_pacing_ca_ratio;

extern int tcp_memory_pressure;

void sk_forced_mem_schedule(struct sock *sk, int size);

bool tcp_check_oom(struct sock *sk, int shift);

void tcp_shutdown(struct sock *sk, int how);

int tcp_v4_rcv(struct sk_buff *skb);

int tcp_v4_tw_remember_stamp(struct inet_timewait_sock *tw);

int tcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t size);

int tcp_sendpage(struct sock *sk, struct page *page, int offset, size_t size,
		 int flags);

int tcp_ioctl(struct sock *sk, int cmd, unsigned long arg);

int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb);

void tcp_rcv_established(struct sock *sk, struct sk_buff *skb,
			 const struct tcphdr *th, unsigned int len);

int tcp_twsk_unique(struct sock *sk, struct sock *sktw, void *twp);

ssize_t tcp_splice_read(struct socket *sk, loff_t *ppos,
			struct pipe_inode_info *pipe, size_t len,
			unsigned int flags);

int tcp_child_process(struct sock *parent, struct sock *child,
		      struct sk_buff *skb);

unsigned int tcp_poll(struct file *file, struct socket *sock,
		      struct poll_table_struct *wait);

int tcp_getsockopt(struct sock *sk, int level, int optname,
		   char __user *optval, int __user *optlen);

int tcp_setsockopt(struct sock *sk, int level, int optname,
		   char __user *optval, unsigned int optlen);

int compat_tcp_getsockopt(struct sock *sk, int level, int optname,
			  char __user *optval, int __user *optlen);

int compat_tcp_setsockopt(struct sock *sk, int level, int optname,
			  char __user *optval, unsigned int optlen);

void tcp_set_keepalive(struct sock *sk, int val);


static inline void tcp_disable_early_retrans(struct tcp_sock *tp)
{
	tp->do_early_retrans = 0;
}


static inline u32 tcp_notsent_lowat(const struct tcp_sock *tp)
{
	struct net *net = sock_net((struct sock *)tp);
	return tp->notsent_lowat ?: net->ipv4.sysctl_tcp_notsent_lowat;
}

extern struct inet_hashinfo tcp_hashinfo;

extern struct percpu_counter tcp_orphan_count;

void tcp_time_wait(struct sock *sk, int state, int timeo);

extern struct inet_timewait_death_row tcp_death_row;

extern struct percpu_counter tcp_sockets_allocated;

void sk_forced_mem_schedule(struct sock *sk, int size);

bool tcp_check_oom(struct sock *sk, int shift);

extern struct proto tcp_prot;

#define TCP_INC_STATS(net, field)	SNMP_INC_STATS((net)->mib.tcp_statistics, field)

#define __TCP_INC_STATS(net, field)	__SNMP_INC_STATS((net)->mib.tcp_statistics, field)

#define TCP_DEC_STATS(net, field)	SNMP_DEC_STATS((net)->mib.tcp_statistics, field)

#define TCP_ADD_STATS(net, field, val)	SNMP_ADD_STATS((net)->mib.tcp_statistics, field, val)

void tcp_v4_err(struct sk_buff *skb, u32);

void tcp_shutdown(struct sock *sk, int how);

void tcp_v4_early_demux(struct sk_buff *skb);

int tcp_v4_rcv(struct sk_buff *skb);

int tcp_v4_tw_remember_stamp(struct inet_timewait_sock *tw);

int tcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t size);

int tcp_sendpage(struct sock *sk, struct page *page, int offset, size_t size,
		 int flags);

void tcp_release_cb(struct sock *sk);

void tcp_wfree(struct sk_buff *skb);

void tcp_write_timer_handler(struct sock *sk);

void tcp_delack_timer_handler(struct sock *sk);

int tcp_ioctl(struct sock *sk, int cmd, unsigned long arg);

int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb);

void tcp_rcv_established(struct sock *sk, struct sk_buff *skb,
			 const struct tcphdr *th, unsigned int len);

void tcp_rcv_space_adjust(struct sock *sk);

int tcp_twsk_unique(struct sock *sk, struct sock *sktw, void *twp);

void tcp_twsk_destructor(struct sock *sk);

ssize_t tcp_splice_read(struct socket *sk, loff_t *ppos,
			struct pipe_inode_info *pipe, size_t len,
			unsigned int flags);

enum tcp_tw_status tcp_timewait_state_process(struct inet_timewait_sock *tw,
					      struct sk_buff *skb,
					      const struct tcphdr *th);

struct sock *tcp_check_req(struct sock *sk, struct sk_buff *skb,
			   struct request_sock *req, bool fastopen);

int tcp_child_process(struct sock *parent, struct sock *child,
		      struct sk_buff *skb);

void tcp_enter_loss(struct sock *sk);

void tcp_clear_retrans(struct tcp_sock *tp);

void tcp_update_metrics(struct sock *sk);

void tcp_init_metrics(struct sock *sk);

bool tcp_peer_is_proven(struct request_sock *req, struct dst_entry *dst,
			bool paws_check, bool timestamps);

bool tcp_remember_stamp(struct sock *sk);

bool tcp_tw_remember_stamp(struct inet_timewait_sock *tw);

void tcp_fetch_timewait_stamp(struct sock *sk, struct dst_entry *dst);

void tcp_disable_fack(struct tcp_sock *tp);

void tcp_close(struct sock *sk, long timeout);

void tcp_init_sock(struct sock *sk);

unsigned int tcp_poll(struct file *file, struct socket *sock,
		      struct poll_table_struct *wait);

int tcp_getsockopt(struct sock *sk, int level, int optname,
		   char __user *optval, int __user *optlen);

int tcp_setsockopt(struct sock *sk, int level, int optname,
		   char __user *optval, unsigned int optlen);


static inline bool tcp_stream_is_thin(struct tcp_sock *tp)
{
	return tp->packets_out < 4 && !tcp_in_initial_slowstart(tp);
}


static inline int tcp_bound_to_half_wnd(struct tcp_sock *tp, int pktsize)
{
	int cutoff;

	/* When peer uses tiny windows, there is no use in packetizing
	 * to sub-MSS pieces for the sake of SWS or making sure there
	 * are enough packets in the pipe for fast recovery.
	 *
	 * On the other hand, for extremely large MSS devices, handling
	 * smaller than MSS windows in this way does make sense.
	 */
	if (tp->max_window > TCP_MSS_DEFAULT)
		cutoff = (tp->max_window >> 1);
	else
		cutoff = tp->max_window;

	if (cutoff && pktsize > cutoff)
		return max_t(int, cutoff, 68U - tp->tcp_header_len);
	else
		return pktsize;
}

extern struct inet_hashinfo tcp_hashinfo;

extern struct percpu_counter tcp_orphan_count;

void tcp_time_wait(struct sock *sk, int state, int timeo);

#define TCP_RETR1	3	/*
				 * This is how many retries it does before it
				 * tries to figure out if the gateway is
				 * down. Minimal RFC value is 3; it corresponds
				 * to ~3sec-8min depending on RTO.
				 */

#define TCP_RETR2	15	/*
				 * This should take at least
				 * 90 minutes to time out.
				 * RFC1122 says that the limit is 100 sec.
				 * 15 is ~13-30min depending on RTO.
				 */

#define TCP_SYN_RETRIES	 6	/* This is how many retries are done
				 * when active opening a connection.
				 * RFC1122 says the minimum retry MUST
				 * be at least 180secs.  Nevertheless
				 * this value is corresponding to
				 * 63secs of retransmission with the
				 * current initial RTO.
				 */

#define TCP_SYNACK_RETRIES 5	/* This is how may retries are done
				 * when passive opening a connection.
				 * This is corresponding to 31secs of
				 * retransmission with the current
				 * initial RTO.
				 */

#define TCP_TIMEOUT_FALLBACK ((unsigned)(3*HZ))	/* RFC 1122 initial RTO value, now
						 * used as a fallback RTO for the
						 * initial data transmission if no
						 * valid RTT sample has been acquired,
						 * most likely due to retrans in 3WHS.
						 */

#define TCP_RESOURCE_PROBE_INTERVAL ((unsigned)(HZ/2U)) /* Maximal interval between probes
					                 * for local resources.
					                 */

#define TCP_PAWS_MSL	60		/* Per-host timestamps are invalidated
					 * after this time. It should be equal
					 * (or greater than) TCP_TIMEWAIT_LEN
					 * to provide reliability equal to one
					 * provided by timewait state.
					 */

#define TCP_PAWS_WINDOW	1		/* Replay window for per-host
					 * timestamps. It must be less than
					 * minimal timewait lifetime.
					 */

#define TCP_NAGLE_PUSH		4	/* Cork is overridden for already queued data */

extern struct inet_timewait_death_row tcp_death_row;

extern int sysctl_tcp_timestamps;

extern int sysctl_tcp_window_scaling;

extern int sysctl_tcp_sack;

extern int sysctl_tcp_fastopen;

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

extern int sysctl_tcp_reordering;

extern int sysctl_tcp_max_reordering;

extern int sysctl_tcp_dsack;

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

extern int sysctl_tcp_moderate_rcvbuf;

extern int sysctl_tcp_tso_win_divisor;

extern int sysctl_tcp_workaround_signed_windows;

extern int sysctl_tcp_slow_start_after_idle;

extern int sysctl_tcp_thin_linear_timeouts;

extern int sysctl_tcp_thin_dupack;

extern int sysctl_tcp_early_retrans;

extern int sysctl_tcp_limit_output_bytes;


static inline bool tcp_paws_check(const struct tcp_options_received *rx_opt,
				  int paws_win)
{
	if ((s32)(rx_opt->ts_recent - rx_opt->rcv_tsval) <= paws_win)
		return true;
	if (unlikely(get_seconds() >= rx_opt->ts_recent_stamp + TCP_PAWS_24DAYS))
		return true;
	/*
	 * Some OSes send SYN and SYNACK messages with tsval=0 tsecr=0,
	 * then following tcp messages have valid values. Ignore 0 value,
	 * or else 'negative' tsval might forbid us to accept their packets.
	 */
	if (!rx_opt->ts_recent)
		return true;
	return false;
}

extern struct inet_hashinfo tcp_hashinfo;

extern struct percpu_counter tcp_orphan_count;

void tcp_time_wait(struct sock *sk, int state, int timeo);

#define TCP_RETR1	3	/*
				 * This is how many retries it does before it
				 * tries to figure out if the gateway is
				 * down. Minimal RFC value is 3; it corresponds
				 * to ~3sec-8min depending on RTO.
				 */

#define TCP_SYN_RETRIES	 6	/* This is how many retries are done
				 * when active opening a connection.
				 * RFC1122 says the minimum retry MUST
				 * be at least 180secs.  Nevertheless
				 * this value is corresponding to
				 * 63secs of retransmission with the
				 * current initial RTO.
				 */

#define TCP_SYNACK_RETRIES 5	/* This is how may retries are done
				 * when passive opening a connection.
				 * This is corresponding to 31secs of
				 * retransmission with the current
				 * initial RTO.
				 */

#define TCP_TIMEOUT_INIT ((unsigned)(1*HZ))	/* RFC6298 2.1 initial RTO value	*/

#define TCP_TIMEOUT_FALLBACK ((unsigned)(3*HZ))	/* RFC 1122 initial RTO value, now
						 * used as a fallback RTO for the
						 * initial data transmission if no
						 * valid RTT sample has been acquired,
						 * most likely due to retrans in 3WHS.
						 */

#define TCP_SYNQ_INTERVAL	(HZ/5)	/* Period of SYNACK timer */

#define TCP_PAWS_24DAYS	(60 * 60 * 24 * 24)

#define	TFO_CLIENT_NO_COOKIE	4	/* Data in SYN w/o cookie option */

extern struct inet_timewait_death_row tcp_death_row;

extern int sysctl_tcp_timestamps;

extern int sysctl_tcp_window_scaling;

extern int sysctl_tcp_sack;

extern int sysctl_tcp_fastopen;

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

extern int sysctl_tcp_reordering;

extern int sysctl_tcp_max_reordering;

extern int sysctl_tcp_dsack;

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

extern int sysctl_tcp_moderate_rcvbuf;

extern int sysctl_tcp_tso_win_divisor;

extern int sysctl_tcp_workaround_signed_windows;

extern int sysctl_tcp_slow_start_after_idle;

extern int sysctl_tcp_thin_linear_timeouts;

extern int sysctl_tcp_thin_dupack;

extern int sysctl_tcp_early_retrans;

extern int sysctl_tcp_limit_output_bytes;

extern int sysctl_tcp_challenge_ack_limit;

extern int sysctl_tcp_min_tso_segs;

extern int sysctl_tcp_min_rtt_wlen;

extern int sysctl_tcp_autocorking;

extern int sysctl_tcp_invalid_ratelimit;

extern int sysctl_tcp_pacing_ss_ratio;

extern int sysctl_tcp_pacing_ca_ratio;

extern struct percpu_counter tcp_sockets_allocated;

extern int tcp_memory_pressure;

void sk_forced_mem_schedule(struct sock *sk, int size);

bool tcp_check_oom(struct sock *sk, int shift);

extern struct proto tcp_prot;


static inline struct sk_buff *tcp_send_head(const struct sock *sk)
{
	return sk->sk_send_head;
}


static inline u32 tcp_cookie_time(void)
{
	u64 val = get_jiffies_64();

	do_div(val, TCP_SYNCOOKIE_PERIOD);
	return val;
}

void tcp_time_wait(struct sock *sk, int state, int timeo);

void sk_forced_mem_schedule(struct sock *sk, int size);

#define TCP_ADD_STATS(net, field, val)	SNMP_ADD_STATS((net)->mib.tcp_statistics, field, val)

void tcp_tasklet_init(void);

void tcp_v4_err(struct sk_buff *skb, u32);

void tcp_shutdown(struct sock *sk, int how);

void tcp_v4_early_demux(struct sk_buff *skb);

void tcp_release_cb(struct sock *sk);

void tcp_wfree(struct sk_buff *skb);

void tcp_write_timer_handler(struct sock *sk);

void tcp_delack_timer_handler(struct sock *sk);

void tcp_rcv_established(struct sock *sk, struct sk_buff *skb,
			 const struct tcphdr *th, unsigned int len);

void tcp_rcv_space_adjust(struct sock *sk);

int tcp_twsk_unique(struct sock *sk, struct sock *sktw, void *twp);

void tcp_twsk_destructor(struct sock *sk);

void tcp_enter_loss(struct sock *sk);

void tcp_clear_retrans(struct tcp_sock *tp);

void tcp_update_metrics(struct sock *sk);

void tcp_init_metrics(struct sock *sk);

void tcp_metrics_init(void);

void tcp_fetch_timewait_stamp(struct sock *sk, struct dst_entry *dst);

void tcp_disable_fack(struct tcp_sock *tp);

void tcp_close(struct sock *sk, long timeout);

void tcp_init_sock(struct sock *sk);

void tcp_set_keepalive(struct sock *sk, int val);

void tcp_syn_ack_timeout(const struct request_sock *req);

void tcp_parse_options(const struct sk_buff *skb,
		       struct tcp_options_received *opt_rx,
		       int estab, struct tcp_fastopen_cookie *foc);

void tcp_v4_send_check(struct sock *sk, struct sk_buff *skb);

void tcp_v4_mtu_reduced(struct sock *sk);

void tcp_req_err(struct sock *sk, u32 seq, bool abort);

void tcp_ca_openreq_child(struct sock *sk, const struct dst_entry *dst);

void tcp_finish_connect(struct sock *sk, struct sk_buff *skb);

void inet_sk_rx_dst_set(struct sock *sk, const struct sk_buff *skb);

int __cookie_v4_check(const struct iphdr *iph, const struct tcphdr *th,
		      u32 cookie);

#define TCP_SYNCOOKIE_PERIOD	(60 * HZ)

#define TCP_SYNCOOKIE_VALID	(MAX_SYNCOOKIE_AGE * TCP_SYNCOOKIE_PERIOD)

u32 __cookie_v4_init_sequence(const struct iphdr *iph, const struct tcphdr *th,
			      u16 *mssp);

int __cookie_v6_check(const struct ipv6hdr *iph, const struct tcphdr *th,
		      u32 cookie);

u32 __cookie_v6_init_sequence(const struct ipv6hdr *iph,
			      const struct tcphdr *th, u16 *mssp);

void __tcp_push_pending_frames(struct sock *sk, unsigned int cur_mss,
			       int nonagle);

void tcp_retransmit_timer(struct sock *sk);

void tcp_xmit_retransmit_queue(struct sock *);

void tcp_simple_retransmit(struct sock *);

int tcp_trim_head(struct sock *, struct sk_buff *, u32);

int tcp_fragment(struct sock *, struct sk_buff *, u32, unsigned int, gfp_t);

void tcp_send_probe0(struct sock *);

void tcp_send_partial(struct sock *);

void tcp_send_fin(struct sock *sk);

void tcp_send_active_reset(struct sock *sk, gfp_t priority);

void tcp_push_one(struct sock *, unsigned int mss_now);

void tcp_send_ack(struct sock *sk);

void tcp_send_delayed_ack(struct sock *sk);

void tcp_send_loss_probe(struct sock *sk);


static inline int tcp_fin_time(const struct sock *sk)
{
	int fin_timeout = tcp_sk(sk)->linger2 ? : sock_net(sk)->ipv4.sysctl_tcp_fin_timeout;
	const int rto = inet_csk(sk)->icsk_rto;

	if (fin_timeout < (rto << 2) - (rto >> 1))
		fin_timeout = (rto << 2) - (rto >> 1);

	return fin_timeout;
}


static inline void tcp_fast_path_check(struct sock *sk)
{
	struct tcp_sock *tp = tcp_sk(sk);

	if (skb_queue_empty(&tp->out_of_order_queue) &&
	    tp->rcv_wnd &&
	    atomic_read(&sk->sk_rmem_alloc) < sk->sk_rcvbuf &&
	    !tp->urg_data)
		tcp_fast_path_on(tp);
}


static inline void tcp_put_md5sig_pool(void)
{
	local_bh_enable();
}

void tcp_time_wait(struct sock *sk, int state, int timeo);

void sk_forced_mem_schedule(struct sock *sk, int size);

void tcp_tasklet_init(void);

void tcp_v4_err(struct sk_buff *skb, u32);

void tcp_shutdown(struct sock *sk, int how);

void tcp_v4_early_demux(struct sk_buff *skb);

void tcp_release_cb(struct sock *sk);

void tcp_wfree(struct sk_buff *skb);

void tcp_write_timer_handler(struct sock *sk);

void tcp_delack_timer_handler(struct sock *sk);

void tcp_rcv_established(struct sock *sk, struct sk_buff *skb,
			 const struct tcphdr *th, unsigned int len);

void tcp_rcv_space_adjust(struct sock *sk);

int tcp_twsk_unique(struct sock *sk, struct sock *sktw, void *twp);

void tcp_twsk_destructor(struct sock *sk);

void tcp_enter_loss(struct sock *sk);

void tcp_clear_retrans(struct tcp_sock *tp);

void tcp_update_metrics(struct sock *sk);

void tcp_init_metrics(struct sock *sk);

void tcp_metrics_init(void);

void tcp_fetch_timewait_stamp(struct sock *sk, struct dst_entry *dst);

void tcp_disable_fack(struct tcp_sock *tp);

void tcp_close(struct sock *sk, long timeout);

void tcp_init_sock(struct sock *sk);

void tcp_set_keepalive(struct sock *sk, int val);

void tcp_syn_ack_timeout(const struct request_sock *req);

void tcp_parse_options(const struct sk_buff *skb,
		       struct tcp_options_received *opt_rx,
		       int estab, struct tcp_fastopen_cookie *foc);

void tcp_v4_send_check(struct sock *sk, struct sk_buff *skb);

void tcp_v4_mtu_reduced(struct sock *sk);

void tcp_req_err(struct sock *sk, u32 seq, bool abort);

void tcp_ca_openreq_child(struct sock *sk, const struct dst_entry *dst);

void tcp_finish_connect(struct sock *sk, struct sk_buff *skb);

void inet_sk_rx_dst_set(struct sock *sk, const struct sk_buff *skb);

void __tcp_push_pending_frames(struct sock *sk, unsigned int cur_mss,
			       int nonagle);

void tcp_retransmit_timer(struct sock *sk);

void tcp_xmit_retransmit_queue(struct sock *);

void tcp_simple_retransmit(struct sock *);

void tcp_send_probe0(struct sock *);

void tcp_send_partial(struct sock *);

void tcp_send_fin(struct sock *sk);

void tcp_send_active_reset(struct sock *sk, gfp_t priority);

void tcp_push_one(struct sock *, unsigned int mss_now);

void tcp_send_ack(struct sock *sk);

void tcp_send_delayed_ack(struct sock *sk);

void tcp_send_loss_probe(struct sock *sk);

void tcp_skb_collapse_tstamp(struct sk_buff *skb,
			     const struct sk_buff *next_skb);

void tcp_resume_early_retransmit(struct sock *sk);

void tcp_rearm_rto(struct sock *sk);

void tcp_synack_rtt_meas(struct sock *sk, struct request_sock *req);

void tcp_reset(struct sock *sk);

void tcp_skb_mark_lost_uncond_verify(struct tcp_sock *tp, struct sk_buff *skb);

void tcp_fin(struct sock *sk);

void tcp_init_xmit_timers(struct sock *);

void tcp_get_info(struct sock *, struct tcp_info *);

void tcp_initialize_rcv_mss(struct sock *sk);

void tcp_mtup_init(struct sock *sk);

void tcp_init_buffer_space(struct sock *sk);

void tcp_send_window_probe(struct sock *sk);


static inline u32 tcp_highest_sack_seq(struct tcp_sock *tp)
{
	if (!tp->sacked_out)
		return tp->snd_una;

	if (tp->highest_sack == NULL)
		return tp->snd_nxt;

	return TCP_SKB_CB(tp->highest_sack)->seq;
}


static inline void tcp_update_wl(struct tcp_sock *tp, u32 seq)
{
	tp->snd_wl1 = seq;
}


static inline void tcp_init_send_head(struct sock *sk)
{
	sk->sk_send_head = NULL;
}


static inline void __tcp_fast_path_on(struct tcp_sock *tp, u32 snd_wnd)
{
	tp->pred_flags = htonl((tp->tcp_header_len << 26) |
			       ntohl(TCP_FLAG_ACK) |
			       snd_wnd);
}


static inline void tcp_bound_rto(const struct sock *sk)
{
	if (inet_csk(sk)->icsk_rto > TCP_RTO_MAX)
		inet_csk(sk)->icsk_rto = TCP_RTO_MAX;
}

extern struct inet_hashinfo tcp_hashinfo;

extern struct percpu_counter tcp_orphan_count;

void tcp_time_wait(struct sock *sk, int state, int timeo);

#define TCP_RTO_MAX	((unsigned)(120*HZ))

extern struct inet_timewait_death_row tcp_death_row;

extern struct percpu_counter tcp_sockets_allocated;

void sk_forced_mem_schedule(struct sock *sk, int size);

bool tcp_check_oom(struct sock *sk, int shift);

extern struct proto tcp_prot;

void tcp_tasklet_init(void);

void tcp_v4_err(struct sk_buff *skb, u32);

void tcp_shutdown(struct sock *sk, int how);

void tcp_v4_early_demux(struct sk_buff *skb);

int tcp_v4_rcv(struct sk_buff *skb);

int tcp_v4_tw_remember_stamp(struct inet_timewait_sock *tw);

int tcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t size);

int tcp_sendpage(struct sock *sk, struct page *page, int offset, size_t size,
		 int flags);

void tcp_release_cb(struct sock *sk);

void tcp_wfree(struct sk_buff *skb);

void tcp_write_timer_handler(struct sock *sk);

void tcp_delack_timer_handler(struct sock *sk);

int tcp_ioctl(struct sock *sk, int cmd, unsigned long arg);

int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb);

void tcp_rcv_established(struct sock *sk, struct sk_buff *skb,
			 const struct tcphdr *th, unsigned int len);

void tcp_rcv_space_adjust(struct sock *sk);

int tcp_twsk_unique(struct sock *sk, struct sock *sktw, void *twp);

void tcp_twsk_destructor(struct sock *sk);

ssize_t tcp_splice_read(struct socket *sk, loff_t *ppos,
			struct pipe_inode_info *pipe, size_t len,
			unsigned int flags);

enum tcp_tw_status tcp_timewait_state_process(struct inet_timewait_sock *tw,
					      struct sk_buff *skb,
					      const struct tcphdr *th);

struct sock *tcp_check_req(struct sock *sk, struct sk_buff *skb,
			   struct request_sock *req, bool fastopen);

int tcp_child_process(struct sock *parent, struct sock *child,
		      struct sk_buff *skb);

void tcp_enter_loss(struct sock *sk);

void tcp_clear_retrans(struct tcp_sock *tp);

void tcp_update_metrics(struct sock *sk);

void tcp_init_metrics(struct sock *sk);

void tcp_metrics_init(void);

bool tcp_peer_is_proven(struct request_sock *req, struct dst_entry *dst,
			bool paws_check, bool timestamps);

bool tcp_remember_stamp(struct sock *sk);

bool tcp_tw_remember_stamp(struct inet_timewait_sock *tw);

void tcp_fetch_timewait_stamp(struct sock *sk, struct dst_entry *dst);

void tcp_disable_fack(struct tcp_sock *tp);

void tcp_close(struct sock *sk, long timeout);

void tcp_init_sock(struct sock *sk);

unsigned int tcp_poll(struct file *file, struct socket *sock,
		      struct poll_table_struct *wait);

int tcp_getsockopt(struct sock *sk, int level, int optname,
		   char __user *optval, int __user *optlen);

int tcp_setsockopt(struct sock *sk, int level, int optname,
		   char __user *optval, unsigned int optlen);

int compat_tcp_getsockopt(struct sock *sk, int level, int optname,
			  char __user *optval, int __user *optlen);

int compat_tcp_setsockopt(struct sock *sk, int level, int optname,
			  char __user *optval, unsigned int optlen);

void tcp_set_keepalive(struct sock *sk, int val);


static inline bool tcp_synq_no_recent_overflow(const struct sock *sk)
{
	unsigned long last_overflow = tcp_sk(sk)->rx_opt.ts_recent_stamp;

	return time_after(jiffies, last_overflow + TCP_SYNCOOKIE_VALID);
}

extern struct inet_hashinfo tcp_hashinfo;

extern struct percpu_counter tcp_orphan_count;

void tcp_time_wait(struct sock *sk, int state, int timeo);

#define TCP_TIMEWAIT_LEN (60*HZ) /* how long to wait to destroy TIME-WAIT
				  * state, about 60 seconds	*/

#define TCP_DELACK_MAX	((unsigned)(HZ/5))	/* maximal time to delay before sending an ACK */

#define TCP_DELACK_MIN	((unsigned)(HZ/25))	/* minimal time to delay before sending an ACK */

#define TCP_ATO_MIN	((unsigned)(HZ/25))

#define TCP_RTO_MAX	((unsigned)(120*HZ))

#define TCP_RTO_MIN	((unsigned)(HZ/5))

#define TCP_TIMEOUT_INIT ((unsigned)(1*HZ))	/* RFC6298 2.1 initial RTO value	*/

#define TCP_TIMEOUT_FALLBACK ((unsigned)(3*HZ))	/* RFC 1122 initial RTO value, now
						 * used as a fallback RTO for the
						 * initial data transmission if no
						 * valid RTT sample has been acquired,
						 * most likely due to retrans in 3WHS.
						 */

#define TCP_RESOURCE_PROBE_INTERVAL ((unsigned)(HZ/2U)) /* Maximal interval between probes
					                 * for local resources.
					                 */

extern struct inet_timewait_death_row tcp_death_row;

extern long sysctl_tcp_mem[3];

extern struct percpu_counter tcp_sockets_allocated;

void sk_forced_mem_schedule(struct sock *sk, int size);

bool tcp_check_oom(struct sock *sk, int shift);

extern struct proto tcp_prot;

void tcp_v4_err(struct sk_buff *skb, u32);

void tcp_shutdown(struct sock *sk, int how);

void tcp_v4_early_demux(struct sk_buff *skb);

int tcp_v4_rcv(struct sk_buff *skb);

int tcp_v4_tw_remember_stamp(struct inet_timewait_sock *tw);

int tcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t size);

int tcp_sendpage(struct sock *sk, struct page *page, int offset, size_t size,
		 int flags);

void tcp_release_cb(struct sock *sk);

void tcp_wfree(struct sk_buff *skb);

void tcp_write_timer_handler(struct sock *sk);

void tcp_delack_timer_handler(struct sock *sk);

int tcp_ioctl(struct sock *sk, int cmd, unsigned long arg);

int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb);

void tcp_rcv_established(struct sock *sk, struct sk_buff *skb,
			 const struct tcphdr *th, unsigned int len);

void tcp_rcv_space_adjust(struct sock *sk);

int tcp_twsk_unique(struct sock *sk, struct sock *sktw, void *twp);

void tcp_twsk_destructor(struct sock *sk);

ssize_t tcp_splice_read(struct socket *sk, loff_t *ppos,
			struct pipe_inode_info *pipe, size_t len,
			unsigned int flags);

enum tcp_tw_status tcp_timewait_state_process(struct inet_timewait_sock *tw,
					      struct sk_buff *skb,
					      const struct tcphdr *th);

struct sock *tcp_check_req(struct sock *sk, struct sk_buff *skb,
			   struct request_sock *req, bool fastopen);

int tcp_child_process(struct sock *parent, struct sock *child,
		      struct sk_buff *skb);

void tcp_enter_loss(struct sock *sk);

void tcp_clear_retrans(struct tcp_sock *tp);

void tcp_update_metrics(struct sock *sk);

void tcp_init_metrics(struct sock *sk);

bool tcp_peer_is_proven(struct request_sock *req, struct dst_entry *dst,
			bool paws_check, bool timestamps);


static inline void tcp_fast_path_on(struct tcp_sock *tp)
{
	__tcp_fast_path_on(tp, tp->snd_wnd >> tp->rx_opt.snd_wscale);
}


static inline u32 tcp_wnd_end(const struct tcp_sock *tp)
{
	return tp->snd_una + tp->snd_wnd;
}


static inline void tcp_check_probe_timer(struct sock *sk)
{
	if (!tcp_sk(sk)->packets_out && !inet_csk(sk)->icsk_pending)
		inet_csk_reset_xmit_timer(sk, ICSK_TIME_PROBE0,
					  tcp_probe0_base(sk), TCP_RTO_MAX);
}


static inline void tcp_sack_reset(struct tcp_options_received *rx_opt)
{
	rx_opt->dsack = 0;
	rx_opt->num_sacks = 0;
}


static inline int tcp_full_space(const struct sock *sk)
{
	return tcp_win_from_space(sk->sk_rcvbuf);
}


static inline void tcp_segs_in(struct tcp_sock *tp, const struct sk_buff *skb)
{
	u16 segs_in;

	segs_in = max_t(u16, 1, skb_shinfo(skb)->gso_segs);
	tp->segs_in += segs_in;
	if (skb->len > tcp_hdrlen(skb))
		tp->data_segs_in += segs_in;
}


static inline bool skb_is_tcp_pure_ack(const struct sk_buff *skb)
{
	return skb->truesize == 2;
}


static inline char *tcp_ca_get_name_by_key(u32 key, char *buffer)
{
	return NULL;
}

void tcp_v4_err(struct sk_buff *skb, u32);

int tcp_getsockopt(struct sock *sk, int level, int optname,
		   char __user *optval, int __user *optlen);

int tcp_setsockopt(struct sock *sk, int level, int optname,
		   char __user *optval, unsigned int optlen);

int compat_tcp_getsockopt(struct sock *sk, int level, int optname,
			  char __user *optval, int __user *optlen);

int compat_tcp_setsockopt(struct sock *sk, int level, int optname,
			  char __user *optval, unsigned int optlen);

void tcp_req_err(struct sock *sk, u32 seq, bool abort);

int __cookie_v4_check(const struct iphdr *iph, const struct tcphdr *th,
		      u32 cookie);

u32 __cookie_v4_init_sequence(const struct iphdr *iph, const struct tcphdr *th,
			      u16 *mssp);

int __cookie_v6_check(const struct ipv6hdr *iph, const struct tcphdr *th,
		      u32 cookie);

u32 __cookie_v6_init_sequence(const struct ipv6hdr *iph,
			      const struct tcphdr *th, u16 *mssp);

int tcp_trim_head(struct sock *, struct sk_buff *, u32);

int tcp_fragment(struct sock *, struct sk_buff *, u32, unsigned int, gfp_t);

unsigned int tcp_sync_mss(struct sock *sk, u32 pmtu);

u32 __tcp_select_window(struct sock *sk);

struct ack_sample {
	u32 pkts_acked;
	s32 rtt_us;
	u32 in_flight;
}

struct tcp_congestion_ops {
	struct list_head	list;
	u32 key;
	u32 flags;

	/* initialize private data (optional) */
	void (*init)(struct sock *sk);
	/* cleanup private data  (optional) */
	void (*release)(struct sock *sk);

	/* return slow start threshold (required) */
	u32 (*ssthresh)(struct sock *sk);
	/* do new cwnd calculation (required) */
	void (*cong_avoid)(struct sock *sk, u32 ack, u32 acked);
	/* call before changing ca_state (optional) */
	void (*set_state)(struct sock *sk, u8 new_state);
	/* call when cwnd event occurs (optional) */
	void (*cwnd_event)(struct sock *sk, enum tcp_ca_event ev);
	/* call when ack arrives (optional) */
	void (*in_ack_event)(struct sock *sk, u32 flags);
	/* new value of cwnd after loss (optional) */
	u32  (*undo_cwnd)(struct sock *sk);
	/* hook for packet ack accounting (optional) */
	void (*pkts_acked)(struct sock *sk, const struct ack_sample *sample);
	/* get info for inet_diag (optional) */
	size_t (*get_info)(struct sock *sk, u32 ext, int *attr,
			   union tcp_cc_info *info);

	char 		name[TCP_CA_NAME_MAX];
	struct module 	*owner;
}

int tcp_set_default_congestion_control(const char *name);

void tcp_get_default_congestion_control(char *name);

void tcp_get_available_congestion_control(char *buf, size_t len);

void tcp_get_allowed_congestion_control(char *buf, size_t len);

int tcp_set_allowed_congestion_control(char *allowed);

int tcp_set_congestion_control(struct sock *sk, const char *name);

u32 tcp_slow_start(struct tcp_sock *tp, u32 acked);


static inline int keepalive_intvl_when(const struct tcp_sock *tp)
{
	struct net *net = sock_net((struct sock *)tp);

	return tp->keepalive_intvl ? : net->ipv4.sysctl_tcp_keepalive_intvl;
}


static inline __u32 tcp_current_ssthresh(const struct sock *sk)
{
	const struct tcp_sock *tp = tcp_sk(sk);

	if (tcp_in_cwnd_reduction(sk))
		return tp->snd_ssthresh;
	else
		return max(tp->snd_ssthresh,
			   ((tp->snd_cwnd >> 1) +
			    (tp->snd_cwnd >> 2)));
}


static inline bool before(__u32 seq1, __u32 seq2)
{
        return (__s32)(seq1-seq2) < 0;
}

#define TCP_RETR1	3	/*
				 * This is how many retries it does before it
				 * tries to figure out if the gateway is
				 * down. Minimal RFC value is 3; it corresponds
				 * to ~3sec-8min depending on RTO.
				 */

#define TCP_DELACK_MAX	((unsigned)(HZ/5))	/* maximal time to delay before sending an ACK */

#define TCP_DELACK_MIN	((unsigned)(HZ/25))	/* minimal time to delay before sending an ACK */

#define after(seq2, seq1) 	before(seq1, seq2)

bool tcp_check_oom(struct sock *sk, int shift);

struct sock *tcp_check_req(struct sock *sk, struct sk_buff *skb,
			   struct request_sock *req, bool fastopen);

bool tcp_peer_is_proven(struct request_sock *req, struct dst_entry *dst,
			bool paws_check, bool timestamps);

bool tcp_remember_stamp(struct sock *sk);

bool tcp_tw_remember_stamp(struct inet_timewait_sock *tw);

void tcp_req_err(struct sock *sk, u32 seq, bool abort);

struct sock *tcp_v4_syn_recv_sock(const struct sock *sk, struct sk_buff *skb,
				  struct request_sock *req,
				  struct dst_entry *dst,
				  struct request_sock *req_unhash,
				  bool *own_req);

__u32 cookie_v4_init_sequence(const struct sk_buff *skb, __u16 *mss);

__u32 cookie_init_timestamp(struct request_sock *req);

bool cookie_timestamp_decode(struct tcp_options_received *opt);

bool cookie_ecn_ok(const struct tcp_options_received *opt,
		   const struct net *net, const struct dst_entry *dst);

__u32 cookie_v6_init_sequence(const struct sk_buff *skb, __u16 *mss);

bool tcp_may_send_now(struct sock *sk);

bool tcp_schedule_loss_probe(struct sock *sk);

#define tcp_time_stamp		((__u32)(jiffies))


static inline unsigned int tcp_packets_in_flight(const struct tcp_sock *tp)
{
	return tp->packets_out - tcp_left_out(tp) + tp->retrans_out;
}

extern struct inet_hashinfo tcp_hashinfo;

extern struct percpu_counter tcp_orphan_count;

void tcp_time_wait(struct sock *sk, int state, int timeo);

#define TCP_DELACK_MAX	((unsigned)(HZ/5))	/* maximal time to delay before sending an ACK */

#define TCP_DELACK_MIN	((unsigned)(HZ/25))	/* minimal time to delay before sending an ACK */

#define TCP_ATO_MIN	((unsigned)(HZ/25))

#define TCP_RTO_MAX	((unsigned)(120*HZ))

#define TCP_RTO_MIN	((unsigned)(HZ/5))

#define TCP_TIMEOUT_INIT ((unsigned)(1*HZ))	/* RFC6298 2.1 initial RTO value	*/

#define TCP_TIMEOUT_FALLBACK ((unsigned)(3*HZ))	/* RFC 1122 initial RTO value, now
						 * used as a fallback RTO for the
						 * initial data transmission if no
						 * valid RTT sample has been acquired,
						 * most likely due to retrans in 3WHS.
						 */

#define TCP_RESOURCE_PROBE_INTERVAL ((unsigned)(HZ/2U)) /* Maximal interval between probes
					                 * for local resources.
					                 */

extern struct inet_timewait_death_row tcp_death_row;

extern int sysctl_tcp_timestamps;

extern int sysctl_tcp_window_scaling;

extern int sysctl_tcp_sack;

extern int sysctl_tcp_fastopen;

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

extern int sysctl_tcp_reordering;

extern int sysctl_tcp_max_reordering;

extern int sysctl_tcp_dsack;

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

extern int sysctl_tcp_moderate_rcvbuf;

extern int sysctl_tcp_tso_win_divisor;

extern int sysctl_tcp_workaround_signed_windows;

extern int sysctl_tcp_slow_start_after_idle;

extern int sysctl_tcp_thin_linear_timeouts;

extern int sysctl_tcp_thin_dupack;

extern int sysctl_tcp_early_retrans;

extern int sysctl_tcp_limit_output_bytes;

extern int sysctl_tcp_challenge_ack_limit;

extern int sysctl_tcp_min_tso_segs;

extern int sysctl_tcp_min_rtt_wlen;

extern int sysctl_tcp_autocorking;

extern int sysctl_tcp_invalid_ratelimit;

extern int sysctl_tcp_pacing_ss_ratio;

extern int sysctl_tcp_pacing_ca_ratio;

extern struct percpu_counter tcp_sockets_allocated;

extern int tcp_memory_pressure;

void sk_forced_mem_schedule(struct sock *sk, int size);

bool tcp_check_oom(struct sock *sk, int shift);

extern struct proto tcp_prot;

void tcp_v4_err(struct sk_buff *skb, u32);

void tcp_shutdown(struct sock *sk, int how);

void tcp_v4_early_demux(struct sk_buff *skb);

int tcp_v4_rcv(struct sk_buff *skb);

int tcp_v4_tw_remember_stamp(struct inet_timewait_sock *tw);

int tcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t size);

int tcp_sendpage(struct sock *sk, struct page *page, int offset, size_t size,
		 int flags);

void tcp_release_cb(struct sock *sk);

void tcp_wfree(struct sk_buff *skb);

void tcp_write_timer_handler(struct sock *sk);


static inline int tcp_win_from_space(int space)
{
	return sysctl_tcp_adv_win_scale<=0 ?
		(space>>(-sysctl_tcp_adv_win_scale)) :
		space - (space>>sysctl_tcp_adv_win_scale);
}


static inline void tcp_highest_sack_combine(struct sock *sk,
					    struct sk_buff *old,
					    struct sk_buff *new)
{
	if (tcp_sk(sk)->sacked_out && (old == tcp_sk(sk)->highest_sack))
		tcp_sk(sk)->highest_sack = new;
}

extern struct inet_hashinfo tcp_hashinfo;

extern struct percpu_counter tcp_orphan_count;

void tcp_time_wait(struct sock *sk, int state, int timeo);

extern struct inet_timewait_death_row tcp_death_row;

extern struct percpu_counter tcp_sockets_allocated;

void sk_forced_mem_schedule(struct sock *sk, int size);

bool tcp_check_oom(struct sock *sk, int shift);

extern struct proto tcp_prot;

void tcp_tasklet_init(void);

void tcp_v4_err(struct sk_buff *skb, u32);

void tcp_shutdown(struct sock *sk, int how);

void tcp_v4_early_demux(struct sk_buff *skb);

int tcp_v4_rcv(struct sk_buff *skb);

int tcp_v4_tw_remember_stamp(struct inet_timewait_sock *tw);

int tcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t size);

int tcp_sendpage(struct sock *sk, struct page *page, int offset, size_t size,
		 int flags);

void tcp_release_cb(struct sock *sk);

void tcp_wfree(struct sk_buff *skb);

void tcp_write_timer_handler(struct sock *sk);

void tcp_delack_timer_handler(struct sock *sk);

int tcp_ioctl(struct sock *sk, int cmd, unsigned long arg);

int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb);

void tcp_rcv_established(struct sock *sk, struct sk_buff *skb,
			 const struct tcphdr *th, unsigned int len);

void tcp_rcv_space_adjust(struct sock *sk);

int tcp_twsk_unique(struct sock *sk, struct sock *sktw, void *twp);

void tcp_twsk_destructor(struct sock *sk);

ssize_t tcp_splice_read(struct socket *sk, loff_t *ppos,
			struct pipe_inode_info *pipe, size_t len,
			unsigned int flags);

enum tcp_tw_status tcp_timewait_state_process(struct inet_timewait_sock *tw,
					      struct sk_buff *skb,
					      const struct tcphdr *th);

struct sock *tcp_check_req(struct sock *sk, struct sk_buff *skb,
			   struct request_sock *req, bool fastopen);

int tcp_child_process(struct sock *parent, struct sock *child,
		      struct sk_buff *skb);

void tcp_enter_loss(struct sock *sk);

void tcp_clear_retrans(struct tcp_sock *tp);

void tcp_update_metrics(struct sock *sk);

void tcp_init_metrics(struct sock *sk);

void tcp_metrics_init(void);

bool tcp_peer_is_proven(struct request_sock *req, struct dst_entry *dst,
			bool paws_check, bool timestamps);

bool tcp_remember_stamp(struct sock *sk);

bool tcp_tw_remember_stamp(struct inet_timewait_sock *tw);

void tcp_fetch_timewait_stamp(struct sock *sk, struct dst_entry *dst);

void tcp_disable_fack(struct tcp_sock *tp);

void tcp_close(struct sock *sk, long timeout);

void tcp_init_sock(struct sock *sk);

unsigned int tcp_poll(struct file *file, struct socket *sock,
		      struct poll_table_struct *wait);

int tcp_getsockopt(struct sock *sk, int level, int optname,
		   char __user *optval, int __user *optlen);

int tcp_setsockopt(struct sock *sk, int level, int optname,
		   char __user *optval, unsigned int optlen);

int compat_tcp_getsockopt(struct sock *sk, int level, int optname,
			  char __user *optval, int __user *optlen);

int compat_tcp_setsockopt(struct sock *sk, int level, int optname,
			  char __user *optval, unsigned int optlen);

void tcp_set_keepalive(struct sock *sk, int val);

void tcp_syn_ack_timeout(const struct request_sock *req);


static inline void tcp_dec_quickack_mode(struct sock *sk,
					 const unsigned int pkts)
{
	struct inet_connection_sock *icsk = inet_csk(sk);

	if (icsk->icsk_ack.quick) {
		if (pkts >= icsk->icsk_ack.quick) {
			icsk->icsk_ack.quick = 0;
			/* Leaving quickack mode we deflate ATO. */
			icsk->icsk_ack.ato   = TCP_ATO_MIN;
		} else
			icsk->icsk_ack.quick -= pkts;
	}
}

extern struct inet_hashinfo tcp_hashinfo;

extern struct percpu_counter tcp_orphan_count;

void tcp_time_wait(struct sock *sk, int state, int timeo);

#define TCP_DELACK_MAX	((unsigned)(HZ/5))	/* maximal time to delay before sending an ACK */

#define TCP_DELACK_MIN	((unsigned)(HZ/25))	/* minimal time to delay before sending an ACK */

#define TCP_ATO_MIN	((unsigned)(HZ/25))

#define TCP_ATO_MIN	4U

#define TCP_RTO_MAX	((unsigned)(120*HZ))

#define TCP_RTO_MIN	((unsigned)(HZ/5))

#define TCP_TIMEOUT_INIT ((unsigned)(1*HZ))	/* RFC6298 2.1 initial RTO value	*/

#define TCP_TIMEOUT_FALLBACK ((unsigned)(3*HZ))	/* RFC 1122 initial RTO value, now
						 * used as a fallback RTO for the
						 * initial data transmission if no
						 * valid RTT sample has been acquired,
						 * most likely due to retrans in 3WHS.
						 */

#define TCP_RESOURCE_PROBE_INTERVAL ((unsigned)(HZ/2U)) /* Maximal interval between probes
					                 * for local resources.
					                 */

extern struct inet_timewait_death_row tcp_death_row;

extern int sysctl_tcp_timestamps;

extern int sysctl_tcp_window_scaling;

extern int sysctl_tcp_sack;

extern int sysctl_tcp_fastopen;

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

extern int sysctl_tcp_reordering;

extern int sysctl_tcp_max_reordering;

extern int sysctl_tcp_dsack;

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

extern int sysctl_tcp_moderate_rcvbuf;

extern int sysctl_tcp_tso_win_divisor;

extern int sysctl_tcp_workaround_signed_windows;

extern int sysctl_tcp_slow_start_after_idle;

extern int sysctl_tcp_thin_linear_timeouts;

extern int sysctl_tcp_thin_dupack;

extern int sysctl_tcp_early_retrans;

extern int sysctl_tcp_limit_output_bytes;

extern int sysctl_tcp_challenge_ack_limit;

extern int sysctl_tcp_min_tso_segs;

extern int sysctl_tcp_min_rtt_wlen;

extern int sysctl_tcp_autocorking;

extern int sysctl_tcp_invalid_ratelimit;

extern int sysctl_tcp_pacing_ss_ratio;

extern int sysctl_tcp_pacing_ca_ratio;

extern struct percpu_counter tcp_sockets_allocated;

extern int tcp_memory_pressure;

void sk_forced_mem_schedule(struct sock *sk, int size);

bool tcp_check_oom(struct sock *sk, int shift);

extern struct proto tcp_prot;

void tcp_tasklet_init(void);

void tcp_v4_err(struct sk_buff *skb, u32);

void tcp_shutdown(struct sock *sk, int how);

void tcp_v4_early_demux(struct sk_buff *skb);

int tcp_v4_rcv(struct sk_buff *skb);

int tcp_v4_tw_remember_stamp(struct inet_timewait_sock *tw);

int tcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t size);

int tcp_sendpage(struct sock *sk, struct page *page, int offset, size_t size,
		 int flags);

void tcp_release_cb(struct sock *sk);


static inline void tcp_listendrop(const struct sock *sk)
{
	atomic_inc(&((struct sock *)sk)->sk_drops);
	__NET_INC_STATS(sock_net(sk), LINUX_MIB_LISTENDROPS);
}


static inline struct sk_buff *tcp_write_queue_next(const struct sock *sk,
						   const struct sk_buff *skb)
{
	return skb_queue_next(&sk->sk_write_queue, skb);
}


static inline bool tcp_paws_reject(const struct tcp_options_received *rx_opt,
				   int rst)
{
	if (tcp_paws_check(rx_opt, 0))
		return false;

	/* RST segments are not recommended to carry timestamp,
	   and, if they do, it is recommended to ignore PAWS because
	   "their cleanup function should take precedence over timestamps."
	   Certainly, it is mistake. It is necessary to understand the reasons
	   of this constraint to relax it: if peer reboots, clock may go
	   out-of-sync and half-open connections will not be reset.
	   Actually, the problem would be not existing if all
	   the implementations followed draft about maintaining clock
	   via reboots. Linux-2.2 DOES NOT!

	   However, we can relax time bounds for RST segments to MSL.
	 */
	if (rst && get_seconds() >= rx_opt->ts_recent_stamp + TCP_PAWS_MSL)
		return false;
	return true;
}

extern struct inet_hashinfo tcp_hashinfo;

extern struct percpu_counter tcp_orphan_count;

void tcp_time_wait(struct sock *sk, int state, int timeo);

#define TCP_RETR1	3	/*
				 * This is how many retries it does before it
				 * tries to figure out if the gateway is
				 * down. Minimal RFC value is 3; it corresponds
				 * to ~3sec-8min depending on RTO.
				 */

#define TCP_RETR2	15	/*
				 * This should take at least
				 * 90 minutes to time out.
				 * RFC1122 says that the limit is 100 sec.
				 * 15 is ~13-30min depending on RTO.
				 */

#define TCP_SYN_RETRIES	 6	/* This is how many retries are done
				 * when active opening a connection.
				 * RFC1122 says the minimum retry MUST
				 * be at least 180secs.  Nevertheless
				 * this value is corresponding to
				 * 63secs of retransmission with the
				 * current initial RTO.
				 */

#define TCP_SYNACK_RETRIES 5	/* This is how may retries are done
				 * when passive opening a connection.
				 * This is corresponding to 31secs of
				 * retransmission with the current
				 * initial RTO.
				 */

#define TCP_TIMEWAIT_LEN (60*HZ) /* how long to wait to destroy TIME-WAIT
				  * state, about 60 seconds	*/

#define TCP_DELACK_MAX	((unsigned)(HZ/5))	/* maximal time to delay before sending an ACK */

#define TCP_DELACK_MIN	((unsigned)(HZ/25))	/* minimal time to delay before sending an ACK */

#define TCP_TIMEOUT_FALLBACK ((unsigned)(3*HZ))	/* RFC 1122 initial RTO value, now
						 * used as a fallback RTO for the
						 * initial data transmission if no
						 * valid RTT sample has been acquired,
						 * most likely due to retrans in 3WHS.
						 */

#define TCP_RESOURCE_PROBE_INTERVAL ((unsigned)(HZ/2U)) /* Maximal interval between probes
					                 * for local resources.
					                 */

#define TCP_PAWS_MSL	60		/* Per-host timestamps are invalidated
					 * after this time. It should be equal
					 * (or greater than) TCP_TIMEWAIT_LEN
					 * to provide reliability equal to one
					 * provided by timewait state.
					 */

#define TCP_PAWS_WINDOW	1		/* Replay window for per-host
					 * timestamps. It must be less than
					 * minimal timewait lifetime.
					 */

#define TCPOPT_TIMESTAMP	8	/* Better RTT estimations/PAWS */

#define TCPOPT_FASTOPEN		34	/* Fast open (RFC7413) */

#define TCP_NAGLE_PUSH		4	/* Cork is overridden for already queued data */

extern struct inet_timewait_death_row tcp_death_row;

extern int sysctl_tcp_timestamps;

extern int sysctl_tcp_window_scaling;

extern int sysctl_tcp_sack;

extern int sysctl_tcp_fastopen;

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

extern int sysctl_tcp_reordering;

extern int sysctl_tcp_max_reordering;

extern int sysctl_tcp_dsack;

extern int sysctl_tcp_wmem[3];

extern int sysctl_tcp_rmem[3];

extern int sysctl_tcp_app_win;


static inline void __tcp_add_write_queue_tail(struct sock *sk, struct sk_buff *skb)
{
	__skb_queue_tail(&sk->sk_write_queue, skb);
}


static inline void __tcp_add_write_queue_head(struct sock *sk, struct sk_buff *skb)
{
	__skb_queue_head(&sk->sk_write_queue, skb);
}


static inline int tcp_v6_iif(const struct sk_buff *skb)
{
	bool l3_slave = skb_l3mdev_slave(TCP_SKB_CB(skb)->header.h6.flags);

	return l3_slave ? skb->skb_iif : TCP_SKB_CB(skb)->header.h6.iif;
}


static inline unsigned long tcp_probe0_when(const struct sock *sk,
					    unsigned long max_when)
{
	u64 when = (u64)tcp_probe0_base(sk) << inet_csk(sk)->icsk_backoff;

	return (unsigned long)min_t(u64, when, max_when);
}

extern struct inet_hashinfo tcp_hashinfo;

extern struct percpu_counter tcp_orphan_count;

void tcp_time_wait(struct sock *sk, int state, int timeo);

#define TCP_SYN_RETRIES	 6	/* This is how many retries are done
				 * when active opening a connection.
				 * RFC1122 says the minimum retry MUST
				 * be at least 180secs.  Nevertheless
				 * this value is corresponding to
				 * 63secs of retransmission with the
				 * current initial RTO.
				 */

#define TCP_SYNACK_RETRIES 5	/* This is how may retries are done
				 * when passive opening a connection.
				 * This is corresponding to 31secs of
				 * retransmission with the current
				 * initial RTO.
				 */

#define TCP_TIMEWAIT_LEN (60*HZ) /* how long to wait to destroy TIME-WAIT
				  * state, about 60 seconds	*/

#define TCP_DELACK_MAX	((unsigned)(HZ/5))	/* maximal time to delay before sending an ACK */

#define TCP_DELACK_MIN	((unsigned)(HZ/25))	/* minimal time to delay before sending an ACK */

#define TCP_ATO_MIN	((unsigned)(HZ/25))

#define TCP_RTO_MAX	((unsigned)(120*HZ))

#define TCP_RTO_MIN	((unsigned)(HZ/5))

#define TCP_TIMEOUT_INIT ((unsigned)(1*HZ))	/* RFC6298 2.1 initial RTO value	*/

#define TCP_TIMEOUT_FALLBACK ((unsigned)(3*HZ))	/* RFC 1122 initial RTO value, now
						 * used as a fallback RTO for the
						 * initial data transmission if no
						 * valid RTT sample has been acquired,
						 * most likely due to retrans in 3WHS.
						 */

#define TCP_RESOURCE_PROBE_INTERVAL ((unsigned)(HZ/2U)) /* Maximal interval between probes
					                 * for local resources.
					                 */

extern struct inet_timewait_death_row tcp_death_row;

extern long sysctl_tcp_mem[3];

extern struct percpu_counter tcp_sockets_allocated;

void sk_forced_mem_schedule(struct sock *sk, int size);

bool tcp_check_oom(struct sock *sk, int shift);

extern struct proto tcp_prot;

void tcp_v4_err(struct sk_buff *skb, u32);

void tcp_shutdown(struct sock *sk, int how);

void tcp_v4_early_demux(struct sk_buff *skb);

int tcp_v4_rcv(struct sk_buff *skb);

int tcp_v4_tw_remember_stamp(struct inet_timewait_sock *tw);

int tcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t size);

int tcp_sendpage(struct sock *sk, struct page *page, int offset, size_t size,
		 int flags);

void tcp_release_cb(struct sock *sk);

void tcp_wfree(struct sk_buff *skb);

void tcp_write_timer_handler(struct sock *sk);

void tcp_delack_timer_handler(struct sock *sk);

int tcp_ioctl(struct sock *sk, int cmd, unsigned long arg);

int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb);

void tcp_rcv_established(struct sock *sk, struct sk_buff *skb,
			 const struct tcphdr *th, unsigned int len);

void tcp_rcv_space_adjust(struct sock *sk);

int tcp_twsk_unique(struct sock *sk, struct sock *sktw, void *twp);

void tcp_twsk_destructor(struct sock *sk);

ssize_t tcp_splice_read(struct socket *sk, loff_t *ppos,
			struct pipe_inode_info *pipe, size_t len,
			unsigned int flags);


static inline bool tcp_in_initial_slowstart(const struct tcp_sock *tp)
{
	return tp->snd_ssthresh >= TCP_INFINITE_SSTHRESH;
}

extern struct inet_hashinfo tcp_hashinfo;

extern struct percpu_counter tcp_orphan_count;

void tcp_time_wait(struct sock *sk, int state, int timeo);

extern struct inet_timewait_death_row tcp_death_row;

extern struct percpu_counter tcp_sockets_allocated;

void sk_forced_mem_schedule(struct sock *sk, int size);

bool tcp_check_oom(struct sock *sk, int shift);

extern struct proto tcp_prot;

void tcp_v4_err(struct sk_buff *skb, u32);

void tcp_shutdown(struct sock *sk, int how);

void tcp_v4_early_demux(struct sk_buff *skb);

int tcp_v4_rcv(struct sk_buff *skb);

int tcp_v4_tw_remember_stamp(struct inet_timewait_sock *tw);

int tcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t size);

int tcp_sendpage(struct sock *sk, struct page *page, int offset, size_t size,
		 int flags);

void tcp_release_cb(struct sock *sk);

void tcp_wfree(struct sk_buff *skb);

void tcp_write_timer_handler(struct sock *sk);

void tcp_delack_timer_handler(struct sock *sk);

int tcp_ioctl(struct sock *sk, int cmd, unsigned long arg);

int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb);

void tcp_rcv_established(struct sock *sk, struct sk_buff *skb,
			 const struct tcphdr *th, unsigned int len);

void tcp_rcv_space_adjust(struct sock *sk);

int tcp_twsk_unique(struct sock *sk, struct sock *sktw, void *twp);

void tcp_twsk_destructor(struct sock *sk);

ssize_t tcp_splice_read(struct socket *sk, loff_t *ppos,
			struct pipe_inode_info *pipe, size_t len,
			unsigned int flags);

enum tcp_tw_status tcp_timewait_state_process(struct inet_timewait_sock *tw,
					      struct sk_buff *skb,
					      const struct tcphdr *th);

struct sock *tcp_check_req(struct sock *sk, struct sk_buff *skb,
			   struct request_sock *req, bool fastopen);

int tcp_child_process(struct sock *parent, struct sock *child,
		      struct sk_buff *skb);

void tcp_enter_loss(struct sock *sk);

void tcp_clear_retrans(struct tcp_sock *tp);

void tcp_update_metrics(struct sock *sk);

void tcp_init_metrics(struct sock *sk);

bool tcp_peer_is_proven(struct request_sock *req, struct dst_entry *dst,
			bool paws_check, bool timestamps);

bool tcp_remember_stamp(struct sock *sk);

bool tcp_tw_remember_stamp(struct inet_timewait_sock *tw);

void tcp_fetch_timewait_stamp(struct sock *sk, struct dst_entry *dst);

void tcp_disable_fack(struct tcp_sock *tp);

void tcp_close(struct sock *sk, long timeout);

void tcp_init_sock(struct sock *sk);

unsigned int tcp_poll(struct file *file, struct socket *sock,
		      struct poll_table_struct *wait);

int tcp_getsockopt(struct sock *sk, int level, int optname,
		   char __user *optval, int __user *optlen);

int tcp_setsockopt(struct sock *sk, int level, int optname,
		   char __user *optval, unsigned int optlen);

int compat_tcp_getsockopt(struct sock *sk, int level, int optname,
			  char __user *optval, int __user *optlen);

int compat_tcp_setsockopt(struct sock *sk, int level, int optname,
			  char __user *optval, unsigned int optlen);

void tcp_set_keepalive(struct sock *sk, int val);

void tcp_syn_ack_timeout(const struct request_sock *req);


static inline unsigned long tcp_probe0_base(const struct sock *sk)
{
	return max_t(unsigned long, inet_csk(sk)->icsk_rto, TCP_RTO_MIN);
}


static inline void tcp_insert_write_queue_after(struct sk_buff *skb,
						struct sk_buff *buff,
						struct sock *sk)
{
	__skb_queue_after(&sk->sk_write_queue, skb, buff);
}


static inline bool tcp_under_memory_pressure(const struct sock *sk)
{
	if (mem_cgroup_sockets_enabled && sk->sk_memcg &&
	    mem_cgroup_under_socket_pressure(sk->sk_memcg))
		return true;

	return tcp_memory_pressure;
}

extern struct inet_hashinfo tcp_hashinfo;

extern struct percpu_counter tcp_orphan_count;

void tcp_time_wait(struct sock *sk, int state, int timeo);

extern struct inet_timewait_death_row tcp_death_row;

extern struct percpu_counter tcp_sockets_allocated;

extern int tcp_memory_pressure;

void sk_forced_mem_schedule(struct sock *sk, int size);

bool tcp_check_oom(struct sock *sk, int shift);

extern struct proto tcp_prot;

void tcp_v4_err(struct sk_buff *skb, u32);

void tcp_shutdown(struct sock *sk, int how);

void tcp_v4_early_demux(struct sk_buff *skb);

int tcp_v4_rcv(struct sk_buff *skb);

int tcp_v4_tw_remember_stamp(struct inet_timewait_sock *tw);

int tcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t size);

int tcp_sendpage(struct sock *sk, struct page *page, int offset, size_t size,
		 int flags);

void tcp_release_cb(struct sock *sk);

void tcp_wfree(struct sk_buff *skb);

void tcp_write_timer_handler(struct sock *sk);

void tcp_delack_timer_handler(struct sock *sk);

int tcp_ioctl(struct sock *sk, int cmd, unsigned long arg);

int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb);

void tcp_rcv_established(struct sock *sk, struct sk_buff *skb,
			 const struct tcphdr *th, unsigned int len);

void tcp_rcv_space_adjust(struct sock *sk);

int tcp_twsk_unique(struct sock *sk, struct sock *sktw, void *twp);

void tcp_twsk_destructor(struct sock *sk);

ssize_t tcp_splice_read(struct socket *sk, loff_t *ppos,
			struct pipe_inode_info *pipe, size_t len,
			unsigned int flags);

enum tcp_tw_status tcp_timewait_state_process(struct inet_timewait_sock *tw,
					      struct sk_buff *skb,
					      const struct tcphdr *th);

struct sock *tcp_check_req(struct sock *sk, struct sk_buff *skb,
			   struct request_sock *req, bool fastopen);

int tcp_child_process(struct sock *parent, struct sock *child,
		      struct sk_buff *skb);

void tcp_enter_loss(struct sock *sk);

void tcp_clear_retrans(struct tcp_sock *tp);

void tcp_update_metrics(struct sock *sk);

void tcp_init_metrics(struct sock *sk);

bool tcp_peer_is_proven(struct request_sock *req, struct dst_entry *dst,
			bool paws_check, bool timestamps);

bool tcp_remember_stamp(struct sock *sk);

bool tcp_tw_remember_stamp(struct inet_timewait_sock *tw);

void tcp_fetch_timewait_stamp(struct sock *sk, struct dst_entry *dst);

void tcp_disable_fack(struct tcp_sock *tp);

void tcp_close(struct sock *sk, long timeout);

void tcp_init_sock(struct sock *sk);

unsigned int tcp_poll(struct file *file, struct socket *sock,
		      struct poll_table_struct *wait);

int tcp_getsockopt(struct sock *sk, int level, int optname,
		   char __user *optval, int __user *optlen);

int tcp_setsockopt(struct sock *sk, int level, int optname,
		   char __user *optval, unsigned int optlen);

int compat_tcp_getsockopt(struct sock *sk, int level, int optname,
			  char __user *optval, int __user *optlen);

int compat_tcp_setsockopt(struct sock *sk, int level, int optname,
			  char __user *optval, unsigned int optlen);

void tcp_set_keepalive(struct sock *sk, int val);

void tcp_syn_ack_timeout(const struct request_sock *req);


static inline __u32 cookie_init_sequence(const struct tcp_request_sock_ops *ops,
					 const struct sock *sk, struct sk_buff *skb,
					 __u16 *mss)
{
	return 0;
}


static inline void tcp_push_pending_frames(struct sock *sk)
{
	if (tcp_send_head(sk)) {
		struct tcp_sock *tp = tcp_sk(sk);

		__tcp_push_pending_frames(sk, tcp_current_mss(sk), tp->nonagle);
	}
}


static inline struct sk_buff *tcp_write_queue_tail(const struct sock *sk)
{
	return skb_peek_tail(&sk->sk_write_queue);
}


static inline void tcp_add_write_queue_tail(struct sock *sk, struct sk_buff *skb)
{
	__tcp_add_write_queue_tail(sk, skb);

	/* Queue it, remembering where we must start sending. */
	if (sk->sk_send_head == NULL) {
		sk->sk_send_head = skb;

		if (tcp_sk(sk)->highest_sack == NULL)
			tcp_sk(sk)->highest_sack = skb;
	}
}

extern struct inet_hashinfo tcp_hashinfo;

extern struct percpu_counter tcp_orphan_count;

void tcp_time_wait(struct sock *sk, int state, int timeo);

#define TCP_DELACK_MAX	((unsigned)(HZ/5))	/* maximal time to delay before sending an ACK */

#define TCP_DELACK_MIN	((unsigned)(HZ/25))	/* minimal time to delay before sending an ACK */

#define TCP_PAWS_WINDOW	1		/* Replay window for per-host
					 * timestamps. It must be less than
					 * minimal timewait lifetime.
					 */

extern struct inet_timewait_death_row tcp_death_row;

extern struct percpu_counter tcp_sockets_allocated;

void sk_forced_mem_schedule(struct sock *sk, int size);

bool tcp_check_oom(struct sock *sk, int shift);

extern struct proto tcp_prot;

void tcp_tasklet_init(void);

void tcp_v4_err(struct sk_buff *skb, u32);

void tcp_shutdown(struct sock *sk, int how);

void tcp_v4_early_demux(struct sk_buff *skb);

int tcp_v4_rcv(struct sk_buff *skb);

int tcp_v4_tw_remember_stamp(struct inet_timewait_sock *tw);

int tcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t size);

int tcp_sendpage(struct sock *sk, struct page *page, int offset, size_t size,
		 int flags);

void tcp_release_cb(struct sock *sk);

void tcp_wfree(struct sk_buff *skb);

void tcp_write_timer_handler(struct sock *sk);

void tcp_delack_timer_handler(struct sock *sk);

int tcp_ioctl(struct sock *sk, int cmd, unsigned long arg);

int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb);

void tcp_rcv_established(struct sock *sk, struct sk_buff *skb,
			 const struct tcphdr *th, unsigned int len);

void tcp_rcv_space_adjust(struct sock *sk);

int tcp_twsk_unique(struct sock *sk, struct sock *sktw, void *twp);

void tcp_twsk_destructor(struct sock *sk);

ssize_t tcp_splice_read(struct socket *sk, loff_t *ppos,
			struct pipe_inode_info *pipe, size_t len,
			unsigned int flags);

enum tcp_tw_status tcp_timewait_state_process(struct inet_timewait_sock *tw,
					      struct sk_buff *skb,
					      const struct tcphdr *th);

struct sock *tcp_check_req(struct sock *sk, struct sk_buff *skb,
			   struct request_sock *req, bool fastopen);

int tcp_child_process(struct sock *parent, struct sock *child,
		      struct sk_buff *skb);

void tcp_enter_loss(struct sock *sk);

void tcp_clear_retrans(struct tcp_sock *tp);

void tcp_update_metrics(struct sock *sk);

void tcp_init_metrics(struct sock *sk);

void tcp_metrics_init(void);

bool tcp_peer_is_proven(struct request_sock *req, struct dst_entry *dst,
			bool paws_check, bool timestamps);

bool tcp_remember_stamp(struct sock *sk);

bool tcp_tw_remember_stamp(struct inet_timewait_sock *tw);

void tcp_fetch_timewait_stamp(struct sock *sk, struct dst_entry *dst);

void tcp_disable_fack(struct tcp_sock *tp);

void tcp_close(struct sock *sk, long timeout);

void tcp_init_sock(struct sock *sk);

unsigned int tcp_poll(struct file *file, struct socket *sock,
		      struct poll_table_struct *wait);

int tcp_getsockopt(struct sock *sk, int level, int optname,
		   char __user *optval, int __user *optlen);

int tcp_setsockopt(struct sock *sk, int level, int optname,
		   char __user *optval, unsigned int optlen);


static inline bool tcp_write_queue_empty(struct sock *sk)
{
	return skb_queue_empty(&sk->sk_write_queue);
}


static inline struct sk_buff *tcp_highest_sack(struct sock *sk)
{
	return tcp_sk(sk)->highest_sack;
}


static inline void tcp_ca_event(struct sock *sk, const enum tcp_ca_event event)
{
	const struct inet_connection_sock *icsk = inet_csk(sk);

	if (icsk->icsk_ca_ops->cwnd_event)
		icsk->icsk_ca_ops->cwnd_event(sk, event);
}

extern struct inet_hashinfo tcp_hashinfo;

extern struct percpu_counter tcp_orphan_count;

void tcp_time_wait(struct sock *sk, int state, int timeo);

extern struct inet_timewait_death_row tcp_death_row;

extern struct percpu_counter tcp_sockets_allocated;

void sk_forced_mem_schedule(struct sock *sk, int size);

bool tcp_check_oom(struct sock *sk, int shift);

extern struct proto tcp_prot;

void tcp_tasklet_init(void);

void tcp_v4_err(struct sk_buff *skb, u32);

void tcp_shutdown(struct sock *sk, int how);

void tcp_v4_early_demux(struct sk_buff *skb);

int tcp_v4_rcv(struct sk_buff *skb);

int tcp_v4_tw_remember_stamp(struct inet_timewait_sock *tw);

int tcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t size);

int tcp_sendpage(struct sock *sk, struct page *page, int offset, size_t size,
		 int flags);

void tcp_release_cb(struct sock *sk);

void tcp_wfree(struct sk_buff *skb);

void tcp_write_timer_handler(struct sock *sk);

void tcp_delack_timer_handler(struct sock *sk);

int tcp_ioctl(struct sock *sk, int cmd, unsigned long arg);

int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb);

void tcp_rcv_established(struct sock *sk, struct sk_buff *skb,
			 const struct tcphdr *th, unsigned int len);

void tcp_rcv_space_adjust(struct sock *sk);

int tcp_twsk_unique(struct sock *sk, struct sock *sktw, void *twp);

void tcp_twsk_destructor(struct sock *sk);

ssize_t tcp_splice_read(struct socket *sk, loff_t *ppos,
			struct pipe_inode_info *pipe, size_t len,
			unsigned int flags);

enum tcp_tw_status {
	TCP_TW_SUCCESS = 0,
	TCP_TW_RST = 1,
	TCP_TW_ACK = 2,
	TCP_TW_SYN = 3
}

enum tcp_tw_status tcp_timewait_state_process(struct inet_timewait_sock *tw,
					      struct sk_buff *skb,
					      const struct tcphdr *th);

struct sock *tcp_check_req(struct sock *sk, struct sk_buff *skb,
			   struct request_sock *req, bool fastopen);

int tcp_child_process(struct sock *parent, struct sock *child,
		      struct sk_buff *skb);

void tcp_enter_loss(struct sock *sk);

void tcp_clear_retrans(struct tcp_sock *tp);

void tcp_update_metrics(struct sock *sk);

void tcp_init_metrics(struct sock *sk);

void tcp_metrics_init(void);

bool tcp_peer_is_proven(struct request_sock *req, struct dst_entry *dst,
			bool paws_check, bool timestamps);

bool tcp_remember_stamp(struct sock *sk);

bool tcp_tw_remember_stamp(struct inet_timewait_sock *tw);

void tcp_fetch_timewait_stamp(struct sock *sk, struct dst_entry *dst);

void tcp_disable_fack(struct tcp_sock *tp);

void tcp_close(struct sock *sk, long timeout);

void tcp_init_sock(struct sock *sk);

unsigned int tcp_poll(struct file *file, struct socket *sock,
		      struct poll_table_struct *wait);

int tcp_getsockopt(struct sock *sk, int level, int optname,
		   char __user *optval, int __user *optlen);

int tcp_setsockopt(struct sock *sk, int level, int optname,
		   char __user *optval, unsigned int optlen);

int compat_tcp_getsockopt(struct sock *sk, int level, int optname,
			  char __user *optval, int __user *optlen);


static inline void tcp_clear_retrans_hints_partial(struct tcp_sock *tp)
{
	tp->lost_skb_hint = NULL;
}


static inline __sum16 __tcp_checksum_complete(struct sk_buff *skb)
{
	return __skb_checksum_complete(skb);
}


static inline void tcp_set_ca_state(struct sock *sk, const u8 ca_state)
{
	struct inet_connection_sock *icsk = inet_csk(sk);

	if (icsk->icsk_ca_ops->set_state)
		icsk->icsk_ca_ops->set_state(sk, ca_state);
	icsk->icsk_ca_state = ca_state;
}


static inline void skb_set_tcp_pure_ack(struct sk_buff *skb)
{
	skb->truesize = 2;
}


static inline void tcp_advance_send_head(struct sock *sk, const struct sk_buff *skb)
{
	if (tcp_skb_is_last(sk, skb))
		sk->sk_send_head = NULL;
	else
		sk->sk_send_head = tcp_write_queue_next(sk, skb);
}


static inline bool tcp_is_cwnd_limited(const struct sock *sk)
{
	const struct tcp_sock *tp = tcp_sk(sk);

	/* If in slow start, ensure cwnd grows to twice what was ACKed. */
	if (tcp_in_slow_start(tp))
		return tp->snd_cwnd < 2 * tp->max_packets_out;

	return tp->is_cwnd_limited;
}


static inline __u32 tcp_max_tso_deferred_mss(const struct tcp_sock *tp)
{
	return 3;
}


static inline u32 tcp_rto_min(struct sock *sk)
{
	const struct dst_entry *dst = __sk_dst_get(sk);
	u32 rto_min = TCP_RTO_MIN;

	if (dst && dst_metric_locked(dst, RTAX_RTO_MIN))
		rto_min = dst_metric_rtt(dst, RTAX_RTO_MIN);
	return rto_min;
}

extern struct inet_hashinfo tcp_hashinfo;

extern struct percpu_counter tcp_orphan_count;

void tcp_time_wait(struct sock *sk, int state, int timeo);

#define TCP_RTO_MIN	((unsigned)(HZ/5))

extern struct inet_timewait_death_row tcp_death_row;

extern struct percpu_counter tcp_sockets_allocated;

void sk_forced_mem_schedule(struct sock *sk, int size);

bool tcp_check_oom(struct sock *sk, int shift);

extern struct proto tcp_prot;

void tcp_v4_err(struct sk_buff *skb, u32);

void tcp_shutdown(struct sock *sk, int how);

void tcp_v4_early_demux(struct sk_buff *skb);

int tcp_v4_rcv(struct sk_buff *skb);

int tcp_v4_tw_remember_stamp(struct inet_timewait_sock *tw);

int tcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t size);

int tcp_sendpage(struct sock *sk, struct page *page, int offset, size_t size,
		 int flags);

void tcp_release_cb(struct sock *sk);

void tcp_wfree(struct sk_buff *skb);

void tcp_write_timer_handler(struct sock *sk);

void tcp_delack_timer_handler(struct sock *sk);

int tcp_ioctl(struct sock *sk, int cmd, unsigned long arg);

int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb);

void tcp_rcv_established(struct sock *sk, struct sk_buff *skb,
			 const struct tcphdr *th, unsigned int len);

void tcp_rcv_space_adjust(struct sock *sk);

int tcp_twsk_unique(struct sock *sk, struct sock *sktw, void *twp);

void tcp_twsk_destructor(struct sock *sk);

ssize_t tcp_splice_read(struct socket *sk, loff_t *ppos,
			struct pipe_inode_info *pipe, size_t len,
			unsigned int flags);

enum tcp_tw_status tcp_timewait_state_process(struct inet_timewait_sock *tw,
					      struct sk_buff *skb,
					      const struct tcphdr *th);

struct sock *tcp_check_req(struct sock *sk, struct sk_buff *skb,
			   struct request_sock *req, bool fastopen);

int tcp_child_process(struct sock *parent, struct sock *child,
		      struct sk_buff *skb);

void tcp_enter_loss(struct sock *sk);

void tcp_clear_retrans(struct tcp_sock *tp);

void tcp_update_metrics(struct sock *sk);

void tcp_init_metrics(struct sock *sk);

bool tcp_peer_is_proven(struct request_sock *req, struct dst_entry *dst,
			bool paws_check, bool timestamps);

bool tcp_remember_stamp(struct sock *sk);

bool tcp_tw_remember_stamp(struct inet_timewait_sock *tw);

void tcp_fetch_timewait_stamp(struct sock *sk, struct dst_entry *dst);

void tcp_disable_fack(struct tcp_sock *tp);

void tcp_close(struct sock *sk, long timeout);

void tcp_init_sock(struct sock *sk);

unsigned int tcp_poll(struct file *file, struct socket *sock,
		      struct poll_table_struct *wait);

int tcp_getsockopt(struct sock *sk, int level, int optname,
		   char __user *optval, int __user *optlen);

int tcp_setsockopt(struct sock *sk, int level, int optname,
		   char __user *optval, unsigned int optlen);

int compat_tcp_getsockopt(struct sock *sk, int level, int optname,
			  char __user *optval, int __user *optlen);

int compat_tcp_setsockopt(struct sock *sk, int level, int optname,
			  char __user *optval, unsigned int optlen);

void tcp_set_keepalive(struct sock *sk, int val);

void tcp_syn_ack_timeout(const struct request_sock *req);


static inline unsigned int tcp_left_out(const struct tcp_sock *tp)
{
	return tp->sacked_out + tp->lost_out;
}


static inline bool tcp_out_of_memory(struct sock *sk)
{
	if (sk->sk_wmem_queued > SOCK_MIN_SNDBUF &&
	    sk_memory_allocated(sk) > sk_prot_mem_limits(sk, 2))
		return true;
	return false;
}


static inline bool tcp_in_cwnd_reduction(const struct sock *sk)
{
	return (TCPF_CA_CWR | TCPF_CA_Recovery) &
	       (1 << inet_csk(sk)->icsk_ca_state);
}