Lines Matching full:subflow

94 	struct mptcp_subflow_context *subflow;  in __mptcp_socket_create()  local
105 subflow = mptcp_subflow_ctx(ssock->sk); in __mptcp_socket_create()
106 list_add(&subflow->node, &msk->conn_list); in __mptcp_socket_create()
108 subflow->request_mptcp = 1; in __mptcp_socket_create()
109 subflow->subflow_id = msk->subflow_id++; in __mptcp_socket_create()
111 /* This is the first subflow, always with id 0 */ in __mptcp_socket_create()
112 WRITE_ONCE(subflow->local_id, 0); in __mptcp_socket_create()
119 /* If the MPC handshake is not started, returns the first subflow,
343 const struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); in mptcp_init_skb() local
350 MPTCP_SKB_CB(skb)->map_seq = mptcp_subflow_get_mapped_dsn(subflow); in mptcp_init_skb()
368 /* try to fetch required memory from subflow */ in __mptcp_move_skb()
422 struct mptcp_subflow_context *subflow; in mptcp_shutdown_subflows() local
424 mptcp_for_each_subflow(msk, subflow) { in mptcp_shutdown_subflows()
425 struct sock *ssk = mptcp_subflow_tcp_sock(subflow); in mptcp_shutdown_subflows()
504 static long mptcp_timeout_from_subflow(const struct mptcp_subflow_context *subflow) in mptcp_timeout_from_subflow() argument
506 const struct sock *ssk = mptcp_subflow_tcp_sock(subflow); in mptcp_timeout_from_subflow()
508 return inet_csk(ssk)->icsk_pending && !subflow->stale_count ? in mptcp_timeout_from_subflow()
514 struct mptcp_subflow_context *subflow; in mptcp_set_timeout() local
517 mptcp_for_each_subflow(mptcp_sk(sk), subflow) in mptcp_set_timeout()
518 tout = max(tout, mptcp_timeout_from_subflow(subflow)); in mptcp_set_timeout()
545 struct mptcp_subflow_context *subflow; in mptcp_send_ack() local
547 mptcp_for_each_subflow(msk, subflow) in mptcp_send_ack()
548 mptcp_subflow_send_ack(mptcp_subflow_tcp_sock(subflow)); in mptcp_send_ack()
577 struct mptcp_subflow_context *subflow; in mptcp_cleanup_rbuf() local
585 mptcp_for_each_subflow(msk, subflow) { in mptcp_cleanup_rbuf()
586 struct sock *ssk = mptcp_subflow_tcp_sock(subflow); in mptcp_cleanup_rbuf()
601 * at the subflow level and the msk lock was not held, so this in mptcp_check_data_fin()
652 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); in __mptcp_move_skbs_from_subflow() local
670 map_remaining = subflow->map_data_len - in __mptcp_move_skbs_from_subflow()
671 mptcp_subflow_get_map_offset(subflow); in __mptcp_move_skbs_from_subflow()
683 subflow->map_data_len = skb->len; in __mptcp_move_skbs_from_subflow()
799 struct mptcp_subflow_context *subflow; in __mptcp_error_report() local
802 mptcp_for_each_subflow(msk, subflow) in __mptcp_error_report()
803 if (__mptcp_subflow_error_report(sk, mptcp_subflow_tcp_sock(subflow))) in __mptcp_error_report()
841 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); in mptcp_data_ready() local
844 * subflow at msk destruction time, but we must avoid enqueuing in mptcp_data_ready()
847 if (unlikely(subflow->disposable)) in mptcp_data_ready()
895 struct mptcp_subflow_context *tmp, *subflow; in __mptcp_flush_join_list() local
898 list_for_each_entry_safe(subflow, tmp, join_list, node) { in __mptcp_flush_join_list()
899 struct sock *ssk = mptcp_subflow_tcp_sock(subflow); in __mptcp_flush_join_list()
902 list_move_tail(&subflow->node, &msk->conn_list); in __mptcp_flush_join_list()
931 /* each subflow already holds a reference to the sk, and the in mptcp_schedule_work()
932 * workqueue is invoked by a subflow, so sk can't go away here. in mptcp_schedule_work()
1061 struct mptcp_subflow_context *subflow; in mptcp_enter_memory_pressure() local
1065 mptcp_for_each_subflow(msk, subflow) { in mptcp_enter_memory_pressure()
1066 struct sock *ssk = mptcp_subflow_tcp_sock(subflow); in mptcp_enter_memory_pressure()
1372 void mptcp_subflow_set_active(struct mptcp_subflow_context *subflow) in mptcp_subflow_set_active() argument
1374 if (!subflow->stale) in mptcp_subflow_set_active()
1377 subflow->stale = 0; in mptcp_subflow_set_active()
1378 MPTCP_INC_STATS(sock_net(mptcp_subflow_tcp_sock(subflow)), MPTCP_MIB_SUBFLOWRECOVER); in mptcp_subflow_set_active()
1381 bool mptcp_subflow_active(struct mptcp_subflow_context *subflow) in mptcp_subflow_active() argument
1383 if (unlikely(subflow->stale)) { in mptcp_subflow_active()
1384 u32 rcv_tstamp = READ_ONCE(tcp_sk(mptcp_subflow_tcp_sock(subflow))->rcv_tstamp); in mptcp_subflow_active()
1386 if (subflow->stale_rcv_tstamp == rcv_tstamp) in mptcp_subflow_active()
1389 mptcp_subflow_set_active(subflow); in mptcp_subflow_active()
1391 return __mptcp_subflow_active(subflow); in mptcp_subflow_active()
1399 * returns the subflow that will transmit the next DSS
1405 struct mptcp_subflow_context *subflow; in mptcp_subflow_get_send() local
1413 /* pick the subflow with the lower wmem/wspace ratio */ in mptcp_subflow_get_send()
1419 mptcp_for_each_subflow(msk, subflow) { in mptcp_subflow_get_send()
1420 bool backup = subflow->backup || subflow->request_bkup; in mptcp_subflow_get_send()
1422 trace_mptcp_subflow_get_send(subflow); in mptcp_subflow_get_send()
1423 ssk = mptcp_subflow_tcp_sock(subflow); in mptcp_subflow_get_send()
1424 if (!mptcp_subflow_active(subflow)) in mptcp_subflow_get_send()
1427 tout = max(tout, mptcp_timeout_from_subflow(subflow)); in mptcp_subflow_get_send()
1429 pace = subflow->avg_pacing_rate; in mptcp_subflow_get_send()
1432 subflow->avg_pacing_rate = READ_ONCE(ssk->sk_pacing_rate); in mptcp_subflow_get_send()
1433 pace = subflow->avg_pacing_rate; in mptcp_subflow_get_send()
1446 /* pick the best backup if no other subflow is active */ in mptcp_subflow_get_send()
1456 * otherwise do not use the picked, slower, subflow in mptcp_subflow_get_send()
1457 * We select the subflow with the shorter estimated time to flush in mptcp_subflow_get_send()
1459 * to check that subflow has a non empty cwin. in mptcp_subflow_get_send()
1470 subflow = mptcp_subflow_ctx(ssk); in mptcp_subflow_get_send()
1471 subflow->avg_pacing_rate = div_u64((u64)subflow->avg_pacing_rate * wmem + in mptcp_subflow_get_send()
1502 * that has been handed to the subflow for transmission in mptcp_update_post_push()
1575 struct mptcp_subflow_context *subflow; in __mptcp_push_pending() local
1583 mptcp_for_each_subflow(msk, subflow) { in __mptcp_push_pending()
1584 if (READ_ONCE(subflow->scheduled)) { in __mptcp_push_pending()
1585 mptcp_subflow_set_scheduled(subflow, false); in __mptcp_push_pending()
1588 ssk = mptcp_subflow_tcp_sock(subflow); in __mptcp_push_pending()
1596 /* Need to lock the new subflow only if different in __mptcp_push_pending()
1618 /* at this point we held the socket lock for the last subflow we used */ in __mptcp_push_pending()
1641 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); in __mptcp_subflow_push_pending() local
1644 /* check for a different subflow usage only after in __mptcp_subflow_push_pending()
1648 mptcp_subflow_set_scheduled(subflow, false); in __mptcp_subflow_push_pending()
1660 if (READ_ONCE(subflow->scheduled)) { in __mptcp_subflow_push_pending()
1661 mptcp_subflow_set_scheduled(subflow, false); in __mptcp_subflow_push_pending()
1668 mptcp_for_each_subflow(msk, subflow) { in __mptcp_subflow_push_pending()
1669 if (READ_ONCE(subflow->scheduled)) { in __mptcp_subflow_push_pending()
1670 xmit_ssk = mptcp_subflow_tcp_sock(subflow); in __mptcp_subflow_push_pending()
1672 mptcp_subflow_delegate(subflow, in __mptcp_subflow_push_pending()
1707 * first subflow right now. Otherwise we are in the defer_connect in mptcp_sendmsg_fastopen()
1708 * path, and the first subflow must be already present. in mptcp_sendmsg_fastopen()
1710 * fastopen attempt, no need to check for additional subflow status. in mptcp_sendmsg_fastopen()
1794 struct mptcp_subflow_context *subflow; in mptcp_rps_record_subflows() local
1799 mptcp_for_each_subflow(msk, subflow) { in mptcp_rps_record_subflows()
1800 struct sock *ssk = mptcp_subflow_tcp_sock(subflow); in mptcp_rps_record_subflows()
2005 struct mptcp_subflow_context *subflow; in mptcp_rcv_space_adjust() local
2029 mptcp_for_each_subflow(msk, subflow) { in mptcp_rcv_space_adjust()
2034 tp = tcp_sk(mptcp_subflow_tcp_sock(subflow)); in mptcp_rcv_space_adjust()
2056 * get drops at subflow level if skbs can't be moved to in mptcp_rcv_space_adjust()
2060 mptcp_for_each_subflow(msk, subflow) { in mptcp_rcv_space_adjust()
2064 ssk = mptcp_subflow_tcp_sock(subflow); in mptcp_rcv_space_adjust()
2079 struct mptcp_subflow_context *subflow) in __mptcp_first_ready_from() argument
2081 struct mptcp_subflow_context *start_subflow = subflow; in __mptcp_first_ready_from()
2083 while (!READ_ONCE(subflow->data_avail)) { in __mptcp_first_ready_from()
2084 subflow = mptcp_next_subflow(msk, subflow); in __mptcp_first_ready_from()
2085 if (subflow == start_subflow) in __mptcp_first_ready_from()
2088 return subflow; in __mptcp_first_ready_from()
2093 struct mptcp_subflow_context *subflow; in __mptcp_move_skbs() local
2100 subflow = list_first_entry(&msk->conn_list, in __mptcp_move_skbs()
2108 * and ev. acquiring the subflow socket lock before baling out in __mptcp_move_skbs()
2113 subflow = __mptcp_first_ready_from(msk, subflow); in __mptcp_move_skbs()
2114 if (!subflow) in __mptcp_move_skbs()
2117 ssk = mptcp_subflow_tcp_sock(subflow); in __mptcp_move_skbs()
2124 subflow = mptcp_next_subflow(msk, subflow); in __mptcp_move_skbs()
2294 /* Find an idle subflow. Return NULL if there is unacked data at tcp
2297 * A backup subflow is returned only if that is the only kind available.
2302 struct mptcp_subflow_context *subflow; in mptcp_subflow_get_retrans() local
2305 mptcp_for_each_subflow(msk, subflow) { in mptcp_subflow_get_retrans()
2306 struct sock *ssk = mptcp_subflow_tcp_sock(subflow); in mptcp_subflow_get_retrans()
2308 if (!__mptcp_subflow_active(subflow)) in mptcp_subflow_get_retrans()
2314 min_stale_count = min_t(int, min_stale_count, subflow->stale_count); in mptcp_subflow_get_retrans()
2318 if (subflow->backup || subflow->request_bkup) { in mptcp_subflow_get_retrans()
2377 * clean completely the subflow status when the subflow reaches
2381 struct mptcp_subflow_context *subflow, in __mptcp_subflow_disconnect() argument
2386 /* The MPTCP code never wait on the subflow sockets, TCP-level in __mptcp_subflow_disconnect()
2390 mptcp_subflow_ctx_reset(subflow); in __mptcp_subflow_disconnect()
2396 /* subflow sockets can be either outgoing (connect) or incoming
2405 struct mptcp_subflow_context *subflow, in __mptcp_close_ssk() argument
2411 /* If the first subflow moved to a close state before accept, e.g. due in __mptcp_close_ssk()
2412 * to an incoming reset or listener shutdown, the subflow socket is in __mptcp_close_ssk()
2428 list_del(&subflow->node); in __mptcp_close_ssk()
2438 subflow->send_fastclose = 1; in __mptcp_close_ssk()
2443 __mptcp_subflow_disconnect(ssk, subflow, flags); in __mptcp_close_ssk()
2449 subflow->disposable = 1; in __mptcp_close_ssk()
2457 kfree_rcu(subflow, rcu); in __mptcp_close_ssk()
2459 /* otherwise tcp will dispose of the ssk and subflow ctx */ in __mptcp_close_ssk()
2498 struct mptcp_subflow_context *subflow) in mptcp_close_ssk() argument
2500 /* The first subflow can already be closed and still in the list */ in mptcp_close_ssk()
2501 if (subflow->close_event_done) in mptcp_close_ssk()
2504 subflow->close_event_done = true; in mptcp_close_ssk()
2509 /* subflow aborted before reaching the fully_established status in mptcp_close_ssk()
2510 * attempt the creation of the next subflow in mptcp_close_ssk()
2512 mptcp_pm_subflow_check_next(mptcp_sk(sk), subflow); in mptcp_close_ssk()
2514 __mptcp_close_ssk(sk, ssk, subflow, MPTCP_CF_PUSH); in mptcp_close_ssk()
2524 struct mptcp_subflow_context *subflow, *tmp; in __mptcp_close_subflow() local
2529 mptcp_for_each_subflow_safe(msk, subflow, tmp) { in __mptcp_close_subflow()
2530 struct sock *ssk = mptcp_subflow_tcp_sock(subflow); in __mptcp_close_subflow()
2542 mptcp_close_ssk(sk, ssk, subflow); in __mptcp_close_subflow()
2559 struct mptcp_subflow_context *subflow, *tmp; in mptcp_check_fastclose() local
2567 mptcp_for_each_subflow_safe(msk, subflow, tmp) { in mptcp_check_fastclose()
2568 struct sock *tcp_sk = mptcp_subflow_tcp_sock(subflow); in mptcp_check_fastclose()
2610 struct mptcp_subflow_context *subflow; in __mptcp_retrans() local
2642 mptcp_for_each_subflow(msk, subflow) { in __mptcp_retrans()
2643 if (READ_ONCE(subflow->scheduled)) { in __mptcp_retrans()
2646 mptcp_subflow_set_scheduled(subflow, false); in __mptcp_retrans()
2648 ssk = mptcp_subflow_tcp_sock(subflow); in __mptcp_retrans()
2729 pr_debug("MP_FAIL doesn't respond, reset the subflow\n"); in mptcp_mp_fail_no_response()
2739 struct mptcp_subflow_context *subflow, *tmp; in mptcp_do_fastclose() local
2743 mptcp_for_each_subflow_safe(msk, subflow, tmp) in mptcp_do_fastclose()
2744 __mptcp_close_ssk(sk, mptcp_subflow_tcp_sock(subflow), in mptcp_do_fastclose()
2745 subflow, MPTCP_CF_FASTCLOSE); in mptcp_do_fastclose()
2914 pr_debug("Sending DATA_FIN on subflow %p\n", ssk); in mptcp_subflow_shutdown()
2977 struct mptcp_subflow_context *subflow; in mptcp_check_send_data_fin() local
2993 mptcp_for_each_subflow(msk, subflow) { in mptcp_check_send_data_fin()
2994 struct sock *tcp_sk = mptcp_subflow_tcp_sock(subflow); in mptcp_check_send_data_fin()
3070 struct mptcp_subflow_context *subflow; in __mptcp_close() local
3097 mptcp_for_each_subflow(msk, subflow) { in __mptcp_close()
3098 struct sock *ssk = mptcp_subflow_tcp_sock(subflow); in __mptcp_close()
3107 subflow->fail_tout = 0; in __mptcp_close()
3194 /* msk->subflow is still intact, the following will not free the first in mptcp_disconnect()
3195 * subflow in mptcp_disconnect()
3199 /* The first subflow is already in TCP_CLOSE status, the following in mptcp_disconnect()
3286 struct mptcp_subflow_context *subflow; in mptcp_sk_clone_init() local
3321 /* passive msk is created after the first/MPC subflow */ in mptcp_sk_clone_init()
3332 /* The msk maintain a ref to each subflow in the connections list */ in mptcp_sk_clone_init()
3334 subflow = mptcp_subflow_ctx(ssk); in mptcp_sk_clone_init()
3335 list_add(&subflow->node, &msk->conn_list); in mptcp_sk_clone_init()
3338 /* new mpc subflow takes ownership of the newly in mptcp_sk_clone_init()
3352 __mptcp_subflow_fully_established(msk, subflow, mp_opt); in mptcp_sk_clone_init()
3378 struct mptcp_subflow_context *subflow, *tmp; in mptcp_destroy_common() local
3384 mptcp_for_each_subflow_safe(msk, subflow, tmp) in mptcp_destroy_common()
3385 __mptcp_close_ssk(sk, mptcp_subflow_tcp_sock(subflow), subflow, flags); in mptcp_destroy_common()
3401 /* allow the following to close even the initial subflow */ in mptcp_destroy()
3447 /* the following actions acquire the subflow socket lock in mptcp_release_cb()
3452 * the subflow socket lock in mptcp_release_cb()
3478 * On sk release avoid actions depending on the first subflow in mptcp_release_cb()
3489 /* MP_JOIN client subflow must wait for 4th ack before sending any data:
3490 * TCP can't schedule delack timer before the subflow is fully established.
3517 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); in mptcp_subflow_process_delegated() local
3518 struct sock *sk = subflow->conn; in mptcp_subflow_process_delegated()
3567 struct mptcp_subflow_context *subflow; in mptcp_finish_connect() local
3571 subflow = mptcp_subflow_ctx(ssk); in mptcp_finish_connect()
3572 sk = subflow->conn; in mptcp_finish_connect()
3575 pr_debug("msk=%p, token=%u\n", sk, subflow->token); in mptcp_finish_connect()
3577 subflow->map_seq = subflow->iasn; in mptcp_finish_connect()
3578 subflow->map_subflow_seq = 1; in mptcp_finish_connect()
3580 /* the socket is not connected yet, no msk/subflow ops can access/race in mptcp_finish_connect()
3583 WRITE_ONCE(msk->local_key, subflow->local_key); in mptcp_finish_connect()
3598 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); in mptcp_finish_join() local
3599 struct mptcp_sock *msk = mptcp_sk(subflow->conn); in mptcp_finish_join()
3603 pr_debug("msk=%p, subflow=%p\n", msk, subflow); in mptcp_finish_join()
3607 subflow->reset_reason = MPTCP_RST_EMPTCP; in mptcp_finish_join()
3611 /* active subflow, already present inside the conn_list */ in mptcp_finish_join()
3612 if (!list_empty(&subflow->node)) { in mptcp_finish_join()
3637 list_add_tail(&subflow->node, &msk->conn_list); in mptcp_finish_join()
3641 list_add_tail(&subflow->node, &msk->join_list); in mptcp_finish_join()
3648 subflow->reset_reason = MPTCP_RST_EPROHIBIT; in mptcp_finish_join()
3678 /* the first subflow is disconnected after close - see in mptcp_ioctl_outq()
3727 struct mptcp_subflow_context *subflow; in mptcp_connect() local
3737 subflow = mptcp_subflow_ctx(ssk); in mptcp_connect()
3743 mptcp_early_fallback(msk, subflow, MPTCP_MIB_MD5SIGFALLBACK); in mptcp_connect()
3745 if (subflow->request_mptcp) { in mptcp_connect()
3747 mptcp_early_fallback(msk, subflow, in mptcp_connect()
3750 mptcp_early_fallback(msk, subflow, in mptcp_connect()
3754 WRITE_ONCE(msk->write_seq, subflow->idsn); in mptcp_connect()
3755 WRITE_ONCE(msk->snd_nxt, subflow->idsn); in mptcp_connect()
3756 WRITE_ONCE(msk->snd_una, subflow->idsn); in mptcp_connect()
3761 * acquired the subflow socket lock, too. in mptcp_connect()
3911 * but no need to allocate the first subflow just to error out. in mptcp_stream_accept()
3922 pr_debug("newsk=%p, subflow is mptcp=%d\n", newsk, sk_is_mptcp(newsk)); in mptcp_stream_accept()
3924 struct mptcp_subflow_context *subflow; in mptcp_stream_accept() local
3927 subflow = mptcp_subflow_ctx(newsk); in mptcp_stream_accept()
3928 new_mptcp_sock = subflow->conn; in mptcp_stream_accept()
3930 /* is_mptcp should be false if subflow->conn is missing, see in mptcp_stream_accept()
3952 mptcp_for_each_subflow(msk, subflow) { in mptcp_stream_accept()
3953 struct sock *ssk = mptcp_subflow_tcp_sock(subflow); in mptcp_stream_accept()
3961 /* Do late cleanup for the first subflow as necessary. Also in mptcp_stream_accept()
4086 struct mptcp_subflow_context *subflow; in mptcp_napi_poll() local
4090 while ((subflow = mptcp_subflow_delegated_next(delegated)) != NULL) { in mptcp_napi_poll()
4091 struct sock *ssk = mptcp_subflow_tcp_sock(subflow); in mptcp_napi_poll()
4095 mptcp_subflow_process_delegated(ssk, xchg(&subflow->delegated_status, 0)); in mptcp_napi_poll()
4099 * In both case must dequeue the subflow here - on the same in mptcp_napi_poll()
4103 clear_bit(MPTCP_DELEGATE_SCHEDULED, &subflow->delegated_status); in mptcp_napi_poll()