Skip to content

Commit 6a389c8

Browse files
Geliang Tangkuba-moo
authored andcommitted
mptcp: add mptcp_userspace_pm_get_sock helper
Each userspace pm netlink function uses nla_get_u32() to get the msk token value, then pass it to mptcp_token_get_sock() to get the msk. Finally check whether userspace PM is selected on this msk. It makes sense to wrap them into a helper, named mptcp_userspace_pm_get_sock(), to do this. This patch doesn't change the behaviour of the code, just refactoring. Signed-off-by: Geliang Tang <[email protected]> Reviewed-by: Matthieu Baerts (NGI0) <[email protected]> Signed-off-by: Matthieu Baerts (NGI0) <[email protected]> Link: https://patch.msgid.link/20241213-net-next-mptcp-pm-misc-cleanup-v1-3-ddb6d00109a8@kernel.org Signed-off-by: Jakub Kicinski <[email protected]>
1 parent a28717d commit 6a389c8

File tree

1 file changed

+47
-97
lines changed

1 file changed

+47
-97
lines changed

net/mptcp/pm_userspace.c

Lines changed: 47 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -173,36 +173,50 @@ bool mptcp_userspace_pm_is_backup(struct mptcp_sock *msk,
173173
return backup;
174174
}
175175

176-
int mptcp_pm_nl_announce_doit(struct sk_buff *skb, struct genl_info *info)
176+
static struct mptcp_sock *mptcp_userspace_pm_get_sock(const struct genl_info *info)
177177
{
178178
struct nlattr *token = info->attrs[MPTCP_PM_ATTR_TOKEN];
179+
struct mptcp_sock *msk;
180+
181+
if (!token) {
182+
GENL_SET_ERR_MSG(info, "missing required token");
183+
return NULL;
184+
}
185+
186+
msk = mptcp_token_get_sock(genl_info_net(info), nla_get_u32(token));
187+
if (!msk) {
188+
NL_SET_ERR_MSG_ATTR(info->extack, token, "invalid token");
189+
return NULL;
190+
}
191+
192+
if (!mptcp_pm_is_userspace(msk)) {
193+
GENL_SET_ERR_MSG(info, "invalid request; userspace PM not selected");
194+
sock_put((struct sock *)msk);
195+
return NULL;
196+
}
197+
198+
return msk;
199+
}
200+
201+
int mptcp_pm_nl_announce_doit(struct sk_buff *skb, struct genl_info *info)
202+
{
179203
struct nlattr *addr = info->attrs[MPTCP_PM_ATTR_ADDR];
180204
struct mptcp_pm_addr_entry addr_val;
181205
struct mptcp_sock *msk;
182206
int err = -EINVAL;
183207
struct sock *sk;
184-
u32 token_val;
185208

186-
if (!addr || !token) {
187-
GENL_SET_ERR_MSG(info, "missing required inputs");
209+
if (!addr) {
210+
GENL_SET_ERR_MSG(info, "missing required address");
188211
return err;
189212
}
190213

191-
token_val = nla_get_u32(token);
192-
193-
msk = mptcp_token_get_sock(sock_net(skb->sk), token_val);
194-
if (!msk) {
195-
NL_SET_ERR_MSG_ATTR(info->extack, token, "invalid token");
214+
msk = mptcp_userspace_pm_get_sock(info);
215+
if (!msk)
196216
return err;
197-
}
198217

199218
sk = (struct sock *)msk;
200219

201-
if (!mptcp_pm_is_userspace(msk)) {
202-
GENL_SET_ERR_MSG(info, "invalid request; userspace PM not selected");
203-
goto announce_err;
204-
}
205-
206220
err = mptcp_pm_parse_entry(addr, info, true, &addr_val);
207221
if (err < 0) {
208222
GENL_SET_ERR_MSG(info, "error parsing local address");
@@ -275,38 +289,28 @@ static int mptcp_userspace_pm_remove_id_zero_address(struct mptcp_sock *msk,
275289

276290
int mptcp_pm_nl_remove_doit(struct sk_buff *skb, struct genl_info *info)
277291
{
278-
struct nlattr *token = info->attrs[MPTCP_PM_ATTR_TOKEN];
279292
struct nlattr *id = info->attrs[MPTCP_PM_ATTR_LOC_ID];
280293
struct mptcp_pm_addr_entry *match;
281294
struct mptcp_pm_addr_entry *entry;
282295
struct mptcp_sock *msk;
283296
LIST_HEAD(free_list);
284297
int err = -EINVAL;
285298
struct sock *sk;
286-
u32 token_val;
287299
u8 id_val;
288300

289-
if (!id || !token) {
290-
GENL_SET_ERR_MSG(info, "missing required inputs");
301+
if (!id) {
302+
GENL_SET_ERR_MSG(info, "missing required ID");
291303
return err;
292304
}
293305

294306
id_val = nla_get_u8(id);
295-
token_val = nla_get_u32(token);
296307

297-
msk = mptcp_token_get_sock(sock_net(skb->sk), token_val);
298-
if (!msk) {
299-
NL_SET_ERR_MSG_ATTR(info->extack, token, "invalid token");
308+
msk = mptcp_userspace_pm_get_sock(info);
309+
if (!msk)
300310
return err;
301-
}
302311

303312
sk = (struct sock *)msk;
304313

305-
if (!mptcp_pm_is_userspace(msk)) {
306-
GENL_SET_ERR_MSG(info, "invalid request; userspace PM not selected");
307-
goto out;
308-
}
309-
310314
if (id_val == 0) {
311315
err = mptcp_userspace_pm_remove_id_zero_address(msk, info);
312316
goto out;
@@ -343,36 +347,25 @@ int mptcp_pm_nl_remove_doit(struct sk_buff *skb, struct genl_info *info)
343347
int mptcp_pm_nl_subflow_create_doit(struct sk_buff *skb, struct genl_info *info)
344348
{
345349
struct nlattr *raddr = info->attrs[MPTCP_PM_ATTR_ADDR_REMOTE];
346-
struct nlattr *token = info->attrs[MPTCP_PM_ATTR_TOKEN];
347350
struct nlattr *laddr = info->attrs[MPTCP_PM_ATTR_ADDR];
348351
struct mptcp_pm_addr_entry entry = { 0 };
349352
struct mptcp_addr_info addr_r;
350353
struct mptcp_pm_local local;
351354
struct mptcp_sock *msk;
352355
int err = -EINVAL;
353356
struct sock *sk;
354-
u32 token_val;
355357

356-
if (!laddr || !raddr || !token) {
357-
GENL_SET_ERR_MSG(info, "missing required inputs");
358+
if (!laddr || !raddr) {
359+
GENL_SET_ERR_MSG(info, "missing required address(es)");
358360
return err;
359361
}
360362

361-
token_val = nla_get_u32(token);
362-
363-
msk = mptcp_token_get_sock(genl_info_net(info), token_val);
364-
if (!msk) {
365-
NL_SET_ERR_MSG_ATTR(info->extack, token, "invalid token");
363+
msk = mptcp_userspace_pm_get_sock(info);
364+
if (!msk)
366365
return err;
367-
}
368366

369367
sk = (struct sock *)msk;
370368

371-
if (!mptcp_pm_is_userspace(msk)) {
372-
GENL_SET_ERR_MSG(info, "invalid request; userspace PM not selected");
373-
goto create_err;
374-
}
375-
376369
err = mptcp_pm_parse_entry(laddr, info, true, &entry);
377370
if (err < 0) {
378371
NL_SET_ERR_MSG_ATTR(info->extack, laddr, "error parsing local addr");
@@ -475,35 +468,24 @@ static struct sock *mptcp_nl_find_ssk(struct mptcp_sock *msk,
475468
int mptcp_pm_nl_subflow_destroy_doit(struct sk_buff *skb, struct genl_info *info)
476469
{
477470
struct nlattr *raddr = info->attrs[MPTCP_PM_ATTR_ADDR_REMOTE];
478-
struct nlattr *token = info->attrs[MPTCP_PM_ATTR_TOKEN];
479471
struct nlattr *laddr = info->attrs[MPTCP_PM_ATTR_ADDR];
480472
struct mptcp_addr_info addr_l;
481473
struct mptcp_addr_info addr_r;
482474
struct mptcp_sock *msk;
483475
struct sock *sk, *ssk;
484476
int err = -EINVAL;
485-
u32 token_val;
486477

487-
if (!laddr || !raddr || !token) {
488-
GENL_SET_ERR_MSG(info, "missing required inputs");
478+
if (!laddr || !raddr) {
479+
GENL_SET_ERR_MSG(info, "missing required address(es)");
489480
return err;
490481
}
491482

492-
token_val = nla_get_u32(token);
493-
494-
msk = mptcp_token_get_sock(genl_info_net(info), token_val);
495-
if (!msk) {
496-
NL_SET_ERR_MSG_ATTR(info->extack, token, "invalid token");
483+
msk = mptcp_userspace_pm_get_sock(info);
484+
if (!msk)
497485
return err;
498-
}
499486

500487
sk = (struct sock *)msk;
501488

502-
if (!mptcp_pm_is_userspace(msk)) {
503-
GENL_SET_ERR_MSG(info, "invalid request; userspace PM not selected");
504-
goto destroy_err;
505-
}
506-
507489
err = mptcp_pm_parse_addr(laddr, info, &addr_l);
508490
if (err < 0) {
509491
NL_SET_ERR_MSG_ATTR(info->extack, laddr, "error parsing local addr");
@@ -566,31 +548,19 @@ int mptcp_userspace_pm_set_flags(struct sk_buff *skb, struct genl_info *info)
566548
struct mptcp_pm_addr_entry loc = { .addr = { .family = AF_UNSPEC }, };
567549
struct mptcp_pm_addr_entry rem = { .addr = { .family = AF_UNSPEC }, };
568550
struct nlattr *attr_rem = info->attrs[MPTCP_PM_ATTR_ADDR_REMOTE];
569-
struct nlattr *token = info->attrs[MPTCP_PM_ATTR_TOKEN];
570551
struct nlattr *attr = info->attrs[MPTCP_PM_ATTR_ADDR];
571-
struct net *net = sock_net(skb->sk);
572552
struct mptcp_pm_addr_entry *entry;
573553
struct mptcp_sock *msk;
574554
int ret = -EINVAL;
575555
struct sock *sk;
576-
u32 token_val;
577556
u8 bkup = 0;
578557

579-
token_val = nla_get_u32(token);
580-
581-
msk = mptcp_token_get_sock(net, token_val);
582-
if (!msk) {
583-
NL_SET_ERR_MSG_ATTR(info->extack, token, "invalid token");
558+
msk = mptcp_userspace_pm_get_sock(info);
559+
if (!msk)
584560
return ret;
585-
}
586561

587562
sk = (struct sock *)msk;
588563

589-
if (!mptcp_pm_is_userspace(msk)) {
590-
GENL_SET_ERR_MSG(info, "userspace PM not selected");
591-
goto set_flags_err;
592-
}
593-
594564
ret = mptcp_pm_parse_entry(attr, info, false, &loc);
595565
if (ret < 0)
596566
goto set_flags_err;
@@ -637,30 +607,20 @@ int mptcp_userspace_pm_dump_addr(struct sk_buff *msg,
637607
DECLARE_BITMAP(map, MPTCP_PM_MAX_ADDR_ID + 1);
638608
} *bitmap;
639609
const struct genl_info *info = genl_info_dump(cb);
640-
struct net *net = sock_net(msg->sk);
641610
struct mptcp_pm_addr_entry *entry;
642611
struct mptcp_sock *msk;
643-
struct nlattr *token;
644612
int ret = -EINVAL;
645613
struct sock *sk;
646614
void *hdr;
647615

648616
bitmap = (struct id_bitmap *)cb->ctx;
649-
token = info->attrs[MPTCP_PM_ATTR_TOKEN];
650617

651-
msk = mptcp_token_get_sock(net, nla_get_u32(token));
652-
if (!msk) {
653-
NL_SET_ERR_MSG_ATTR(info->extack, token, "invalid token");
618+
msk = mptcp_userspace_pm_get_sock(info);
619+
if (!msk)
654620
return ret;
655-
}
656621

657622
sk = (struct sock *)msk;
658623

659-
if (!mptcp_pm_is_userspace(msk)) {
660-
GENL_SET_ERR_MSG(info, "invalid request; userspace PM not selected");
661-
goto out;
662-
}
663-
664624
lock_sock(sk);
665625
spin_lock_bh(&msk->pm.lock);
666626
mptcp_for_each_userspace_pm_addr(msk, entry) {
@@ -685,7 +645,6 @@ int mptcp_userspace_pm_dump_addr(struct sk_buff *msg,
685645
release_sock(sk);
686646
ret = msg->len;
687647

688-
out:
689648
sock_put(sk);
690649
return ret;
691650
}
@@ -694,28 +653,19 @@ int mptcp_userspace_pm_get_addr(struct sk_buff *skb,
694653
struct genl_info *info)
695654
{
696655
struct nlattr *attr = info->attrs[MPTCP_PM_ENDPOINT_ADDR];
697-
struct nlattr *token = info->attrs[MPTCP_PM_ATTR_TOKEN];
698656
struct mptcp_pm_addr_entry addr, *entry;
699-
struct net *net = sock_net(skb->sk);
700657
struct mptcp_sock *msk;
701658
struct sk_buff *msg;
702659
int ret = -EINVAL;
703660
struct sock *sk;
704661
void *reply;
705662

706-
msk = mptcp_token_get_sock(net, nla_get_u32(token));
707-
if (!msk) {
708-
NL_SET_ERR_MSG_ATTR(info->extack, token, "invalid token");
663+
msk = mptcp_userspace_pm_get_sock(info);
664+
if (!msk)
709665
return ret;
710-
}
711666

712667
sk = (struct sock *)msk;
713668

714-
if (!mptcp_pm_is_userspace(msk)) {
715-
GENL_SET_ERR_MSG(info, "invalid request; userspace PM not selected");
716-
goto out;
717-
}
718-
719669
ret = mptcp_pm_parse_entry(attr, info, false, &addr);
720670
if (ret < 0)
721671
goto out;

0 commit comments

Comments
 (0)