Skip to content

Commit

Permalink
mptcp: react scheduler when subflow events pop up
Browse files Browse the repository at this point in the history
The current packet scheduler will not react by queuing more packets if
some subflows only events are emitted, e.g. new TCP ACKs are received
only acking things at TCP-level but not at MPTCP level. The scheduler
should be called when such events happen.

ack_update_msk() is invoked when an ACK is received, so it's the right
place to call the scheduler by invoking __mptcp_check_push().

mptcp_subflow_timeout() is implemented to call the scheduler when a
subflow timeout happens. But I'm not sure where is the right place to
invoke it. I mean where is the right place when a RTO is fired. So I
temporarily do it in mptcp_worker().

Closes: multipath-tcp#343
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
  • Loading branch information
Geliang Tang committed Dec 27, 2024
1 parent f120b95 commit 2f48a15
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 3 deletions.
3 changes: 3 additions & 0 deletions include/net/tcp.h
Original file line number Diff line number Diff line change
Expand Up @@ -341,6 +341,9 @@ void tcp_release_cb(struct sock *sk);
void tcp_wfree(struct sk_buff *skb);
void tcp_write_timer_handler(struct sock *sk);
void tcp_delack_timer_handler(struct sock *sk);
bool retransmits_timed_out(struct sock *sk,
unsigned int boundary,
unsigned int timeout);
int tcp_ioctl(struct sock *sk, int cmd, int *karg);
enum skb_drop_reason tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb);
void tcp_rcv_established(struct sock *sk, struct sk_buff *skb);
Expand Down
6 changes: 3 additions & 3 deletions net/ipv4/tcp_timer.c
Original file line number Diff line number Diff line change
Expand Up @@ -210,9 +210,9 @@ static unsigned int tcp_model_timeout(struct sock *sk,
* after "boundary" unsuccessful, exponentially backed-off
* retransmissions with an initial RTO of TCP_RTO_MIN.
*/
static bool retransmits_timed_out(struct sock *sk,
unsigned int boundary,
unsigned int timeout)
bool retransmits_timed_out(struct sock *sk,
unsigned int boundary,
unsigned int timeout)
{
struct tcp_sock *tp = tcp_sk(sk);
unsigned int start_ts, delta;
Expand Down
21 changes: 21 additions & 0 deletions net/mptcp/protocol.c
Original file line number Diff line number Diff line change
Expand Up @@ -423,6 +423,26 @@ static long mptcp_timeout_from_subflow(const struct mptcp_subflow_context *subfl
inet_csk(ssk)->icsk_timeout - jiffies : 0;
}

static void __mptcp_subflow_timeout(struct sock *sk, struct sock *ssk, long tout)
{
unsigned int boundary = READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_retries1) + 1;

if (retransmits_timed_out(ssk, boundary, tout))
__mptcp_check_push(sk, ssk);
}

static void mptcp_subflow_timeout(struct sock *sk)
{
struct mptcp_subflow_context *subflow;

mptcp_for_each_subflow(mptcp_sk(sk), subflow) {
struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
long tout = mptcp_timeout_from_subflow(subflow);

__mptcp_subflow_timeout(sk, ssk, tout);
}
}

void mptcp_set_timeout(struct sock *sk)
{
struct mptcp_subflow_context *subflow;
Expand Down Expand Up @@ -2673,6 +2693,7 @@ static void mptcp_worker(struct work_struct *work)
mptcp_check_fastclose(msk);

mptcp_pm_nl_work(msk);
mptcp_subflow_timeout(sk);

mptcp_check_send_data_fin(sk);
mptcp_check_data_fin_ack(sk);
Expand Down

0 comments on commit 2f48a15

Please sign in to comment.