Skip to content

Commit e5ad6ed

Browse files
Geliang Tangintel-lab-lkp
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]>
1 parent 7659c99 commit e5ad6ed

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
@@ -172,36 +172,50 @@ bool mptcp_userspace_pm_is_backup(struct mptcp_sock *msk,
172172
return backup;
173173
}
174174

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

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

190-
token_val = nla_get_u32(token);
191-
192-
msk = mptcp_token_get_sock(sock_net(skb->sk), token_val);
193-
if (!msk) {
194-
NL_SET_ERR_MSG_ATTR(info->extack, token, "invalid token");
213+
msk = mptcp_userspace_pm_get_sock(info);
214+
if (!msk)
195215
return err;
196-
}
197216

198217
sk = (struct sock *)msk;
199218

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

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

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

293305
id_val = nla_get_u8(id);
294-
token_val = nla_get_u32(token);
295306

296-
msk = mptcp_token_get_sock(sock_net(skb->sk), token_val);
297-
if (!msk) {
298-
NL_SET_ERR_MSG_ATTR(info->extack, token, "invalid token");
307+
msk = mptcp_userspace_pm_get_sock(info);
308+
if (!msk)
299309
return err;
300-
}
301310

302311
sk = (struct sock *)msk;
303312

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

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

360-
token_val = nla_get_u32(token);
361-
362-
msk = mptcp_token_get_sock(genl_info_net(info), token_val);
363-
if (!msk) {
364-
NL_SET_ERR_MSG_ATTR(info->extack, token, "invalid token");
362+
msk = mptcp_userspace_pm_get_sock(info);
363+
if (!msk)
365364
return err;
366-
}
367365

368366
sk = (struct sock *)msk;
369367

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

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

491-
token_val = nla_get_u32(token);
492-
493-
msk = mptcp_token_get_sock(genl_info_net(info), token_val);
494-
if (!msk) {
495-
NL_SET_ERR_MSG_ATTR(info->extack, token, "invalid token");
482+
msk = mptcp_userspace_pm_get_sock(info);
483+
if (!msk)
496484
return err;
497-
}
498485

499486
sk = (struct sock *)msk;
500487

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

578-
token_val = nla_get_u32(token);
579-
580-
msk = mptcp_token_get_sock(net, token_val);
581-
if (!msk) {
582-
NL_SET_ERR_MSG_ATTR(info->extack, token, "invalid token");
557+
msk = mptcp_userspace_pm_get_sock(info);
558+
if (!msk)
583559
return ret;
584-
}
585560

586561
sk = (struct sock *)msk;
587562

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

647615
bitmap = (struct id_bitmap *)cb->ctx;
648-
token = info->attrs[MPTCP_PM_ATTR_TOKEN];
649616

650-
msk = mptcp_token_get_sock(net, nla_get_u32(token));
651-
if (!msk) {
652-
NL_SET_ERR_MSG_ATTR(info->extack, token, "invalid token");
617+
msk = mptcp_userspace_pm_get_sock(info);
618+
if (!msk)
653619
return ret;
654-
}
655620

656621
sk = (struct sock *)msk;
657622

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

687-
out:
688647
sock_put(sk);
689648
return ret;
690649
}
@@ -693,28 +652,19 @@ int mptcp_userspace_pm_get_addr(struct sk_buff *skb,
693652
struct genl_info *info)
694653
{
695654
struct nlattr *attr = info->attrs[MPTCP_PM_ENDPOINT_ADDR];
696-
struct nlattr *token = info->attrs[MPTCP_PM_ATTR_TOKEN];
697655
struct mptcp_pm_addr_entry addr, *entry;
698-
struct net *net = sock_net(skb->sk);
699656
struct mptcp_sock *msk;
700657
struct sk_buff *msg;
701658
int ret = -EINVAL;
702659
struct sock *sk;
703660
void *reply;
704661

705-
msk = mptcp_token_get_sock(net, nla_get_u32(token));
706-
if (!msk) {
707-
NL_SET_ERR_MSG_ATTR(info->extack, token, "invalid token");
662+
msk = mptcp_userspace_pm_get_sock(info);
663+
if (!msk)
708664
return ret;
709-
}
710665

711666
sk = (struct sock *)msk;
712667

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

0 commit comments

Comments
 (0)