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: Geliang Tang <geliangtang@gmail.com> Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
067065422f
commit
40453a5c61
@ -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,
|
|||||||
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)
|
|||||||
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)
|
|||||||
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 @@
|
|||||||
#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 {
|
|||||||
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,
|
|||||||
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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user