mptcp: explicitly track the fully established status
Currently accepted msk sockets become established only after accept() returns the new sk to user-space. As MP_JOIN request are refused as per RFC spec on non fully established socket, the above causes mp_join self-tests instabilities. This change lets the msk entering the established status as soon as it receives the 3rd ack and propagates the first subflow fully established status on the msk socket. Finally we can change the subflow acceptance condition to take in account both the sock state and the msk fully established flag. Reviewed-by: Mat Martineau <mathew.j.martineau@linux.intel.com> Tested-by: Christoph Paasch <cpaasch@apple.com> Signed-off-by: Paolo Abeni <pabeni@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
0235d075a5
commit
b93df08ccd
@@ -198,6 +198,7 @@ struct mptcp_sock {
|
||||
u32 token;
|
||||
unsigned long flags;
|
||||
bool can_ack;
|
||||
bool fully_established;
|
||||
spinlock_t join_list_lock;
|
||||
struct work_struct work;
|
||||
struct list_head conn_list;
|
||||
@@ -342,6 +343,8 @@ mptcp_subflow_get_mapped_dsn(const struct mptcp_subflow_context *subflow)
|
||||
}
|
||||
|
||||
int mptcp_is_enabled(struct net *net);
|
||||
void mptcp_subflow_fully_established(struct mptcp_subflow_context *subflow,
|
||||
struct mptcp_options_received *mp_opt);
|
||||
bool mptcp_subflow_data_available(struct sock *sk);
|
||||
void __init mptcp_subflow_init(void);
|
||||
|
||||
@@ -373,6 +376,11 @@ void mptcp_get_options(const struct sk_buff *skb,
|
||||
struct mptcp_options_received *mp_opt);
|
||||
|
||||
void mptcp_finish_connect(struct sock *sk);
|
||||
static inline bool mptcp_is_fully_established(struct sock *sk)
|
||||
{
|
||||
return inet_sk_state_load(sk) == TCP_ESTABLISHED &&
|
||||
READ_ONCE(mptcp_sk(sk)->fully_established);
|
||||
}
|
||||
void mptcp_rcv_space_init(struct mptcp_sock *msk, const struct sock *ssk);
|
||||
void mptcp_data_ready(struct sock *sk, struct sock *ssk);
|
||||
bool mptcp_finish_join(struct sock *sk);
|
||||
|
Reference in New Issue
Block a user