mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	mptcp: add deny_join_id0 in mptcp_options_received
This patch added a new flag named deny_join_id0 in struct mptcp_options_received. Set it when MP_CAPABLE with the flag MPTCP_CAP_DENYJOIN_ID0 is received. Also add a new flag remote_deny_join_id0 in struct mptcp_pm_data. When the flag deny_join_id0 is set, set this remote_deny_join_id0 flag. In mptcp_pm_create_subflow_or_signal_addr, if the remote_deny_join_id0 flag is set, and the remote address id is zero, stop this connection. Suggested-by: Florian Westphal <fw@strlen.de> Acked-by: Paolo Abeni <pabeni@redhat.com> Signed-off-by: Geliang Tang <geliangtang@gmail.com> Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									bab6b88e05
								
							
						
					
					
						commit
						df377be387
					
				
					 5 changed files with 15 additions and 2 deletions
				
			
		| 
						 | 
				
			
			@ -83,6 +83,9 @@ static void mptcp_parse_option(const struct sk_buff *skb,
 | 
			
		|||
		if (flags & MPTCP_CAP_CHECKSUM_REQD)
 | 
			
		||||
			mp_opt->csum_reqd = 1;
 | 
			
		||||
 | 
			
		||||
		if (flags & MPTCP_CAP_DENY_JOIN_ID0)
 | 
			
		||||
			mp_opt->deny_join_id0 = 1;
 | 
			
		||||
 | 
			
		||||
		mp_opt->mp_capable = 1;
 | 
			
		||||
		if (opsize >= TCPOLEN_MPTCP_MPC_SYNACK) {
 | 
			
		||||
			mp_opt->sndr_key = get_unaligned_be64(ptr);
 | 
			
		||||
| 
						 | 
				
			
			@ -360,6 +363,7 @@ void mptcp_get_options(const struct sock *sk,
 | 
			
		|||
	mp_opt->mp_prio = 0;
 | 
			
		||||
	mp_opt->reset = 0;
 | 
			
		||||
	mp_opt->csum_reqd = READ_ONCE(msk->csum_enabled);
 | 
			
		||||
	mp_opt->deny_join_id0 = 0;
 | 
			
		||||
 | 
			
		||||
	length = (th->doff * 4) - sizeof(struct tcphdr);
 | 
			
		||||
	ptr = (const unsigned char *)(th + 1);
 | 
			
		||||
| 
						 | 
				
			
			@ -908,6 +912,9 @@ static bool check_fully_established(struct mptcp_sock *msk, struct sock *ssk,
 | 
			
		|||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (mp_opt->deny_join_id0)
 | 
			
		||||
		WRITE_ONCE(msk->pm.remote_deny_join_id0, true);
 | 
			
		||||
 | 
			
		||||
	if (unlikely(!READ_ONCE(msk->pm.server_side)))
 | 
			
		||||
		pr_warn_once("bogus mpc option on established client sk");
 | 
			
		||||
	mptcp_subflow_fully_established(subflow, mp_opt);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -320,6 +320,7 @@ void mptcp_pm_data_init(struct mptcp_sock *msk)
 | 
			
		|||
	WRITE_ONCE(msk->pm.addr_signal, 0);
 | 
			
		||||
	WRITE_ONCE(msk->pm.accept_addr, false);
 | 
			
		||||
	WRITE_ONCE(msk->pm.accept_subflow, false);
 | 
			
		||||
	WRITE_ONCE(msk->pm.remote_deny_join_id0, false);
 | 
			
		||||
	msk->pm.status = 0;
 | 
			
		||||
 | 
			
		||||
	spin_lock_init(&msk->pm.lock);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -451,7 +451,8 @@ static void mptcp_pm_create_subflow_or_signal_addr(struct mptcp_sock *msk)
 | 
			
		|||
 | 
			
		||||
	/* check if should create a new subflow */
 | 
			
		||||
	if (msk->pm.local_addr_used < local_addr_max &&
 | 
			
		||||
	    msk->pm.subflows < subflows_max) {
 | 
			
		||||
	    msk->pm.subflows < subflows_max &&
 | 
			
		||||
	    !READ_ONCE(msk->pm.remote_deny_join_id0)) {
 | 
			
		||||
		local = select_local_address(pernet, msk);
 | 
			
		||||
		if (local) {
 | 
			
		||||
			struct mptcp_addr_info remote = { 0 };
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -138,7 +138,8 @@ struct mptcp_options_received {
 | 
			
		|||
		mp_prio : 1,
 | 
			
		||||
		echo : 1,
 | 
			
		||||
		csum_reqd : 1,
 | 
			
		||||
		backup : 1;
 | 
			
		||||
		backup : 1,
 | 
			
		||||
		deny_join_id0 : 1;
 | 
			
		||||
	u32	token;
 | 
			
		||||
	u32	nonce;
 | 
			
		||||
	u64	thmac;
 | 
			
		||||
| 
						 | 
				
			
			@ -193,6 +194,7 @@ struct mptcp_pm_data {
 | 
			
		|||
	bool		work_pending;
 | 
			
		||||
	bool		accept_addr;
 | 
			
		||||
	bool		accept_subflow;
 | 
			
		||||
	bool		remote_deny_join_id0;
 | 
			
		||||
	u8		add_addr_signaled;
 | 
			
		||||
	u8		add_addr_accepted;
 | 
			
		||||
	u8		local_addr_used;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -408,6 +408,8 @@ static void subflow_finish_connect(struct sock *sk, const struct sk_buff *skb)
 | 
			
		|||
 | 
			
		||||
		if (mp_opt.csum_reqd)
 | 
			
		||||
			WRITE_ONCE(mptcp_sk(parent)->csum_enabled, true);
 | 
			
		||||
		if (mp_opt.deny_join_id0)
 | 
			
		||||
			WRITE_ONCE(mptcp_sk(parent)->pm.remote_deny_join_id0, true);
 | 
			
		||||
		subflow->mp_capable = 1;
 | 
			
		||||
		subflow->can_ack = 1;
 | 
			
		||||
		subflow->remote_key = mp_opt.sndr_key;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue