Commit 40453a5c authored by Geliang Tang's avatar Geliang Tang Committed by Jakub Kicinski

mptcp: add the incoming MP_PRIO support

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: default avatarGeliang Tang <geliangtang@gmail.com>
Signed-off-by: default avatarMat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 06706542
...@@ -282,6 +282,15 @@ static void mptcp_parse_option(const struct sk_buff *skb, ...@@ -282,6 +282,15 @@ static void mptcp_parse_option(const struct sk_buff *skb,
pr_debug("RM_ADDR: id=%d", mp_opt->rm_id); pr_debug("RM_ADDR: id=%d", mp_opt->rm_id);
break; 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: case MPTCPOPT_MP_FASTCLOSE:
if (opsize != TCPOLEN_MPTCP_FASTCLOSE) if (opsize != TCPOLEN_MPTCP_FASTCLOSE)
break; break;
...@@ -313,6 +322,7 @@ void mptcp_get_options(const struct sk_buff *skb, ...@@ -313,6 +322,7 @@ void mptcp_get_options(const struct sk_buff *skb,
mp_opt->port = 0; mp_opt->port = 0;
mp_opt->rm_addr = 0; mp_opt->rm_addr = 0;
mp_opt->dss = 0; mp_opt->dss = 0;
mp_opt->mp_prio = 0;
length = (th->doff * 4) - sizeof(struct tcphdr); length = (th->doff * 4) - sizeof(struct tcphdr);
ptr = (const unsigned char *)(th + 1); ptr = (const unsigned char *)(th + 1);
...@@ -1022,6 +1032,11 @@ void mptcp_incoming_options(struct sock *sk, struct sk_buff *skb) ...@@ -1022,6 +1032,11 @@ void mptcp_incoming_options(struct sock *sk, struct sk_buff *skb)
mp_opt.rm_addr = 0; 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) if (!mp_opt.dss)
return; return;
......
...@@ -207,6 +207,14 @@ void mptcp_pm_rm_addr_received(struct mptcp_sock *msk, u8 rm_id) ...@@ -207,6 +207,14 @@ void mptcp_pm_rm_addr_received(struct mptcp_sock *msk, u8 rm_id)
spin_unlock_bh(&pm->lock); 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 */ /* path manager helpers */
bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, unsigned int remaining, bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, unsigned int remaining,
......
...@@ -88,6 +88,9 @@ ...@@ -88,6 +88,9 @@
#define MPTCP_ADDR_IPVERSION_4 4 #define MPTCP_ADDR_IPVERSION_4 4
#define MPTCP_ADDR_IPVERSION_6 6 #define MPTCP_ADDR_IPVERSION_6 6
/* MPTCP MP_PRIO flags */
#define MPTCP_PRIO_BKUP BIT(0)
/* MPTCP socket flags */ /* MPTCP socket flags */
#define MPTCP_DATA_READY 0 #define MPTCP_DATA_READY 0
#define MPTCP_NOSPACE 1 #define MPTCP_NOSPACE 1
...@@ -118,6 +121,7 @@ struct mptcp_options_received { ...@@ -118,6 +121,7 @@ struct mptcp_options_received {
dss : 1, dss : 1,
add_addr : 1, add_addr : 1,
rm_addr : 1, rm_addr : 1,
mp_prio : 1,
family : 4, family : 4,
echo : 1, echo : 1,
backup : 1; backup : 1;
...@@ -553,6 +557,7 @@ void mptcp_pm_add_addr_received(struct mptcp_sock *msk, ...@@ -553,6 +557,7 @@ void mptcp_pm_add_addr_received(struct mptcp_sock *msk,
const struct mptcp_addr_info *addr); const struct mptcp_addr_info *addr);
void mptcp_pm_add_addr_send_ack(struct mptcp_sock *msk); 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_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, int mptcp_pm_nl_mp_prio_send_ack(struct mptcp_sock *msk,
struct mptcp_addr_info *addr, struct mptcp_addr_info *addr,
u8 bkup); u8 bkup);
......
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