diff options
Diffstat (limited to 'net/mptcp/protocol.h')
| -rw-r--r-- | net/mptcp/protocol.h | 49 | 
1 files changed, 46 insertions, 3 deletions
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index a10ebf3ee10a..7aa47e2dd52b 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -12,8 +12,7 @@  #include <net/inet_connection_sock.h>  #include <uapi/linux/mptcp.h>  #include <net/genetlink.h> - -#include "mptcp_pm_gen.h" +#include <net/rstreason.h>  #define MPTCP_SUPPORTED_VERSION	1 @@ -282,6 +281,9 @@ struct mptcp_sock {  	u64		bytes_acked;  	u64		snd_una;  	u64		wnd_end; +	u32		last_data_sent; +	u32		last_data_recv; +	u32		last_ack_recv;  	unsigned long	timer_ival;  	u32		token;  	int		rmem_released; @@ -308,6 +310,9 @@ struct mptcp_sock {  			free_first:1,  			rcvspace_init:1;  	u32		notsent_lowat; +	int		keepalive_cnt; +	int		keepalive_idle; +	int		keepalive_intvl;  	struct work_struct work;  	struct sk_buff  *ooo_last_skb;  	struct rb_root  out_of_order_queue; @@ -558,7 +563,7 @@ struct mptcp_subflow_context {  static inline struct mptcp_subflow_context *  mptcp_subflow_ctx(const struct sock *sk)  { -	struct inet_connection_sock *icsk = inet_csk(sk); +	const struct inet_connection_sock *icsk = inet_csk(sk);  	/* Use RCU on icsk_ulp_data only for sock diag code */  	return (__force struct mptcp_subflow_context *)icsk->icsk_ulp_data; @@ -578,6 +583,43 @@ mptcp_subflow_ctx_reset(struct mptcp_subflow_context *subflow)  	WRITE_ONCE(subflow->local_id, -1);  } +/* Convert reset reasons in MPTCP to enum sk_rst_reason type */ +static inline enum sk_rst_reason +sk_rst_convert_mptcp_reason(u32 reason) +{ +	switch (reason) { +	case MPTCP_RST_EUNSPEC: +		return SK_RST_REASON_MPTCP_RST_EUNSPEC; +	case MPTCP_RST_EMPTCP: +		return SK_RST_REASON_MPTCP_RST_EMPTCP; +	case MPTCP_RST_ERESOURCE: +		return SK_RST_REASON_MPTCP_RST_ERESOURCE; +	case MPTCP_RST_EPROHIBIT: +		return SK_RST_REASON_MPTCP_RST_EPROHIBIT; +	case MPTCP_RST_EWQ2BIG: +		return SK_RST_REASON_MPTCP_RST_EWQ2BIG; +	case MPTCP_RST_EBADPERF: +		return SK_RST_REASON_MPTCP_RST_EBADPERF; +	case MPTCP_RST_EMIDDLEBOX: +		return SK_RST_REASON_MPTCP_RST_EMIDDLEBOX; +	default: +		/* It should not happen, or else errors may occur +		 * in MPTCP layer +		 */ +		return SK_RST_REASON_ERROR; +	} +} + +static inline void +mptcp_send_active_reset_reason(struct sock *sk) +{ +	struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); +	enum sk_rst_reason reason; + +	reason = sk_rst_convert_mptcp_reason(subflow->reset_reason); +	tcp_send_active_reset(sk, GFP_ATOMIC, reason); +} +  static inline u64  mptcp_subflow_get_map_offset(const struct mptcp_subflow_context *subflow)  { @@ -642,6 +684,7 @@ unsigned int mptcp_stale_loss_cnt(const struct net *net);  unsigned int mptcp_close_timeout(const struct sock *sk);  int mptcp_get_pm_type(const struct net *net);  const char *mptcp_get_scheduler(const struct net *net); +void mptcp_get_available_schedulers(char *buf, size_t maxlen);  void __mptcp_subflow_fully_established(struct mptcp_sock *msk,  				       struct mptcp_subflow_context *subflow,  				       const struct mptcp_options_received *mp_opt);  |