Lines Matching refs:msk

107 static bool mptcp_pm_is_init_remote_addr(struct mptcp_sock *msk,  in mptcp_pm_is_init_remote_addr()  argument
112 mptcp_remote_address((struct sock_common *)msk, &mpc_remote); in mptcp_pm_is_init_remote_addr()
135 mptcp_lookup_anno_list_by_saddr(const struct mptcp_sock *msk, in mptcp_lookup_anno_list_by_saddr() argument
140 lockdep_assert_held(&msk->pm.lock); in mptcp_lookup_anno_list_by_saddr()
142 list_for_each_entry(entry, &msk->pm.anno_list, list) { in mptcp_lookup_anno_list_by_saddr()
150 bool mptcp_remove_anno_list_by_saddr(struct mptcp_sock *msk, in mptcp_remove_anno_list_by_saddr() argument
156 entry = mptcp_pm_del_add_timer(msk, addr, false); in mptcp_remove_anno_list_by_saddr()
163 bool mptcp_pm_sport_in_anno_list(struct mptcp_sock *msk, const struct sock *sk) in mptcp_pm_sport_in_anno_list() argument
171 spin_lock_bh(&msk->pm.lock); in mptcp_pm_sport_in_anno_list()
172 list_for_each_entry(entry, &msk->pm.anno_list, list) { in mptcp_pm_sport_in_anno_list()
180 spin_unlock_bh(&msk->pm.lock); in mptcp_pm_sport_in_anno_list()
184 static void __mptcp_pm_send_ack(struct mptcp_sock *msk, in __mptcp_pm_send_ack() argument
193 (mptcp_pm_should_add_signal(msk) ? "add_addr" : "rm_addr")); in __mptcp_pm_send_ack()
205 void mptcp_pm_send_ack(struct mptcp_sock *msk, in mptcp_pm_send_ack() argument
209 spin_unlock_bh(&msk->pm.lock); in mptcp_pm_send_ack()
210 __mptcp_pm_send_ack(msk, subflow, prio, backup); in mptcp_pm_send_ack()
211 spin_lock_bh(&msk->pm.lock); in mptcp_pm_send_ack()
214 void mptcp_pm_addr_send_ack(struct mptcp_sock *msk) in mptcp_pm_addr_send_ack() argument
218 msk_owned_by_me(msk); in mptcp_pm_addr_send_ack()
219 lockdep_assert_held(&msk->pm.lock); in mptcp_pm_addr_send_ack()
221 if (!mptcp_pm_should_add_signal(msk) && in mptcp_pm_addr_send_ack()
222 !mptcp_pm_should_rm_signal(msk)) in mptcp_pm_addr_send_ack()
225 mptcp_for_each_subflow(msk, subflow) { in mptcp_pm_addr_send_ack()
228 mptcp_pm_send_ack(msk, subflow, false, false); in mptcp_pm_addr_send_ack()
238 mptcp_pm_send_ack(msk, alt, false, false); in mptcp_pm_addr_send_ack()
241 int mptcp_pm_mp_prio_send_ack(struct mptcp_sock *msk, in mptcp_pm_mp_prio_send_ack() argument
250 mptcp_for_each_subflow(msk, subflow) { in mptcp_pm_mp_prio_send_ack()
264 __mptcp_pm_send_ack(msk, subflow, true, bkup); in mptcp_pm_mp_prio_send_ack()
275 struct mptcp_sock *msk = entry->sock; in mptcp_pm_add_timer() local
276 struct sock *sk = (struct sock *)msk; in mptcp_pm_add_timer()
278 pr_debug("msk=%p\n", msk); in mptcp_pm_add_timer()
280 if (!msk) in mptcp_pm_add_timer()
289 if (mptcp_pm_should_add_signal_addr(msk)) { in mptcp_pm_add_timer()
294 spin_lock_bh(&msk->pm.lock); in mptcp_pm_add_timer()
296 if (!mptcp_pm_should_add_signal_addr(msk)) { in mptcp_pm_add_timer()
298 mptcp_pm_announce_addr(msk, &entry->addr, false); in mptcp_pm_add_timer()
299 mptcp_pm_add_addr_send_ack(msk); in mptcp_pm_add_timer()
307 spin_unlock_bh(&msk->pm.lock); in mptcp_pm_add_timer()
310 mptcp_pm_subflow_established(msk); in mptcp_pm_add_timer()
317 mptcp_pm_del_add_timer(struct mptcp_sock *msk, in mptcp_pm_del_add_timer() argument
321 struct sock *sk = (struct sock *)msk; in mptcp_pm_del_add_timer()
324 spin_lock_bh(&msk->pm.lock); in mptcp_pm_del_add_timer()
325 entry = mptcp_lookup_anno_list_by_saddr(msk, addr); in mptcp_pm_del_add_timer()
332 spin_unlock_bh(&msk->pm.lock); in mptcp_pm_del_add_timer()
341 bool mptcp_pm_alloc_anno_list(struct mptcp_sock *msk, in mptcp_pm_alloc_anno_list() argument
345 struct sock *sk = (struct sock *)msk; in mptcp_pm_alloc_anno_list()
348 lockdep_assert_held(&msk->pm.lock); in mptcp_pm_alloc_anno_list()
350 add_entry = mptcp_lookup_anno_list_by_saddr(msk, addr); in mptcp_pm_alloc_anno_list()
353 if (WARN_ON_ONCE(mptcp_pm_is_kernel(msk))) in mptcp_pm_alloc_anno_list()
365 list_add(&add_entry->list, &msk->pm.anno_list); in mptcp_pm_alloc_anno_list()
368 add_entry->sock = msk; in mptcp_pm_alloc_anno_list()
378 static void mptcp_pm_free_anno_list(struct mptcp_sock *msk) in mptcp_pm_free_anno_list() argument
381 struct sock *sk = (struct sock *)msk; in mptcp_pm_free_anno_list()
384 pr_debug("msk=%p\n", msk); in mptcp_pm_free_anno_list()
386 spin_lock_bh(&msk->pm.lock); in mptcp_pm_free_anno_list()
387 list_splice_init(&msk->pm.anno_list, &free_list); in mptcp_pm_free_anno_list()
388 spin_unlock_bh(&msk->pm.lock); in mptcp_pm_free_anno_list()
398 int mptcp_pm_announce_addr(struct mptcp_sock *msk, in mptcp_pm_announce_addr() argument
402 u8 add_addr = READ_ONCE(msk->pm.addr_signal); in mptcp_pm_announce_addr()
404 pr_debug("msk=%p, local_id=%d, echo=%d\n", msk, addr->id, echo); in mptcp_pm_announce_addr()
406 lockdep_assert_held(&msk->pm.lock); in mptcp_pm_announce_addr()
410 MPTCP_INC_STATS(sock_net((struct sock *)msk), in mptcp_pm_announce_addr()
416 msk->pm.remote = *addr; in mptcp_pm_announce_addr()
419 msk->pm.local = *addr; in mptcp_pm_announce_addr()
422 WRITE_ONCE(msk->pm.addr_signal, add_addr); in mptcp_pm_announce_addr()
426 int mptcp_pm_remove_addr(struct mptcp_sock *msk, const struct mptcp_rm_list *rm_list) in mptcp_pm_remove_addr() argument
428 u8 rm_addr = READ_ONCE(msk->pm.addr_signal); in mptcp_pm_remove_addr()
430 pr_debug("msk=%p, rm_list_nr=%d\n", msk, rm_list->nr); in mptcp_pm_remove_addr()
433 MPTCP_ADD_STATS(sock_net((struct sock *)msk), in mptcp_pm_remove_addr()
438 msk->pm.rm_list_tx = *rm_list; in mptcp_pm_remove_addr()
440 WRITE_ONCE(msk->pm.addr_signal, rm_addr); in mptcp_pm_remove_addr()
441 mptcp_pm_addr_send_ack(msk); in mptcp_pm_remove_addr()
447 void mptcp_pm_new_connection(struct mptcp_sock *msk, const struct sock *ssk, int server_side) in mptcp_pm_new_connection() argument
449 struct mptcp_pm_data *pm = &msk->pm; in mptcp_pm_new_connection()
451 pr_debug("msk=%p, token=%u side=%d\n", msk, READ_ONCE(msk->token), server_side); in mptcp_pm_new_connection()
454 mptcp_event(MPTCP_EVENT_CREATED, msk, ssk, GFP_ATOMIC); in mptcp_pm_new_connection()
457 bool mptcp_pm_allow_new_subflow(struct mptcp_sock *msk) in mptcp_pm_allow_new_subflow() argument
459 struct mptcp_pm_data *pm = &msk->pm; in mptcp_pm_allow_new_subflow()
463 if (mptcp_pm_is_userspace(msk)) { in mptcp_pm_allow_new_subflow()
464 if (mptcp_userspace_pm_active(msk)) { in mptcp_pm_allow_new_subflow()
473 subflows_max = mptcp_pm_get_subflows_max(msk); in mptcp_pm_allow_new_subflow()
475 pr_debug("msk=%p subflows=%d max=%d allow=%d\n", msk, pm->subflows, in mptcp_pm_allow_new_subflow()
496 static bool mptcp_pm_schedule_work(struct mptcp_sock *msk, in mptcp_pm_schedule_work() argument
499 pr_debug("msk=%p status=%x new=%lx\n", msk, msk->pm.status, in mptcp_pm_schedule_work()
501 if (msk->pm.status & BIT(new_status)) in mptcp_pm_schedule_work()
504 msk->pm.status |= BIT(new_status); in mptcp_pm_schedule_work()
505 mptcp_schedule_work((struct sock *)msk); in mptcp_pm_schedule_work()
509 void mptcp_pm_fully_established(struct mptcp_sock *msk, const struct sock *ssk) in mptcp_pm_fully_established() argument
511 struct mptcp_pm_data *pm = &msk->pm; in mptcp_pm_fully_established()
514 pr_debug("msk=%p\n", msk); in mptcp_pm_fully_established()
524 mptcp_pm_schedule_work(msk, MPTCP_PM_ESTABLISHED); in mptcp_pm_fully_established()
533 mptcp_event(MPTCP_EVENT_ESTABLISHED, msk, ssk, GFP_ATOMIC); in mptcp_pm_fully_established()
536 void mptcp_pm_connection_closed(struct mptcp_sock *msk) in mptcp_pm_connection_closed() argument
538 pr_debug("msk=%p\n", msk); in mptcp_pm_connection_closed()
540 if (msk->token) in mptcp_pm_connection_closed()
541 mptcp_event(MPTCP_EVENT_CLOSED, msk, NULL, GFP_KERNEL); in mptcp_pm_connection_closed()
544 void mptcp_pm_subflow_established(struct mptcp_sock *msk) in mptcp_pm_subflow_established() argument
546 struct mptcp_pm_data *pm = &msk->pm; in mptcp_pm_subflow_established()
548 pr_debug("msk=%p\n", msk); in mptcp_pm_subflow_established()
556 mptcp_pm_schedule_work(msk, MPTCP_PM_SUBFLOW_ESTABLISHED); in mptcp_pm_subflow_established()
561 void mptcp_pm_subflow_check_next(struct mptcp_sock *msk, in mptcp_pm_subflow_check_next() argument
564 struct mptcp_pm_data *pm = &msk->pm; in mptcp_pm_subflow_check_next()
568 if (mptcp_pm_is_userspace(msk)) { in mptcp_pm_subflow_check_next()
582 __mptcp_pm_close_subflow(msk); in mptcp_pm_subflow_check_next()
587 if (mptcp_pm_nl_check_work_pending(msk)) in mptcp_pm_subflow_check_next()
588 mptcp_pm_schedule_work(msk, MPTCP_PM_SUBFLOW_ESTABLISHED); in mptcp_pm_subflow_check_next()
597 struct mptcp_sock *msk = mptcp_sk(subflow->conn); in mptcp_pm_add_addr_received() local
598 struct mptcp_pm_data *pm = &msk->pm; in mptcp_pm_add_addr_received()
600 pr_debug("msk=%p remote_id=%d accept=%d\n", msk, addr->id, in mptcp_pm_add_addr_received()
607 if (mptcp_pm_is_userspace(msk)) { in mptcp_pm_add_addr_received()
608 if (mptcp_userspace_pm_active(msk)) { in mptcp_pm_add_addr_received()
609 mptcp_pm_announce_addr(msk, addr, true); in mptcp_pm_add_addr_received()
610 mptcp_pm_add_addr_send_ack(msk); in mptcp_pm_add_addr_received()
612 __MPTCP_INC_STATS(sock_net((struct sock *)msk), MPTCP_MIB_ADDADDRDROP); in mptcp_pm_add_addr_received()
615 } else if ((addr->id == 0 && !mptcp_pm_is_init_remote_addr(msk, addr)) || in mptcp_pm_add_addr_received()
617 mptcp_pm_announce_addr(msk, addr, true); in mptcp_pm_add_addr_received()
618 mptcp_pm_add_addr_send_ack(msk); in mptcp_pm_add_addr_received()
619 } else if (mptcp_pm_schedule_work(msk, MPTCP_PM_ADD_ADDR_RECEIVED)) { in mptcp_pm_add_addr_received()
622 __MPTCP_INC_STATS(sock_net((struct sock *)msk), MPTCP_MIB_ADDADDRDROP); in mptcp_pm_add_addr_received()
628 void mptcp_pm_add_addr_echoed(struct mptcp_sock *msk, in mptcp_pm_add_addr_echoed() argument
631 struct mptcp_pm_data *pm = &msk->pm; in mptcp_pm_add_addr_echoed()
633 pr_debug("msk=%p\n", msk); in mptcp_pm_add_addr_echoed()
640 if (mptcp_lookup_anno_list_by_saddr(msk, addr) && READ_ONCE(pm->work_pending)) in mptcp_pm_add_addr_echoed()
641 mptcp_pm_schedule_work(msk, MPTCP_PM_SUBFLOW_ESTABLISHED); in mptcp_pm_add_addr_echoed()
646 void mptcp_pm_add_addr_send_ack(struct mptcp_sock *msk) in mptcp_pm_add_addr_send_ack() argument
648 if (!mptcp_pm_should_add_signal(msk)) in mptcp_pm_add_addr_send_ack()
651 mptcp_pm_schedule_work(msk, MPTCP_PM_ADD_ADDR_SEND_ACK); in mptcp_pm_add_addr_send_ack()
654 static void mptcp_pm_rm_addr_or_subflow(struct mptcp_sock *msk, in mptcp_pm_rm_addr_or_subflow() argument
659 struct sock *sk = (struct sock *)msk; in mptcp_pm_rm_addr_or_subflow()
665 msk_owned_by_me(msk); in mptcp_pm_rm_addr_or_subflow()
673 if (list_empty(&msk->conn_list)) in mptcp_pm_rm_addr_or_subflow()
680 mptcp_for_each_subflow_safe(msk, subflow, tmp) { in mptcp_pm_rm_addr_or_subflow()
696 i, rm_id, id, remote_id, msk->mpc_endpoint_id); in mptcp_pm_rm_addr_or_subflow()
697 spin_unlock_bh(&msk->pm.lock); in mptcp_pm_rm_addr_or_subflow()
703 spin_lock_bh(&msk->pm.lock); in mptcp_pm_rm_addr_or_subflow()
711 if (removed && mptcp_pm_is_kernel(msk)) in mptcp_pm_rm_addr_or_subflow()
712 mptcp_pm_nl_rm_addr(msk, rm_id); in mptcp_pm_rm_addr_or_subflow()
717 static void mptcp_pm_rm_addr_recv(struct mptcp_sock *msk) in mptcp_pm_rm_addr_recv() argument
719 mptcp_pm_rm_addr_or_subflow(msk, &msk->pm.rm_list_rx, MPTCP_MIB_RMADDR); in mptcp_pm_rm_addr_recv()
722 void mptcp_pm_rm_subflow(struct mptcp_sock *msk, in mptcp_pm_rm_subflow() argument
725 mptcp_pm_rm_addr_or_subflow(msk, rm_list, MPTCP_MIB_RMSUBFLOW); in mptcp_pm_rm_subflow()
728 void mptcp_pm_rm_addr_received(struct mptcp_sock *msk, in mptcp_pm_rm_addr_received() argument
731 struct mptcp_pm_data *pm = &msk->pm; in mptcp_pm_rm_addr_received()
734 pr_debug("msk=%p remote_ids_nr=%d\n", msk, rm_list->nr); in mptcp_pm_rm_addr_received()
737 mptcp_event_addr_removed(msk, rm_list->ids[i]); in mptcp_pm_rm_addr_received()
740 if (mptcp_pm_schedule_work(msk, MPTCP_PM_RM_ADDR_RECEIVED)) in mptcp_pm_rm_addr_received()
743 __MPTCP_INC_STATS(sock_net((struct sock *)msk), MPTCP_MIB_RMADDRDROP); in mptcp_pm_rm_addr_received()
751 struct mptcp_sock *msk; in mptcp_pm_mp_prio_received() local
754 msk = mptcp_sk(sk); in mptcp_pm_mp_prio_received()
758 mptcp_event(MPTCP_EVENT_SUB_PRIORITY, msk, ssk, GFP_ATOMIC); in mptcp_pm_mp_prio_received()
764 struct mptcp_sock *msk = mptcp_sk(subflow->conn); in mptcp_pm_mp_fail_received() local
769 spin_lock_bh(&msk->fallback_lock); in mptcp_pm_mp_fail_received()
770 if (!msk->allow_infinite_fallback) { in mptcp_pm_mp_fail_received()
771 spin_unlock_bh(&msk->fallback_lock); in mptcp_pm_mp_fail_received()
774 msk->allow_subflows = false; in mptcp_pm_mp_fail_received()
775 spin_unlock_bh(&msk->fallback_lock); in mptcp_pm_mp_fail_received()
789 bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, const struct sk_buff *skb, in mptcp_pm_add_addr_signal() argument
799 spin_lock_bh(&msk->pm.lock); in mptcp_pm_add_addr_signal()
802 if (!mptcp_pm_should_add_signal(msk)) in mptcp_pm_add_addr_signal()
814 *echo = mptcp_pm_should_add_signal_echo(msk); in mptcp_pm_add_addr_signal()
815 port = !!(*echo ? msk->pm.remote.port : msk->pm.local.port); in mptcp_pm_add_addr_signal()
817 family = *echo ? msk->pm.remote.family : msk->pm.local.family; in mptcp_pm_add_addr_signal()
822 *addr = msk->pm.remote; in mptcp_pm_add_addr_signal()
823 add_addr = msk->pm.addr_signal & ~BIT(MPTCP_ADD_ADDR_ECHO); in mptcp_pm_add_addr_signal()
825 *addr = msk->pm.local; in mptcp_pm_add_addr_signal()
826 add_addr = msk->pm.addr_signal & ~BIT(MPTCP_ADD_ADDR_SIGNAL); in mptcp_pm_add_addr_signal()
828 WRITE_ONCE(msk->pm.addr_signal, add_addr); in mptcp_pm_add_addr_signal()
832 spin_unlock_bh(&msk->pm.lock); in mptcp_pm_add_addr_signal()
836 bool mptcp_pm_rm_addr_signal(struct mptcp_sock *msk, unsigned int remaining, in mptcp_pm_rm_addr_signal() argument
842 spin_lock_bh(&msk->pm.lock); in mptcp_pm_rm_addr_signal()
845 if (!mptcp_pm_should_rm_signal(msk)) in mptcp_pm_rm_addr_signal()
848 rm_addr = msk->pm.addr_signal & ~BIT(MPTCP_RM_ADDR_SIGNAL); in mptcp_pm_rm_addr_signal()
849 len = mptcp_rm_addr_len(&msk->pm.rm_list_tx); in mptcp_pm_rm_addr_signal()
851 WRITE_ONCE(msk->pm.addr_signal, rm_addr); in mptcp_pm_rm_addr_signal()
857 *rm_list = msk->pm.rm_list_tx; in mptcp_pm_rm_addr_signal()
858 WRITE_ONCE(msk->pm.addr_signal, rm_addr); in mptcp_pm_rm_addr_signal()
862 spin_unlock_bh(&msk->pm.lock); in mptcp_pm_rm_addr_signal()
866 int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc) in mptcp_pm_get_local_id() argument
871 if (WARN_ON_ONCE(!msk)) in mptcp_pm_get_local_id()
877 mptcp_local_address((struct sock_common *)msk, &msk_local); in mptcp_pm_get_local_id()
885 if (mptcp_pm_is_userspace(msk)) in mptcp_pm_get_local_id()
886 return mptcp_userspace_pm_get_local_id(msk, &skc_local); in mptcp_pm_get_local_id()
887 return mptcp_pm_nl_get_local_id(msk, &skc_local); in mptcp_pm_get_local_id()
890 bool mptcp_pm_is_backup(struct mptcp_sock *msk, struct sock_common *skc) in mptcp_pm_is_backup() argument
896 if (mptcp_pm_is_userspace(msk)) in mptcp_pm_is_backup()
897 return mptcp_userspace_pm_is_backup(msk, &skc_local); in mptcp_pm_is_backup()
899 return mptcp_pm_nl_is_backup(msk, &skc_local); in mptcp_pm_is_backup()
902 static void mptcp_pm_subflows_chk_stale(const struct mptcp_sock *msk, struct sock *ssk) in mptcp_pm_subflows_chk_stale() argument
905 struct sock *sk = (struct sock *)msk; in mptcp_pm_subflows_chk_stale()
917 mptcp_for_each_subflow(msk, iter) { in mptcp_pm_subflows_chk_stale()
939 void mptcp_pm_subflow_chk_stale(const struct mptcp_sock *msk, struct sock *ssk) in mptcp_pm_subflow_chk_stale() argument
951 mptcp_pm_subflows_chk_stale(msk, ssk); in mptcp_pm_subflow_chk_stale()
958 void mptcp_pm_worker(struct mptcp_sock *msk) in mptcp_pm_worker() argument
960 struct mptcp_pm_data *pm = &msk->pm; in mptcp_pm_worker()
962 msk_owned_by_me(msk); in mptcp_pm_worker()
967 spin_lock_bh(&msk->pm.lock); in mptcp_pm_worker()
969 pr_debug("msk=%p status=%x\n", msk, pm->status); in mptcp_pm_worker()
972 mptcp_pm_addr_send_ack(msk); in mptcp_pm_worker()
976 mptcp_pm_rm_addr_recv(msk); in mptcp_pm_worker()
978 __mptcp_pm_kernel_worker(msk); in mptcp_pm_worker()
980 spin_unlock_bh(&msk->pm.lock); in mptcp_pm_worker()
983 void mptcp_pm_destroy(struct mptcp_sock *msk) in mptcp_pm_destroy() argument
985 mptcp_pm_free_anno_list(msk); in mptcp_pm_destroy()
987 if (mptcp_pm_is_userspace(msk)) in mptcp_pm_destroy()
988 mptcp_userspace_pm_free_local_addr_list(msk); in mptcp_pm_destroy()
991 void mptcp_pm_data_reset(struct mptcp_sock *msk) in mptcp_pm_data_reset() argument
993 u8 pm_type = mptcp_get_pm_type(sock_net((struct sock *)msk)); in mptcp_pm_data_reset()
994 struct mptcp_pm_data *pm = &msk->pm; in mptcp_pm_data_reset()
1002 bool subflows_allowed = !!mptcp_pm_get_subflows_max(msk); in mptcp_pm_data_reset()
1008 (!!mptcp_pm_get_local_addr_max(msk) && in mptcp_pm_data_reset()
1010 !!mptcp_pm_get_add_addr_signal_max(msk)); in mptcp_pm_data_reset()
1012 !!mptcp_pm_get_add_addr_accept_max(msk) && in mptcp_pm_data_reset()
1020 void mptcp_pm_data_init(struct mptcp_sock *msk) in mptcp_pm_data_init() argument
1022 spin_lock_init(&msk->pm.lock); in mptcp_pm_data_init()
1023 INIT_LIST_HEAD(&msk->pm.anno_list); in mptcp_pm_data_init()
1024 INIT_LIST_HEAD(&msk->pm.userspace_pm_local_addr_list); in mptcp_pm_data_init()
1025 mptcp_pm_data_reset(msk); in mptcp_pm_data_init()