mptcp: add the incoming MP_PRIO support
authorGeliang Tang <geliangtang@gmail.com>
Sat, 9 Jan 2021 00:47:58 +0000 (16:47 -0800)
committerJakub Kicinski <kuba@kernel.org>
Sun, 10 Jan 2021 02:18:43 +0000 (18:18 -0800)
This patch added the incoming MP_PRIO logic:

Added a flag named mp_prio in struct mptcp_options_received, to mark the
MP_PRIO is received, and save the priority value to struct
mptcp_options_received's backup member. Then invoke
mptcp_pm_mp_prio_received with the receiving subsocket and the backup
value.

In mptcp_pm_mp_prio_received, get the subflow context according the input
subsocket, and change the subflow's backup as the incoming priority value.

Signed-off-by: Geliang Tang <geliangtang@gmail.com>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/mptcp/options.c
net/mptcp/pm.c
net/mptcp/protocol.h

index ef50a86..adfa96d 100644 (file)
@@ -282,6 +282,15 @@ static void mptcp_parse_option(const struct sk_buff *skb,
                pr_debug("RM_ADDR: id=%d", mp_opt->rm_id);
                break;
 
+       case MPTCPOPT_MP_PRIO:
+               if (opsize != TCPOLEN_MPTCP_PRIO)
+                       break;
+
+               mp_opt->mp_prio = 1;
+               mp_opt->backup = *ptr++ & MPTCP_PRIO_BKUP;
+               pr_debug("MP_PRIO: prio=%d", mp_opt->backup);
+               break;
+
        case MPTCPOPT_MP_FASTCLOSE:
                if (opsize != TCPOLEN_MPTCP_FASTCLOSE)
                        break;
@@ -313,6 +322,7 @@ void mptcp_get_options(const struct sk_buff *skb,
        mp_opt->port = 0;
        mp_opt->rm_addr = 0;
        mp_opt->dss = 0;
+       mp_opt->mp_prio = 0;
 
        length = (th->doff * 4) - sizeof(struct tcphdr);
        ptr = (const unsigned char *)(th + 1);
@@ -1022,6 +1032,11 @@ void mptcp_incoming_options(struct sock *sk, struct sk_buff *skb)
                mp_opt.rm_addr = 0;
        }
 
+       if (mp_opt.mp_prio) {
+               mptcp_pm_mp_prio_received(sk, mp_opt.backup);
+               mp_opt.mp_prio = 0;
+       }
+
        if (!mp_opt.dss)
                return;
 
index da2ed57..0a6ebd0 100644 (file)
@@ -207,6 +207,14 @@ void mptcp_pm_rm_addr_received(struct mptcp_sock *msk, u8 rm_id)
        spin_unlock_bh(&pm->lock);
 }
 
+void mptcp_pm_mp_prio_received(struct sock *sk, u8 bkup)
+{
+       struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
+
+       pr_debug("subflow->backup=%d, bkup=%d\n", subflow->backup, bkup);
+       subflow->backup = bkup;
+}
+
 /* path manager helpers */
 
 bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, unsigned int remaining,
index 21763e0..d6400ad 100644 (file)
@@ -88,6 +88,9 @@
 #define MPTCP_ADDR_IPVERSION_4 4
 #define MPTCP_ADDR_IPVERSION_6 6
 
+/* MPTCP MP_PRIO flags */
+#define MPTCP_PRIO_BKUP                BIT(0)
+
 /* MPTCP socket flags */
 #define MPTCP_DATA_READY       0
 #define MPTCP_NOSPACE          1
@@ -118,6 +121,7 @@ struct mptcp_options_received {
                dss : 1,
                add_addr : 1,
                rm_addr : 1,
+               mp_prio : 1,
                family : 4,
                echo : 1,
                backup : 1;
@@ -553,6 +557,7 @@ void mptcp_pm_add_addr_received(struct mptcp_sock *msk,
                                const struct mptcp_addr_info *addr);
 void mptcp_pm_add_addr_send_ack(struct mptcp_sock *msk);
 void mptcp_pm_rm_addr_received(struct mptcp_sock *msk, u8 rm_id);
+void mptcp_pm_mp_prio_received(struct sock *sk, u8 bkup);
 int mptcp_pm_nl_mp_prio_send_ack(struct mptcp_sock *msk,
                                 struct mptcp_addr_info *addr,
                                 u8 bkup);