Lines Matching refs:msk
39 pm_nl_get_pernet_from_msk(const struct mptcp_sock *msk) in pm_nl_get_pernet_from_msk() argument
41 return pm_nl_get_pernet(sock_net((struct sock *)msk)); in pm_nl_get_pernet_from_msk()
49 unsigned int mptcp_pm_get_add_addr_signal_max(const struct mptcp_sock *msk) in mptcp_pm_get_add_addr_signal_max() argument
51 const struct pm_nl_pernet *pernet = pm_nl_get_pernet_from_msk(msk); in mptcp_pm_get_add_addr_signal_max()
57 unsigned int mptcp_pm_get_add_addr_accept_max(const struct mptcp_sock *msk) in mptcp_pm_get_add_addr_accept_max() argument
59 struct pm_nl_pernet *pernet = pm_nl_get_pernet_from_msk(msk); in mptcp_pm_get_add_addr_accept_max()
65 unsigned int mptcp_pm_get_subflows_max(const struct mptcp_sock *msk) in mptcp_pm_get_subflows_max() argument
67 struct pm_nl_pernet *pernet = pm_nl_get_pernet_from_msk(msk); in mptcp_pm_get_subflows_max()
73 unsigned int mptcp_pm_get_local_addr_max(const struct mptcp_sock *msk) in mptcp_pm_get_local_addr_max() argument
75 struct pm_nl_pernet *pernet = pm_nl_get_pernet_from_msk(msk); in mptcp_pm_get_local_addr_max()
104 const struct mptcp_sock *msk, in select_local_address() argument
110 msk_owned_by_me(msk); in select_local_address()
117 if (!test_bit(entry->addr.id, msk->pm.id_avail_bitmap)) in select_local_address()
132 select_signal_address(struct pm_nl_pernet *pernet, const struct mptcp_sock *msk, in select_signal_address() argument
145 if (!test_bit(entry->addr.id, msk->pm.id_avail_bitmap)) in select_signal_address()
165 static unsigned int fill_remote_addresses_vec(struct mptcp_sock *msk, in fill_remote_addresses_vec() argument
170 bool deny_id0 = READ_ONCE(msk->pm.remote_deny_join_id0); in fill_remote_addresses_vec()
171 struct sock *sk = (struct sock *)msk, *ssk; in fill_remote_addresses_vec()
177 subflows_max = mptcp_pm_get_subflows_max(msk); in fill_remote_addresses_vec()
190 msk->pm.subflows++; in fill_remote_addresses_vec()
199 mptcp_for_each_subflow(msk, subflow) in fill_remote_addresses_vec()
203 mptcp_for_each_subflow(msk, subflow) { in fill_remote_addresses_vec()
216 if (msk->pm.subflows < subflows_max) { in fill_remote_addresses_vec()
221 msk->pm.subflows++; in fill_remote_addresses_vec()
256 static void mptcp_pm_create_subflow_or_signal_addr(struct mptcp_sock *msk) in mptcp_pm_create_subflow_or_signal_addr() argument
258 struct sock *sk = (struct sock *)msk; in mptcp_pm_create_subflow_or_signal_addr()
268 add_addr_signal_max = mptcp_pm_get_add_addr_signal_max(msk); in mptcp_pm_create_subflow_or_signal_addr()
269 local_addr_max = mptcp_pm_get_local_addr_max(msk); in mptcp_pm_create_subflow_or_signal_addr()
270 subflows_max = mptcp_pm_get_subflows_max(msk); in mptcp_pm_create_subflow_or_signal_addr()
273 if (unlikely(!(msk->pm.status & BIT(MPTCP_PM_MPC_ENDPOINT_ACCOUNTED))) && msk->first) { in mptcp_pm_create_subflow_or_signal_addr()
274 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(msk->first); in mptcp_pm_create_subflow_or_signal_addr()
279 mptcp_local_address((struct sock_common *)msk->first, &mpc_addr); in mptcp_pm_create_subflow_or_signal_addr()
283 __clear_bit(entry->addr.id, msk->pm.id_avail_bitmap); in mptcp_pm_create_subflow_or_signal_addr()
284 msk->mpc_endpoint_id = entry->addr.id; in mptcp_pm_create_subflow_or_signal_addr()
290 mptcp_pm_send_ack(msk, subflow, true, backup); in mptcp_pm_create_subflow_or_signal_addr()
292 msk->pm.status |= BIT(MPTCP_PM_MPC_ENDPOINT_ACCOUNTED); in mptcp_pm_create_subflow_or_signal_addr()
296 msk->pm.local_addr_used, local_addr_max, in mptcp_pm_create_subflow_or_signal_addr()
297 msk->pm.add_addr_signaled, add_addr_signal_max, in mptcp_pm_create_subflow_or_signal_addr()
298 msk->pm.subflows, subflows_max); in mptcp_pm_create_subflow_or_signal_addr()
301 if (msk->pm.add_addr_signaled < add_addr_signal_max) { in mptcp_pm_create_subflow_or_signal_addr()
309 if (msk->pm.addr_signal & BIT(MPTCP_ADD_ADDR_SIGNAL)) in mptcp_pm_create_subflow_or_signal_addr()
312 if (!select_signal_address(pernet, msk, &local)) in mptcp_pm_create_subflow_or_signal_addr()
318 if (!mptcp_pm_alloc_anno_list(msk, &local.addr)) in mptcp_pm_create_subflow_or_signal_addr()
321 __clear_bit(local.addr.id, msk->pm.id_avail_bitmap); in mptcp_pm_create_subflow_or_signal_addr()
322 msk->pm.add_addr_signaled++; in mptcp_pm_create_subflow_or_signal_addr()
325 if (local.addr.id == msk->mpc_endpoint_id) in mptcp_pm_create_subflow_or_signal_addr()
328 mptcp_pm_announce_addr(msk, &local.addr, false); in mptcp_pm_create_subflow_or_signal_addr()
329 mptcp_pm_addr_send_ack(msk); in mptcp_pm_create_subflow_or_signal_addr()
337 while (msk->pm.local_addr_used < local_addr_max && in mptcp_pm_create_subflow_or_signal_addr()
338 msk->pm.subflows < subflows_max) { in mptcp_pm_create_subflow_or_signal_addr()
345 else if (!select_local_address(pernet, msk, &local)) in mptcp_pm_create_subflow_or_signal_addr()
350 __clear_bit(local.addr.id, msk->pm.id_avail_bitmap); in mptcp_pm_create_subflow_or_signal_addr()
353 if (local.addr.id == msk->mpc_endpoint_id) in mptcp_pm_create_subflow_or_signal_addr()
356 msk->pm.local_addr_used++; in mptcp_pm_create_subflow_or_signal_addr()
358 nr = fill_remote_addresses_vec(msk, &local.addr, fullmesh, addrs); in mptcp_pm_create_subflow_or_signal_addr()
362 spin_unlock_bh(&msk->pm.lock); in mptcp_pm_create_subflow_or_signal_addr()
365 spin_lock_bh(&msk->pm.lock); in mptcp_pm_create_subflow_or_signal_addr()
367 mptcp_pm_nl_check_work_pending(msk); in mptcp_pm_create_subflow_or_signal_addr()
370 static void mptcp_pm_nl_fully_established(struct mptcp_sock *msk) in mptcp_pm_nl_fully_established() argument
372 mptcp_pm_create_subflow_or_signal_addr(msk); in mptcp_pm_nl_fully_established()
375 static void mptcp_pm_nl_subflow_established(struct mptcp_sock *msk) in mptcp_pm_nl_subflow_established() argument
377 mptcp_pm_create_subflow_or_signal_addr(msk); in mptcp_pm_nl_subflow_established()
383 static unsigned int fill_local_addresses_vec(struct mptcp_sock *msk, in fill_local_addresses_vec() argument
387 struct sock *sk = (struct sock *)msk; in fill_local_addresses_vec()
394 pernet = pm_nl_get_pernet_from_msk(msk); in fill_local_addresses_vec()
395 subflows_max = mptcp_pm_get_subflows_max(msk); in fill_local_addresses_vec()
397 mptcp_local_address((struct sock_common *)msk, &mpc_addr); in fill_local_addresses_vec()
407 if (msk->pm.subflows < subflows_max) { in fill_local_addresses_vec()
416 msk->pm.subflows++; in fill_local_addresses_vec()
437 msk->pm.subflows++; in fill_local_addresses_vec()
444 static void mptcp_pm_nl_add_addr_received(struct mptcp_sock *msk) in mptcp_pm_nl_add_addr_received() argument
447 struct sock *sk = (struct sock *)msk; in mptcp_pm_nl_add_addr_received()
454 add_addr_accept_max = mptcp_pm_get_add_addr_accept_max(msk); in mptcp_pm_nl_add_addr_received()
455 subflows_max = mptcp_pm_get_subflows_max(msk); in mptcp_pm_nl_add_addr_received()
458 msk->pm.add_addr_accepted, add_addr_accept_max, in mptcp_pm_nl_add_addr_received()
459 msk->pm.remote.family); in mptcp_pm_nl_add_addr_received()
461 remote = msk->pm.remote; in mptcp_pm_nl_add_addr_received()
462 mptcp_pm_announce_addr(msk, &remote, true); in mptcp_pm_nl_add_addr_received()
463 mptcp_pm_addr_send_ack(msk); in mptcp_pm_nl_add_addr_received()
465 if (lookup_subflow_by_daddr(&msk->conn_list, &remote)) in mptcp_pm_nl_add_addr_received()
475 nr = fill_local_addresses_vec(msk, &remote, locals); in mptcp_pm_nl_add_addr_received()
479 spin_unlock_bh(&msk->pm.lock); in mptcp_pm_nl_add_addr_received()
483 spin_lock_bh(&msk->pm.lock); in mptcp_pm_nl_add_addr_received()
488 msk->pm.add_addr_accepted++; in mptcp_pm_nl_add_addr_received()
489 if (msk->pm.add_addr_accepted >= add_addr_accept_max || in mptcp_pm_nl_add_addr_received()
490 msk->pm.subflows >= subflows_max) in mptcp_pm_nl_add_addr_received()
491 WRITE_ONCE(msk->pm.accept_addr, false); in mptcp_pm_nl_add_addr_received()
495 void mptcp_pm_nl_rm_addr(struct mptcp_sock *msk, u8 rm_id) in mptcp_pm_nl_rm_addr() argument
497 if (rm_id && WARN_ON_ONCE(msk->pm.add_addr_accepted == 0)) { in mptcp_pm_nl_rm_addr()
501 if (--msk->pm.add_addr_accepted < mptcp_pm_get_add_addr_accept_max(msk)) in mptcp_pm_nl_rm_addr()
502 WRITE_ONCE(msk->pm.accept_addr, true); in mptcp_pm_nl_rm_addr()
696 int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk, in mptcp_pm_nl_get_local_id() argument
703 pernet = pm_nl_get_pernet_from_msk(msk); in mptcp_pm_nl_get_local_id()
725 bool mptcp_pm_nl_is_backup(struct mptcp_sock *msk, struct mptcp_addr_info *skc) in mptcp_pm_nl_is_backup() argument
727 struct pm_nl_pernet *pernet = pm_nl_get_pernet_from_msk(msk); in mptcp_pm_nl_is_backup()
742 struct mptcp_sock *msk; in mptcp_nl_add_subflow_or_signal_addr() local
745 while ((msk = mptcp_token_iter_next(net, &s_slot, &s_num)) != NULL) { in mptcp_nl_add_subflow_or_signal_addr()
746 struct sock *sk = (struct sock *)msk; in mptcp_nl_add_subflow_or_signal_addr()
749 if (!READ_ONCE(msk->fully_established) || in mptcp_nl_add_subflow_or_signal_addr()
750 mptcp_pm_is_userspace(msk)) in mptcp_nl_add_subflow_or_signal_addr()
754 mptcp_local_address((struct sock_common *)msk, &mpc_addr); in mptcp_nl_add_subflow_or_signal_addr()
757 spin_lock_bh(&msk->pm.lock); in mptcp_nl_add_subflow_or_signal_addr()
759 msk->mpc_endpoint_id = addr->id; in mptcp_nl_add_subflow_or_signal_addr()
760 mptcp_pm_create_subflow_or_signal_addr(msk); in mptcp_nl_add_subflow_or_signal_addr()
761 spin_unlock_bh(&msk->pm.lock); in mptcp_nl_add_subflow_or_signal_addr()
848 static u8 mptcp_endp_get_local_id(struct mptcp_sock *msk, in mptcp_endp_get_local_id() argument
851 return msk->mpc_endpoint_id == addr->id ? 0 : addr->id; in mptcp_endp_get_local_id()
854 static bool mptcp_pm_remove_anno_addr(struct mptcp_sock *msk, in mptcp_pm_remove_anno_addr() argument
861 list.ids[list.nr++] = mptcp_endp_get_local_id(msk, addr); in mptcp_pm_remove_anno_addr()
863 ret = mptcp_remove_anno_list_by_saddr(msk, addr); in mptcp_pm_remove_anno_addr()
865 spin_lock_bh(&msk->pm.lock); in mptcp_pm_remove_anno_addr()
867 __set_bit(addr->id, msk->pm.id_avail_bitmap); in mptcp_pm_remove_anno_addr()
868 msk->pm.add_addr_signaled--; in mptcp_pm_remove_anno_addr()
870 mptcp_pm_remove_addr(msk, &list); in mptcp_pm_remove_anno_addr()
871 spin_unlock_bh(&msk->pm.lock); in mptcp_pm_remove_anno_addr()
876 static void __mark_subflow_endp_available(struct mptcp_sock *msk, u8 id) in __mark_subflow_endp_available() argument
879 if (!__test_and_set_bit(id ? : msk->mpc_endpoint_id, msk->pm.id_avail_bitmap) && in __mark_subflow_endp_available()
880 id && !WARN_ON_ONCE(msk->pm.local_addr_used == 0)) in __mark_subflow_endp_available()
881 msk->pm.local_addr_used--; in __mark_subflow_endp_available()
890 struct mptcp_sock *msk; in mptcp_nl_remove_subflow_and_signal_addr() local
894 while ((msk = mptcp_token_iter_next(net, &s_slot, &s_num)) != NULL) { in mptcp_nl_remove_subflow_and_signal_addr()
895 struct sock *sk = (struct sock *)msk; in mptcp_nl_remove_subflow_and_signal_addr()
898 if (mptcp_pm_is_userspace(msk)) in mptcp_nl_remove_subflow_and_signal_addr()
902 remove_subflow = mptcp_lookup_subflow_by_saddr(&msk->conn_list, addr); in mptcp_nl_remove_subflow_and_signal_addr()
903 mptcp_pm_remove_anno_addr(msk, addr, remove_subflow && in mptcp_nl_remove_subflow_and_signal_addr()
906 list.ids[0] = mptcp_endp_get_local_id(msk, addr); in mptcp_nl_remove_subflow_and_signal_addr()
908 spin_lock_bh(&msk->pm.lock); in mptcp_nl_remove_subflow_and_signal_addr()
909 mptcp_pm_rm_subflow(msk, &list); in mptcp_nl_remove_subflow_and_signal_addr()
910 spin_unlock_bh(&msk->pm.lock); in mptcp_nl_remove_subflow_and_signal_addr()
914 spin_lock_bh(&msk->pm.lock); in mptcp_nl_remove_subflow_and_signal_addr()
915 __mark_subflow_endp_available(msk, list.ids[0]); in mptcp_nl_remove_subflow_and_signal_addr()
916 spin_unlock_bh(&msk->pm.lock); in mptcp_nl_remove_subflow_and_signal_addr()
919 if (msk->mpc_endpoint_id == entry->addr.id) in mptcp_nl_remove_subflow_and_signal_addr()
920 msk->mpc_endpoint_id = 0; in mptcp_nl_remove_subflow_and_signal_addr()
936 struct mptcp_sock *msk; in mptcp_nl_remove_id_zero_address() local
940 while ((msk = mptcp_token_iter_next(net, &s_slot, &s_num)) != NULL) { in mptcp_nl_remove_id_zero_address()
941 struct sock *sk = (struct sock *)msk; in mptcp_nl_remove_id_zero_address()
944 if (list_empty(&msk->conn_list) || mptcp_pm_is_userspace(msk)) in mptcp_nl_remove_id_zero_address()
947 mptcp_local_address((struct sock_common *)msk, &msk_local); in mptcp_nl_remove_id_zero_address()
952 spin_lock_bh(&msk->pm.lock); in mptcp_nl_remove_id_zero_address()
953 mptcp_pm_remove_addr(msk, &list); in mptcp_nl_remove_id_zero_address()
954 mptcp_pm_rm_subflow(msk, &list); in mptcp_nl_remove_id_zero_address()
955 __mark_subflow_endp_available(msk, 0); in mptcp_nl_remove_id_zero_address()
956 spin_unlock_bh(&msk->pm.lock); in mptcp_nl_remove_id_zero_address()
1020 static void mptcp_pm_flush_addrs_and_subflows(struct mptcp_sock *msk, in mptcp_pm_flush_addrs_and_subflows() argument
1028 mptcp_lookup_subflow_by_saddr(&msk->conn_list, &entry->addr)) in mptcp_pm_flush_addrs_and_subflows()
1029 slist.ids[slist.nr++] = mptcp_endp_get_local_id(msk, &entry->addr); in mptcp_pm_flush_addrs_and_subflows()
1032 mptcp_remove_anno_list_by_saddr(msk, &entry->addr)) in mptcp_pm_flush_addrs_and_subflows()
1033 alist.ids[alist.nr++] = mptcp_endp_get_local_id(msk, &entry->addr); in mptcp_pm_flush_addrs_and_subflows()
1036 spin_lock_bh(&msk->pm.lock); in mptcp_pm_flush_addrs_and_subflows()
1038 msk->pm.add_addr_signaled -= alist.nr; in mptcp_pm_flush_addrs_and_subflows()
1039 mptcp_pm_remove_addr(msk, &alist); in mptcp_pm_flush_addrs_and_subflows()
1042 mptcp_pm_rm_subflow(msk, &slist); in mptcp_pm_flush_addrs_and_subflows()
1044 bitmap_fill(msk->pm.id_avail_bitmap, MPTCP_PM_MAX_ADDR_ID + 1); in mptcp_pm_flush_addrs_and_subflows()
1045 msk->pm.local_addr_used = 0; in mptcp_pm_flush_addrs_and_subflows()
1046 spin_unlock_bh(&msk->pm.lock); in mptcp_pm_flush_addrs_and_subflows()
1053 struct mptcp_sock *msk; in mptcp_nl_flush_addrs_list() local
1058 while ((msk = mptcp_token_iter_next(net, &s_slot, &s_num)) != NULL) { in mptcp_nl_flush_addrs_list()
1059 struct sock *sk = (struct sock *)msk; in mptcp_nl_flush_addrs_list()
1061 if (!mptcp_pm_is_userspace(msk)) { in mptcp_nl_flush_addrs_list()
1063 mptcp_pm_flush_addrs_and_subflows(msk, rm_list); in mptcp_nl_flush_addrs_list()
1235 static void mptcp_pm_nl_fullmesh(struct mptcp_sock *msk, in mptcp_pm_nl_fullmesh() argument
1240 list.ids[list.nr++] = mptcp_endp_get_local_id(msk, addr); in mptcp_pm_nl_fullmesh()
1242 spin_lock_bh(&msk->pm.lock); in mptcp_pm_nl_fullmesh()
1243 mptcp_pm_rm_subflow(msk, &list); in mptcp_pm_nl_fullmesh()
1244 __mark_subflow_endp_available(msk, list.ids[0]); in mptcp_pm_nl_fullmesh()
1245 mptcp_pm_create_subflow_or_signal_addr(msk); in mptcp_pm_nl_fullmesh()
1246 spin_unlock_bh(&msk->pm.lock); in mptcp_pm_nl_fullmesh()
1256 struct mptcp_sock *msk; in mptcp_pm_nl_set_flags_all() local
1261 while ((msk = mptcp_token_iter_next(net, &s_slot, &s_num)) != NULL) { in mptcp_pm_nl_set_flags_all()
1262 struct sock *sk = (struct sock *)msk; in mptcp_pm_nl_set_flags_all()
1264 if (list_empty(&msk->conn_list) || mptcp_pm_is_userspace(msk)) in mptcp_pm_nl_set_flags_all()
1269 mptcp_pm_mp_prio_send_ack(msk, &local->addr, NULL, bkup); in mptcp_pm_nl_set_flags_all()
1272 mptcp_pm_nl_fullmesh(msk, &local->addr); in mptcp_pm_nl_set_flags_all()
1328 bool mptcp_pm_nl_check_work_pending(struct mptcp_sock *msk) in mptcp_pm_nl_check_work_pending() argument
1330 struct pm_nl_pernet *pernet = pm_nl_get_pernet_from_msk(msk); in mptcp_pm_nl_check_work_pending()
1332 if (msk->pm.subflows == mptcp_pm_get_subflows_max(msk) || in mptcp_pm_nl_check_work_pending()
1333 (find_next_and_bit(pernet->id_bitmap, msk->pm.id_avail_bitmap, in mptcp_pm_nl_check_work_pending()
1335 WRITE_ONCE(msk->pm.work_pending, false); in mptcp_pm_nl_check_work_pending()
1342 void __mptcp_pm_kernel_worker(struct mptcp_sock *msk) in __mptcp_pm_kernel_worker() argument
1344 struct mptcp_pm_data *pm = &msk->pm; in __mptcp_pm_kernel_worker()
1348 mptcp_pm_nl_add_addr_received(msk); in __mptcp_pm_kernel_worker()
1352 mptcp_pm_nl_fully_established(msk); in __mptcp_pm_kernel_worker()
1356 mptcp_pm_nl_subflow_established(msk); in __mptcp_pm_kernel_worker()