@@ -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
276290int 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)
343347int 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,
475468int 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