All of lore.kernel.org
 help / color / mirror / Atom feed
* [MPTCP] [RFC 3/9] Introduce MPTCP specific elements that can be under #ifdef MPTCP_CONFIG
@ 2018-02-22 23:49 rao.shoaib
  0 siblings, 0 replies; 3+ messages in thread
From: rao.shoaib @ 2018-02-22 23:49 UTC (permalink / raw)
  To: mptcp

[-- Attachment #1: Type: text/plain, Size: 6321 bytes --]

From: Rao Shoaib <rao.shoaib(a)oracle.com>

Signed-off-by: Rao Shoaib <rao.shoaib(a)oracle.com>
---
 include/linux/tcp.h      | 78 ++++++++++++++++++++++++++++++++++++++++++++++++
 include/net/secure_seq.h |  9 +++++-
 include/net/tcp_states.h |  4 ++-
 include/uapi/linux/bpf.h |  4 ++-
 include/uapi/linux/if.h  |  5 ++++
 5 files changed, 97 insertions(+), 3 deletions(-)

diff --git a/include/linux/tcp.h b/include/linux/tcp.h
index 612360b..62c8e6c 100644
--- a/include/linux/tcp.h
+++ b/include/linux/tcp.h
@@ -92,6 +92,44 @@ struct tcp_out_options {
 	__u8 *hash_location;	/* temporary pointer, overloaded */
 	__u32 tsval, tsecr;	/* need to include OPTION_TS */
 	struct tcp_fastopen_cookie *fastopen_cookie;	/* Fast open cookie */
+#ifdef CONFIG_MPTCP
+	u16	mptcp_options;  /* bit field of MPTCP related OPTION_* */
+	u8	dss_csum:1,     /* dss-checksum required? */
+		add_addr_v4:1,
+		add_addr_v6:1,
+		mptcp_ver:4;
+
+	union {
+		struct {
+			__u64   sender_key;	/* sender's key for mptcp */
+			__u64   receiver_key;	/* receiver's key for mptcp */
+		} mp_capable;
+
+		struct {
+			__u64   sender_truncated_mac;
+			__u32   sender_nonce;
+					/* random number of the sender */
+			__u32   token;	/* token for mptcp */
+			u8      low_prio:1;
+		} mp_join_syns;
+	};
+
+	struct {
+		__u64 trunc_mac;
+		struct in_addr addr;
+		u16 port;
+		u8 addr_id;
+	} add_addr4;
+	struct {
+		__u64 trunc_mac;
+		struct in6_addr addr;
+		u16 port;
+		u8 addr_id;
+	} add_addr6;
+
+	u16     remove_addrs;   /* list of address id */
+	u8      addr_id;        /* address id (mp_join or add_address) */
+#endif /* CONFIG_MPTCP */
 };
 
 /*These are used to set the sack_ok field in struct tcp_options_received */
@@ -397,6 +435,35 @@ struct tcp_sock {
 	u32	*saved_syn;
 	const struct tcp_operational_ops	*op_ops;
 	const struct tcp_state_ops		*state_ops;
+	void	*tcp_sock_private;
+#ifdef CONFIG_MPTCP
+	struct mptcp_cb         *mpcb;
+	struct sock             *meta_sk;
+	/* We keep these flags even if CONFIG_MPTCP is not checked, because
+	 * it allows checking MPTCP capability just by checking the mpc flag,
+	 * rather than adding ifdefs everywhere.
+	 */
+	u16     mpc:1,          /* Other end is multipath capable */
+		inside_tk_table:1, /* Is the tcp_sock inside the token-table? */
+		send_mp_fclose:1,
+		request_mptcp:1, /* Did we send out an MP_CAPABLE?
+				  * (this speeds up mptcp_doit() in tcp_recvmsg)
+				  */
+		pf:1, /* Potentially Failed state: when this flag is set, we
+		       * stop using the subflow
+		       */
+		mp_killed:1, /* Killed with a tcp_done in mptcp? */
+		was_meta_sk:1,  /* This was a meta sk (in case of reuse) */
+		is_master_sk:1,
+		close_it:1,     /* Must close socket in mptcp_data_ready? */
+		closing:1,
+		mptcp_ver:4;
+		struct mptcp_tcp_sock *mptcp;
+	struct hlist_nulls_node tk_table;
+	u32 mptcp_loc_token;
+	u64 mptcp_loc_key;
+#endif /* CONFIG_MPTCP */
+
 };
 
 enum tsq_enum {
@@ -408,6 +475,10 @@ enum tsq_enum {
 	TCP_MTU_REDUCED_DEFERRED,  /* tcp_v{4|6}_err() could not call
 				    * tcp_v{4|6}_mtu_reduced()
 				    */
+#ifdef CONFIG_MPTCP
+	MPTCP_PATH_MANAGER,	/* MPTCP deferred creation of new subflows */
+	MPTCP_SUB_DEFERRED,	/* A subflow got deferred - process them */
+#endif
 };
 
 enum tsq_flags {
@@ -417,6 +488,10 @@ enum tsq_flags {
 	TCPF_WRITE_TIMER_DEFERRED	= (1UL << TCP_WRITE_TIMER_DEFERRED),
 	TCPF_DELACK_TIMER_DEFERRED	= (1UL << TCP_DELACK_TIMER_DEFERRED),
 	TCPF_MTU_REDUCED_DEFERRED	= (1UL << TCP_MTU_REDUCED_DEFERRED),
+#ifdef CONFIG_MPTCP
+	MPTCPF_PATH_MANAGER		= (1UL << MPTCP_PATH_MANAGER),
+	MPTCPF_SUB_DEFERRED		= (1UL << MPTCP_SUB_DEFERRED),
+#endif
 };
 
 static inline struct tcp_sock *tcp_sk(const struct sock *sk)
@@ -439,6 +514,9 @@ struct tcp_timewait_sock {
 #ifdef CONFIG_TCP_MD5SIG
 	struct tcp_md5sig_key	  *tw_md5_key;
 #endif
+#ifdef CONFIG_MPTCP
+	struct	mptcp_tw	  *mptcp_tw;
+#endif
 };
 
 static inline struct tcp_timewait_sock *tcp_twsk(const struct sock *sk)
diff --git a/include/net/secure_seq.h b/include/net/secure_seq.h
index d7d2495f..102dc91 100644
--- a/include/net/secure_seq.h
+++ b/include/net/secure_seq.h
@@ -18,5 +18,12 @@ u64 secure_dccp_sequence_number(__be32 saddr, __be32 daddr,
 				__be16 sport, __be16 dport);
 u64 secure_dccpv6_sequence_number(__be32 *saddr, __be32 *daddr,
 				  __be16 sport, __be16 dport);
-
+#ifdef CONFIG_MPTCP
+u32 mptcp_v4_get_nonce(__be32 saddr, __be32 daddr, __be16 sport, __be16 dport);
+u64 mptcp_v4_get_key(__be32 saddr, __be32 daddr, __be16 sport, __be16 dport);
+u32 mptcp_v6_get_nonce(const __be32 *saddr, const __be32 *daddr,
+		       __be16 sport, __be16 dport);
+u64 mptcp_v6_get_key(const __be32 *saddr, const __be32 *daddr,
+		     __be16 sport, __be16 dport);
+#endif
 #endif /* _NET_SECURE_SEQ */
diff --git a/include/net/tcp_states.h b/include/net/tcp_states.h
index 50e78a7..73eb518 100644
--- a/include/net/tcp_states.h
+++ b/include/net/tcp_states.h
@@ -26,7 +26,9 @@ enum {
 	TCP_LISTEN,
 	TCP_CLOSING,	/* Now a valid state */
 	TCP_NEW_SYN_RECV,
-
+#ifdef CONFIG_MPTCP
+	TCP_RST_WAIT,
+#endif
 	TCP_MAX_STATES	/* Leave at the end! */
 };
 
diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h
index db6bdc3..f837e91 100644
--- a/include/uapi/linux/bpf.h
+++ b/include/uapi/linux/bpf.h
@@ -1079,7 +1079,9 @@ enum {
 	BPF_TCP_LISTEN,
 	BPF_TCP_CLOSING,	/* Now a valid state */
 	BPF_TCP_NEW_SYN_RECV,
-
+#ifdef CONFIG_MPTCP
+	BPF_TCP_RST_WAIT,
+#endif
 	BPF_TCP_MAX_STATES	/* Leave at the end! */
 };
 
diff --git a/include/uapi/linux/if.h b/include/uapi/linux/if.h
index 7fea0fd..fa08d86 100644
--- a/include/uapi/linux/if.h
+++ b/include/uapi/linux/if.h
@@ -132,6 +132,11 @@ enum net_device_flags {
 #define IFF_ECHO			IFF_ECHO
 #endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO */
 
+#ifdef CONFIG_MPTCP
+#define IFF_NOMULTIPATH 0x80000         /* Disable for MPTCP            */
+#define IFF_MPBACKUP    0x100000        /* Use as backup path for MPTCP */
+#endif
+
 #define IFF_VOLATILE	(IFF_LOOPBACK|IFF_POINTOPOINT|IFF_BROADCAST|IFF_ECHO|\
 		IFF_MASTER|IFF_SLAVE|IFF_RUNNING|IFF_LOWER_UP|IFF_DORMANT)
 
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [MPTCP] [RFC 3/9] Introduce MPTCP specific elements that can be under #ifdef MPTCP_CONFIG
@ 2018-03-30 17:38 Rao Shoaib
  0 siblings, 0 replies; 3+ messages in thread
From: Rao Shoaib @ 2018-03-30 17:38 UTC (permalink / raw)
  To: mptcp

[-- Attachment #1: Type: text/plain, Size: 7969 bytes --]



On 03/27/2018 02:43 AM, Christoph Paasch wrote:
> On 22/02/18 - 15:49:55, rao.shoaib(a)oracle.com wrote:
>> From: Rao Shoaib <rao.shoaib(a)oracle.com>
>>
>> Signed-off-by: Rao Shoaib <rao.shoaib(a)oracle.com>
>> ---
>>   include/linux/tcp.h      | 78 ++++++++++++++++++++++++++++++++++++++++++++++++
>>   include/net/secure_seq.h |  9 +++++-
>>   include/net/tcp_states.h |  4 ++-
>>   include/uapi/linux/bpf.h |  4 ++-
>>   include/uapi/linux/if.h  |  5 ++++
>>   5 files changed, 97 insertions(+), 3 deletions(-)
>>
>> diff --git a/include/linux/tcp.h b/include/linux/tcp.h
>> index 612360b..62c8e6c 100644
>> --- a/include/linux/tcp.h
>> +++ b/include/linux/tcp.h
>> @@ -92,6 +92,44 @@ struct tcp_out_options {
>>   	__u8 *hash_location;	/* temporary pointer, overloaded */
>>   	__u32 tsval, tsecr;	/* need to include OPTION_TS */
>>   	struct tcp_fastopen_cookie *fastopen_cookie;	/* Fast open cookie */
>> +#ifdef CONFIG_MPTCP
>> +	u16	mptcp_options;  /* bit field of MPTCP related OPTION_* */
>> +	u8	dss_csum:1,     /* dss-checksum required? */
>> +		add_addr_v4:1,
>> +		add_addr_v6:1,
>> +		mptcp_ver:4;
>> +
>> +	union {
>> +		struct {
>> +			__u64   sender_key;	/* sender's key for mptcp */
>> +			__u64   receiver_key;	/* receiver's key for mptcp */
>> +		} mp_capable;
>> +
>> +		struct {
>> +			__u64   sender_truncated_mac;
>> +			__u32   sender_nonce;
>> +					/* random number of the sender */
>> +			__u32   token;	/* token for mptcp */
>> +			u8      low_prio:1;
>> +		} mp_join_syns;
>> +	};
>> +
>> +	struct {
>> +		__u64 trunc_mac;
>> +		struct in_addr addr;
>> +		u16 port;
>> +		u8 addr_id;
>> +	} add_addr4;
>> +	struct {
>> +		__u64 trunc_mac;
>> +		struct in6_addr addr;
>> +		u16 port;
>> +		u8 addr_id;
>> +	} add_addr6;
>> +
>> +	u16     remove_addrs;   /* list of address id */
>> +	u8      addr_id;        /* address id (mp_join or add_address) */
>> +#endif /* CONFIG_MPTCP */
>>   };
>>   
>>   /*These are used to set the sack_ok field in struct tcp_options_received */
>> @@ -397,6 +435,35 @@ struct tcp_sock {
>>   	u32	*saved_syn;
>>   	const struct tcp_operational_ops	*op_ops;
>>   	const struct tcp_state_ops		*state_ops;
>> +	void	*tcp_sock_private;
>> +#ifdef CONFIG_MPTCP
>> +	struct mptcp_cb         *mpcb;
>> +	struct sock             *meta_sk;
>> +	/* We keep these flags even if CONFIG_MPTCP is not checked, because
>> +	 * it allows checking MPTCP capability just by checking the mpc flag,
>> +	 * rather than adding ifdefs everywhere.
>> +	 */
>> +	u16     mpc:1,          /* Other end is multipath capable */
>> +		inside_tk_table:1, /* Is the tcp_sock inside the token-table? */
>> +		send_mp_fclose:1,
>> +		request_mptcp:1, /* Did we send out an MP_CAPABLE?
>> +				  * (this speeds up mptcp_doit() in tcp_recvmsg)
>> +				  */
>> +		pf:1, /* Potentially Failed state: when this flag is set, we
>> +		       * stop using the subflow
>> +		       */
>> +		mp_killed:1, /* Killed with a tcp_done in mptcp? */
>> +		was_meta_sk:1,  /* This was a meta sk (in case of reuse) */
>> +		is_master_sk:1,
>> +		close_it:1,     /* Must close socket in mptcp_data_ready? */
>> +		closing:1,
>> +		mptcp_ver:4;
>> +		struct mptcp_tcp_sock *mptcp;
>> +	struct hlist_nulls_node tk_table;
>> +	u32 mptcp_loc_token;
>> +	u64 mptcp_loc_key;
>> +#endif /* CONFIG_MPTCP */
> Can we somehow reduce the number of elements added to tcp_sock?
Sure. As I said I am not done with MPTCP yet. That is the next step.
>
> ->mpcb can probably be reached through ->mptcp. Same, for the meta_sk.
>
> tk_table, mptcp_loc_token and mptcp_loc_key are only used on the
> meta-socket, if I'm not mistaken. And the meta-socket is only using a very
> small portion of struct tcp_sock. It might be better to use an entirely
> different data-structure for the meta-socket. That way you don't have to add
> tk_table, mptcp_loc_token and mptcp_loc_key to struct tcp_sock.
>
>
> Christoph
I can definitely look into that. As I said there is a lot of opportunity 
for improvement particularly in the MPTCP code.

Shoaib
>
>
>
>> +
>>   };
>>   
>>   enum tsq_enum {
>> @@ -408,6 +475,10 @@ enum tsq_enum {
>>   	TCP_MTU_REDUCED_DEFERRED,  /* tcp_v{4|6}_err() could not call
>>   				    * tcp_v{4|6}_mtu_reduced()
>>   				    */
>> +#ifdef CONFIG_MPTCP
>> +	MPTCP_PATH_MANAGER,	/* MPTCP deferred creation of new subflows */
>> +	MPTCP_SUB_DEFERRED,	/* A subflow got deferred - process them */
>> +#endif
>>   };
>>   
>>   enum tsq_flags {
>> @@ -417,6 +488,10 @@ enum tsq_flags {
>>   	TCPF_WRITE_TIMER_DEFERRED	= (1UL << TCP_WRITE_TIMER_DEFERRED),
>>   	TCPF_DELACK_TIMER_DEFERRED	= (1UL << TCP_DELACK_TIMER_DEFERRED),
>>   	TCPF_MTU_REDUCED_DEFERRED	= (1UL << TCP_MTU_REDUCED_DEFERRED),
>> +#ifdef CONFIG_MPTCP
>> +	MPTCPF_PATH_MANAGER		= (1UL << MPTCP_PATH_MANAGER),
>> +	MPTCPF_SUB_DEFERRED		= (1UL << MPTCP_SUB_DEFERRED),
>> +#endif
>>   };
>>   
>>   static inline struct tcp_sock *tcp_sk(const struct sock *sk)
>> @@ -439,6 +514,9 @@ struct tcp_timewait_sock {
>>   #ifdef CONFIG_TCP_MD5SIG
>>   	struct tcp_md5sig_key	  *tw_md5_key;
>>   #endif
>> +#ifdef CONFIG_MPTCP
>> +	struct	mptcp_tw	  *mptcp_tw;
>> +#endif
>>   };
>>   
>>   static inline struct tcp_timewait_sock *tcp_twsk(const struct sock *sk)
>> diff --git a/include/net/secure_seq.h b/include/net/secure_seq.h
>> index d7d2495f..102dc91 100644
>> --- a/include/net/secure_seq.h
>> +++ b/include/net/secure_seq.h
>> @@ -18,5 +18,12 @@ u64 secure_dccp_sequence_number(__be32 saddr, __be32 daddr,
>>   				__be16 sport, __be16 dport);
>>   u64 secure_dccpv6_sequence_number(__be32 *saddr, __be32 *daddr,
>>   				  __be16 sport, __be16 dport);
>> -
>> +#ifdef CONFIG_MPTCP
>> +u32 mptcp_v4_get_nonce(__be32 saddr, __be32 daddr, __be16 sport, __be16 dport);
>> +u64 mptcp_v4_get_key(__be32 saddr, __be32 daddr, __be16 sport, __be16 dport);
>> +u32 mptcp_v6_get_nonce(const __be32 *saddr, const __be32 *daddr,
>> +		       __be16 sport, __be16 dport);
>> +u64 mptcp_v6_get_key(const __be32 *saddr, const __be32 *daddr,
>> +		     __be16 sport, __be16 dport);
>> +#endif
>>   #endif /* _NET_SECURE_SEQ */
>> diff --git a/include/net/tcp_states.h b/include/net/tcp_states.h
>> index 50e78a7..73eb518 100644
>> --- a/include/net/tcp_states.h
>> +++ b/include/net/tcp_states.h
>> @@ -26,7 +26,9 @@ enum {
>>   	TCP_LISTEN,
>>   	TCP_CLOSING,	/* Now a valid state */
>>   	TCP_NEW_SYN_RECV,
>> -
>> +#ifdef CONFIG_MPTCP
>> +	TCP_RST_WAIT,
>> +#endif
>>   	TCP_MAX_STATES	/* Leave at the end! */
>>   };
>>   
>> diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h
>> index db6bdc3..f837e91 100644
>> --- a/include/uapi/linux/bpf.h
>> +++ b/include/uapi/linux/bpf.h
>> @@ -1079,7 +1079,9 @@ enum {
>>   	BPF_TCP_LISTEN,
>>   	BPF_TCP_CLOSING,	/* Now a valid state */
>>   	BPF_TCP_NEW_SYN_RECV,
>> -
>> +#ifdef CONFIG_MPTCP
>> +	BPF_TCP_RST_WAIT,
>> +#endif
>>   	BPF_TCP_MAX_STATES	/* Leave at the end! */
>>   };
>>   
>> diff --git a/include/uapi/linux/if.h b/include/uapi/linux/if.h
>> index 7fea0fd..fa08d86 100644
>> --- a/include/uapi/linux/if.h
>> +++ b/include/uapi/linux/if.h
>> @@ -132,6 +132,11 @@ enum net_device_flags {
>>   #define IFF_ECHO			IFF_ECHO
>>   #endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO */
>>   
>> +#ifdef CONFIG_MPTCP
>> +#define IFF_NOMULTIPATH 0x80000         /* Disable for MPTCP            */
>> +#define IFF_MPBACKUP    0x100000        /* Use as backup path for MPTCP */
>> +#endif
>> +
>>   #define IFF_VOLATILE	(IFF_LOOPBACK|IFF_POINTOPOINT|IFF_BROADCAST|IFF_ECHO|\
>>   		IFF_MASTER|IFF_SLAVE|IFF_RUNNING|IFF_LOWER_UP|IFF_DORMANT)
>>   
>> -- 
>> 2.7.4
>>
>> _______________________________________________
>> mptcp mailing list
>> mptcp(a)lists.01.org
>> https://lists.01.org/mailman/listinfo/mptcp


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [MPTCP] [RFC 3/9] Introduce MPTCP specific elements that can be under #ifdef MPTCP_CONFIG
@ 2018-03-27  9:43 Christoph Paasch
  0 siblings, 0 replies; 3+ messages in thread
From: Christoph Paasch @ 2018-03-27  9:43 UTC (permalink / raw)
  To: mptcp

[-- Attachment #1: Type: text/plain, Size: 7433 bytes --]

On 22/02/18 - 15:49:55, rao.shoaib(a)oracle.com wrote:
> From: Rao Shoaib <rao.shoaib(a)oracle.com>
> 
> Signed-off-by: Rao Shoaib <rao.shoaib(a)oracle.com>
> ---
>  include/linux/tcp.h      | 78 ++++++++++++++++++++++++++++++++++++++++++++++++
>  include/net/secure_seq.h |  9 +++++-
>  include/net/tcp_states.h |  4 ++-
>  include/uapi/linux/bpf.h |  4 ++-
>  include/uapi/linux/if.h  |  5 ++++
>  5 files changed, 97 insertions(+), 3 deletions(-)
> 
> diff --git a/include/linux/tcp.h b/include/linux/tcp.h
> index 612360b..62c8e6c 100644
> --- a/include/linux/tcp.h
> +++ b/include/linux/tcp.h
> @@ -92,6 +92,44 @@ struct tcp_out_options {
>  	__u8 *hash_location;	/* temporary pointer, overloaded */
>  	__u32 tsval, tsecr;	/* need to include OPTION_TS */
>  	struct tcp_fastopen_cookie *fastopen_cookie;	/* Fast open cookie */
> +#ifdef CONFIG_MPTCP
> +	u16	mptcp_options;  /* bit field of MPTCP related OPTION_* */
> +	u8	dss_csum:1,     /* dss-checksum required? */
> +		add_addr_v4:1,
> +		add_addr_v6:1,
> +		mptcp_ver:4;
> +
> +	union {
> +		struct {
> +			__u64   sender_key;	/* sender's key for mptcp */
> +			__u64   receiver_key;	/* receiver's key for mptcp */
> +		} mp_capable;
> +
> +		struct {
> +			__u64   sender_truncated_mac;
> +			__u32   sender_nonce;
> +					/* random number of the sender */
> +			__u32   token;	/* token for mptcp */
> +			u8      low_prio:1;
> +		} mp_join_syns;
> +	};
> +
> +	struct {
> +		__u64 trunc_mac;
> +		struct in_addr addr;
> +		u16 port;
> +		u8 addr_id;
> +	} add_addr4;
> +	struct {
> +		__u64 trunc_mac;
> +		struct in6_addr addr;
> +		u16 port;
> +		u8 addr_id;
> +	} add_addr6;
> +
> +	u16     remove_addrs;   /* list of address id */
> +	u8      addr_id;        /* address id (mp_join or add_address) */
> +#endif /* CONFIG_MPTCP */
>  };
>  
>  /*These are used to set the sack_ok field in struct tcp_options_received */
> @@ -397,6 +435,35 @@ struct tcp_sock {
>  	u32	*saved_syn;
>  	const struct tcp_operational_ops	*op_ops;
>  	const struct tcp_state_ops		*state_ops;
> +	void	*tcp_sock_private;
> +#ifdef CONFIG_MPTCP
> +	struct mptcp_cb         *mpcb;
> +	struct sock             *meta_sk;
> +	/* We keep these flags even if CONFIG_MPTCP is not checked, because
> +	 * it allows checking MPTCP capability just by checking the mpc flag,
> +	 * rather than adding ifdefs everywhere.
> +	 */
> +	u16     mpc:1,          /* Other end is multipath capable */
> +		inside_tk_table:1, /* Is the tcp_sock inside the token-table? */
> +		send_mp_fclose:1,
> +		request_mptcp:1, /* Did we send out an MP_CAPABLE?
> +				  * (this speeds up mptcp_doit() in tcp_recvmsg)
> +				  */
> +		pf:1, /* Potentially Failed state: when this flag is set, we
> +		       * stop using the subflow
> +		       */
> +		mp_killed:1, /* Killed with a tcp_done in mptcp? */
> +		was_meta_sk:1,  /* This was a meta sk (in case of reuse) */
> +		is_master_sk:1,
> +		close_it:1,     /* Must close socket in mptcp_data_ready? */
> +		closing:1,
> +		mptcp_ver:4;
> +		struct mptcp_tcp_sock *mptcp;
> +	struct hlist_nulls_node tk_table;
> +	u32 mptcp_loc_token;
> +	u64 mptcp_loc_key;
> +#endif /* CONFIG_MPTCP */

Can we somehow reduce the number of elements added to tcp_sock?

->mpcb can probably be reached through ->mptcp. Same, for the meta_sk.

tk_table, mptcp_loc_token and mptcp_loc_key are only used on the
meta-socket, if I'm not mistaken. And the meta-socket is only using a very
small portion of struct tcp_sock. It might be better to use an entirely
different data-structure for the meta-socket. That way you don't have to add
tk_table, mptcp_loc_token and mptcp_loc_key to struct tcp_sock.


Christoph



> +
>  };
>  
>  enum tsq_enum {
> @@ -408,6 +475,10 @@ enum tsq_enum {
>  	TCP_MTU_REDUCED_DEFERRED,  /* tcp_v{4|6}_err() could not call
>  				    * tcp_v{4|6}_mtu_reduced()
>  				    */
> +#ifdef CONFIG_MPTCP
> +	MPTCP_PATH_MANAGER,	/* MPTCP deferred creation of new subflows */
> +	MPTCP_SUB_DEFERRED,	/* A subflow got deferred - process them */
> +#endif
>  };
>  
>  enum tsq_flags {
> @@ -417,6 +488,10 @@ enum tsq_flags {
>  	TCPF_WRITE_TIMER_DEFERRED	= (1UL << TCP_WRITE_TIMER_DEFERRED),
>  	TCPF_DELACK_TIMER_DEFERRED	= (1UL << TCP_DELACK_TIMER_DEFERRED),
>  	TCPF_MTU_REDUCED_DEFERRED	= (1UL << TCP_MTU_REDUCED_DEFERRED),
> +#ifdef CONFIG_MPTCP
> +	MPTCPF_PATH_MANAGER		= (1UL << MPTCP_PATH_MANAGER),
> +	MPTCPF_SUB_DEFERRED		= (1UL << MPTCP_SUB_DEFERRED),
> +#endif
>  };
>  
>  static inline struct tcp_sock *tcp_sk(const struct sock *sk)
> @@ -439,6 +514,9 @@ struct tcp_timewait_sock {
>  #ifdef CONFIG_TCP_MD5SIG
>  	struct tcp_md5sig_key	  *tw_md5_key;
>  #endif
> +#ifdef CONFIG_MPTCP
> +	struct	mptcp_tw	  *mptcp_tw;
> +#endif
>  };
>  
>  static inline struct tcp_timewait_sock *tcp_twsk(const struct sock *sk)
> diff --git a/include/net/secure_seq.h b/include/net/secure_seq.h
> index d7d2495f..102dc91 100644
> --- a/include/net/secure_seq.h
> +++ b/include/net/secure_seq.h
> @@ -18,5 +18,12 @@ u64 secure_dccp_sequence_number(__be32 saddr, __be32 daddr,
>  				__be16 sport, __be16 dport);
>  u64 secure_dccpv6_sequence_number(__be32 *saddr, __be32 *daddr,
>  				  __be16 sport, __be16 dport);
> -
> +#ifdef CONFIG_MPTCP
> +u32 mptcp_v4_get_nonce(__be32 saddr, __be32 daddr, __be16 sport, __be16 dport);
> +u64 mptcp_v4_get_key(__be32 saddr, __be32 daddr, __be16 sport, __be16 dport);
> +u32 mptcp_v6_get_nonce(const __be32 *saddr, const __be32 *daddr,
> +		       __be16 sport, __be16 dport);
> +u64 mptcp_v6_get_key(const __be32 *saddr, const __be32 *daddr,
> +		     __be16 sport, __be16 dport);
> +#endif
>  #endif /* _NET_SECURE_SEQ */
> diff --git a/include/net/tcp_states.h b/include/net/tcp_states.h
> index 50e78a7..73eb518 100644
> --- a/include/net/tcp_states.h
> +++ b/include/net/tcp_states.h
> @@ -26,7 +26,9 @@ enum {
>  	TCP_LISTEN,
>  	TCP_CLOSING,	/* Now a valid state */
>  	TCP_NEW_SYN_RECV,
> -
> +#ifdef CONFIG_MPTCP
> +	TCP_RST_WAIT,
> +#endif
>  	TCP_MAX_STATES	/* Leave at the end! */
>  };
>  
> diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h
> index db6bdc3..f837e91 100644
> --- a/include/uapi/linux/bpf.h
> +++ b/include/uapi/linux/bpf.h
> @@ -1079,7 +1079,9 @@ enum {
>  	BPF_TCP_LISTEN,
>  	BPF_TCP_CLOSING,	/* Now a valid state */
>  	BPF_TCP_NEW_SYN_RECV,
> -
> +#ifdef CONFIG_MPTCP
> +	BPF_TCP_RST_WAIT,
> +#endif
>  	BPF_TCP_MAX_STATES	/* Leave at the end! */
>  };
>  
> diff --git a/include/uapi/linux/if.h b/include/uapi/linux/if.h
> index 7fea0fd..fa08d86 100644
> --- a/include/uapi/linux/if.h
> +++ b/include/uapi/linux/if.h
> @@ -132,6 +132,11 @@ enum net_device_flags {
>  #define IFF_ECHO			IFF_ECHO
>  #endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO */
>  
> +#ifdef CONFIG_MPTCP
> +#define IFF_NOMULTIPATH 0x80000         /* Disable for MPTCP            */
> +#define IFF_MPBACKUP    0x100000        /* Use as backup path for MPTCP */
> +#endif
> +
>  #define IFF_VOLATILE	(IFF_LOOPBACK|IFF_POINTOPOINT|IFF_BROADCAST|IFF_ECHO|\
>  		IFF_MASTER|IFF_SLAVE|IFF_RUNNING|IFF_LOWER_UP|IFF_DORMANT)
>  
> -- 
> 2.7.4
> 
> _______________________________________________
> mptcp mailing list
> mptcp(a)lists.01.org
> https://lists.01.org/mailman/listinfo/mptcp

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2018-03-30 17:38 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-02-22 23:49 [MPTCP] [RFC 3/9] Introduce MPTCP specific elements that can be under #ifdef MPTCP_CONFIG rao.shoaib
2018-03-27  9:43 Christoph Paasch
2018-03-30 17:38 Rao Shoaib

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.