Skip to content

Commit 6a6c05a

Browse files
geliangtangdavem330
authored andcommitted
mptcp: send out ADD_ADDR with echo flag
When the ADD_ADDR suboption has been received, we need to send out the same ADD_ADDR suboption with echo-flag=1, and no HMAC. Suggested-by: Mat Martineau <[email protected]> Reviewed-by: Mat Martineau <[email protected]> Signed-off-by: Geliang Tang <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent d0876b2 commit 6a6c05a

File tree

4 files changed

+32
-23
lines changed

4 files changed

+32
-23
lines changed

net/mptcp/options.c

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ static void mptcp_parse_option(const struct sk_buff *skb,
242242
mp_opt->add_addr = 1;
243243
mp_opt->port = 0;
244244
mp_opt->addr_id = *ptr++;
245-
pr_debug("ADD_ADDR: id=%d", mp_opt->addr_id);
245+
pr_debug("ADD_ADDR: id=%d, echo=%d", mp_opt->addr_id, mp_opt->echo);
246246
if (mp_opt->family == MPTCP_ADDR_IPVERSION_4) {
247247
memcpy((u8 *)&mp_opt->addr.s_addr, (u8 *)ptr, 4);
248248
ptr += 4;
@@ -579,10 +579,11 @@ static bool mptcp_established_options_add_addr(struct sock *sk,
579579
struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
580580
struct mptcp_sock *msk = mptcp_sk(subflow->conn);
581581
struct mptcp_addr_info saddr;
582+
bool echo;
582583
int len;
583584

584585
if (!mptcp_pm_should_add_signal(msk) ||
585-
!(mptcp_pm_add_addr_signal(msk, remaining, &saddr)))
586+
!(mptcp_pm_add_addr_signal(msk, remaining, &saddr, &echo)))
586587
return false;
587588

588589
len = mptcp_add_addr_len(saddr.family);
@@ -594,22 +595,26 @@ static bool mptcp_established_options_add_addr(struct sock *sk,
594595
if (saddr.family == AF_INET) {
595596
opts->suboptions |= OPTION_MPTCP_ADD_ADDR;
596597
opts->addr = saddr.addr;
597-
opts->ahmac = add_addr_generate_hmac(msk->local_key,
598-
msk->remote_key,
599-
opts->addr_id,
600-
&opts->addr);
598+
if (!echo) {
599+
opts->ahmac = add_addr_generate_hmac(msk->local_key,
600+
msk->remote_key,
601+
opts->addr_id,
602+
&opts->addr);
603+
}
601604
}
602605
#if IS_ENABLED(CONFIG_MPTCP_IPV6)
603606
else if (saddr.family == AF_INET6) {
604607
opts->suboptions |= OPTION_MPTCP_ADD_ADDR6;
605608
opts->addr6 = saddr.addr6;
606-
opts->ahmac = add_addr6_generate_hmac(msk->local_key,
607-
msk->remote_key,
608-
opts->addr_id,
609-
&opts->addr6);
609+
if (!echo) {
610+
opts->ahmac = add_addr6_generate_hmac(msk->local_key,
611+
msk->remote_key,
612+
opts->addr_id,
613+
&opts->addr6);
614+
}
610615
}
611616
#endif
612-
pr_debug("addr_id=%d, ahmac=%llu", opts->addr_id, opts->ahmac);
617+
pr_debug("addr_id=%d, ahmac=%llu, echo=%d", opts->addr_id, opts->ahmac, echo);
613618

614619
return true;
615620
}

net/mptcp/pm.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,13 @@
1313
/* path manager command handlers */
1414

1515
int mptcp_pm_announce_addr(struct mptcp_sock *msk,
16-
const struct mptcp_addr_info *addr)
16+
const struct mptcp_addr_info *addr,
17+
bool echo)
1718
{
1819
pr_debug("msk=%p, local_id=%d", msk, addr->id);
1920

2021
msk->pm.local = *addr;
22+
WRITE_ONCE(msk->pm.add_addr_echo, echo);
2123
WRITE_ONCE(msk->pm.add_addr_signal, true);
2224
return 0;
2325
}
@@ -135,15 +137,11 @@ void mptcp_pm_add_addr_received(struct mptcp_sock *msk,
135137
pr_debug("msk=%p remote_id=%d accept=%d", msk, addr->id,
136138
READ_ONCE(pm->accept_addr));
137139

138-
/* avoid acquiring the lock if there is no room for fouther addresses */
139-
if (!READ_ONCE(pm->accept_addr))
140-
return;
141-
142140
spin_lock_bh(&pm->lock);
143141

144-
/* be sure there is something to signal re-checking under PM lock */
145-
if (READ_ONCE(pm->accept_addr) &&
146-
mptcp_pm_schedule_work(msk, MPTCP_PM_ADD_ADDR_RECEIVED))
142+
if (!READ_ONCE(pm->accept_addr))
143+
mptcp_pm_announce_addr(msk, addr, true);
144+
else if (mptcp_pm_schedule_work(msk, MPTCP_PM_ADD_ADDR_RECEIVED))
147145
pm->remote = *addr;
148146

149147
spin_unlock_bh(&pm->lock);
@@ -164,7 +162,7 @@ void mptcp_pm_rm_addr_received(struct mptcp_sock *msk, u8 rm_id)
164162
/* path manager helpers */
165163

166164
bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, unsigned int remaining,
167-
struct mptcp_addr_info *saddr)
165+
struct mptcp_addr_info *saddr, bool *echo)
168166
{
169167
int ret = false;
170168

@@ -178,6 +176,7 @@ bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, unsigned int remaining,
178176
goto out_unlock;
179177

180178
*saddr = msk->pm.local;
179+
*echo = READ_ONCE(msk->pm.add_addr_echo);
181180
WRITE_ONCE(msk->pm.add_addr_signal, false);
182181
ret = true;
183182

@@ -226,6 +225,7 @@ void mptcp_pm_data_init(struct mptcp_sock *msk)
226225
WRITE_ONCE(msk->pm.rm_addr_signal, false);
227226
WRITE_ONCE(msk->pm.accept_addr, false);
228227
WRITE_ONCE(msk->pm.accept_subflow, false);
228+
WRITE_ONCE(msk->pm.add_addr_echo, false);
229229
msk->pm.status = 0;
230230

231231
spin_lock_init(&msk->pm.lock);

net/mptcp/pm_netlink.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ static void mptcp_pm_create_subflow_or_signal_addr(struct mptcp_sock *msk)
198198

199199
if (local) {
200200
msk->pm.add_addr_signaled++;
201-
mptcp_pm_announce_addr(msk, &local->addr);
201+
mptcp_pm_announce_addr(msk, &local->addr, false);
202202
} else {
203203
/* pick failed, avoid fourther attempts later */
204204
msk->pm.local_addr_used = msk->pm.add_addr_signal_max;
@@ -266,6 +266,8 @@ void mptcp_pm_nl_add_addr_received(struct mptcp_sock *msk)
266266
spin_unlock_bh(&msk->pm.lock);
267267
__mptcp_subflow_connect((struct sock *)msk, &local, &remote);
268268
spin_lock_bh(&msk->pm.lock);
269+
270+
mptcp_pm_announce_addr(msk, &remote, true);
269271
}
270272

271273
void mptcp_pm_nl_rm_addr_received(struct mptcp_sock *msk)

net/mptcp/protocol.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ struct mptcp_pm_data {
169169
bool work_pending;
170170
bool accept_addr;
171171
bool accept_subflow;
172+
bool add_addr_echo;
172173
u8 add_addr_signaled;
173174
u8 add_addr_accepted;
174175
u8 local_addr_used;
@@ -442,7 +443,8 @@ void mptcp_pm_add_addr_received(struct mptcp_sock *msk,
442443
void mptcp_pm_rm_addr_received(struct mptcp_sock *msk, u8 rm_id);
443444

444445
int mptcp_pm_announce_addr(struct mptcp_sock *msk,
445-
const struct mptcp_addr_info *addr);
446+
const struct mptcp_addr_info *addr,
447+
bool echo);
446448
int mptcp_pm_remove_addr(struct mptcp_sock *msk, u8 local_id);
447449
int mptcp_pm_remove_subflow(struct mptcp_sock *msk, u8 remote_id);
448450

@@ -464,7 +466,7 @@ static inline unsigned int mptcp_add_addr_len(int family)
464466
}
465467

466468
bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, unsigned int remaining,
467-
struct mptcp_addr_info *saddr);
469+
struct mptcp_addr_info *saddr, bool *echo);
468470
bool mptcp_pm_rm_addr_signal(struct mptcp_sock *msk, unsigned int remaining,
469471
u8 *rm_id);
470472
int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc);

0 commit comments

Comments
 (0)