xref: /linux/net/mptcp/pm_userspace.c (revision f4cdf7ca9a1fdcca413157df19753f388a5a224e)
1 // SPDX-License-Identifier: GPL-2.0
2 /* Multipath TCP
3  *
4  * Copyright (c) 2022, Intel Corporation.
5  */
6 
7 #include "protocol.h"
8 #include "mib.h"
9 #include "mptcp_pm_gen.h"
10 
11 #define mptcp_for_each_userspace_pm_addr(__msk, __entry)			\
12 	list_for_each_entry(__entry,						\
13 			    &((__msk)->pm.userspace_pm_local_addr_list), list)
14 
15 void mptcp_userspace_pm_free_local_addr_list(struct mptcp_sock *msk)
16 {
17 	struct mptcp_pm_addr_entry *entry, *tmp;
18 	struct sock *sk = (struct sock *)msk;
19 	LIST_HEAD(free_list);
20 
21 	spin_lock_bh(&msk->pm.lock);
22 	list_splice_init(&msk->pm.userspace_pm_local_addr_list, &free_list);
23 	spin_unlock_bh(&msk->pm.lock);
24 
25 	list_for_each_entry_safe(entry, tmp, &free_list, list) {
26 		sock_kfree_s(sk, entry, sizeof(*entry));
27 	}
28 }
29 
30 static struct mptcp_pm_addr_entry *
31 mptcp_userspace_pm_lookup_addr(struct mptcp_sock *msk,
32 			       const struct mptcp_addr_info *addr)
33 {
34 	struct mptcp_pm_addr_entry *entry;
35 
36 	mptcp_for_each_userspace_pm_addr(msk, entry) {
37 		if (mptcp_addresses_equal(&entry->addr, addr, false))
38 			return entry;
39 	}
40 	return NULL;
41 }
42 
43 static int mptcp_userspace_pm_append_new_local_addr(struct mptcp_sock *msk,
44 						    struct mptcp_pm_addr_entry *entry,
45 						    bool needs_id)
46 {
47 	DECLARE_BITMAP(id_bitmap, MPTCP_PM_MAX_ADDR_ID + 1);
48 	struct sock *sk = (struct sock *)msk;
49 	struct mptcp_pm_addr_entry *e;
50 	bool addr_match = false;
51 	bool id_match = false;
52 	int ret = -EINVAL;
53 
54 	bitmap_zero(id_bitmap, MPTCP_PM_MAX_ADDR_ID + 1);
55 
56 	spin_lock_bh(&msk->pm.lock);
57 	if (msk->pm.status & BIT(MPTCP_PM_DESTROYING)) {
58 		ret = -EINVAL;
59 		goto append_err;
60 	}
61 	mptcp_for_each_userspace_pm_addr(msk, e) {
62 		addr_match = mptcp_addresses_equal(&e->addr, &entry->addr, true);
63 		if (addr_match && entry->addr.id == 0 && needs_id)
64 			entry->addr.id = e->addr.id;
65 		id_match = (e->addr.id == entry->addr.id);
66 		if (addr_match || id_match)
67 			break;
68 		__set_bit(e->addr.id, id_bitmap);
69 	}
70 
71 	if (!addr_match && !id_match) {
72 		/* Memory for the entry is allocated from the
73 		 * sock option buffer.
74 		 */
75 		e = sock_kmemdup(sk, entry, sizeof(*entry), GFP_ATOMIC);
76 		if (!e) {
77 			ret = -ENOMEM;
78 			goto append_err;
79 		}
80 
81 		if (!e->addr.id && needs_id)
82 			e->addr.id = find_next_zero_bit(id_bitmap,
83 							MPTCP_PM_MAX_ADDR_ID + 1,
84 							1);
85 		list_add_tail_rcu(&e->list, &msk->pm.userspace_pm_local_addr_list);
86 		msk->pm.local_addr_used++;
87 		ret = e->addr.id;
88 	} else if (addr_match && id_match) {
89 		ret = entry->addr.id;
90 	}
91 
92 append_err:
93 	spin_unlock_bh(&msk->pm.lock);
94 	return ret;
95 }
96 
97 /* If the subflow is closed from the other peer (not via a
98  * subflow destroy command then), we want to keep the entry
99  * not to assign the same ID to another address and to be
100  * able to send RM_ADDR after the removal of the subflow.
101  */
102 static int mptcp_userspace_pm_delete_local_addr(struct mptcp_sock *msk,
103 						struct mptcp_pm_addr_entry *addr)
104 {
105 	struct sock *sk = (struct sock *)msk;
106 	struct mptcp_pm_addr_entry *entry;
107 
108 	entry = mptcp_userspace_pm_lookup_addr(msk, &addr->addr);
109 	if (!entry)
110 		return -EINVAL;
111 
112 	/* TODO: a refcount is needed because the entry can
113 	 * be used multiple times (e.g. fullmesh mode).
114 	 */
115 	list_del_rcu(&entry->list);
116 	sock_kfree_s(sk, entry, sizeof(*entry));
117 	msk->pm.local_addr_used--;
118 	return 0;
119 }
120 
121 static struct mptcp_pm_addr_entry *
122 mptcp_userspace_pm_lookup_addr_by_id(struct mptcp_sock *msk, unsigned int id)
123 {
124 	struct mptcp_pm_addr_entry *entry;
125 
126 	mptcp_for_each_userspace_pm_addr(msk, entry) {
127 		if (entry->addr.id == id)
128 			return entry;
129 	}
130 	return NULL;
131 }
132 
133 int mptcp_userspace_pm_get_local_id(struct mptcp_sock *msk,
134 				    struct mptcp_pm_addr_entry *skc)
135 {
136 	__be16 msk_sport =  ((struct inet_sock *)
137 			     inet_sk((struct sock *)msk))->inet_sport;
138 	struct mptcp_pm_addr_entry *entry;
139 	int id;
140 
141 	spin_lock_bh(&msk->pm.lock);
142 	entry = mptcp_userspace_pm_lookup_addr(msk, &skc->addr);
143 	id = entry ? entry->addr.id : -1;
144 	spin_unlock_bh(&msk->pm.lock);
145 
146 	if (id != -1)
147 		return id;
148 
149 	if (skc->addr.port == msk_sport)
150 		skc->addr.port = 0;
151 
152 	return mptcp_userspace_pm_append_new_local_addr(msk, skc, true);
153 }
154 
155 bool mptcp_userspace_pm_is_backup(struct mptcp_sock *msk,
156 				  struct mptcp_addr_info *skc)
157 {
158 	struct mptcp_pm_addr_entry *entry;
159 	bool backup;
160 
161 	spin_lock_bh(&msk->pm.lock);
162 	entry = mptcp_userspace_pm_lookup_addr(msk, skc);
163 	backup = entry && !!(entry->flags & MPTCP_PM_ADDR_FLAG_BACKUP);
164 	spin_unlock_bh(&msk->pm.lock);
165 
166 	return backup;
167 }
168 
169 static struct mptcp_sock *mptcp_userspace_pm_get_sock(const struct genl_info *info)
170 {
171 	struct mptcp_sock *msk;
172 	struct nlattr *token;
173 
174 	if (GENL_REQ_ATTR_CHECK(info, MPTCP_PM_ATTR_TOKEN))
175 		return NULL;
176 
177 	token = info->attrs[MPTCP_PM_ATTR_TOKEN];
178 	msk = mptcp_token_get_sock(genl_info_net(info), nla_get_u32(token));
179 	if (!msk) {
180 		NL_SET_ERR_MSG_ATTR(info->extack, token, "invalid token");
181 		return NULL;
182 	}
183 
184 	if (!mptcp_pm_is_userspace(msk)) {
185 		NL_SET_ERR_MSG_ATTR(info->extack, token,
186 				    "userspace PM not selected");
187 		sock_put((struct sock *)msk);
188 		return NULL;
189 	}
190 
191 	return msk;
192 }
193 
194 int mptcp_pm_nl_announce_doit(struct sk_buff *skb, struct genl_info *info)
195 {
196 	struct mptcp_pm_addr_entry addr_val;
197 	struct mptcp_sock *msk;
198 	struct nlattr *addr;
199 	int err = -EINVAL;
200 	struct sock *sk;
201 
202 	if (GENL_REQ_ATTR_CHECK(info, MPTCP_PM_ATTR_ADDR))
203 		return err;
204 
205 	msk = mptcp_userspace_pm_get_sock(info);
206 	if (!msk)
207 		return err;
208 
209 	sk = (struct sock *)msk;
210 
211 	addr = info->attrs[MPTCP_PM_ATTR_ADDR];
212 	err = mptcp_pm_parse_entry(addr, info, true, &addr_val);
213 	if (err < 0)
214 		goto announce_err;
215 
216 	if (addr_val.addr.id == 0) {
217 		NL_SET_ERR_MSG_ATTR(info->extack, addr, "invalid addr id");
218 		err = -EINVAL;
219 		goto announce_err;
220 	}
221 
222 	if (!(addr_val.flags & MPTCP_PM_ADDR_FLAG_SIGNAL)) {
223 		NL_SET_ERR_MSG_ATTR(info->extack, addr, "invalid addr flags");
224 		err = -EINVAL;
225 		goto announce_err;
226 	}
227 
228 	err = mptcp_userspace_pm_append_new_local_addr(msk, &addr_val, false);
229 	if (err < 0) {
230 		NL_SET_ERR_MSG_ATTR(info->extack, addr,
231 				    "did not match address and id");
232 		goto announce_err;
233 	}
234 
235 	lock_sock(sk);
236 	spin_lock_bh(&msk->pm.lock);
237 
238 	if (mptcp_pm_announced_alloc(msk, &addr_val.addr)) {
239 		msk->pm.add_addr_signaled++;
240 		mptcp_pm_announce_addr(msk, &addr_val.addr, false);
241 		mptcp_pm_addr_send_ack(msk);
242 	}
243 
244 	spin_unlock_bh(&msk->pm.lock);
245 	release_sock(sk);
246 
247 	err = 0;
248  announce_err:
249 	sock_put(sk);
250 	return err;
251 }
252 
253 static int mptcp_userspace_pm_remove_id_zero_address(struct mptcp_sock *msk)
254 {
255 	struct mptcp_rm_list list = { .nr = 0 };
256 	struct mptcp_subflow_context *subflow;
257 	struct sock *sk = (struct sock *)msk;
258 	bool has_id_0 = false;
259 	int err = -EINVAL;
260 
261 	lock_sock(sk);
262 	mptcp_for_each_subflow(msk, subflow) {
263 		if (READ_ONCE(subflow->local_id) == 0) {
264 			has_id_0 = true;
265 			break;
266 		}
267 	}
268 	if (!has_id_0)
269 		goto remove_err;
270 
271 	list.ids[list.nr++] = 0;
272 
273 	spin_lock_bh(&msk->pm.lock);
274 	mptcp_pm_remove_addr(msk, &list);
275 	spin_unlock_bh(&msk->pm.lock);
276 
277 	err = 0;
278 
279 remove_err:
280 	release_sock(sk);
281 	return err;
282 }
283 
284 void mptcp_pm_remove_addr_entry(struct mptcp_sock *msk,
285 				struct mptcp_pm_addr_entry *entry)
286 {
287 	struct mptcp_rm_list alist = { .nr = 0 };
288 	int anno_nr = 0;
289 
290 	/* only delete if either announced or matching a subflow */
291 	if (mptcp_pm_announced_remove(msk, &entry->addr))
292 		anno_nr++;
293 	else if (!mptcp_pm_has_subflow_saddr(msk, &entry->addr))
294 		return;
295 
296 	alist.ids[alist.nr++] = entry->addr.id;
297 
298 	spin_lock_bh(&msk->pm.lock);
299 	msk->pm.add_addr_signaled -= anno_nr;
300 	mptcp_pm_remove_addr(msk, &alist);
301 	spin_unlock_bh(&msk->pm.lock);
302 }
303 
304 int mptcp_pm_nl_remove_doit(struct sk_buff *skb, struct genl_info *info)
305 {
306 	struct mptcp_pm_addr_entry *match;
307 	struct mptcp_sock *msk;
308 	struct nlattr *id;
309 	int err = -EINVAL;
310 	struct sock *sk;
311 	u8 id_val;
312 
313 	if (GENL_REQ_ATTR_CHECK(info, MPTCP_PM_ATTR_LOC_ID))
314 		return err;
315 
316 	id = info->attrs[MPTCP_PM_ATTR_LOC_ID];
317 	id_val = nla_get_u8(id);
318 
319 	msk = mptcp_userspace_pm_get_sock(info);
320 	if (!msk)
321 		return err;
322 
323 	sk = (struct sock *)msk;
324 
325 	if (id_val == 0) {
326 		err = mptcp_userspace_pm_remove_id_zero_address(msk);
327 		goto out;
328 	}
329 
330 	lock_sock(sk);
331 
332 	spin_lock_bh(&msk->pm.lock);
333 	match = mptcp_userspace_pm_lookup_addr_by_id(msk, id_val);
334 	if (!match) {
335 		spin_unlock_bh(&msk->pm.lock);
336 		release_sock(sk);
337 		goto out;
338 	}
339 
340 	list_del_rcu(&match->list);
341 	spin_unlock_bh(&msk->pm.lock);
342 
343 	mptcp_pm_remove_addr_entry(msk, match);
344 
345 	release_sock(sk);
346 
347 	kfree_rcu_mightsleep(match);
348 	/* Adjust sk_omem_alloc like sock_kfree_s() does, to match
349 	 * with allocation of this memory by sock_kmemdup()
350 	 */
351 	atomic_sub(sizeof(*match), &sk->sk_omem_alloc);
352 
353 	err = 0;
354 out:
355 	if (err)
356 		NL_SET_ERR_MSG_ATTR_FMT(info->extack, id,
357 					"address with id %u not found",
358 					id_val);
359 
360 	sock_put(sk);
361 	return err;
362 }
363 
364 int mptcp_pm_nl_subflow_create_doit(struct sk_buff *skb, struct genl_info *info)
365 {
366 	struct mptcp_pm_addr_entry entry = { 0 };
367 	struct mptcp_addr_info addr_r;
368 	struct nlattr *raddr, *laddr;
369 	struct mptcp_pm_local local;
370 	struct mptcp_sock *msk;
371 	int err = -EINVAL;
372 	struct sock *sk;
373 
374 	if (GENL_REQ_ATTR_CHECK(info, MPTCP_PM_ATTR_ADDR) ||
375 	    GENL_REQ_ATTR_CHECK(info, MPTCP_PM_ATTR_ADDR_REMOTE))
376 		return err;
377 
378 	msk = mptcp_userspace_pm_get_sock(info);
379 	if (!msk)
380 		return err;
381 
382 	sk = (struct sock *)msk;
383 
384 	laddr = info->attrs[MPTCP_PM_ATTR_ADDR];
385 	err = mptcp_pm_parse_entry(laddr, info, true, &entry);
386 	if (err < 0)
387 		goto create_err;
388 
389 	if (entry.flags & MPTCP_PM_ADDR_FLAG_SIGNAL) {
390 		NL_SET_ERR_MSG_ATTR(info->extack, laddr, "invalid addr flags");
391 		err = -EINVAL;
392 		goto create_err;
393 	}
394 	entry.flags |= MPTCP_PM_ADDR_FLAG_SUBFLOW;
395 
396 	raddr = info->attrs[MPTCP_PM_ATTR_ADDR_REMOTE];
397 	err = mptcp_pm_parse_addr(raddr, info, &addr_r);
398 	if (err < 0)
399 		goto create_err;
400 
401 	if (!mptcp_pm_addr_families_match(sk, &entry.addr, &addr_r)) {
402 		GENL_SET_ERR_MSG(info, "families mismatch");
403 		err = -EINVAL;
404 		goto create_err;
405 	}
406 
407 	err = mptcp_userspace_pm_append_new_local_addr(msk, &entry, false);
408 	if (err < 0) {
409 		NL_SET_ERR_MSG_ATTR(info->extack, laddr,
410 				    "did not match address and id");
411 		goto create_err;
412 	}
413 
414 	local.addr = entry.addr;
415 	local.flags = entry.flags;
416 	local.ifindex = entry.ifindex;
417 
418 	spin_lock_bh(&msk->pm.lock);
419 	msk->pm.extra_subflows++;
420 	spin_unlock_bh(&msk->pm.lock);
421 
422 	lock_sock(sk);
423 	err = __mptcp_subflow_connect(sk, &local, &addr_r);
424 	release_sock(sk);
425 
426 	if (err) {
427 		GENL_SET_ERR_MSG_FMT(info, "connect error: %d", err);
428 
429 		spin_lock_bh(&msk->pm.lock);
430 		mptcp_userspace_pm_delete_local_addr(msk, &entry);
431 		spin_unlock_bh(&msk->pm.lock);
432 	}
433 
434  create_err:
435 	sock_put(sk);
436 	return err;
437 }
438 
439 static struct sock *mptcp_nl_find_ssk(struct mptcp_sock *msk,
440 				      const struct mptcp_addr_info *local,
441 				      const struct mptcp_addr_info *remote)
442 {
443 	struct mptcp_subflow_context *subflow;
444 
445 	if (local->family != remote->family)
446 		return NULL;
447 
448 	mptcp_for_each_subflow(msk, subflow) {
449 		const struct inet_sock *issk;
450 		struct sock *ssk;
451 
452 		ssk = mptcp_subflow_tcp_sock(subflow);
453 
454 		if (local->family != ssk->sk_family)
455 			continue;
456 
457 		issk = inet_sk(ssk);
458 
459 		switch (ssk->sk_family) {
460 		case AF_INET:
461 			if (issk->inet_saddr != local->addr.s_addr ||
462 			    issk->inet_daddr != remote->addr.s_addr)
463 				continue;
464 			break;
465 #if IS_ENABLED(CONFIG_MPTCP_IPV6)
466 		case AF_INET6: {
467 			if (!ipv6_addr_equal(&local->addr6, &issk->pinet6->saddr) ||
468 			    !ipv6_addr_equal(&remote->addr6, &ssk->sk_v6_daddr))
469 				continue;
470 			break;
471 		}
472 #endif
473 		default:
474 			continue;
475 		}
476 
477 		if (issk->inet_sport == local->port &&
478 		    issk->inet_dport == remote->port)
479 			return ssk;
480 	}
481 
482 	return NULL;
483 }
484 
485 int mptcp_pm_nl_subflow_destroy_doit(struct sk_buff *skb, struct genl_info *info)
486 {
487 	struct mptcp_pm_addr_entry addr_l;
488 	struct mptcp_addr_info addr_r;
489 	struct nlattr *raddr, *laddr;
490 	struct mptcp_sock *msk;
491 	struct sock *sk, *ssk;
492 	int err = -EINVAL;
493 
494 	if (GENL_REQ_ATTR_CHECK(info, MPTCP_PM_ATTR_ADDR) ||
495 	    GENL_REQ_ATTR_CHECK(info, MPTCP_PM_ATTR_ADDR_REMOTE))
496 		return err;
497 
498 	msk = mptcp_userspace_pm_get_sock(info);
499 	if (!msk)
500 		return err;
501 
502 	sk = (struct sock *)msk;
503 
504 	laddr = info->attrs[MPTCP_PM_ATTR_ADDR];
505 	err = mptcp_pm_parse_entry(laddr, info, true, &addr_l);
506 	if (err < 0)
507 		goto destroy_err;
508 
509 	raddr = info->attrs[MPTCP_PM_ATTR_ADDR_REMOTE];
510 	err = mptcp_pm_parse_addr(raddr, info, &addr_r);
511 	if (err < 0)
512 		goto destroy_err;
513 
514 #if IS_ENABLED(CONFIG_MPTCP_IPV6)
515 	if (addr_l.addr.family == AF_INET && ipv6_addr_v4mapped(&addr_r.addr6)) {
516 		ipv6_addr_set_v4mapped(addr_l.addr.addr.s_addr, &addr_l.addr.addr6);
517 		addr_l.addr.family = AF_INET6;
518 	}
519 	if (addr_r.family == AF_INET && ipv6_addr_v4mapped(&addr_l.addr.addr6)) {
520 		ipv6_addr_set_v4mapped(addr_r.addr.s_addr, &addr_r.addr6);
521 		addr_r.family = AF_INET6;
522 	}
523 #endif
524 	if (addr_l.addr.family != addr_r.family) {
525 		GENL_SET_ERR_MSG(info, "address families do not match");
526 		err = -EINVAL;
527 		goto destroy_err;
528 	}
529 
530 	if (!addr_l.addr.port) {
531 		NL_SET_ERR_MSG_ATTR(info->extack, laddr, "missing local port");
532 		err = -EINVAL;
533 		goto destroy_err;
534 	}
535 
536 	if (!addr_r.port) {
537 		NL_SET_ERR_MSG_ATTR(info->extack, raddr, "missing remote port");
538 		err = -EINVAL;
539 		goto destroy_err;
540 	}
541 
542 	lock_sock(sk);
543 	ssk = mptcp_nl_find_ssk(msk, &addr_l.addr, &addr_r);
544 	if (!ssk) {
545 		GENL_SET_ERR_MSG(info, "subflow not found");
546 		err = -ESRCH;
547 		goto release_sock;
548 	}
549 
550 	spin_lock_bh(&msk->pm.lock);
551 	mptcp_userspace_pm_delete_local_addr(msk, &addr_l);
552 	spin_unlock_bh(&msk->pm.lock);
553 	mptcp_subflow_shutdown(sk, ssk, RCV_SHUTDOWN | SEND_SHUTDOWN);
554 	mptcp_close_ssk(sk, ssk, mptcp_subflow_ctx(ssk));
555 	MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_RMSUBFLOW);
556 release_sock:
557 	release_sock(sk);
558 
559 destroy_err:
560 	sock_put(sk);
561 	return err;
562 }
563 
564 int mptcp_userspace_pm_set_flags(struct mptcp_pm_addr_entry *local,
565 				 struct genl_info *info)
566 {
567 	struct mptcp_addr_info rem = { .family = AF_UNSPEC, };
568 	struct mptcp_pm_addr_entry *entry;
569 	struct nlattr *attr, *attr_rem;
570 	struct mptcp_sock *msk;
571 	int ret = -EINVAL;
572 	struct sock *sk;
573 	u8 bkup = 0;
574 
575 	if (GENL_REQ_ATTR_CHECK(info, MPTCP_PM_ATTR_ADDR_REMOTE))
576 		return ret;
577 
578 	msk = mptcp_userspace_pm_get_sock(info);
579 	if (!msk)
580 		return ret;
581 
582 	sk = (struct sock *)msk;
583 
584 	attr = info->attrs[MPTCP_PM_ATTR_ADDR];
585 	if (local->addr.family == AF_UNSPEC) {
586 		NL_SET_ERR_MSG_ATTR(info->extack, attr,
587 				    "invalid local address family");
588 		ret = -EINVAL;
589 		goto set_flags_err;
590 	}
591 
592 	attr_rem = info->attrs[MPTCP_PM_ATTR_ADDR_REMOTE];
593 	ret = mptcp_pm_parse_addr(attr_rem, info, &rem);
594 	if (ret < 0)
595 		goto set_flags_err;
596 
597 	if (rem.family == AF_UNSPEC) {
598 		NL_SET_ERR_MSG_ATTR(info->extack, attr_rem,
599 				    "invalid remote address family");
600 		ret = -EINVAL;
601 		goto set_flags_err;
602 	}
603 
604 	if (local->flags & MPTCP_PM_ADDR_FLAG_BACKUP)
605 		bkup = 1;
606 
607 	spin_lock_bh(&msk->pm.lock);
608 	entry = mptcp_userspace_pm_lookup_addr(msk, &local->addr);
609 	if (entry) {
610 		if (bkup)
611 			entry->flags |= MPTCP_PM_ADDR_FLAG_BACKUP;
612 		else
613 			entry->flags &= ~MPTCP_PM_ADDR_FLAG_BACKUP;
614 	}
615 	spin_unlock_bh(&msk->pm.lock);
616 
617 	lock_sock(sk);
618 	ret = mptcp_pm_mp_prio_send_ack(msk, &local->addr, &rem, bkup);
619 	release_sock(sk);
620 
621 	/* mptcp_pm_mp_prio_send_ack() only fails in one case */
622 	if (ret < 0)
623 		GENL_SET_ERR_MSG(info, "subflow not found");
624 
625 set_flags_err:
626 	sock_put(sk);
627 	return ret;
628 }
629 
630 int mptcp_userspace_pm_dump_addr(struct sk_buff *msg,
631 				 struct netlink_callback *cb)
632 {
633 	struct id_bitmap {
634 		DECLARE_BITMAP(map, MPTCP_PM_MAX_ADDR_ID + 1);
635 	} *bitmap;
636 	const struct genl_info *info = genl_info_dump(cb);
637 	struct mptcp_pm_addr_entry *entry;
638 	struct mptcp_sock *msk;
639 	int ret = -EINVAL;
640 	struct sock *sk;
641 
642 	BUILD_BUG_ON(sizeof(struct id_bitmap) > sizeof(cb->ctx));
643 
644 	bitmap = (struct id_bitmap *)cb->ctx;
645 
646 	msk = mptcp_userspace_pm_get_sock(info);
647 	if (!msk)
648 		return ret;
649 
650 	sk = (struct sock *)msk;
651 
652 	lock_sock(sk);
653 	spin_lock_bh(&msk->pm.lock);
654 	mptcp_for_each_userspace_pm_addr(msk, entry) {
655 		if (test_bit(entry->addr.id, bitmap->map))
656 			continue;
657 
658 		if (mptcp_pm_genl_fill_addr(msg, cb, entry) < 0)
659 			break;
660 
661 		__set_bit(entry->addr.id, bitmap->map);
662 	}
663 	spin_unlock_bh(&msk->pm.lock);
664 	release_sock(sk);
665 	ret = msg->len;
666 
667 	sock_put(sk);
668 	return ret;
669 }
670 
671 int mptcp_userspace_pm_get_addr(u8 id, struct mptcp_pm_addr_entry *addr,
672 				struct genl_info *info)
673 {
674 	struct mptcp_pm_addr_entry *entry;
675 	struct mptcp_sock *msk;
676 	int ret = -EINVAL;
677 	struct sock *sk;
678 
679 	msk = mptcp_userspace_pm_get_sock(info);
680 	if (!msk)
681 		return ret;
682 
683 	sk = (struct sock *)msk;
684 
685 	lock_sock(sk);
686 	spin_lock_bh(&msk->pm.lock);
687 	entry = mptcp_userspace_pm_lookup_addr_by_id(msk, id);
688 	if (entry) {
689 		*addr = *entry;
690 		ret = 0;
691 	}
692 	spin_unlock_bh(&msk->pm.lock);
693 	release_sock(sk);
694 
695 	sock_put(sk);
696 	return ret;
697 }
698 
699 static struct mptcp_pm_ops mptcp_pm_userspace = {
700 	.name			= "userspace",
701 	.owner			= THIS_MODULE,
702 };
703 
704 void __init mptcp_pm_userspace_register(void)
705 {
706 	mptcp_pm_register(&mptcp_pm_userspace);
707 }
708