mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-30 22:26:55 +00:00
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: Paolo Abeni <pabeni@redhat.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
74c7dfbee3
commit
f6c2ef59bc
1 changed files with 42 additions and 39 deletions
|
@ -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))
|
||||
return sk->sk_state != TCP_CLOSE;
|
||||
|
||||
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.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);
|
||||
} else {
|
||||
mptcp_pm_add_addr_echoed(msk, &mp_opt.addr);
|
||||
mptcp_pm_del_add_timer(msk, &mp_opt.addr, true);
|
||||
MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_ECHOADD);
|
||||
if (unlikely(mp_opt.suboptions != OPTION_MPTCP_DSS)) {
|
||||
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.addr.port)
|
||||
MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_PORTADD);
|
||||
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);
|
||||
} else {
|
||||
mptcp_pm_add_addr_echoed(msk, &mp_opt.addr);
|
||||
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.suboptions & OPTION_MPTCP_RM_ADDR)
|
||||
mptcp_pm_rm_addr_received(msk, &mp_opt.rm_list);
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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.suboptions & OPTION_MPTCP_DSS))
|
||||
return true;
|
||||
}
|
||||
|
||||
if (mp_opt.suboptions & OPTION_MPTCP_RM_ADDR)
|
||||
mptcp_pm_rm_addr_received(msk, &mp_opt.rm_list);
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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.suboptions & OPTION_MPTCP_DSS))
|
||||
return true;
|
||||
|
||||
/* we can't wait for recvmsg() to update the ack_seq, otherwise
|
||||
* monodirectional flows will stuck
|
||||
*/
|
||||
|
@ -1179,7 +1182,7 @@ bool mptcp_incoming_options(struct sock *sk, struct sk_buff *skb)
|
|||
|
||||
memset(mpext, 0, sizeof(*mpext));
|
||||
|
||||
if (mp_opt.use_map) {
|
||||
if (likely(mp_opt.use_map)) {
|
||||
if (mp_opt.mpc_map) {
|
||||
/* this is an MP_CAPABLE carrying MPTCP data
|
||||
* we know this map the first chunk of data
|
||||
|
|
Loading…
Reference in a new issue