mptcp: use mptcp_addr_info in mptcp_options_received
This patch added a new struct mptcp_addr_info member addr in struct mptcp_options_received, and dropped the original family, addr_id, addr, addr6 and port fields in it. Then we can pass the parameter mp_opt.addr directly to mptcp_pm_add_addr_received and mptcp_pm_add_addr_echoed. Since the port number became big-endian now, use htons to convert the incoming port number to it. Also use ntohs to convert it when passing it to add_addr_generate_hmac or printing it out. Co-developed-by: Matthieu Baerts <matthieu.baerts@tessares.net> Signed-off-by: Matthieu Baerts <matthieu.baerts@tessares.net> Signed-off-by: Geliang Tang <geliangtang@gmail.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
fef6b7ecfb
commit
f7dafee185
2 changed files with 23 additions and 45 deletions
|
@ -220,45 +220,45 @@ static void mptcp_parse_option(const struct sk_buff *skb,
|
|||
if (!mp_opt->echo) {
|
||||
if (opsize == TCPOLEN_MPTCP_ADD_ADDR ||
|
||||
opsize == TCPOLEN_MPTCP_ADD_ADDR_PORT)
|
||||
mp_opt->family = MPTCP_ADDR_IPVERSION_4;
|
||||
mp_opt->addr.family = MPTCP_ADDR_IPVERSION_4;
|
||||
#if IS_ENABLED(CONFIG_MPTCP_IPV6)
|
||||
else if (opsize == TCPOLEN_MPTCP_ADD_ADDR6 ||
|
||||
opsize == TCPOLEN_MPTCP_ADD_ADDR6_PORT)
|
||||
mp_opt->family = MPTCP_ADDR_IPVERSION_6;
|
||||
mp_opt->addr.family = MPTCP_ADDR_IPVERSION_6;
|
||||
#endif
|
||||
else
|
||||
break;
|
||||
} else {
|
||||
if (opsize == TCPOLEN_MPTCP_ADD_ADDR_BASE ||
|
||||
opsize == TCPOLEN_MPTCP_ADD_ADDR_BASE_PORT)
|
||||
mp_opt->family = MPTCP_ADDR_IPVERSION_4;
|
||||
mp_opt->addr.family = MPTCP_ADDR_IPVERSION_4;
|
||||
#if IS_ENABLED(CONFIG_MPTCP_IPV6)
|
||||
else if (opsize == TCPOLEN_MPTCP_ADD_ADDR6_BASE ||
|
||||
opsize == TCPOLEN_MPTCP_ADD_ADDR6_BASE_PORT)
|
||||
mp_opt->family = MPTCP_ADDR_IPVERSION_6;
|
||||
mp_opt->addr.family = MPTCP_ADDR_IPVERSION_6;
|
||||
#endif
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
mp_opt->add_addr = 1;
|
||||
mp_opt->addr_id = *ptr++;
|
||||
if (mp_opt->family == MPTCP_ADDR_IPVERSION_4) {
|
||||
memcpy((u8 *)&mp_opt->addr.s_addr, (u8 *)ptr, 4);
|
||||
mp_opt->addr.id = *ptr++;
|
||||
if (mp_opt->addr.family == MPTCP_ADDR_IPVERSION_4) {
|
||||
memcpy((u8 *)&mp_opt->addr.addr.s_addr, (u8 *)ptr, 4);
|
||||
ptr += 4;
|
||||
if (opsize == TCPOLEN_MPTCP_ADD_ADDR_PORT ||
|
||||
opsize == TCPOLEN_MPTCP_ADD_ADDR_BASE_PORT) {
|
||||
mp_opt->port = get_unaligned_be16(ptr);
|
||||
mp_opt->addr.port = htons(get_unaligned_be16(ptr));
|
||||
ptr += 2;
|
||||
}
|
||||
}
|
||||
#if IS_ENABLED(CONFIG_MPTCP_IPV6)
|
||||
else {
|
||||
memcpy(mp_opt->addr6.s6_addr, (u8 *)ptr, 16);
|
||||
memcpy(mp_opt->addr.addr6.s6_addr, (u8 *)ptr, 16);
|
||||
ptr += 16;
|
||||
if (opsize == TCPOLEN_MPTCP_ADD_ADDR6_PORT ||
|
||||
opsize == TCPOLEN_MPTCP_ADD_ADDR6_BASE_PORT) {
|
||||
mp_opt->port = get_unaligned_be16(ptr);
|
||||
mp_opt->addr.port = htons(get_unaligned_be16(ptr));
|
||||
ptr += 2;
|
||||
}
|
||||
}
|
||||
|
@ -268,8 +268,8 @@ static void mptcp_parse_option(const struct sk_buff *skb,
|
|||
ptr += 8;
|
||||
}
|
||||
pr_debug("ADD_ADDR%s: id=%d, ahmac=%llu, echo=%d, port=%d",
|
||||
(mp_opt->family == MPTCP_ADDR_IPVERSION_6) ? "6" : "",
|
||||
mp_opt->addr_id, mp_opt->ahmac, mp_opt->echo, mp_opt->port);
|
||||
(mp_opt->addr.family == MPTCP_ADDR_IPVERSION_6) ? "6" : "",
|
||||
mp_opt->addr.id, mp_opt->ahmac, mp_opt->echo, ntohs(mp_opt->addr.port));
|
||||
break;
|
||||
|
||||
case MPTCPOPT_RM_ADDR:
|
||||
|
@ -335,7 +335,7 @@ void mptcp_get_options(const struct sk_buff *skb,
|
|||
mp_opt->add_addr = 0;
|
||||
mp_opt->ahmac = 0;
|
||||
mp_opt->fastclose = 0;
|
||||
mp_opt->port = 0;
|
||||
mp_opt->addr.port = 0;
|
||||
mp_opt->rm_addr = 0;
|
||||
mp_opt->dss = 0;
|
||||
mp_opt->mp_prio = 0;
|
||||
|
@ -991,17 +991,17 @@ static bool add_addr_hmac_valid(struct mptcp_sock *msk,
|
|||
if (mp_opt->echo)
|
||||
return true;
|
||||
|
||||
if (mp_opt->family == MPTCP_ADDR_IPVERSION_4)
|
||||
if (mp_opt->addr.family == MPTCP_ADDR_IPVERSION_4)
|
||||
hmac = add_addr_generate_hmac(msk->remote_key,
|
||||
msk->local_key,
|
||||
mp_opt->addr_id, &mp_opt->addr,
|
||||
mp_opt->port);
|
||||
mp_opt->addr.id, &mp_opt->addr.addr,
|
||||
ntohs(mp_opt->addr.port));
|
||||
#if IS_ENABLED(CONFIG_MPTCP_IPV6)
|
||||
else
|
||||
hmac = add_addr6_generate_hmac(msk->remote_key,
|
||||
msk->local_key,
|
||||
mp_opt->addr_id, &mp_opt->addr6,
|
||||
mp_opt->port);
|
||||
mp_opt->addr.id, &mp_opt->addr.addr6,
|
||||
ntohs(mp_opt->addr.port));
|
||||
#endif
|
||||
|
||||
pr_debug("msk=%p, ahmac=%llu, mp_opt->ahmac=%llu\n",
|
||||
|
@ -1043,30 +1043,16 @@ void mptcp_incoming_options(struct sock *sk, struct sk_buff *skb)
|
|||
}
|
||||
|
||||
if (mp_opt.add_addr && add_addr_hmac_valid(msk, &mp_opt)) {
|
||||
struct mptcp_addr_info addr;
|
||||
|
||||
addr.port = htons(mp_opt.port);
|
||||
addr.id = mp_opt.addr_id;
|
||||
if (mp_opt.family == MPTCP_ADDR_IPVERSION_4) {
|
||||
addr.family = AF_INET;
|
||||
addr.addr = mp_opt.addr;
|
||||
}
|
||||
#if IS_ENABLED(CONFIG_MPTCP_IPV6)
|
||||
else if (mp_opt.family == MPTCP_ADDR_IPVERSION_6) {
|
||||
addr.family = AF_INET6;
|
||||
addr.addr6 = mp_opt.addr6;
|
||||
}
|
||||
#endif
|
||||
if (!mp_opt.echo) {
|
||||
mptcp_pm_add_addr_received(msk, &addr);
|
||||
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, &addr);
|
||||
mptcp_pm_del_add_timer(msk, &addr);
|
||||
mptcp_pm_add_addr_echoed(msk, &mp_opt.addr);
|
||||
mptcp_pm_del_add_timer(msk, &mp_opt.addr);
|
||||
MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_ECHOADD);
|
||||
}
|
||||
|
||||
if (mp_opt.port)
|
||||
if (mp_opt.addr.port)
|
||||
MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_PORTADD);
|
||||
|
||||
mp_opt.add_addr = 0;
|
||||
|
|
|
@ -133,7 +133,6 @@ struct mptcp_options_received {
|
|||
add_addr : 1,
|
||||
rm_addr : 1,
|
||||
mp_prio : 1,
|
||||
family : 4,
|
||||
echo : 1,
|
||||
backup : 1;
|
||||
u32 token;
|
||||
|
@ -148,16 +147,9 @@ struct mptcp_options_received {
|
|||
ack64:1,
|
||||
mpc_map:1,
|
||||
__unused:2;
|
||||
u8 addr_id;
|
||||
struct mptcp_addr_info addr;
|
||||
struct mptcp_rm_list rm_list;
|
||||
union {
|
||||
struct in_addr addr;
|
||||
#if IS_ENABLED(CONFIG_MPTCP_IPV6)
|
||||
struct in6_addr addr6;
|
||||
#endif
|
||||
};
|
||||
u64 ahmac;
|
||||
u16 port;
|
||||
u8 reset_reason:4;
|
||||
u8 reset_transient:1;
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue