Skip to content

Commit 14da0d2

Browse files
committed
Merge branch 'mptcp-fixes-and-cleanup-for-v6-7'
Mat Martineau says: ==================== mptcp: Fixes and cleanup for v6.7 This series includes three initial patches that we had queued in our mptcp-net branch, but given the likely timing of net/net-next syncs this week, the need to avoid introducing branch conflicts, and another batch of net-next patches pending in the mptcp tree, the most practical route is to send everything for net-next. Patches 1 & 2 fix some intermittent selftest failures by adjusting timing. Patch 3 removes an unneccessary userspace path manager restriction on the removal of subflows with subflow ID 0. The remainder of the patches are all cleanup or selftest changes: Patches 4-8 clean up kernel code by removing unused parameters, making more consistent use of existing helper functions, and reducing extra casting of socket pointers. Patch 9 removes an unused variable in a selftest script. Patch 10 adds a little more detail to some mptcp_join test output. ==================== Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
2 parents 79fa295 + 629b35a commit 14da0d2

File tree

7 files changed

+88
-31
lines changed

7 files changed

+88
-31
lines changed

net/mptcp/pm.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ void mptcp_pm_subflow_established(struct mptcp_sock *msk)
184184
spin_unlock_bh(&pm->lock);
185185
}
186186

187-
void mptcp_pm_subflow_check_next(struct mptcp_sock *msk, const struct sock *ssk,
187+
void mptcp_pm_subflow_check_next(struct mptcp_sock *msk,
188188
const struct mptcp_subflow_context *subflow)
189189
{
190190
struct mptcp_pm_data *pm = &msk->pm;

net/mptcp/pm_userspace.c

Lines changed: 65 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ int mptcp_pm_nl_announce_doit(struct sk_buff *skb, struct genl_info *info)
152152
struct mptcp_pm_addr_entry addr_val;
153153
struct mptcp_sock *msk;
154154
int err = -EINVAL;
155+
struct sock *sk;
155156
u32 token_val;
156157

157158
if (!addr || !token) {
@@ -167,6 +168,8 @@ int mptcp_pm_nl_announce_doit(struct sk_buff *skb, struct genl_info *info)
167168
return err;
168169
}
169170

171+
sk = (struct sock *)msk;
172+
170173
if (!mptcp_pm_is_userspace(msk)) {
171174
GENL_SET_ERR_MSG(info, "invalid request; userspace PM not selected");
172175
goto announce_err;
@@ -190,7 +193,7 @@ int mptcp_pm_nl_announce_doit(struct sk_buff *skb, struct genl_info *info)
190193
goto announce_err;
191194
}
192195

193-
lock_sock((struct sock *)msk);
196+
lock_sock(sk);
194197
spin_lock_bh(&msk->pm.lock);
195198

196199
if (mptcp_pm_alloc_anno_list(msk, &addr_val.addr)) {
@@ -200,11 +203,45 @@ int mptcp_pm_nl_announce_doit(struct sk_buff *skb, struct genl_info *info)
200203
}
201204

202205
spin_unlock_bh(&msk->pm.lock);
203-
release_sock((struct sock *)msk);
206+
release_sock(sk);
204207

205208
err = 0;
206209
announce_err:
207-
sock_put((struct sock *)msk);
210+
sock_put(sk);
211+
return err;
212+
}
213+
214+
static int mptcp_userspace_pm_remove_id_zero_address(struct mptcp_sock *msk,
215+
struct genl_info *info)
216+
{
217+
struct mptcp_rm_list list = { .nr = 0 };
218+
struct mptcp_subflow_context *subflow;
219+
struct sock *sk = (struct sock *)msk;
220+
bool has_id_0 = false;
221+
int err = -EINVAL;
222+
223+
lock_sock(sk);
224+
mptcp_for_each_subflow(msk, subflow) {
225+
if (subflow->local_id == 0) {
226+
has_id_0 = true;
227+
break;
228+
}
229+
}
230+
if (!has_id_0) {
231+
GENL_SET_ERR_MSG(info, "address with id 0 not found");
232+
goto remove_err;
233+
}
234+
235+
list.ids[list.nr++] = 0;
236+
237+
spin_lock_bh(&msk->pm.lock);
238+
mptcp_pm_remove_addr(msk, &list);
239+
spin_unlock_bh(&msk->pm.lock);
240+
241+
err = 0;
242+
243+
remove_err:
244+
release_sock(sk);
208245
return err;
209246
}
210247

@@ -217,6 +254,7 @@ int mptcp_pm_nl_remove_doit(struct sk_buff *skb, struct genl_info *info)
217254
struct mptcp_sock *msk;
218255
LIST_HEAD(free_list);
219256
int err = -EINVAL;
257+
struct sock *sk;
220258
u32 token_val;
221259
u8 id_val;
222260

@@ -234,12 +272,19 @@ int mptcp_pm_nl_remove_doit(struct sk_buff *skb, struct genl_info *info)
234272
return err;
235273
}
236274

275+
sk = (struct sock *)msk;
276+
237277
if (!mptcp_pm_is_userspace(msk)) {
238278
GENL_SET_ERR_MSG(info, "invalid request; userspace PM not selected");
239279
goto remove_err;
240280
}
241281

242-
lock_sock((struct sock *)msk);
282+
if (id_val == 0) {
283+
err = mptcp_userspace_pm_remove_id_zero_address(msk, info);
284+
goto remove_err;
285+
}
286+
287+
lock_sock(sk);
243288

244289
list_for_each_entry(entry, &msk->pm.userspace_pm_local_addr_list, list) {
245290
if (entry->addr.id == id_val) {
@@ -250,23 +295,23 @@ int mptcp_pm_nl_remove_doit(struct sk_buff *skb, struct genl_info *info)
250295

251296
if (!match) {
252297
GENL_SET_ERR_MSG(info, "address with specified id not found");
253-
release_sock((struct sock *)msk);
298+
release_sock(sk);
254299
goto remove_err;
255300
}
256301

257302
list_move(&match->list, &free_list);
258303

259304
mptcp_pm_remove_addrs(msk, &free_list);
260305

261-
release_sock((struct sock *)msk);
306+
release_sock(sk);
262307

263308
list_for_each_entry_safe(match, entry, &free_list, list) {
264-
sock_kfree_s((struct sock *)msk, match, sizeof(*match));
309+
sock_kfree_s(sk, match, sizeof(*match));
265310
}
266311

267312
err = 0;
268313
remove_err:
269-
sock_put((struct sock *)msk);
314+
sock_put(sk);
270315
return err;
271316
}
272317

@@ -296,6 +341,8 @@ int mptcp_pm_nl_subflow_create_doit(struct sk_buff *skb, struct genl_info *info)
296341
return err;
297342
}
298343

344+
sk = (struct sock *)msk;
345+
299346
if (!mptcp_pm_is_userspace(msk)) {
300347
GENL_SET_ERR_MSG(info, "invalid request; userspace PM not selected");
301348
goto create_err;
@@ -313,8 +360,6 @@ int mptcp_pm_nl_subflow_create_doit(struct sk_buff *skb, struct genl_info *info)
313360
goto create_err;
314361
}
315362

316-
sk = (struct sock *)msk;
317-
318363
if (!mptcp_pm_addr_families_match(sk, &addr_l, &addr_r)) {
319364
GENL_SET_ERR_MSG(info, "families mismatch");
320365
err = -EINVAL;
@@ -342,7 +387,7 @@ int mptcp_pm_nl_subflow_create_doit(struct sk_buff *skb, struct genl_info *info)
342387
spin_unlock_bh(&msk->pm.lock);
343388

344389
create_err:
345-
sock_put((struct sock *)msk);
390+
sock_put(sk);
346391
return err;
347392
}
348393

@@ -419,6 +464,8 @@ int mptcp_pm_nl_subflow_destroy_doit(struct sk_buff *skb, struct genl_info *info
419464
return err;
420465
}
421466

467+
sk = (struct sock *)msk;
468+
422469
if (!mptcp_pm_is_userspace(msk)) {
423470
GENL_SET_ERR_MSG(info, "invalid request; userspace PM not selected");
424471
goto destroy_err;
@@ -448,7 +495,6 @@ int mptcp_pm_nl_subflow_destroy_doit(struct sk_buff *skb, struct genl_info *info
448495
goto destroy_err;
449496
}
450497

451-
sk = (struct sock *)msk;
452498
lock_sock(sk);
453499
ssk = mptcp_nl_find_ssk(msk, &addr_l, &addr_r);
454500
if (ssk) {
@@ -468,7 +514,7 @@ int mptcp_pm_nl_subflow_destroy_doit(struct sk_buff *skb, struct genl_info *info
468514
release_sock(sk);
469515

470516
destroy_err:
471-
sock_put((struct sock *)msk);
517+
sock_put(sk);
472518
return err;
473519
}
474520

@@ -478,6 +524,7 @@ int mptcp_userspace_pm_set_flags(struct net *net, struct nlattr *token,
478524
{
479525
struct mptcp_sock *msk;
480526
int ret = -EINVAL;
527+
struct sock *sk;
481528
u32 token_val;
482529

483530
token_val = nla_get_u32(token);
@@ -486,18 +533,20 @@ int mptcp_userspace_pm_set_flags(struct net *net, struct nlattr *token,
486533
if (!msk)
487534
return ret;
488535

536+
sk = (struct sock *)msk;
537+
489538
if (!mptcp_pm_is_userspace(msk))
490539
goto set_flags_err;
491540

492541
if (loc->addr.family == AF_UNSPEC ||
493542
rem->addr.family == AF_UNSPEC)
494543
goto set_flags_err;
495544

496-
lock_sock((struct sock *)msk);
545+
lock_sock(sk);
497546
ret = mptcp_pm_nl_mp_prio_send_ack(msk, &loc->addr, &rem->addr, bkup);
498-
release_sock((struct sock *)msk);
547+
release_sock(sk);
499548

500549
set_flags_err:
501-
sock_put((struct sock *)msk);
550+
sock_put(sk);
502551
return ret;
503552
}

net/mptcp/protocol.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1267,7 +1267,7 @@ static int mptcp_sendmsg_frag(struct sock *sk, struct sock *ssk,
12671267
* queue management operation, to avoid breaking the ext <->
12681268
* SSN association set here
12691269
*/
1270-
mpext = skb_ext_find(skb, SKB_EXT_MPTCP);
1270+
mpext = mptcp_get_ext(skb);
12711271
if (!mptcp_skb_can_collapse_to(data_seq, skb, mpext)) {
12721272
TCP_SKB_CB(skb)->eor = 1;
12731273
goto alloc_skb;
@@ -1289,7 +1289,7 @@ static int mptcp_sendmsg_frag(struct sock *sk, struct sock *ssk,
12891289

12901290
i = skb_shinfo(skb)->nr_frags;
12911291
reuse_skb = false;
1292-
mpext = skb_ext_find(skb, SKB_EXT_MPTCP);
1292+
mpext = mptcp_get_ext(skb);
12931293
}
12941294

12951295
/* Zero window and all data acked? Probe. */
@@ -2490,7 +2490,7 @@ void mptcp_close_ssk(struct sock *sk, struct sock *ssk,
24902490
/* subflow aborted before reaching the fully_established status
24912491
* attempt the creation of the next subflow
24922492
*/
2493-
mptcp_pm_subflow_check_next(mptcp_sk(sk), ssk, subflow);
2493+
mptcp_pm_subflow_check_next(mptcp_sk(sk), subflow);
24942494

24952495
__mptcp_close_ssk(sk, ssk, subflow, MPTCP_CF_PUSH);
24962496
}

net/mptcp/protocol.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -888,7 +888,7 @@ bool mptcp_pm_allow_new_subflow(struct mptcp_sock *msk);
888888
void mptcp_pm_connection_closed(struct mptcp_sock *msk);
889889
void mptcp_pm_subflow_established(struct mptcp_sock *msk);
890890
bool mptcp_pm_nl_check_work_pending(struct mptcp_sock *msk);
891-
void mptcp_pm_subflow_check_next(struct mptcp_sock *msk, const struct sock *ssk,
891+
void mptcp_pm_subflow_check_next(struct mptcp_sock *msk,
892892
const struct mptcp_subflow_context *subflow);
893893
void mptcp_pm_add_addr_received(const struct sock *ssk,
894894
const struct mptcp_addr_info *addr);
@@ -1065,7 +1065,7 @@ static inline bool mptcp_check_fallback(const struct sock *sk)
10651065

10661066
static inline void __mptcp_do_fallback(struct mptcp_sock *msk)
10671067
{
1068-
if (test_bit(MPTCP_FALLBACK_DONE, &msk->flags)) {
1068+
if (__mptcp_check_fallback(msk)) {
10691069
pr_debug("TCP fallback already done (msk=%p)", msk);
10701070
return;
10711071
}

net/mptcp/sockopt.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -916,7 +916,7 @@ void mptcp_diag_fill_info(struct mptcp_sock *msk, struct mptcp_info *info)
916916
mptcp_pm_get_local_addr_max(msk);
917917
}
918918

919-
if (test_bit(MPTCP_FALLBACK_DONE, &msk->flags))
919+
if (__mptcp_check_fallback(msk))
920920
flags |= MPTCP_INFO_FLAG_FALLBACK;
921921
if (READ_ONCE(msk->can_ack))
922922
flags |= MPTCP_INFO_FLAG_REMOTE_KEY_RECEIVED;

tools/testing/selftests/net/mptcp/mptcp_join.sh

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1770,7 +1770,10 @@ chk_rm_nr()
17701770
# in case of simult flush, the subflow removal count on each side is
17711771
# unreliable
17721772
count=$((count + cnt))
1773-
[ "$count" != "$rm_subflow_nr" ] && suffix="$count in [$rm_subflow_nr:$((rm_subflow_nr*2))]"
1773+
if [ "$count" != "$rm_subflow_nr" ]; then
1774+
suffix="$count in [$rm_subflow_nr:$((rm_subflow_nr*2))]"
1775+
extra_msg="$extra_msg simult"
1776+
fi
17741777
if [ $count -ge "$rm_subflow_nr" ] && \
17751778
[ "$count" -le "$((rm_subflow_nr *2 ))" ]; then
17761779
print_ok "$suffix"
@@ -3289,6 +3292,7 @@ userspace_pm_rm_sf_addr_ns1()
32893292
local addr=$1
32903293
local id=$2
32913294
local tk sp da dp
3295+
local cnt_addr cnt_sf
32923296

32933297
tk=$(grep "type:1," "$evts_ns1" |
32943298
sed -n 's/.*\(token:\)\([[:digit:]]*\).*$/\2/p;q')
@@ -3298,11 +3302,13 @@ userspace_pm_rm_sf_addr_ns1()
32983302
sed -n 's/.*\(daddr6:\)\([0-9a-f:.]*\).*$/\2/p;q')
32993303
dp=$(grep "type:10" "$evts_ns1" |
33003304
sed -n 's/.*\(dport:\)\([[:digit:]]*\).*$/\2/p;q')
3305+
cnt_addr=$(rm_addr_count ${ns1})
3306+
cnt_sf=$(rm_sf_count ${ns1})
33013307
ip netns exec $ns1 ./pm_nl_ctl rem token $tk id $id
33023308
ip netns exec $ns1 ./pm_nl_ctl dsf lip "::ffff:$addr" \
33033309
lport $sp rip $da rport $dp token $tk
3304-
wait_rm_addr $ns1 1
3305-
wait_rm_sf $ns1 1
3310+
wait_rm_addr $ns1 "${cnt_addr}"
3311+
wait_rm_sf $ns1 "${cnt_sf}"
33063312
}
33073313

33083314
userspace_pm_add_sf()
@@ -3324,17 +3330,20 @@ userspace_pm_rm_sf_addr_ns2()
33243330
local addr=$1
33253331
local id=$2
33263332
local tk da dp sp
3333+
local cnt_addr cnt_sf
33273334

33283335
tk=$(sed -n 's/.*\(token:\)\([[:digit:]]*\).*$/\2/p;q' "$evts_ns2")
33293336
da=$(sed -n 's/.*\(daddr4:\)\([0-9.]*\).*$/\2/p;q' "$evts_ns2")
33303337
dp=$(sed -n 's/.*\(dport:\)\([[:digit:]]*\).*$/\2/p;q' "$evts_ns2")
33313338
sp=$(grep "type:10" "$evts_ns2" |
33323339
sed -n 's/.*\(sport:\)\([[:digit:]]*\).*$/\2/p;q')
3340+
cnt_addr=$(rm_addr_count ${ns2})
3341+
cnt_sf=$(rm_sf_count ${ns2})
33333342
ip netns exec $ns2 ./pm_nl_ctl rem token $tk id $id
33343343
ip netns exec $ns2 ./pm_nl_ctl dsf lip $addr lport $sp \
33353344
rip $da rport $dp token $tk
3336-
wait_rm_addr $ns2 1
3337-
wait_rm_sf $ns2 1
3345+
wait_rm_addr $ns2 "${cnt_addr}"
3346+
wait_rm_sf $ns2 "${cnt_sf}"
33383347
}
33393348

33403349
userspace_tests()
@@ -3417,7 +3426,7 @@ userspace_tests()
34173426
continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then
34183427
set_userspace_pm $ns1
34193428
pm_nl_set_limits $ns2 1 1
3420-
speed=10 \
3429+
speed=5 \
34213430
run_tests $ns1 $ns2 10.0.1.1 &
34223431
local tests_pid=$!
34233432
wait_mpj $ns1
@@ -3438,7 +3447,7 @@ userspace_tests()
34383447
continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then
34393448
set_userspace_pm $ns2
34403449
pm_nl_set_limits $ns1 0 1
3441-
speed=10 \
3450+
speed=5 \
34423451
run_tests $ns1 $ns2 10.0.1.1 &
34433452
local tests_pid=$!
34443453
wait_mpj $ns2

tools/testing/selftests/net/mptcp/mptcp_sockopt.sh

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ cout=""
1111
ksft_skip=4
1212
timeout_poll=30
1313
timeout_test=$((timeout_poll * 2 + 1))
14-
mptcp_connect=""
1514
iptables="iptables"
1615
ip6tables="ip6tables"
1716

0 commit comments

Comments
 (0)