mptcp: optimize the input options processing
authorPaolo Abeni <pabeni@redhat.com>
Fri, 27 Aug 2021 00:44:53 +0000 (17:44 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 27 Aug 2021 08:45:07 +0000 (09:45 +0100)
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>
net/mptcp/options.c

index 0d33c02..c41273c 100644 (file)
@@ -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 (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.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.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.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_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_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_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_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_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