Commit f6c2ef59 authored by Paolo Abeni's avatar Paolo Abeni Committed by David S. Miller

mptcp: optimize the input options processing

Most MPTCP packets carries a single MPTCP subption: the
DSS containing the mapping for the current packet.

Check explicitly for the above, so that is such scenario we
replace most conditional statements with a single likely() one.
Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
Signed-off-by: default avatarMat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 74c7dfbe
...@@ -1111,48 +1111,51 @@ bool mptcp_incoming_options(struct sock *sk, struct sk_buff *skb) ...@@ -1111,48 +1111,51 @@ bool mptcp_incoming_options(struct sock *sk, struct sk_buff *skb)
if (!check_fully_established(msk, sk, subflow, skb, &mp_opt)) if (!check_fully_established(msk, sk, subflow, skb, &mp_opt))
return sk->sk_state != TCP_CLOSE; return sk->sk_state != TCP_CLOSE;
if ((mp_opt.suboptions & OPTION_MPTCP_FASTCLOSE) && if (unlikely(mp_opt.suboptions != OPTION_MPTCP_DSS)) {
msk->local_key == mp_opt.rcvr_key) { if ((mp_opt.suboptions & OPTION_MPTCP_FASTCLOSE) &&
WRITE_ONCE(msk->rcv_fastclose, true); msk->local_key == mp_opt.rcvr_key) {
mptcp_schedule_work((struct sock *)msk); WRITE_ONCE(msk->rcv_fastclose, true);
} mptcp_schedule_work((struct sock *)msk);
}
if ((mp_opt.suboptions & OPTION_MPTCP_ADD_ADDR) && add_addr_hmac_valid(msk, &mp_opt)) { if ((mp_opt.suboptions & OPTION_MPTCP_ADD_ADDR) &&
if (!mp_opt.echo) { add_addr_hmac_valid(msk, &mp_opt)) {
mptcp_pm_add_addr_received(msk, &mp_opt.addr); if (!mp_opt.echo) {
MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_ADDADDR); mptcp_pm_add_addr_received(msk, &mp_opt.addr);
} else { MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_ADDADDR);
mptcp_pm_add_addr_echoed(msk, &mp_opt.addr); } else {
mptcp_pm_del_add_timer(msk, &mp_opt.addr, true); mptcp_pm_add_addr_echoed(msk, &mp_opt.addr);
MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_ECHOADD); mptcp_pm_del_add_timer(msk, &mp_opt.addr, true);
MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_ECHOADD);
}
if (mp_opt.addr.port)
MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_PORTADD);
} }
if (mp_opt.addr.port) if (mp_opt.suboptions & OPTION_MPTCP_RM_ADDR)
MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_PORTADD); mptcp_pm_rm_addr_received(msk, &mp_opt.rm_list);
}
if (mp_opt.suboptions & OPTION_MPTCP_RM_ADDR) if (mp_opt.suboptions & OPTION_MPTCP_PRIO) {
mptcp_pm_rm_addr_received(msk, &mp_opt.rm_list); mptcp_pm_mp_prio_received(sk, mp_opt.backup);
MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_MPPRIORX);
}
if (mp_opt.suboptions & OPTION_MPTCP_PRIO) { if (mp_opt.suboptions & OPTION_MPTCP_FAIL) {
mptcp_pm_mp_prio_received(sk, mp_opt.backup); mptcp_pm_mp_fail_received(sk, mp_opt.fail_seq);
MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_MPPRIORX); MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_MPFAILRX);
} }
if (mp_opt.suboptions & OPTION_MPTCP_FAIL) { if (mp_opt.suboptions & OPTION_MPTCP_RST) {
mptcp_pm_mp_fail_received(sk, mp_opt.fail_seq); subflow->reset_seen = 1;
MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_MPFAILRX); subflow->reset_reason = mp_opt.reset_reason;
} subflow->reset_transient = mp_opt.reset_transient;
}
if (mp_opt.suboptions & OPTION_MPTCP_RST) { if (!(mp_opt.suboptions & OPTION_MPTCP_DSS))
subflow->reset_seen = 1; return true;
subflow->reset_reason = mp_opt.reset_reason;
subflow->reset_transient = mp_opt.reset_transient;
} }
if (!(mp_opt.suboptions & OPTION_MPTCP_DSS))
return true;
/* we can't wait for recvmsg() to update the ack_seq, otherwise /* we can't wait for recvmsg() to update the ack_seq, otherwise
* monodirectional flows will stuck * monodirectional flows will stuck
*/ */
...@@ -1179,7 +1182,7 @@ bool mptcp_incoming_options(struct sock *sk, struct sk_buff *skb) ...@@ -1179,7 +1182,7 @@ bool mptcp_incoming_options(struct sock *sk, struct sk_buff *skb)
memset(mpext, 0, sizeof(*mpext)); memset(mpext, 0, sizeof(*mpext));
if (mp_opt.use_map) { if (likely(mp_opt.use_map)) {
if (mp_opt.mpc_map) { if (mp_opt.mpc_map) {
/* this is an MP_CAPABLE carrying MPTCP data /* this is an MP_CAPABLE carrying MPTCP data
* we know this map the first chunk of data * we know this map the first chunk of data
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment