1 // SPDX-License-Identifier: GPL-2.0
4 * Copyright (c) 2022, Intel Corporation.
9 #include "mptcp_pm_gen.h"
11 void mptcp_free_local_addr_list(struct mptcp_sock
*msk
)
13 struct mptcp_pm_addr_entry
*entry
, *tmp
;
14 struct sock
*sk
= (struct sock
*)msk
;
17 if (!mptcp_pm_is_userspace(msk
))
20 spin_lock_bh(&msk
->pm
.lock
);
21 list_splice_init(&msk
->pm
.userspace_pm_local_addr_list
, &free_list
);
22 spin_unlock_bh(&msk
->pm
.lock
);
24 list_for_each_entry_safe(entry
, tmp
, &free_list
, list
) {
25 sock_kfree_s(sk
, entry
, sizeof(*entry
));
29 static int mptcp_userspace_pm_append_new_local_addr(struct mptcp_sock
*msk
,
30 struct mptcp_pm_addr_entry
*entry
,
33 DECLARE_BITMAP(id_bitmap
, MPTCP_PM_MAX_ADDR_ID
+ 1);
34 struct mptcp_pm_addr_entry
*match
= NULL
;
35 struct sock
*sk
= (struct sock
*)msk
;
36 struct mptcp_pm_addr_entry
*e
;
37 bool addr_match
= false;
38 bool id_match
= false;
41 bitmap_zero(id_bitmap
, MPTCP_PM_MAX_ADDR_ID
+ 1);
43 spin_lock_bh(&msk
->pm
.lock
);
44 list_for_each_entry(e
, &msk
->pm
.userspace_pm_local_addr_list
, list
) {
45 addr_match
= mptcp_addresses_equal(&e
->addr
, &entry
->addr
, true);
46 if (addr_match
&& entry
->addr
.id
== 0 && needs_id
)
47 entry
->addr
.id
= e
->addr
.id
;
48 id_match
= (e
->addr
.id
== entry
->addr
.id
);
49 if (addr_match
&& id_match
) {
52 } else if (addr_match
|| id_match
) {
55 __set_bit(e
->addr
.id
, id_bitmap
);
58 if (!match
&& !addr_match
&& !id_match
) {
59 /* Memory for the entry is allocated from the
62 e
= sock_kmalloc(sk
, sizeof(*e
), GFP_ATOMIC
);
69 if (!e
->addr
.id
&& needs_id
)
70 e
->addr
.id
= find_next_zero_bit(id_bitmap
,
71 MPTCP_PM_MAX_ADDR_ID
+ 1,
73 list_add_tail_rcu(&e
->list
, &msk
->pm
.userspace_pm_local_addr_list
);
74 msk
->pm
.local_addr_used
++;
81 spin_unlock_bh(&msk
->pm
.lock
);
85 /* If the subflow is closed from the other peer (not via a
86 * subflow destroy command then), we want to keep the entry
87 * not to assign the same ID to another address and to be
88 * able to send RM_ADDR after the removal of the subflow.
90 static int mptcp_userspace_pm_delete_local_addr(struct mptcp_sock
*msk
,
91 struct mptcp_pm_addr_entry
*addr
)
93 struct mptcp_pm_addr_entry
*entry
, *tmp
;
94 struct sock
*sk
= (struct sock
*)msk
;
96 list_for_each_entry_safe(entry
, tmp
, &msk
->pm
.userspace_pm_local_addr_list
, list
) {
97 if (mptcp_addresses_equal(&entry
->addr
, &addr
->addr
, false)) {
98 /* TODO: a refcount is needed because the entry can
99 * be used multiple times (e.g. fullmesh mode).
101 list_del_rcu(&entry
->list
);
102 sock_kfree_s(sk
, entry
, sizeof(*entry
));
103 msk
->pm
.local_addr_used
--;
111 static struct mptcp_pm_addr_entry
*
112 mptcp_userspace_pm_lookup_addr_by_id(struct mptcp_sock
*msk
, unsigned int id
)
114 struct mptcp_pm_addr_entry
*entry
;
116 list_for_each_entry(entry
, &msk
->pm
.userspace_pm_local_addr_list
, list
) {
117 if (entry
->addr
.id
== id
)
123 int mptcp_userspace_pm_get_local_id(struct mptcp_sock
*msk
,
124 struct mptcp_addr_info
*skc
)
126 struct mptcp_pm_addr_entry
*entry
= NULL
, *e
, new_entry
;
127 __be16 msk_sport
= ((struct inet_sock
*)
128 inet_sk((struct sock
*)msk
))->inet_sport
;
130 spin_lock_bh(&msk
->pm
.lock
);
131 list_for_each_entry(e
, &msk
->pm
.userspace_pm_local_addr_list
, list
) {
132 if (mptcp_addresses_equal(&e
->addr
, skc
, false)) {
137 spin_unlock_bh(&msk
->pm
.lock
);
139 return entry
->addr
.id
;
141 memset(&new_entry
, 0, sizeof(struct mptcp_pm_addr_entry
));
142 new_entry
.addr
= *skc
;
143 new_entry
.addr
.id
= 0;
144 new_entry
.flags
= MPTCP_PM_ADDR_FLAG_IMPLICIT
;
146 if (new_entry
.addr
.port
== msk_sport
)
147 new_entry
.addr
.port
= 0;
149 return mptcp_userspace_pm_append_new_local_addr(msk
, &new_entry
, true);
152 bool mptcp_userspace_pm_is_backup(struct mptcp_sock
*msk
,
153 struct mptcp_addr_info
*skc
)
155 struct mptcp_pm_addr_entry
*entry
;
158 spin_lock_bh(&msk
->pm
.lock
);
159 list_for_each_entry(entry
, &msk
->pm
.userspace_pm_local_addr_list
, list
) {
160 if (mptcp_addresses_equal(&entry
->addr
, skc
, false)) {
161 backup
= !!(entry
->flags
& MPTCP_PM_ADDR_FLAG_BACKUP
);
165 spin_unlock_bh(&msk
->pm
.lock
);
170 int mptcp_pm_nl_announce_doit(struct sk_buff
*skb
, struct genl_info
*info
)
172 struct nlattr
*token
= info
->attrs
[MPTCP_PM_ATTR_TOKEN
];
173 struct nlattr
*addr
= info
->attrs
[MPTCP_PM_ATTR_ADDR
];
174 struct mptcp_pm_addr_entry addr_val
;
175 struct mptcp_sock
*msk
;
180 if (!addr
|| !token
) {
181 GENL_SET_ERR_MSG(info
, "missing required inputs");
185 token_val
= nla_get_u32(token
);
187 msk
= mptcp_token_get_sock(sock_net(skb
->sk
), token_val
);
189 NL_SET_ERR_MSG_ATTR(info
->extack
, token
, "invalid token");
193 sk
= (struct sock
*)msk
;
195 if (!mptcp_pm_is_userspace(msk
)) {
196 GENL_SET_ERR_MSG(info
, "invalid request; userspace PM not selected");
200 err
= mptcp_pm_parse_entry(addr
, info
, true, &addr_val
);
202 GENL_SET_ERR_MSG(info
, "error parsing local address");
206 if (addr_val
.addr
.id
== 0 || !(addr_val
.flags
& MPTCP_PM_ADDR_FLAG_SIGNAL
)) {
207 GENL_SET_ERR_MSG(info
, "invalid addr id or flags");
212 err
= mptcp_userspace_pm_append_new_local_addr(msk
, &addr_val
, false);
214 GENL_SET_ERR_MSG(info
, "did not match address and id");
219 spin_lock_bh(&msk
->pm
.lock
);
221 if (mptcp_pm_alloc_anno_list(msk
, &addr_val
.addr
)) {
222 msk
->pm
.add_addr_signaled
++;
223 mptcp_pm_announce_addr(msk
, &addr_val
.addr
, false);
224 mptcp_pm_nl_addr_send_ack(msk
);
227 spin_unlock_bh(&msk
->pm
.lock
);
236 static int mptcp_userspace_pm_remove_id_zero_address(struct mptcp_sock
*msk
,
237 struct genl_info
*info
)
239 struct mptcp_rm_list list
= { .nr
= 0 };
240 struct mptcp_subflow_context
*subflow
;
241 struct sock
*sk
= (struct sock
*)msk
;
242 bool has_id_0
= false;
246 mptcp_for_each_subflow(msk
, subflow
) {
247 if (READ_ONCE(subflow
->local_id
) == 0) {
253 GENL_SET_ERR_MSG(info
, "address with id 0 not found");
257 list
.ids
[list
.nr
++] = 0;
259 spin_lock_bh(&msk
->pm
.lock
);
260 mptcp_pm_remove_addr(msk
, &list
);
261 spin_unlock_bh(&msk
->pm
.lock
);
270 int mptcp_pm_nl_remove_doit(struct sk_buff
*skb
, struct genl_info
*info
)
272 struct nlattr
*token
= info
->attrs
[MPTCP_PM_ATTR_TOKEN
];
273 struct nlattr
*id
= info
->attrs
[MPTCP_PM_ATTR_LOC_ID
];
274 struct mptcp_pm_addr_entry
*match
;
275 struct mptcp_pm_addr_entry
*entry
;
276 struct mptcp_sock
*msk
;
277 LIST_HEAD(free_list
);
284 GENL_SET_ERR_MSG(info
, "missing required inputs");
288 id_val
= nla_get_u8(id
);
289 token_val
= nla_get_u32(token
);
291 msk
= mptcp_token_get_sock(sock_net(skb
->sk
), token_val
);
293 NL_SET_ERR_MSG_ATTR(info
->extack
, token
, "invalid token");
297 sk
= (struct sock
*)msk
;
299 if (!mptcp_pm_is_userspace(msk
)) {
300 GENL_SET_ERR_MSG(info
, "invalid request; userspace PM not selected");
305 err
= mptcp_userspace_pm_remove_id_zero_address(msk
, info
);
311 spin_lock_bh(&msk
->pm
.lock
);
312 match
= mptcp_userspace_pm_lookup_addr_by_id(msk
, id_val
);
314 GENL_SET_ERR_MSG(info
, "address with specified id not found");
315 spin_unlock_bh(&msk
->pm
.lock
);
320 list_move(&match
->list
, &free_list
);
321 spin_unlock_bh(&msk
->pm
.lock
);
323 mptcp_pm_remove_addrs(msk
, &free_list
);
327 list_for_each_entry_safe(match
, entry
, &free_list
, list
) {
328 sock_kfree_s(sk
, match
, sizeof(*match
));
337 int mptcp_pm_nl_subflow_create_doit(struct sk_buff
*skb
, struct genl_info
*info
)
339 struct nlattr
*raddr
= info
->attrs
[MPTCP_PM_ATTR_ADDR_REMOTE
];
340 struct nlattr
*token
= info
->attrs
[MPTCP_PM_ATTR_TOKEN
];
341 struct nlattr
*laddr
= info
->attrs
[MPTCP_PM_ATTR_ADDR
];
342 struct mptcp_pm_addr_entry entry
= { 0 };
343 struct mptcp_addr_info addr_r
;
344 struct mptcp_pm_local local
;
345 struct mptcp_sock
*msk
;
350 if (!laddr
|| !raddr
|| !token
) {
351 GENL_SET_ERR_MSG(info
, "missing required inputs");
355 token_val
= nla_get_u32(token
);
357 msk
= mptcp_token_get_sock(genl_info_net(info
), token_val
);
359 NL_SET_ERR_MSG_ATTR(info
->extack
, token
, "invalid token");
363 sk
= (struct sock
*)msk
;
365 if (!mptcp_pm_is_userspace(msk
)) {
366 GENL_SET_ERR_MSG(info
, "invalid request; userspace PM not selected");
370 err
= mptcp_pm_parse_entry(laddr
, info
, true, &entry
);
372 NL_SET_ERR_MSG_ATTR(info
->extack
, laddr
, "error parsing local addr");
376 if (entry
.flags
& MPTCP_PM_ADDR_FLAG_SIGNAL
) {
377 GENL_SET_ERR_MSG(info
, "invalid addr flags");
381 entry
.flags
|= MPTCP_PM_ADDR_FLAG_SUBFLOW
;
383 err
= mptcp_pm_parse_addr(raddr
, info
, &addr_r
);
385 NL_SET_ERR_MSG_ATTR(info
->extack
, raddr
, "error parsing remote addr");
389 if (!mptcp_pm_addr_families_match(sk
, &entry
.addr
, &addr_r
)) {
390 GENL_SET_ERR_MSG(info
, "families mismatch");
395 err
= mptcp_userspace_pm_append_new_local_addr(msk
, &entry
, false);
397 GENL_SET_ERR_MSG(info
, "did not match address and id");
401 local
.addr
= entry
.addr
;
402 local
.flags
= entry
.flags
;
403 local
.ifindex
= entry
.ifindex
;
406 err
= __mptcp_subflow_connect(sk
, &local
, &addr_r
);
409 spin_lock_bh(&msk
->pm
.lock
);
411 mptcp_userspace_pm_delete_local_addr(msk
, &entry
);
414 spin_unlock_bh(&msk
->pm
.lock
);
421 static struct sock
*mptcp_nl_find_ssk(struct mptcp_sock
*msk
,
422 const struct mptcp_addr_info
*local
,
423 const struct mptcp_addr_info
*remote
)
425 struct mptcp_subflow_context
*subflow
;
427 if (local
->family
!= remote
->family
)
430 mptcp_for_each_subflow(msk
, subflow
) {
431 const struct inet_sock
*issk
;
434 ssk
= mptcp_subflow_tcp_sock(subflow
);
436 if (local
->family
!= ssk
->sk_family
)
441 switch (ssk
->sk_family
) {
443 if (issk
->inet_saddr
!= local
->addr
.s_addr
||
444 issk
->inet_daddr
!= remote
->addr
.s_addr
)
447 #if IS_ENABLED(CONFIG_MPTCP_IPV6)
449 const struct ipv6_pinfo
*pinfo
= inet6_sk(ssk
);
451 if (!ipv6_addr_equal(&local
->addr6
, &pinfo
->saddr
) ||
452 !ipv6_addr_equal(&remote
->addr6
, &ssk
->sk_v6_daddr
))
461 if (issk
->inet_sport
== local
->port
&&
462 issk
->inet_dport
== remote
->port
)
469 int mptcp_pm_nl_subflow_destroy_doit(struct sk_buff
*skb
, struct genl_info
*info
)
471 struct nlattr
*raddr
= info
->attrs
[MPTCP_PM_ATTR_ADDR_REMOTE
];
472 struct nlattr
*token
= info
->attrs
[MPTCP_PM_ATTR_TOKEN
];
473 struct nlattr
*laddr
= info
->attrs
[MPTCP_PM_ATTR_ADDR
];
474 struct mptcp_addr_info addr_l
;
475 struct mptcp_addr_info addr_r
;
476 struct mptcp_sock
*msk
;
477 struct sock
*sk
, *ssk
;
481 if (!laddr
|| !raddr
|| !token
) {
482 GENL_SET_ERR_MSG(info
, "missing required inputs");
486 token_val
= nla_get_u32(token
);
488 msk
= mptcp_token_get_sock(genl_info_net(info
), token_val
);
490 NL_SET_ERR_MSG_ATTR(info
->extack
, token
, "invalid token");
494 sk
= (struct sock
*)msk
;
496 if (!mptcp_pm_is_userspace(msk
)) {
497 GENL_SET_ERR_MSG(info
, "invalid request; userspace PM not selected");
501 err
= mptcp_pm_parse_addr(laddr
, info
, &addr_l
);
503 NL_SET_ERR_MSG_ATTR(info
->extack
, laddr
, "error parsing local addr");
507 err
= mptcp_pm_parse_addr(raddr
, info
, &addr_r
);
509 NL_SET_ERR_MSG_ATTR(info
->extack
, raddr
, "error parsing remote addr");
513 #if IS_ENABLED(CONFIG_MPTCP_IPV6)
514 if (addr_l
.family
== AF_INET
&& ipv6_addr_v4mapped(&addr_r
.addr6
)) {
515 ipv6_addr_set_v4mapped(addr_l
.addr
.s_addr
, &addr_l
.addr6
);
516 addr_l
.family
= AF_INET6
;
518 if (addr_r
.family
== AF_INET
&& ipv6_addr_v4mapped(&addr_l
.addr6
)) {
519 ipv6_addr_set_v4mapped(addr_r
.addr
.s_addr
, &addr_r
.addr6
);
520 addr_r
.family
= AF_INET6
;
523 if (addr_l
.family
!= addr_r
.family
) {
524 GENL_SET_ERR_MSG(info
, "address families do not match");
529 if (!addr_l
.port
|| !addr_r
.port
) {
530 GENL_SET_ERR_MSG(info
, "missing local or remote port");
536 ssk
= mptcp_nl_find_ssk(msk
, &addr_l
, &addr_r
);
538 struct mptcp_subflow_context
*subflow
= mptcp_subflow_ctx(ssk
);
539 struct mptcp_pm_addr_entry entry
= { .addr
= addr_l
};
541 spin_lock_bh(&msk
->pm
.lock
);
542 mptcp_userspace_pm_delete_local_addr(msk
, &entry
);
543 spin_unlock_bh(&msk
->pm
.lock
);
544 mptcp_subflow_shutdown(sk
, ssk
, RCV_SHUTDOWN
| SEND_SHUTDOWN
);
545 mptcp_close_ssk(sk
, ssk
, subflow
);
546 MPTCP_INC_STATS(sock_net(sk
), MPTCP_MIB_RMSUBFLOW
);
558 int mptcp_userspace_pm_set_flags(struct sk_buff
*skb
, struct genl_info
*info
)
560 struct mptcp_pm_addr_entry loc
= { .addr
= { .family
= AF_UNSPEC
}, };
561 struct mptcp_pm_addr_entry rem
= { .addr
= { .family
= AF_UNSPEC
}, };
562 struct nlattr
*attr_rem
= info
->attrs
[MPTCP_PM_ATTR_ADDR_REMOTE
];
563 struct nlattr
*token
= info
->attrs
[MPTCP_PM_ATTR_TOKEN
];
564 struct nlattr
*attr
= info
->attrs
[MPTCP_PM_ATTR_ADDR
];
565 struct net
*net
= sock_net(skb
->sk
);
566 struct mptcp_pm_addr_entry
*entry
;
567 struct mptcp_sock
*msk
;
573 token_val
= nla_get_u32(token
);
575 msk
= mptcp_token_get_sock(net
, token_val
);
577 NL_SET_ERR_MSG_ATTR(info
->extack
, token
, "invalid token");
581 sk
= (struct sock
*)msk
;
583 if (!mptcp_pm_is_userspace(msk
)) {
584 GENL_SET_ERR_MSG(info
, "userspace PM not selected");
588 ret
= mptcp_pm_parse_entry(attr
, info
, false, &loc
);
593 ret
= mptcp_pm_parse_entry(attr_rem
, info
, false, &rem
);
598 if (loc
.addr
.family
== AF_UNSPEC
||
599 rem
.addr
.family
== AF_UNSPEC
) {
600 GENL_SET_ERR_MSG(info
, "invalid address families");
605 if (loc
.flags
& MPTCP_PM_ADDR_FLAG_BACKUP
)
608 spin_lock_bh(&msk
->pm
.lock
);
609 list_for_each_entry(entry
, &msk
->pm
.userspace_pm_local_addr_list
, list
) {
610 if (mptcp_addresses_equal(&entry
->addr
, &loc
.addr
, false)) {
612 entry
->flags
|= MPTCP_PM_ADDR_FLAG_BACKUP
;
614 entry
->flags
&= ~MPTCP_PM_ADDR_FLAG_BACKUP
;
617 spin_unlock_bh(&msk
->pm
.lock
);
620 ret
= mptcp_pm_nl_mp_prio_send_ack(msk
, &loc
.addr
, &rem
.addr
, bkup
);
628 int mptcp_userspace_pm_dump_addr(struct sk_buff
*msg
,
629 struct netlink_callback
*cb
)
632 DECLARE_BITMAP(map
, MPTCP_PM_MAX_ADDR_ID
+ 1);
634 const struct genl_info
*info
= genl_info_dump(cb
);
635 struct net
*net
= sock_net(msg
->sk
);
636 struct mptcp_pm_addr_entry
*entry
;
637 struct mptcp_sock
*msk
;
638 struct nlattr
*token
;
643 bitmap
= (struct id_bitmap
*)cb
->ctx
;
644 token
= info
->attrs
[MPTCP_PM_ATTR_TOKEN
];
646 msk
= mptcp_token_get_sock(net
, nla_get_u32(token
));
648 NL_SET_ERR_MSG_ATTR(info
->extack
, token
, "invalid token");
652 sk
= (struct sock
*)msk
;
654 if (!mptcp_pm_is_userspace(msk
)) {
655 GENL_SET_ERR_MSG(info
, "invalid request; userspace PM not selected");
660 spin_lock_bh(&msk
->pm
.lock
);
661 list_for_each_entry(entry
, &msk
->pm
.userspace_pm_local_addr_list
, list
) {
662 if (test_bit(entry
->addr
.id
, bitmap
->map
))
665 hdr
= genlmsg_put(msg
, NETLINK_CB(cb
->skb
).portid
,
666 cb
->nlh
->nlmsg_seq
, &mptcp_genl_family
,
667 NLM_F_MULTI
, MPTCP_PM_CMD_GET_ADDR
);
671 if (mptcp_nl_fill_addr(msg
, entry
) < 0) {
672 genlmsg_cancel(msg
, hdr
);
676 __set_bit(entry
->addr
.id
, bitmap
->map
);
677 genlmsg_end(msg
, hdr
);
679 spin_unlock_bh(&msk
->pm
.lock
);
688 int mptcp_userspace_pm_get_addr(struct sk_buff
*skb
,
689 struct genl_info
*info
)
691 struct nlattr
*attr
= info
->attrs
[MPTCP_PM_ENDPOINT_ADDR
];
692 struct nlattr
*token
= info
->attrs
[MPTCP_PM_ATTR_TOKEN
];
693 struct mptcp_pm_addr_entry addr
, *entry
;
694 struct net
*net
= sock_net(skb
->sk
);
695 struct mptcp_sock
*msk
;
701 msk
= mptcp_token_get_sock(net
, nla_get_u32(token
));
703 NL_SET_ERR_MSG_ATTR(info
->extack
, token
, "invalid token");
707 sk
= (struct sock
*)msk
;
709 if (!mptcp_pm_is_userspace(msk
)) {
710 GENL_SET_ERR_MSG(info
, "invalid request; userspace PM not selected");
714 ret
= mptcp_pm_parse_entry(attr
, info
, false, &addr
);
718 msg
= nlmsg_new(NLMSG_DEFAULT_SIZE
, GFP_KERNEL
);
724 reply
= genlmsg_put_reply(msg
, info
, &mptcp_genl_family
, 0,
727 GENL_SET_ERR_MSG(info
, "not enough space in Netlink message");
733 spin_lock_bh(&msk
->pm
.lock
);
734 entry
= mptcp_userspace_pm_lookup_addr_by_id(msk
, addr
.addr
.id
);
736 GENL_SET_ERR_MSG(info
, "address not found");
741 ret
= mptcp_nl_fill_addr(msg
, entry
);
745 genlmsg_end(msg
, reply
);
746 ret
= genlmsg_reply(msg
, info
);
747 spin_unlock_bh(&msk
->pm
.lock
);
753 spin_unlock_bh(&msk
->pm
.lock
);