@@ -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
470516destroy_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
500549set_flags_err :
501- sock_put (( struct sock * ) msk );
550+ sock_put (sk );
502551 return ret ;
503552}
0 commit comments