Lines Matching refs:msk
57 pm_nl_get_pernet_from_msk(const struct mptcp_sock *msk) in pm_nl_get_pernet_from_msk() argument
59 return pm_nl_get_pernet(sock_net((struct sock *)msk)); in pm_nl_get_pernet_from_msk()
156 const struct mptcp_sock *msk, in select_local_address() argument
162 msk_owned_by_me(msk); in select_local_address()
169 if (!test_bit(entry->addr.id, msk->pm.id_avail_bitmap)) in select_local_address()
182 select_signal_address(struct pm_nl_pernet *pernet, const struct mptcp_sock *msk, in select_signal_address() argument
195 if (!test_bit(entry->addr.id, msk->pm.id_avail_bitmap)) in select_signal_address()
210 unsigned int mptcp_pm_get_add_addr_signal_max(const struct mptcp_sock *msk) in mptcp_pm_get_add_addr_signal_max() argument
212 const struct pm_nl_pernet *pernet = pm_nl_get_pernet_from_msk(msk); in mptcp_pm_get_add_addr_signal_max()
218 unsigned int mptcp_pm_get_add_addr_accept_max(const struct mptcp_sock *msk) in mptcp_pm_get_add_addr_accept_max() argument
220 struct pm_nl_pernet *pernet = pm_nl_get_pernet_from_msk(msk); in mptcp_pm_get_add_addr_accept_max()
226 unsigned int mptcp_pm_get_subflows_max(const struct mptcp_sock *msk) in mptcp_pm_get_subflows_max() argument
228 struct pm_nl_pernet *pernet = pm_nl_get_pernet_from_msk(msk); in mptcp_pm_get_subflows_max()
234 unsigned int mptcp_pm_get_local_addr_max(const struct mptcp_sock *msk) in mptcp_pm_get_local_addr_max() argument
236 struct pm_nl_pernet *pernet = pm_nl_get_pernet_from_msk(msk); in mptcp_pm_get_local_addr_max()
242 bool mptcp_pm_nl_check_work_pending(struct mptcp_sock *msk) in mptcp_pm_nl_check_work_pending() argument
244 struct pm_nl_pernet *pernet = pm_nl_get_pernet_from_msk(msk); in mptcp_pm_nl_check_work_pending()
246 if (msk->pm.subflows == mptcp_pm_get_subflows_max(msk) || in mptcp_pm_nl_check_work_pending()
247 (find_next_and_bit(pernet->id_bitmap, msk->pm.id_avail_bitmap, in mptcp_pm_nl_check_work_pending()
249 WRITE_ONCE(msk->pm.work_pending, false); in mptcp_pm_nl_check_work_pending()
256 mptcp_lookup_anno_list_by_saddr(const struct mptcp_sock *msk, in mptcp_lookup_anno_list_by_saddr() argument
261 lockdep_assert_held(&msk->pm.lock); in mptcp_lookup_anno_list_by_saddr()
263 list_for_each_entry(entry, &msk->pm.anno_list, list) { in mptcp_lookup_anno_list_by_saddr()
271 bool mptcp_pm_sport_in_anno_list(struct mptcp_sock *msk, const struct sock *sk) in mptcp_pm_sport_in_anno_list() argument
279 spin_lock_bh(&msk->pm.lock); in mptcp_pm_sport_in_anno_list()
280 list_for_each_entry(entry, &msk->pm.anno_list, list) { in mptcp_pm_sport_in_anno_list()
288 spin_unlock_bh(&msk->pm.lock); in mptcp_pm_sport_in_anno_list()
295 struct mptcp_sock *msk = entry->sock; in mptcp_pm_add_timer() local
296 struct sock *sk = (struct sock *)msk; in mptcp_pm_add_timer()
298 pr_debug("msk=%p\n", msk); in mptcp_pm_add_timer()
300 if (!msk) in mptcp_pm_add_timer()
309 if (mptcp_pm_should_add_signal_addr(msk)) { in mptcp_pm_add_timer()
314 spin_lock_bh(&msk->pm.lock); in mptcp_pm_add_timer()
316 if (!mptcp_pm_should_add_signal_addr(msk)) { in mptcp_pm_add_timer()
318 mptcp_pm_announce_addr(msk, &entry->addr, false); in mptcp_pm_add_timer()
319 mptcp_pm_add_addr_send_ack(msk); in mptcp_pm_add_timer()
327 spin_unlock_bh(&msk->pm.lock); in mptcp_pm_add_timer()
330 mptcp_pm_subflow_established(msk); in mptcp_pm_add_timer()
337 mptcp_pm_del_add_timer(struct mptcp_sock *msk, in mptcp_pm_del_add_timer() argument
341 struct sock *sk = (struct sock *)msk; in mptcp_pm_del_add_timer()
344 spin_lock_bh(&msk->pm.lock); in mptcp_pm_del_add_timer()
345 entry = mptcp_lookup_anno_list_by_saddr(msk, addr); in mptcp_pm_del_add_timer()
352 spin_unlock_bh(&msk->pm.lock); in mptcp_pm_del_add_timer()
361 bool mptcp_pm_alloc_anno_list(struct mptcp_sock *msk, in mptcp_pm_alloc_anno_list() argument
365 struct sock *sk = (struct sock *)msk; in mptcp_pm_alloc_anno_list()
368 lockdep_assert_held(&msk->pm.lock); in mptcp_pm_alloc_anno_list()
370 add_entry = mptcp_lookup_anno_list_by_saddr(msk, addr); in mptcp_pm_alloc_anno_list()
373 if (WARN_ON_ONCE(mptcp_pm_is_kernel(msk))) in mptcp_pm_alloc_anno_list()
385 list_add(&add_entry->list, &msk->pm.anno_list); in mptcp_pm_alloc_anno_list()
388 add_entry->sock = msk; in mptcp_pm_alloc_anno_list()
398 void mptcp_pm_free_anno_list(struct mptcp_sock *msk) in mptcp_pm_free_anno_list() argument
401 struct sock *sk = (struct sock *)msk; in mptcp_pm_free_anno_list()
404 pr_debug("msk=%p\n", msk); in mptcp_pm_free_anno_list()
406 spin_lock_bh(&msk->pm.lock); in mptcp_pm_free_anno_list()
407 list_splice_init(&msk->pm.anno_list, &free_list); in mptcp_pm_free_anno_list()
408 spin_unlock_bh(&msk->pm.lock); in mptcp_pm_free_anno_list()
419 static unsigned int fill_remote_addresses_vec(struct mptcp_sock *msk, in fill_remote_addresses_vec() argument
424 bool deny_id0 = READ_ONCE(msk->pm.remote_deny_join_id0); in fill_remote_addresses_vec()
425 struct sock *sk = (struct sock *)msk, *ssk; in fill_remote_addresses_vec()
431 subflows_max = mptcp_pm_get_subflows_max(msk); in fill_remote_addresses_vec()
444 msk->pm.subflows++; in fill_remote_addresses_vec()
453 mptcp_for_each_subflow(msk, subflow) in fill_remote_addresses_vec()
457 mptcp_for_each_subflow(msk, subflow) { in fill_remote_addresses_vec()
470 if (msk->pm.subflows < subflows_max) { in fill_remote_addresses_vec()
475 msk->pm.subflows++; in fill_remote_addresses_vec()
484 static void __mptcp_pm_send_ack(struct mptcp_sock *msk, struct mptcp_subflow_context *subflow, in __mptcp_pm_send_ack() argument
491 prio ? "mp_prio" : (mptcp_pm_should_add_signal(msk) ? "add_addr" : "rm_addr")); in __mptcp_pm_send_ack()
503 static void mptcp_pm_send_ack(struct mptcp_sock *msk, struct mptcp_subflow_context *subflow, in mptcp_pm_send_ack() argument
506 spin_unlock_bh(&msk->pm.lock); in mptcp_pm_send_ack()
507 __mptcp_pm_send_ack(msk, subflow, prio, backup); in mptcp_pm_send_ack()
508 spin_lock_bh(&msk->pm.lock); in mptcp_pm_send_ack()
536 static void mptcp_pm_create_subflow_or_signal_addr(struct mptcp_sock *msk) in mptcp_pm_create_subflow_or_signal_addr() argument
538 struct sock *sk = (struct sock *)msk; in mptcp_pm_create_subflow_or_signal_addr()
548 add_addr_signal_max = mptcp_pm_get_add_addr_signal_max(msk); in mptcp_pm_create_subflow_or_signal_addr()
549 local_addr_max = mptcp_pm_get_local_addr_max(msk); in mptcp_pm_create_subflow_or_signal_addr()
550 subflows_max = mptcp_pm_get_subflows_max(msk); in mptcp_pm_create_subflow_or_signal_addr()
553 if (unlikely(!(msk->pm.status & BIT(MPTCP_PM_MPC_ENDPOINT_ACCOUNTED))) && msk->first) { in mptcp_pm_create_subflow_or_signal_addr()
554 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(msk->first); in mptcp_pm_create_subflow_or_signal_addr()
559 mptcp_local_address((struct sock_common *)msk->first, &mpc_addr); in mptcp_pm_create_subflow_or_signal_addr()
563 __clear_bit(entry->addr.id, msk->pm.id_avail_bitmap); in mptcp_pm_create_subflow_or_signal_addr()
564 msk->mpc_endpoint_id = entry->addr.id; in mptcp_pm_create_subflow_or_signal_addr()
570 mptcp_pm_send_ack(msk, subflow, true, backup); in mptcp_pm_create_subflow_or_signal_addr()
572 msk->pm.status |= BIT(MPTCP_PM_MPC_ENDPOINT_ACCOUNTED); in mptcp_pm_create_subflow_or_signal_addr()
576 msk->pm.local_addr_used, local_addr_max, in mptcp_pm_create_subflow_or_signal_addr()
577 msk->pm.add_addr_signaled, add_addr_signal_max, in mptcp_pm_create_subflow_or_signal_addr()
578 msk->pm.subflows, subflows_max); in mptcp_pm_create_subflow_or_signal_addr()
581 if (msk->pm.add_addr_signaled < add_addr_signal_max) { in mptcp_pm_create_subflow_or_signal_addr()
589 if (msk->pm.addr_signal & BIT(MPTCP_ADD_ADDR_SIGNAL)) in mptcp_pm_create_subflow_or_signal_addr()
592 if (!select_signal_address(pernet, msk, &local)) in mptcp_pm_create_subflow_or_signal_addr()
598 if (!mptcp_pm_alloc_anno_list(msk, &local.addr)) in mptcp_pm_create_subflow_or_signal_addr()
601 __clear_bit(local.addr.id, msk->pm.id_avail_bitmap); in mptcp_pm_create_subflow_or_signal_addr()
602 msk->pm.add_addr_signaled++; in mptcp_pm_create_subflow_or_signal_addr()
605 if (local.addr.id == msk->mpc_endpoint_id) in mptcp_pm_create_subflow_or_signal_addr()
608 mptcp_pm_announce_addr(msk, &local.addr, false); in mptcp_pm_create_subflow_or_signal_addr()
609 mptcp_pm_nl_addr_send_ack(msk); in mptcp_pm_create_subflow_or_signal_addr()
617 while (msk->pm.local_addr_used < local_addr_max && in mptcp_pm_create_subflow_or_signal_addr()
618 msk->pm.subflows < subflows_max) { in mptcp_pm_create_subflow_or_signal_addr()
625 else if (!select_local_address(pernet, msk, &local)) in mptcp_pm_create_subflow_or_signal_addr()
630 __clear_bit(local.addr.id, msk->pm.id_avail_bitmap); in mptcp_pm_create_subflow_or_signal_addr()
633 if (local.addr.id == msk->mpc_endpoint_id) in mptcp_pm_create_subflow_or_signal_addr()
636 msk->pm.local_addr_used++; in mptcp_pm_create_subflow_or_signal_addr()
638 nr = fill_remote_addresses_vec(msk, &local.addr, fullmesh, addrs); in mptcp_pm_create_subflow_or_signal_addr()
642 spin_unlock_bh(&msk->pm.lock); in mptcp_pm_create_subflow_or_signal_addr()
645 spin_lock_bh(&msk->pm.lock); in mptcp_pm_create_subflow_or_signal_addr()
647 mptcp_pm_nl_check_work_pending(msk); in mptcp_pm_create_subflow_or_signal_addr()
650 static void mptcp_pm_nl_fully_established(struct mptcp_sock *msk) in mptcp_pm_nl_fully_established() argument
652 mptcp_pm_create_subflow_or_signal_addr(msk); in mptcp_pm_nl_fully_established()
655 static void mptcp_pm_nl_subflow_established(struct mptcp_sock *msk) in mptcp_pm_nl_subflow_established() argument
657 mptcp_pm_create_subflow_or_signal_addr(msk); in mptcp_pm_nl_subflow_established()
663 static unsigned int fill_local_addresses_vec(struct mptcp_sock *msk, in fill_local_addresses_vec() argument
667 struct sock *sk = (struct sock *)msk; in fill_local_addresses_vec()
674 pernet = pm_nl_get_pernet_from_msk(msk); in fill_local_addresses_vec()
675 subflows_max = mptcp_pm_get_subflows_max(msk); in fill_local_addresses_vec()
677 mptcp_local_address((struct sock_common *)msk, &mpc_addr); in fill_local_addresses_vec()
687 if (msk->pm.subflows < subflows_max) { in fill_local_addresses_vec()
688 msk->pm.subflows++; in fill_local_addresses_vec()
717 msk->pm.subflows++; in fill_local_addresses_vec()
724 static void mptcp_pm_nl_add_addr_received(struct mptcp_sock *msk) in mptcp_pm_nl_add_addr_received() argument
727 struct sock *sk = (struct sock *)msk; in mptcp_pm_nl_add_addr_received()
734 add_addr_accept_max = mptcp_pm_get_add_addr_accept_max(msk); in mptcp_pm_nl_add_addr_received()
735 subflows_max = mptcp_pm_get_subflows_max(msk); in mptcp_pm_nl_add_addr_received()
738 msk->pm.add_addr_accepted, add_addr_accept_max, in mptcp_pm_nl_add_addr_received()
739 msk->pm.remote.family); in mptcp_pm_nl_add_addr_received()
741 remote = msk->pm.remote; in mptcp_pm_nl_add_addr_received()
742 mptcp_pm_announce_addr(msk, &remote, true); in mptcp_pm_nl_add_addr_received()
743 mptcp_pm_nl_addr_send_ack(msk); in mptcp_pm_nl_add_addr_received()
745 if (lookup_subflow_by_daddr(&msk->conn_list, &remote)) in mptcp_pm_nl_add_addr_received()
755 nr = fill_local_addresses_vec(msk, &remote, addrs); in mptcp_pm_nl_add_addr_received()
759 spin_unlock_bh(&msk->pm.lock); in mptcp_pm_nl_add_addr_received()
763 spin_lock_bh(&msk->pm.lock); in mptcp_pm_nl_add_addr_received()
768 msk->pm.add_addr_accepted++; in mptcp_pm_nl_add_addr_received()
769 if (msk->pm.add_addr_accepted >= add_addr_accept_max || in mptcp_pm_nl_add_addr_received()
770 msk->pm.subflows >= subflows_max) in mptcp_pm_nl_add_addr_received()
771 WRITE_ONCE(msk->pm.accept_addr, false); in mptcp_pm_nl_add_addr_received()
775 bool mptcp_pm_nl_is_init_remote_addr(struct mptcp_sock *msk, in mptcp_pm_nl_is_init_remote_addr() argument
780 remote_address((struct sock_common *)msk, &mpc_remote); in mptcp_pm_nl_is_init_remote_addr()
784 void mptcp_pm_nl_addr_send_ack(struct mptcp_sock *msk) in mptcp_pm_nl_addr_send_ack() argument
788 msk_owned_by_me(msk); in mptcp_pm_nl_addr_send_ack()
789 lockdep_assert_held(&msk->pm.lock); in mptcp_pm_nl_addr_send_ack()
791 if (!mptcp_pm_should_add_signal(msk) && in mptcp_pm_nl_addr_send_ack()
792 !mptcp_pm_should_rm_signal(msk)) in mptcp_pm_nl_addr_send_ack()
795 mptcp_for_each_subflow(msk, subflow) { in mptcp_pm_nl_addr_send_ack()
797 mptcp_pm_send_ack(msk, subflow, false, false); in mptcp_pm_nl_addr_send_ack()
803 int mptcp_pm_nl_mp_prio_send_ack(struct mptcp_sock *msk, in mptcp_pm_nl_mp_prio_send_ack() argument
812 mptcp_for_each_subflow(msk, subflow) { in mptcp_pm_nl_mp_prio_send_ack()
826 __mptcp_pm_send_ack(msk, subflow, true, bkup); in mptcp_pm_nl_mp_prio_send_ack()
833 static void mptcp_pm_nl_rm_addr_or_subflow(struct mptcp_sock *msk, in mptcp_pm_nl_rm_addr_or_subflow() argument
838 struct sock *sk = (struct sock *)msk; in mptcp_pm_nl_rm_addr_or_subflow()
844 msk_owned_by_me(msk); in mptcp_pm_nl_rm_addr_or_subflow()
852 if (list_empty(&msk->conn_list)) in mptcp_pm_nl_rm_addr_or_subflow()
859 mptcp_for_each_subflow_safe(msk, subflow, tmp) { in mptcp_pm_nl_rm_addr_or_subflow()
875 i, rm_id, id, remote_id, msk->mpc_endpoint_id); in mptcp_pm_nl_rm_addr_or_subflow()
876 spin_unlock_bh(&msk->pm.lock); in mptcp_pm_nl_rm_addr_or_subflow()
882 spin_lock_bh(&msk->pm.lock); in mptcp_pm_nl_rm_addr_or_subflow()
894 if (!mptcp_pm_is_kernel(msk)) in mptcp_pm_nl_rm_addr_or_subflow()
898 !WARN_ON_ONCE(msk->pm.add_addr_accepted == 0)) { in mptcp_pm_nl_rm_addr_or_subflow()
902 if (--msk->pm.add_addr_accepted < mptcp_pm_get_add_addr_accept_max(msk)) in mptcp_pm_nl_rm_addr_or_subflow()
903 WRITE_ONCE(msk->pm.accept_addr, true); in mptcp_pm_nl_rm_addr_or_subflow()
908 static void mptcp_pm_nl_rm_addr_received(struct mptcp_sock *msk) in mptcp_pm_nl_rm_addr_received() argument
910 mptcp_pm_nl_rm_addr_or_subflow(msk, &msk->pm.rm_list_rx, MPTCP_MIB_RMADDR); in mptcp_pm_nl_rm_addr_received()
913 static void mptcp_pm_nl_rm_subflow_received(struct mptcp_sock *msk, in mptcp_pm_nl_rm_subflow_received() argument
916 mptcp_pm_nl_rm_addr_or_subflow(msk, rm_list, MPTCP_MIB_RMSUBFLOW); in mptcp_pm_nl_rm_subflow_received()
919 void mptcp_pm_nl_work(struct mptcp_sock *msk) in mptcp_pm_nl_work() argument
921 struct mptcp_pm_data *pm = &msk->pm; in mptcp_pm_nl_work()
923 msk_owned_by_me(msk); in mptcp_pm_nl_work()
928 spin_lock_bh(&msk->pm.lock); in mptcp_pm_nl_work()
930 pr_debug("msk=%p status=%x\n", msk, pm->status); in mptcp_pm_nl_work()
933 mptcp_pm_nl_add_addr_received(msk); in mptcp_pm_nl_work()
937 mptcp_pm_nl_addr_send_ack(msk); in mptcp_pm_nl_work()
941 mptcp_pm_nl_rm_addr_received(msk); in mptcp_pm_nl_work()
945 mptcp_pm_nl_fully_established(msk); in mptcp_pm_nl_work()
949 mptcp_pm_nl_subflow_established(msk); in mptcp_pm_nl_work()
952 spin_unlock_bh(&msk->pm.lock); in mptcp_pm_nl_work()
1145 int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk, struct mptcp_addr_info *skc) in mptcp_pm_nl_get_local_id() argument
1151 pernet = pm_nl_get_pernet_from_msk(msk); in mptcp_pm_nl_get_local_id()
1182 bool mptcp_pm_nl_is_backup(struct mptcp_sock *msk, struct mptcp_addr_info *skc) in mptcp_pm_nl_is_backup() argument
1184 struct pm_nl_pernet *pernet = pm_nl_get_pernet_from_msk(msk); in mptcp_pm_nl_is_backup()
1233 void mptcp_pm_nl_subflow_chk_stale(const struct mptcp_sock *msk, struct sock *ssk) in mptcp_pm_nl_subflow_chk_stale() argument
1236 struct sock *sk = (struct sock *)msk; in mptcp_pm_nl_subflow_chk_stale()
1248 mptcp_for_each_subflow(msk, iter) { in mptcp_pm_nl_subflow_chk_stale()
1386 struct mptcp_sock *msk; in mptcp_nl_add_subflow_or_signal_addr() local
1389 while ((msk = mptcp_token_iter_next(net, &s_slot, &s_num)) != NULL) { in mptcp_nl_add_subflow_or_signal_addr()
1390 struct sock *sk = (struct sock *)msk; in mptcp_nl_add_subflow_or_signal_addr()
1393 if (!READ_ONCE(msk->fully_established) || in mptcp_nl_add_subflow_or_signal_addr()
1394 mptcp_pm_is_userspace(msk)) in mptcp_nl_add_subflow_or_signal_addr()
1398 mptcp_local_address((struct sock_common *)msk, &mpc_addr); in mptcp_nl_add_subflow_or_signal_addr()
1401 spin_lock_bh(&msk->pm.lock); in mptcp_nl_add_subflow_or_signal_addr()
1403 msk->mpc_endpoint_id = addr->id; in mptcp_nl_add_subflow_or_signal_addr()
1404 mptcp_pm_create_subflow_or_signal_addr(msk); in mptcp_nl_add_subflow_or_signal_addr()
1405 spin_unlock_bh(&msk->pm.lock); in mptcp_nl_add_subflow_or_signal_addr()
1485 int mptcp_pm_nl_get_flags_and_ifindex_by_id(struct mptcp_sock *msk, unsigned int id, in mptcp_pm_nl_get_flags_and_ifindex_by_id() argument
1489 struct sock *sk = (struct sock *)msk; in mptcp_pm_nl_get_flags_and_ifindex_by_id()
1507 static bool remove_anno_list_by_saddr(struct mptcp_sock *msk, in remove_anno_list_by_saddr() argument
1512 entry = mptcp_pm_del_add_timer(msk, addr, false); in remove_anno_list_by_saddr()
1521 static u8 mptcp_endp_get_local_id(struct mptcp_sock *msk, in mptcp_endp_get_local_id() argument
1524 return msk->mpc_endpoint_id == addr->id ? 0 : addr->id; in mptcp_endp_get_local_id()
1527 static bool mptcp_pm_remove_anno_addr(struct mptcp_sock *msk, in mptcp_pm_remove_anno_addr() argument
1534 list.ids[list.nr++] = mptcp_endp_get_local_id(msk, addr); in mptcp_pm_remove_anno_addr()
1536 ret = remove_anno_list_by_saddr(msk, addr); in mptcp_pm_remove_anno_addr()
1538 spin_lock_bh(&msk->pm.lock); in mptcp_pm_remove_anno_addr()
1540 __set_bit(addr->id, msk->pm.id_avail_bitmap); in mptcp_pm_remove_anno_addr()
1541 msk->pm.add_addr_signaled--; in mptcp_pm_remove_anno_addr()
1543 mptcp_pm_remove_addr(msk, &list); in mptcp_pm_remove_anno_addr()
1544 spin_unlock_bh(&msk->pm.lock); in mptcp_pm_remove_anno_addr()
1549 static void __mark_subflow_endp_available(struct mptcp_sock *msk, u8 id) in __mark_subflow_endp_available() argument
1552 if (!__test_and_set_bit(id ? : msk->mpc_endpoint_id, msk->pm.id_avail_bitmap) && in __mark_subflow_endp_available()
1553 id && !WARN_ON_ONCE(msk->pm.local_addr_used == 0)) in __mark_subflow_endp_available()
1554 msk->pm.local_addr_used--; in __mark_subflow_endp_available()
1563 struct mptcp_sock *msk; in mptcp_nl_remove_subflow_and_signal_addr() local
1567 while ((msk = mptcp_token_iter_next(net, &s_slot, &s_num)) != NULL) { in mptcp_nl_remove_subflow_and_signal_addr()
1568 struct sock *sk = (struct sock *)msk; in mptcp_nl_remove_subflow_and_signal_addr()
1571 if (mptcp_pm_is_userspace(msk)) in mptcp_nl_remove_subflow_and_signal_addr()
1575 remove_subflow = lookup_subflow_by_saddr(&msk->conn_list, addr); in mptcp_nl_remove_subflow_and_signal_addr()
1576 mptcp_pm_remove_anno_addr(msk, addr, remove_subflow && in mptcp_nl_remove_subflow_and_signal_addr()
1579 list.ids[0] = mptcp_endp_get_local_id(msk, addr); in mptcp_nl_remove_subflow_and_signal_addr()
1581 spin_lock_bh(&msk->pm.lock); in mptcp_nl_remove_subflow_and_signal_addr()
1582 mptcp_pm_nl_rm_subflow_received(msk, &list); in mptcp_nl_remove_subflow_and_signal_addr()
1583 spin_unlock_bh(&msk->pm.lock); in mptcp_nl_remove_subflow_and_signal_addr()
1587 spin_lock_bh(&msk->pm.lock); in mptcp_nl_remove_subflow_and_signal_addr()
1588 __mark_subflow_endp_available(msk, list.ids[0]); in mptcp_nl_remove_subflow_and_signal_addr()
1589 spin_unlock_bh(&msk->pm.lock); in mptcp_nl_remove_subflow_and_signal_addr()
1592 if (msk->mpc_endpoint_id == entry->addr.id) in mptcp_nl_remove_subflow_and_signal_addr()
1593 msk->mpc_endpoint_id = 0; in mptcp_nl_remove_subflow_and_signal_addr()
1609 struct mptcp_sock *msk; in mptcp_nl_remove_id_zero_address() local
1613 while ((msk = mptcp_token_iter_next(net, &s_slot, &s_num)) != NULL) { in mptcp_nl_remove_id_zero_address()
1614 struct sock *sk = (struct sock *)msk; in mptcp_nl_remove_id_zero_address()
1617 if (list_empty(&msk->conn_list) || mptcp_pm_is_userspace(msk)) in mptcp_nl_remove_id_zero_address()
1620 mptcp_local_address((struct sock_common *)msk, &msk_local); in mptcp_nl_remove_id_zero_address()
1625 spin_lock_bh(&msk->pm.lock); in mptcp_nl_remove_id_zero_address()
1626 mptcp_pm_remove_addr(msk, &list); in mptcp_nl_remove_id_zero_address()
1627 mptcp_pm_nl_rm_subflow_received(msk, &list); in mptcp_nl_remove_id_zero_address()
1628 __mark_subflow_endp_available(msk, 0); in mptcp_nl_remove_id_zero_address()
1629 spin_unlock_bh(&msk->pm.lock); in mptcp_nl_remove_id_zero_address()
1689 void mptcp_pm_remove_addrs(struct mptcp_sock *msk, struct list_head *rm_list) in mptcp_pm_remove_addrs() argument
1700 if (remove_anno_list_by_saddr(msk, &entry->addr)) in mptcp_pm_remove_addrs()
1702 else if (!lookup_subflow_by_saddr(&msk->conn_list, in mptcp_pm_remove_addrs()
1710 spin_lock_bh(&msk->pm.lock); in mptcp_pm_remove_addrs()
1711 msk->pm.add_addr_signaled -= anno_nr; in mptcp_pm_remove_addrs()
1712 mptcp_pm_remove_addr(msk, &alist); in mptcp_pm_remove_addrs()
1713 spin_unlock_bh(&msk->pm.lock); in mptcp_pm_remove_addrs()
1718 static void mptcp_pm_remove_addrs_and_subflows(struct mptcp_sock *msk, in mptcp_pm_remove_addrs_and_subflows() argument
1726 lookup_subflow_by_saddr(&msk->conn_list, &entry->addr)) in mptcp_pm_remove_addrs_and_subflows()
1727 slist.ids[slist.nr++] = mptcp_endp_get_local_id(msk, &entry->addr); in mptcp_pm_remove_addrs_and_subflows()
1730 remove_anno_list_by_saddr(msk, &entry->addr)) in mptcp_pm_remove_addrs_and_subflows()
1731 alist.ids[alist.nr++] = mptcp_endp_get_local_id(msk, &entry->addr); in mptcp_pm_remove_addrs_and_subflows()
1734 spin_lock_bh(&msk->pm.lock); in mptcp_pm_remove_addrs_and_subflows()
1736 msk->pm.add_addr_signaled -= alist.nr; in mptcp_pm_remove_addrs_and_subflows()
1737 mptcp_pm_remove_addr(msk, &alist); in mptcp_pm_remove_addrs_and_subflows()
1740 mptcp_pm_nl_rm_subflow_received(msk, &slist); in mptcp_pm_remove_addrs_and_subflows()
1742 bitmap_fill(msk->pm.id_avail_bitmap, MPTCP_PM_MAX_ADDR_ID + 1); in mptcp_pm_remove_addrs_and_subflows()
1743 msk->pm.local_addr_used = 0; in mptcp_pm_remove_addrs_and_subflows()
1744 spin_unlock_bh(&msk->pm.lock); in mptcp_pm_remove_addrs_and_subflows()
1751 struct mptcp_sock *msk; in mptcp_nl_remove_addrs_list() local
1756 while ((msk = mptcp_token_iter_next(net, &s_slot, &s_num)) != NULL) { in mptcp_nl_remove_addrs_list()
1757 struct sock *sk = (struct sock *)msk; in mptcp_nl_remove_addrs_list()
1759 if (!mptcp_pm_is_userspace(msk)) { in mptcp_nl_remove_addrs_list()
1761 mptcp_pm_remove_addrs_and_subflows(msk, rm_list); in mptcp_nl_remove_addrs_list()
2014 static void mptcp_pm_nl_fullmesh(struct mptcp_sock *msk, in mptcp_pm_nl_fullmesh() argument
2019 list.ids[list.nr++] = mptcp_endp_get_local_id(msk, addr); in mptcp_pm_nl_fullmesh()
2021 spin_lock_bh(&msk->pm.lock); in mptcp_pm_nl_fullmesh()
2022 mptcp_pm_nl_rm_subflow_received(msk, &list); in mptcp_pm_nl_fullmesh()
2023 __mark_subflow_endp_available(msk, list.ids[0]); in mptcp_pm_nl_fullmesh()
2024 mptcp_pm_create_subflow_or_signal_addr(msk); in mptcp_pm_nl_fullmesh()
2025 spin_unlock_bh(&msk->pm.lock); in mptcp_pm_nl_fullmesh()
2033 struct mptcp_sock *msk; in mptcp_nl_set_flags() local
2036 while ((msk = mptcp_token_iter_next(net, &s_slot, &s_num)) != NULL) { in mptcp_nl_set_flags()
2037 struct sock *sk = (struct sock *)msk; in mptcp_nl_set_flags()
2039 if (list_empty(&msk->conn_list) || mptcp_pm_is_userspace(msk)) in mptcp_nl_set_flags()
2044 ret = mptcp_pm_nl_mp_prio_send_ack(msk, addr, NULL, bkup); in mptcp_nl_set_flags()
2046 mptcp_pm_nl_fullmesh(msk, addr); in mptcp_nl_set_flags()
2127 bool mptcp_userspace_pm_active(const struct mptcp_sock *msk) in mptcp_userspace_pm_active() argument
2130 sock_net((const struct sock *)msk), in mptcp_userspace_pm_active()
2184 const struct mptcp_sock *msk, in mptcp_event_put_token_and_ssk() argument
2187 const struct sock *sk = (const struct sock *)msk; in mptcp_event_put_token_and_ssk()
2191 if (nla_put_u32(skb, MPTCP_ATTR_TOKEN, msk->token)) in mptcp_event_put_token_and_ssk()
2217 const struct mptcp_sock *msk, in mptcp_event_sub_established() argument
2220 return mptcp_event_put_token_and_ssk(skb, msk, ssk); in mptcp_event_sub_established()
2224 const struct mptcp_sock *msk, in mptcp_event_sub_closed() argument
2229 if (mptcp_event_put_token_and_ssk(skb, msk, ssk)) in mptcp_event_sub_closed()
2246 const struct mptcp_sock *msk, in mptcp_event_created() argument
2249 int err = nla_put_u32(skb, MPTCP_ATTR_TOKEN, msk->token); in mptcp_event_created()
2254 if (nla_put_u8(skb, MPTCP_ATTR_SERVER_SIDE, READ_ONCE(msk->pm.server_side))) in mptcp_event_created()
2260 void mptcp_event_addr_removed(const struct mptcp_sock *msk, uint8_t id) in mptcp_event_addr_removed() argument
2262 struct net *net = sock_net((const struct sock *)msk); in mptcp_event_addr_removed()
2277 if (nla_put_u32(skb, MPTCP_ATTR_TOKEN, msk->token)) in mptcp_event_addr_removed()
2295 struct mptcp_sock *msk = mptcp_sk(subflow->conn); in mptcp_event_addr_announced() local
2312 if (nla_put_u32(skb, MPTCP_ATTR_TOKEN, msk->token)) in mptcp_event_addr_announced()
2400 void mptcp_event(enum mptcp_event_type type, const struct mptcp_sock *msk, in mptcp_event() argument
2403 struct net *net = sock_net((const struct sock *)msk); in mptcp_event()
2424 if (mptcp_event_created(skb, msk, ssk) < 0) in mptcp_event()
2428 if (nla_put_u32(skb, MPTCP_ATTR_TOKEN, msk->token) < 0) in mptcp_event()
2438 if (mptcp_event_sub_established(skb, msk, ssk) < 0) in mptcp_event()
2442 if (mptcp_event_sub_closed(skb, msk, ssk) < 0) in mptcp_event()