diff options
Diffstat (limited to 'net/mptcp/options.c')
| -rw-r--r-- | net/mptcp/options.c | 19 | 
1 files changed, 17 insertions, 2 deletions
diff --git a/net/mptcp/options.c b/net/mptcp/options.c index 19a01b6566f1..c254accb14de 100644 --- a/net/mptcp/options.c +++ b/net/mptcp/options.c @@ -687,9 +687,12 @@ static bool mptcp_established_options_add_addr(struct sock *sk, struct sk_buff *  	}  	opts->suboptions |= OPTION_MPTCP_ADD_ADDR;  	if (!echo) { +		MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_ADDADDRTX);  		opts->ahmac = add_addr_generate_hmac(msk->local_key,  						     msk->remote_key,  						     &opts->addr); +	} else { +		MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_ECHOADDTX);  	}  	pr_debug("addr_id=%d, ahmac=%llu, echo=%d, port=%d",  		 opts->addr.id, opts->ahmac, echo, ntohs(opts->addr.port)); @@ -723,7 +726,7 @@ static bool mptcp_established_options_rm_addr(struct sock *sk,  	for (i = 0; i < opts->rm_list.nr; i++)  		pr_debug("rm_list_ids[%d]=%d", i, opts->rm_list.ids[i]); - +	MPTCP_ADD_STATS(sock_net(sk), MPTCP_MIB_RMADDRTX, opts->rm_list.nr);  	return true;  } @@ -1023,6 +1026,12 @@ u64 __mptcp_expand_seq(u64 old_seq, u64 cur_seq)  	return cur_seq;  } +static void __mptcp_snd_una_update(struct mptcp_sock *msk, u64 new_snd_una) +{ +	msk->bytes_acked += new_snd_una - msk->snd_una; +	msk->snd_una = new_snd_una; +} +  static void ack_update_msk(struct mptcp_sock *msk,  			   struct sock *ssk,  			   struct mptcp_options_received *mp_opt) @@ -1054,7 +1063,7 @@ static void ack_update_msk(struct mptcp_sock *msk,  		__mptcp_check_push(sk, ssk);  	if (after64(new_snd_una, old_snd_una)) { -		msk->snd_una = new_snd_una; +		__mptcp_snd_una_update(msk, new_snd_una);  		__mptcp_data_acked(sk);  	}  	mptcp_data_unlock(sk); @@ -1116,6 +1125,12 @@ bool mptcp_incoming_options(struct sock *sk, struct sk_buff *skb)  		mptcp_data_lock(subflow->conn);  		if (sk_stream_memory_free(sk))  			__mptcp_check_push(subflow->conn, sk); + +		/* on fallback we just need to ignore the msk-level snd_una, as +		 * this is really plain TCP +		 */ +		__mptcp_snd_una_update(msk, READ_ONCE(msk->snd_nxt)); +  		__mptcp_data_acked(subflow->conn);  		mptcp_data_unlock(subflow->conn);  		return true;  |