Lines Matching refs:msk
133 struct mptcp_sock *msk) in select_local_address() argument
138 spin_lock_bh(&msk->join_list_lock); in select_local_address()
146 if (entry->addr.family == ((struct sock *)msk)->sk_family && in select_local_address()
147 !lookup_subflow_by_saddr(&msk->conn_list, &entry->addr) && in select_local_address()
148 !lookup_subflow_by_saddr(&msk->join_list, &entry->addr)) { in select_local_address()
153 spin_unlock_bh(&msk->join_list_lock); in select_local_address()
182 static void check_work_pending(struct mptcp_sock *msk) in check_work_pending() argument
184 if (msk->pm.add_addr_signaled == msk->pm.add_addr_signal_max && in check_work_pending()
185 (msk->pm.local_addr_used == msk->pm.local_addr_max || in check_work_pending()
186 msk->pm.subflows == msk->pm.subflows_max)) in check_work_pending()
187 WRITE_ONCE(msk->pm.work_pending, false); in check_work_pending()
191 lookup_anno_list_by_saddr(struct mptcp_sock *msk, in lookup_anno_list_by_saddr() argument
196 list_for_each_entry(entry, &msk->pm.anno_list, list) { in lookup_anno_list_by_saddr()
207 struct mptcp_sock *msk = entry->sock; in mptcp_pm_add_timer() local
208 struct sock *sk = (struct sock *)msk; in mptcp_pm_add_timer()
210 pr_debug("msk=%p", msk); in mptcp_pm_add_timer()
212 if (!msk) in mptcp_pm_add_timer()
221 if (mptcp_pm_should_add_signal(msk)) { in mptcp_pm_add_timer()
226 spin_lock_bh(&msk->pm.lock); in mptcp_pm_add_timer()
228 if (!mptcp_pm_should_add_signal(msk)) { in mptcp_pm_add_timer()
230 mptcp_pm_announce_addr(msk, &entry->addr, false); in mptcp_pm_add_timer()
237 spin_unlock_bh(&msk->pm.lock); in mptcp_pm_add_timer()
244 mptcp_pm_del_add_timer(struct mptcp_sock *msk, in mptcp_pm_del_add_timer() argument
248 struct sock *sk = (struct sock *)msk; in mptcp_pm_del_add_timer()
250 spin_lock_bh(&msk->pm.lock); in mptcp_pm_del_add_timer()
251 entry = lookup_anno_list_by_saddr(msk, addr); in mptcp_pm_del_add_timer()
254 spin_unlock_bh(&msk->pm.lock); in mptcp_pm_del_add_timer()
262 static bool mptcp_pm_alloc_anno_list(struct mptcp_sock *msk, in mptcp_pm_alloc_anno_list() argument
266 struct sock *sk = (struct sock *)msk; in mptcp_pm_alloc_anno_list()
268 if (lookup_anno_list_by_saddr(msk, &entry->addr)) in mptcp_pm_alloc_anno_list()
275 list_add(&add_entry->list, &msk->pm.anno_list); in mptcp_pm_alloc_anno_list()
278 add_entry->sock = msk; in mptcp_pm_alloc_anno_list()
287 void mptcp_pm_free_anno_list(struct mptcp_sock *msk) in mptcp_pm_free_anno_list() argument
290 struct sock *sk = (struct sock *)msk; in mptcp_pm_free_anno_list()
293 pr_debug("msk=%p", msk); in mptcp_pm_free_anno_list()
295 spin_lock_bh(&msk->pm.lock); in mptcp_pm_free_anno_list()
296 list_splice_init(&msk->pm.anno_list, &free_list); in mptcp_pm_free_anno_list()
297 spin_unlock_bh(&msk->pm.lock); in mptcp_pm_free_anno_list()
305 static void mptcp_pm_create_subflow_or_signal_addr(struct mptcp_sock *msk) in mptcp_pm_create_subflow_or_signal_addr() argument
308 struct sock *sk = (struct sock *)msk; in mptcp_pm_create_subflow_or_signal_addr()
312 pernet = net_generic(sock_net((struct sock *)msk), pm_nl_pernet_id); in mptcp_pm_create_subflow_or_signal_addr()
315 msk->pm.local_addr_used, msk->pm.local_addr_max, in mptcp_pm_create_subflow_or_signal_addr()
316 msk->pm.add_addr_signaled, msk->pm.add_addr_signal_max, in mptcp_pm_create_subflow_or_signal_addr()
317 msk->pm.subflows, msk->pm.subflows_max); in mptcp_pm_create_subflow_or_signal_addr()
320 if (msk->pm.add_addr_signaled < msk->pm.add_addr_signal_max) { in mptcp_pm_create_subflow_or_signal_addr()
322 msk->pm.add_addr_signaled); in mptcp_pm_create_subflow_or_signal_addr()
325 if (mptcp_pm_alloc_anno_list(msk, local)) { in mptcp_pm_create_subflow_or_signal_addr()
326 msk->pm.add_addr_signaled++; in mptcp_pm_create_subflow_or_signal_addr()
327 mptcp_pm_announce_addr(msk, &local->addr, false); in mptcp_pm_create_subflow_or_signal_addr()
331 msk->pm.local_addr_used = msk->pm.add_addr_signal_max; in mptcp_pm_create_subflow_or_signal_addr()
334 check_work_pending(msk); in mptcp_pm_create_subflow_or_signal_addr()
338 if (msk->pm.local_addr_used < msk->pm.local_addr_max && in mptcp_pm_create_subflow_or_signal_addr()
339 msk->pm.subflows < msk->pm.subflows_max) { in mptcp_pm_create_subflow_or_signal_addr()
342 local = select_local_address(pernet, msk); in mptcp_pm_create_subflow_or_signal_addr()
344 msk->pm.local_addr_used++; in mptcp_pm_create_subflow_or_signal_addr()
345 msk->pm.subflows++; in mptcp_pm_create_subflow_or_signal_addr()
346 check_work_pending(msk); in mptcp_pm_create_subflow_or_signal_addr()
347 spin_unlock_bh(&msk->pm.lock); in mptcp_pm_create_subflow_or_signal_addr()
349 spin_lock_bh(&msk->pm.lock); in mptcp_pm_create_subflow_or_signal_addr()
354 msk->pm.local_addr_used = msk->pm.local_addr_max; in mptcp_pm_create_subflow_or_signal_addr()
355 check_work_pending(msk); in mptcp_pm_create_subflow_or_signal_addr()
359 void mptcp_pm_nl_fully_established(struct mptcp_sock *msk) in mptcp_pm_nl_fully_established() argument
361 mptcp_pm_create_subflow_or_signal_addr(msk); in mptcp_pm_nl_fully_established()
364 void mptcp_pm_nl_subflow_established(struct mptcp_sock *msk) in mptcp_pm_nl_subflow_established() argument
366 mptcp_pm_create_subflow_or_signal_addr(msk); in mptcp_pm_nl_subflow_established()
369 void mptcp_pm_nl_add_addr_received(struct mptcp_sock *msk) in mptcp_pm_nl_add_addr_received() argument
371 struct sock *sk = (struct sock *)msk; in mptcp_pm_nl_add_addr_received()
376 msk->pm.add_addr_accepted, msk->pm.add_addr_accept_max, in mptcp_pm_nl_add_addr_received()
377 msk->pm.remote.family); in mptcp_pm_nl_add_addr_received()
378 msk->pm.add_addr_accepted++; in mptcp_pm_nl_add_addr_received()
379 msk->pm.subflows++; in mptcp_pm_nl_add_addr_received()
380 if (msk->pm.add_addr_accepted >= msk->pm.add_addr_accept_max || in mptcp_pm_nl_add_addr_received()
381 msk->pm.subflows >= msk->pm.subflows_max) in mptcp_pm_nl_add_addr_received()
382 WRITE_ONCE(msk->pm.accept_addr, false); in mptcp_pm_nl_add_addr_received()
387 remote = msk->pm.remote; in mptcp_pm_nl_add_addr_received()
393 spin_unlock_bh(&msk->pm.lock); in mptcp_pm_nl_add_addr_received()
394 __mptcp_subflow_connect((struct sock *)msk, &local, &remote); in mptcp_pm_nl_add_addr_received()
395 spin_lock_bh(&msk->pm.lock); in mptcp_pm_nl_add_addr_received()
397 mptcp_pm_announce_addr(msk, &remote, true); in mptcp_pm_nl_add_addr_received()
400 void mptcp_pm_nl_rm_addr_received(struct mptcp_sock *msk) in mptcp_pm_nl_rm_addr_received() argument
403 struct sock *sk = (struct sock *)msk; in mptcp_pm_nl_rm_addr_received()
405 pr_debug("address rm_id %d", msk->pm.rm_id); in mptcp_pm_nl_rm_addr_received()
407 if (!msk->pm.rm_id) in mptcp_pm_nl_rm_addr_received()
410 if (list_empty(&msk->conn_list)) in mptcp_pm_nl_rm_addr_received()
413 list_for_each_entry_safe(subflow, tmp, &msk->conn_list, node) { in mptcp_pm_nl_rm_addr_received()
418 if (msk->pm.rm_id != subflow->remote_id) in mptcp_pm_nl_rm_addr_received()
421 spin_unlock_bh(&msk->pm.lock); in mptcp_pm_nl_rm_addr_received()
424 spin_lock_bh(&msk->pm.lock); in mptcp_pm_nl_rm_addr_received()
426 msk->pm.add_addr_accepted--; in mptcp_pm_nl_rm_addr_received()
427 msk->pm.subflows--; in mptcp_pm_nl_rm_addr_received()
428 WRITE_ONCE(msk->pm.accept_addr, true); in mptcp_pm_nl_rm_addr_received()
436 void mptcp_pm_nl_rm_subflow_received(struct mptcp_sock *msk, u8 rm_id) in mptcp_pm_nl_rm_subflow_received() argument
439 struct sock *sk = (struct sock *)msk; in mptcp_pm_nl_rm_subflow_received()
446 if (list_empty(&msk->conn_list)) in mptcp_pm_nl_rm_subflow_received()
449 list_for_each_entry_safe(subflow, tmp, &msk->conn_list, node) { in mptcp_pm_nl_rm_subflow_received()
457 spin_unlock_bh(&msk->pm.lock); in mptcp_pm_nl_rm_subflow_received()
460 spin_lock_bh(&msk->pm.lock); in mptcp_pm_nl_rm_subflow_received()
462 msk->pm.local_addr_used--; in mptcp_pm_nl_rm_subflow_received()
463 msk->pm.subflows--; in mptcp_pm_nl_rm_subflow_received()
518 int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk, struct sock_common *skc) in mptcp_pm_nl_get_local_id() argument
526 if (WARN_ON_ONCE(!msk)) in mptcp_pm_nl_get_local_id()
532 local_address((struct sock_common *)msk, &msk_local); in mptcp_pm_nl_get_local_id()
540 pernet = net_generic(sock_net((struct sock *)msk), pm_nl_pernet_id); in mptcp_pm_nl_get_local_id()
568 void mptcp_pm_nl_data_init(struct mptcp_sock *msk) in mptcp_pm_nl_data_init() argument
570 struct mptcp_pm_data *pm = &msk->pm; in mptcp_pm_nl_data_init()
574 pernet = net_generic(sock_net((struct sock *)msk), pm_nl_pernet_id); in mptcp_pm_nl_data_init()
734 static bool remove_anno_list_by_saddr(struct mptcp_sock *msk, in remove_anno_list_by_saddr() argument
739 entry = mptcp_pm_del_add_timer(msk, addr); in remove_anno_list_by_saddr()
749 static bool mptcp_pm_remove_anno_addr(struct mptcp_sock *msk, in mptcp_pm_remove_anno_addr() argument
755 ret = remove_anno_list_by_saddr(msk, addr); in mptcp_pm_remove_anno_addr()
757 spin_lock_bh(&msk->pm.lock); in mptcp_pm_remove_anno_addr()
758 mptcp_pm_remove_addr(msk, addr->id); in mptcp_pm_remove_anno_addr()
759 spin_unlock_bh(&msk->pm.lock); in mptcp_pm_remove_anno_addr()
767 struct mptcp_sock *msk; in mptcp_nl_remove_subflow_and_signal_addr() local
772 while ((msk = mptcp_token_iter_next(net, &s_slot, &s_num)) != NULL) { in mptcp_nl_remove_subflow_and_signal_addr()
773 struct sock *sk = (struct sock *)msk; in mptcp_nl_remove_subflow_and_signal_addr()
776 if (list_empty(&msk->conn_list)) { in mptcp_nl_remove_subflow_and_signal_addr()
777 mptcp_pm_remove_anno_addr(msk, addr, false); in mptcp_nl_remove_subflow_and_signal_addr()
782 remove_subflow = lookup_subflow_by_saddr(&msk->conn_list, addr); in mptcp_nl_remove_subflow_and_signal_addr()
783 mptcp_pm_remove_anno_addr(msk, addr, remove_subflow); in mptcp_nl_remove_subflow_and_signal_addr()
785 mptcp_pm_remove_subflow(msk, addr->id); in mptcp_nl_remove_subflow_and_signal_addr()