All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mat Martineau <mathew.j.martineau@linux.intel.com>
To: Paolo Abeni <pabeni@redhat.com>
Cc: mptcp@lists.linux.dev
Subject: Re: [PATCH net-next 3/4] mptcp: consolidate in_opt sub-options fields in a bitmask
Date: Wed, 18 Aug 2021 18:10:02 -0700 (PDT)	[thread overview]
Message-ID: <298d5b5e-a478-4136-796-c0ecc8cb1d7d@linux.intel.com> (raw)
In-Reply-To: <ac598d45ee47c89f56255cb6aa24e743b154f74d.1629133749.git.pabeni@redhat.com>

On Wed, 18 Aug 2021, Paolo Abeni wrote:

> This makes input options processing more consistent with
> output ones and will simplify the next patch.
>
> Also avoid clearing the suboption field after processing
> it, since it's not needed.
>
> Signed-off-by: Paolo Abeni <pabeni@redhat.com>
> ---
> net/mptcp/options.c  | 79 +++++++++++++++++++-------------------------
> net/mptcp/protocol.c |  4 +--
> net/mptcp/protocol.h | 20 +++++------
> net/mptcp/subflow.c  | 43 ++++++++++++++----------
> 4 files changed, 70 insertions(+), 76 deletions(-)
>
> diff --git a/net/mptcp/options.c b/net/mptcp/options.c
> index 500137f93c28..18ad028ed589 100644
> --- a/net/mptcp/options.c
> +++ b/net/mptcp/options.c
> @@ -80,10 +80,12 @@ static void mptcp_parse_option(const struct sk_buff *skb,
> 		 * In other words, the only way for checksums not to be used
> 		 * is if both hosts in their SYNs set A=0."
> 		 */
> -		mp_opt->csum_reqd = !!(flags & MPTCP_CAP_CHECKSUM_REQD);
> -		mp_opt->deny_join_id0 = !!(flags & MPTCP_CAP_DENY_JOIN_ID0);
> +		if (flags & MPTCP_CAP_CHECKSUM_REQD)
> +			mp_opt->suboptions |= OPTION_MPTCP_CSUMREQD;
> +		if (flags & MPTCP_CAP_DENY_JOIN_ID0)
> +			mp_opt->suboptions |= OPTION_MPTCP_DENYID0;
>
> -		mp_opt->mp_capable = 1;
> +		mp_opt->suboptions |= OPTIONS_MPTCP_MPC;
> 		if (opsize >= TCPOLEN_MPTCP_MPC_SYNACK) {
> 			mp_opt->sndr_key = get_unaligned_be64(ptr);
> 			ptr += 8;
> @@ -98,7 +100,7 @@ static void mptcp_parse_option(const struct sk_buff *skb,
> 			 * equivalent to those in a DSS option and can be used
> 			 * interchangeably."
> 			 */
> -			mp_opt->dss = 1;
> +			mp_opt->suboptions |= OPTION_MPTCP_DSS;
> 			mp_opt->use_map = 1;
> 			mp_opt->mpc_map = 1;
> 			mp_opt->data_len = get_unaligned_be16(ptr);
> @@ -106,7 +108,7 @@ static void mptcp_parse_option(const struct sk_buff *skb,
> 		}
> 		if (opsize == TCPOLEN_MPTCP_MPC_ACK_DATA_CSUM) {
> 			mp_opt->csum = (__force __sum16)get_unaligned_be16(ptr);
> -			mp_opt->csum_reqd = 1;
> +			mp_opt->suboptions |= OPTION_MPTCP_CSUMREQD;
> 			ptr += 2;
> 		}
> 		pr_debug("MP_CAPABLE version=%x, flags=%x, optlen=%d sndr=%llu, rcvr=%llu len=%d csum=%u",
> @@ -115,7 +117,7 @@ static void mptcp_parse_option(const struct sk_buff *skb,
> 		break;
>
> 	case MPTCPOPT_MP_JOIN:
> -		mp_opt->mp_join = 1;
> +		mp_opt->suboptions |= OPTIONS_MPTCP_MPJ;
> 		if (opsize == TCPOLEN_MPTCP_MPJ_SYN) {
> 			mp_opt->backup = *ptr++ & MPTCPOPT_BACKUP;
> 			mp_opt->join_id = *ptr++;
> @@ -141,7 +143,7 @@ static void mptcp_parse_option(const struct sk_buff *skb,
> 			memcpy(mp_opt->hmac, ptr, MPTCPOPT_HMAC_LEN);
> 			pr_debug("MP_JOIN hmac");
> 		} else {
> -			mp_opt->mp_join = 0;
> +			mp_opt->suboptions &= ~OPTIONS_MPTCP_MPJ;
> 		}
> 		break;
>
> @@ -189,8 +191,7 @@ static void mptcp_parse_option(const struct sk_buff *skb,
> 		    opsize != expected_opsize + TCPOLEN_MPTCP_DSS_CHECKSUM)
> 			break;
>
> -		mp_opt->dss = 1;
> -
> +		mp_opt->suboptions |= OPTION_MPTCP_DSS;
> 		if (mp_opt->use_ack) {
> 			if (mp_opt->ack64) {
> 				mp_opt->data_ack = get_unaligned_be64(ptr);
> @@ -219,14 +220,15 @@ static void mptcp_parse_option(const struct sk_buff *skb,
> 			ptr += 2;
>
> 			if (opsize == expected_opsize + TCPOLEN_MPTCP_DSS_CHECKSUM) {
> -				mp_opt->csum_reqd = 1;
> +				mp_opt->suboptions |= OPTION_MPTCP_CSUMREQD;
> 				mp_opt->csum = (__force __sum16)get_unaligned_be16(ptr);
> 				ptr += 2;
> 			}
>
> 			pr_debug("data_seq=%llu subflow_seq=%u data_len=%u csum=%d:%u",
> 				 mp_opt->data_seq, mp_opt->subflow_seq,
> -				 mp_opt->data_len, mp_opt->csum_reqd, mp_opt->csum);
> +				 mp_opt->data_len, !!(mp_opt->suboptions & OPTION_MPTCP_CSUMREQD),
> +				 mp_opt->csum);
> 		}
>
> 		break;
> @@ -257,7 +259,7 @@ static void mptcp_parse_option(const struct sk_buff *skb,
> 				break;
> 		}
>
> -		mp_opt->add_addr = 1;
> +		mp_opt->suboptions = OPTION_MPTCP_ADD_ADDR;

The above "=" instead of "|=" is the only issue I noticed (the perils of 
manual bitfields!). Still running the tests to double check, but this 
seems like a good way to skip a lot of unnecessary branches.


Mat


> 		mp_opt->addr.id = *ptr++;
> 		mp_opt->addr.port = 0;
> 		if (mp_opt->addr.family == AF_INET) {
> @@ -297,7 +299,7 @@ static void mptcp_parse_option(const struct sk_buff *skb,
>
> 		ptr++;
>
> -		mp_opt->rm_addr = 1;
> +		mp_opt->suboptions |= OPTION_MPTCP_RM_ADDR;
> 		mp_opt->rm_list.nr = opsize - TCPOLEN_MPTCP_RM_ADDR_BASE;
> 		for (i = 0; i < mp_opt->rm_list.nr; i++)
> 			mp_opt->rm_list.ids[i] = *ptr++;
> @@ -308,7 +310,7 @@ static void mptcp_parse_option(const struct sk_buff *skb,
> 		if (opsize != TCPOLEN_MPTCP_PRIO)
> 			break;
>
> -		mp_opt->mp_prio = 1;
> +		mp_opt->suboptions |= OPTION_MPTCP_PRIO;
> 		mp_opt->backup = *ptr++ & MPTCP_PRIO_BKUP;
> 		pr_debug("MP_PRIO: prio=%d", mp_opt->backup);
> 		break;
> @@ -320,7 +322,7 @@ static void mptcp_parse_option(const struct sk_buff *skb,
> 		ptr += 2;
> 		mp_opt->rcvr_key = get_unaligned_be64(ptr);
> 		ptr += 8;
> -		mp_opt->fastclose = 1;
> +		mp_opt->suboptions |= OPTION_MPTCP_FASTCLOSE;
> 		break;
>
> 	case MPTCPOPT_RST:
> @@ -329,7 +331,8 @@ static void mptcp_parse_option(const struct sk_buff *skb,
>
> 		if (!(TCP_SKB_CB(skb)->tcp_flags & TCPHDR_RST))
> 			break;
> -		mp_opt->reset = 1;
> +
> +		mp_opt->suboptions |= OPTION_MPTCP_RST;
> 		flags = *ptr++;
> 		mp_opt->reset_transient = flags & MPTCP_RST_TRANSIENT;
> 		mp_opt->reset_reason = *ptr;
> @@ -340,7 +343,7 @@ static void mptcp_parse_option(const struct sk_buff *skb,
> 			break;
>
> 		ptr += 2;
> -		mp_opt->mp_fail = 1;
> +		mp_opt->suboptions |= OPTION_MPTCP_FAIL;
> 		mp_opt->fail_seq = get_unaligned_be64(ptr);
> 		pr_debug("MP_FAIL: data_seq=%llu", mp_opt->fail_seq);
> 		break;
> @@ -359,15 +362,7 @@ void mptcp_get_options(const struct sock *sk,
> 	int length;
>
> 	/* initialize option status */
> -	mp_opt->mp_capable = 0;
> -	mp_opt->mp_join = 0;
> -	mp_opt->add_addr = 0;
> -	mp_opt->fastclose = 0;
> -	mp_opt->rm_addr = 0;
> -	mp_opt->dss = 0;
> -	mp_opt->mp_prio = 0;
> -	mp_opt->reset = 0;
> -	mp_opt->mp_fail = 0;
> +	mp_opt->suboptions = 0;
>
> 	length = (th->doff * 4) - sizeof(struct tcphdr);
> 	ptr = (const unsigned char *)(th + 1);
> @@ -921,7 +916,7 @@ static bool check_fully_established(struct mptcp_sock *msk, struct sock *ssk,
> 		 */
> 		if (TCP_SKB_CB(skb)->seq == subflow->ssn_offset + 1 &&
> 		    TCP_SKB_CB(skb)->end_seq == TCP_SKB_CB(skb)->seq &&
> -		    subflow->mp_join && mp_opt->mp_join &&
> +		    subflow->mp_join && (mp_opt->suboptions & OPTIONS_MPTCP_MPJ) &&
> 		    READ_ONCE(msk->pm.server_side))
> 			tcp_send_ack(ssk);
> 		goto fully_established;
> @@ -938,7 +933,7 @@ static bool check_fully_established(struct mptcp_sock *msk, struct sock *ssk,
> 		return subflow->mp_capable;
> 	}
>
> -	if (mp_opt->dss && mp_opt->use_ack) {
> +	if ((mp_opt->suboptions & OPTION_MPTCP_DSS) && mp_opt->use_ack) {
> 		/* subflows are fully established as soon as we get any
> 		 * additional ack.
> 		 */
> @@ -947,7 +942,7 @@ static bool check_fully_established(struct mptcp_sock *msk, struct sock *ssk,
> 		goto fully_established;
> 	}
>
> -	if (mp_opt->add_addr) {
> +	if (mp_opt->suboptions & OPTION_MPTCP_ADD_ADDR) {
> 		WRITE_ONCE(msk->fully_established, true);
> 		return true;
> 	}
> @@ -956,7 +951,7 @@ static bool check_fully_established(struct mptcp_sock *msk, struct sock *ssk,
> 	 * then fallback to TCP. Fallback scenarios requires a reset for
> 	 * MP_JOIN subflows.
> 	 */
> -	if (!mp_opt->mp_capable) {
> +	if (!(mp_opt->suboptions & OPTIONS_MPTCP_MPC)) {
> 		if (subflow->mp_join)
> 			goto reset;
> 		subflow->mp_capable = 0;
> @@ -965,7 +960,7 @@ static bool check_fully_established(struct mptcp_sock *msk, struct sock *ssk,
> 		return false;
> 	}
>
> -	if (mp_opt->deny_join_id0)
> +	if (mp_opt->suboptions & OPTION_MPTCP_DENYID0)
> 		WRITE_ONCE(msk->pm.remote_deny_join_id0, true);
>
> 	if (unlikely(!READ_ONCE(msk->pm.server_side)))
> @@ -1120,13 +1115,13 @@ bool mptcp_incoming_options(struct sock *sk, struct sk_buff *skb)
> 	if (!check_fully_established(msk, sk, subflow, skb, &mp_opt))
> 		return sk->sk_state != TCP_CLOSE;
>
> -	if (mp_opt.fastclose &&
> +	if ((mp_opt.suboptions & OPTION_MPTCP_FASTCLOSE) &&
> 	    msk->local_key == mp_opt.rcvr_key) {
> 		WRITE_ONCE(msk->rcv_fastclose, true);
> 		mptcp_schedule_work((struct sock *)msk);
> 	}
>
> -	if (mp_opt.add_addr && add_addr_hmac_valid(msk, &mp_opt)) {
> +	if ((mp_opt.suboptions & OPTION_MPTCP_ADD_ADDR) && add_addr_hmac_valid(msk, &mp_opt)) {
> 		if (!mp_opt.echo) {
> 			mptcp_pm_add_addr_received(msk, &mp_opt.addr);
> 			MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_ADDADDR);
> @@ -1138,34 +1133,28 @@ bool mptcp_incoming_options(struct sock *sk, struct sk_buff *skb)
>
> 		if (mp_opt.addr.port)
> 			MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_PORTADD);
> -
> -		mp_opt.add_addr = 0;
> 	}
>
> -	if (mp_opt.rm_addr) {
> +	if (mp_opt.suboptions & OPTION_MPTCP_RM_ADDR)
> 		mptcp_pm_rm_addr_received(msk, &mp_opt.rm_list);
> -		mp_opt.rm_addr = 0;
> -	}
>
> -	if (mp_opt.mp_prio) {
> +	if (mp_opt.suboptions & OPTION_MPTCP_PRIO) {
> 		mptcp_pm_mp_prio_received(sk, mp_opt.backup);
> 		MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_MPPRIORX);
> -		mp_opt.mp_prio = 0;
> 	}
>
> -	if (mp_opt.mp_fail) {
> +	if (mp_opt.suboptions & OPTION_MPTCP_FAIL) {
> 		mptcp_pm_mp_fail_received(sk, mp_opt.fail_seq);
> 		MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_MPFAILRX);
> -		mp_opt.mp_fail = 0;
> 	}
>
> -	if (mp_opt.reset) {
> +	if (mp_opt.suboptions & OPTION_MPTCP_RST) {
> 		subflow->reset_seen = 1;
> 		subflow->reset_reason = mp_opt.reset_reason;
> 		subflow->reset_transient = mp_opt.reset_transient;
> 	}
>
> -	if (!mp_opt.dss)
> +	if (!(mp_opt.suboptions & OPTION_MPTCP_DSS))
> 		return true;
>
> 	/* we can't wait for recvmsg() to update the ack_seq, otherwise
> @@ -1214,7 +1203,7 @@ bool mptcp_incoming_options(struct sock *sk, struct sk_buff *skb)
> 		}
> 		mpext->data_len = mp_opt.data_len;
> 		mpext->use_map = 1;
> -		mpext->csum_reqd = mp_opt.csum_reqd;
> +		mpext->csum_reqd = !!(mp_opt.suboptions & OPTION_MPTCP_CSUMREQD);
>
> 		if (mpext->csum_reqd)
> 			mpext->csum = mp_opt.csum;
> diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
> index 8eb2626503d7..b5f8ad634571 100644
> --- a/net/mptcp/protocol.c
> +++ b/net/mptcp/protocol.c
> @@ -2836,7 +2836,7 @@ struct sock *mptcp_sk_clone(const struct sock *sk,
> 	msk->token = subflow_req->token;
> 	msk->subflow = NULL;
> 	WRITE_ONCE(msk->fully_established, false);
> -	if (mp_opt->csum_reqd)
> +	if (mp_opt->suboptions & OPTION_MPTCP_CSUMREQD)
> 		WRITE_ONCE(msk->csum_enabled, true);
>
> 	msk->write_seq = subflow_req->idsn + 1;
> @@ -2845,7 +2845,7 @@ struct sock *mptcp_sk_clone(const struct sock *sk,
> 	msk->wnd_end = msk->snd_nxt + req->rsk_rcv_wnd;
> 	msk->setsockopt_seq = mptcp_sk(sk)->setsockopt_seq;
>
> -	if (mp_opt->mp_capable) {
> +	if (mp_opt->suboptions & OPTIONS_MPTCP_MPC) {
> 		msk->can_ack = true;
> 		msk->remote_key = mp_opt->sndr_key;
> 		mptcp_crypto_key_sha(msk->remote_key, NULL, &ack_seq);
> diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
> index 624a72e7ea17..9934bea21cb9 100644
> --- a/net/mptcp/protocol.h
> +++ b/net/mptcp/protocol.h
> @@ -29,6 +29,14 @@
> #define OPTION_MPTCP_DSS	BIT(11)
> #define OPTION_MPTCP_FAIL	BIT(12)
>
> +#define OPTION_MPTCP_CSUMREQD	BIT(13)
> +#define OPTION_MPTCP_DENYID0	BIT(14)
> +
> +#define OPTIONS_MPTCP_MPC	(OPTION_MPTCP_MPC_SYN | OPTION_MPTCP_MPC_SYNACK | \
> +				 OPTION_MPTCP_MPC_ACK)
> +#define OPTIONS_MPTCP_MPJ	(OPTION_MPTCP_MPJ_SYN | OPTION_MPTCP_MPJ_SYNACK | \
> +				 OPTION_MPTCP_MPJ_SYNACK)
> +
> /* MPTCP option subtypes */
> #define MPTCPOPT_MP_CAPABLE	0
> #define MPTCPOPT_MP_JOIN	1
> @@ -132,15 +140,7 @@ struct mptcp_options_received {
> 	u32	subflow_seq;
> 	u16	data_len;
> 	__sum16	csum;
> -	u16	mp_capable : 1,
> -		mp_join : 1,
> -		fastclose : 1,
> -		reset : 1,
> -		dss : 1,
> -		add_addr : 1,
> -		rm_addr : 1,
> -		mp_prio : 1,
> -		mp_fail : 1;
> +	u16	suboptions;
> 	u32	token;
> 	u32	nonce;
> 	u16	use_map:1,
> @@ -152,9 +152,7 @@ struct mptcp_options_received {
> 		reset_reason:4,
> 		reset_transient:1,
> 		echo:1,
> -		csum_reqd:1,
> 		backup:1,
> -		deny_join_id0:1,
> 		__unused:1;
> 	u8	join_id;
> 	u64	thmac;
> diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c
> index 54b7ffc21861..670bed9fcf2e 100644
> --- a/net/mptcp/subflow.c
> +++ b/net/mptcp/subflow.c
> @@ -141,6 +141,7 @@ static int subflow_check_req(struct request_sock *req,
> 	struct mptcp_subflow_context *listener = mptcp_subflow_ctx(sk_listener);
> 	struct mptcp_subflow_request_sock *subflow_req = mptcp_subflow_rsk(req);
> 	struct mptcp_options_received mp_opt;
> +	bool opt_mp_capable, opt_mp_join;
>
> 	pr_debug("subflow_req=%p, listener=%p", subflow_req, listener);
>
> @@ -154,16 +155,18 @@ static int subflow_check_req(struct request_sock *req,
>
> 	mptcp_get_options(sk_listener, skb, &mp_opt);
>
> -	if (mp_opt.mp_capable) {
> +	opt_mp_capable = !!(mp_opt.suboptions & OPTIONS_MPTCP_MPC);
> +	opt_mp_join = !!(mp_opt.suboptions & OPTIONS_MPTCP_MPJ);
> +	if (opt_mp_capable) {
> 		SUBFLOW_REQ_INC_STATS(req, MPTCP_MIB_MPCAPABLEPASSIVE);
>
> -		if (mp_opt.mp_join)
> +		if (opt_mp_join)
> 			return 0;
> -	} else if (mp_opt.mp_join) {
> +	} else if (opt_mp_join) {
> 		SUBFLOW_REQ_INC_STATS(req, MPTCP_MIB_JOINSYNRX);
> 	}
>
> -	if (mp_opt.mp_capable && listener->request_mptcp) {
> +	if (opt_mp_capable && listener->request_mptcp) {
> 		int err, retries = MPTCP_TOKEN_MAX_RETRIES;
>
> 		subflow_req->ssn_offset = TCP_SKB_CB(skb)->seq;
> @@ -194,7 +197,7 @@ static int subflow_check_req(struct request_sock *req,
> 		else
> 			SUBFLOW_REQ_INC_STATS(req, MPTCP_MIB_TOKENFALLBACKINIT);
>
> -	} else if (mp_opt.mp_join && listener->request_mptcp) {
> +	} else if (opt_mp_join && listener->request_mptcp) {
> 		subflow_req->ssn_offset = TCP_SKB_CB(skb)->seq;
> 		subflow_req->mp_join = 1;
> 		subflow_req->backup = mp_opt.backup;
> @@ -243,15 +246,18 @@ int mptcp_subflow_init_cookie_req(struct request_sock *req,
> 	struct mptcp_subflow_context *listener = mptcp_subflow_ctx(sk_listener);
> 	struct mptcp_subflow_request_sock *subflow_req = mptcp_subflow_rsk(req);
> 	struct mptcp_options_received mp_opt;
> +	bool opt_mp_capable, opt_mp_join;
> 	int err;
>
> 	subflow_init_req(req, sk_listener);
> 	mptcp_get_options(sk_listener, skb, &mp_opt);
>
> -	if (mp_opt.mp_capable && mp_opt.mp_join)
> +	opt_mp_capable = !!(mp_opt.suboptions & OPTIONS_MPTCP_MPC);
> +	opt_mp_join = !!(mp_opt.suboptions & OPTIONS_MPTCP_MPJ);
> +	if (opt_mp_capable && opt_mp_join)
> 		return -EINVAL;
>
> -	if (mp_opt.mp_capable && listener->request_mptcp) {
> +	if (opt_mp_capable && listener->request_mptcp) {
> 		if (mp_opt.sndr_key == 0)
> 			return -EINVAL;
>
> @@ -262,7 +268,7 @@ int mptcp_subflow_init_cookie_req(struct request_sock *req,
>
> 		subflow_req->mp_capable = 1;
> 		subflow_req->ssn_offset = TCP_SKB_CB(skb)->seq - 1;
> -	} else if (mp_opt.mp_join && listener->request_mptcp) {
> +	} else if (opt_mp_join && listener->request_mptcp) {
> 		if (!mptcp_token_join_cookie_init_state(subflow_req, skb))
> 			return -EINVAL;
>
> @@ -394,7 +400,6 @@ static void subflow_finish_connect(struct sock *sk, const struct sk_buff *skb)
>
> 	subflow->icsk_af_ops->sk_rx_dst_set(sk, skb);
>
> -
> 	/* be sure no special action on any packet other than syn-ack */
> 	if (subflow->conn_finished)
> 		return;
> @@ -407,7 +412,7 @@ static void subflow_finish_connect(struct sock *sk, const struct sk_buff *skb)
>
> 	mptcp_get_options(sk, skb, &mp_opt);
> 	if (subflow->request_mptcp) {
> -		if (!mp_opt.mp_capable) {
> +		if (!(mp_opt.suboptions & OPTIONS_MPTCP_MPC)) {
> 			MPTCP_INC_STATS(sock_net(sk),
> 					MPTCP_MIB_MPCAPABLEACTIVEFALLBACK);
> 			mptcp_do_fallback(sk);
> @@ -415,9 +420,9 @@ static void subflow_finish_connect(struct sock *sk, const struct sk_buff *skb)
> 			goto fallback;
> 		}
>
> -		if (mp_opt.csum_reqd)
> +		if (mp_opt.suboptions & OPTION_MPTCP_CSUMREQD)
> 			WRITE_ONCE(mptcp_sk(parent)->csum_enabled, true);
> -		if (mp_opt.deny_join_id0)
> +		if (mp_opt.suboptions & OPTION_MPTCP_DENYID0)
> 			WRITE_ONCE(mptcp_sk(parent)->pm.remote_deny_join_id0, true);
> 		subflow->mp_capable = 1;
> 		subflow->can_ack = 1;
> @@ -430,7 +435,7 @@ static void subflow_finish_connect(struct sock *sk, const struct sk_buff *skb)
> 	} else if (subflow->request_join) {
> 		u8 hmac[SHA256_DIGEST_SIZE];
>
> -		if (!mp_opt.mp_join) {
> +		if (!(mp_opt.suboptions & OPTIONS_MPTCP_MPJ)) {
> 			subflow->reset_reason = MPTCP_RST_EMPTCP;
> 			goto do_reset;
> 		}
> @@ -636,10 +641,10 @@ static struct sock *subflow_syn_recv_sock(const struct sock *sk,
>
> 	pr_debug("listener=%p, req=%p, conn=%p", listener, req, listener->conn);
>
> -	/* After child creation we must look for 'mp_capable' even when options
> +	/* After child creation we must look for MPC even when options
> 	 * are not parsed
> 	 */
> -	mp_opt.mp_capable = 0;
> +	mp_opt.suboptions = 0;
>
> 	/* hopefully temporary handling for MP_JOIN+syncookie */
> 	subflow_req = mptcp_subflow_rsk(req);
> @@ -659,7 +664,7 @@ static struct sock *subflow_syn_recv_sock(const struct sock *sk,
> 		 * options.
> 		 */
> 		mptcp_get_options(sk, skb, &mp_opt);
> -		if (!mp_opt.mp_capable) {
> +		if (!(mp_opt.suboptions & OPTIONS_MPTCP_MPC)) {
> 			fallback = true;
> 			goto create_child;
> 		}
> @@ -668,8 +673,10 @@ static struct sock *subflow_syn_recv_sock(const struct sock *sk,
> 		if (!new_msk)
> 			fallback = true;
> 	} else if (subflow_req->mp_join) {
> +		bool opt_mp_join = !!(mp_opt.suboptions & OPTIONS_MPTCP_MPJ);
> +
> 		mptcp_get_options(sk, skb, &mp_opt);
> -		if (!mp_opt.mp_join || !subflow_hmac_valid(req, &mp_opt) ||
> +		if (!opt_mp_join || !subflow_hmac_valid(req, &mp_opt) ||
> 		    !mptcp_can_accept_new_subflow(subflow_req->msk)) {
> 			SUBFLOW_REQ_INC_STATS(req, MPTCP_MIB_JOINACKMAC);
> 			fallback = true;
> @@ -726,7 +733,7 @@ static struct sock *subflow_syn_recv_sock(const struct sock *sk,
> 			/* with OoO packets we can reach here without ingress
> 			 * mpc option
> 			 */
> -			if (mp_opt.mp_capable)
> +			if (mp_opt.suboptions & OPTIONS_MPTCP_MPC)
> 				mptcp_subflow_fully_established(ctx, &mp_opt);
> 		} else if (ctx->mp_join) {
> 			struct mptcp_sock *owner;
> -- 
> 2.26.3
>
>
>

--
Mat Martineau
Intel

  reply	other threads:[~2021-08-19  1:10 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-08-18 10:35 [PATCH net-next 1/4] mptcp: do not set unconditionally csum_reqd on incoming opt Paolo Abeni
2021-08-18 10:35 ` [PATCH net-next 2/4] mptcp: better binary layout for mptcp_options_received Paolo Abeni
2021-08-18 10:35 ` [PATCH net-next 3/4] mptcp: consolidate in_opt sub-options fields in a bitmask Paolo Abeni
2021-08-19  1:10   ` Mat Martineau [this message]
2021-08-18 10:35 ` [PATCH net-next 4/4] mptcp: optimize the input options processing Paolo Abeni

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=298d5b5e-a478-4136-796-c0ecc8cb1d7d@linux.intel.com \
    --to=mathew.j.martineau@linux.intel.com \
    --cc=mptcp@lists.linux.dev \
    --cc=pabeni@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.