@@ -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
275289int 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)
342346int 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,
474467int 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