Compare commits

..

3 Commits

Author SHA1 Message Date
Lukas Prause
e5c3729522 Adds ECN handling managed by ROCCET. 2026-02-09 13:40:16 +01:00
Lukas Prause
5ebd5c0cb7 Adjusts the comment about the ROCCET paper. 2026-01-30 13:34:47 +01:00
Lukas Prause
a4cce7378f Update paper state in README.md 2026-01-29 11:35:20 +01:00
3 changed files with 10 additions and 28 deletions

View File

@@ -11,11 +11,10 @@ The congestion avoidance phase, called ORBITER, uses
CUBIC's window growth function and adds, based on RTT
and ACK rate, congestion events.
NOTE: A paper for TCP ROCCET is currently under review.
Paper draft:
https://arxiv.org/abs/2510.25281
The oldest Linux kernel version we tested with ROCCET is 6.1.
A peer-reviewed paper on TCP ROCCET will be presented at the WONS 2026 conference.
A draft of the paper is available here:
https://arxiv.org/abs/2510.25281
## Setup

View File

@@ -129,8 +129,7 @@ static inline void roccettcp_reset(struct roccettcp *ca)
ca->bw_limit.next_check = 0;
ca->curr_min_rtt_timed.rtt = ~0U;
ca->curr_min_rtt_timed.time = ~0U;
ca->ece_srrtt = 0;
ca->ece_cwnd = 2;
ca->ece_received = 0;
}
static inline void update_min_rtt(struct sock *sk)
@@ -426,15 +425,6 @@ __bpf_kfunc static void roccettcp_cong_avoid(struct sock *sk, u32 ack,
update_min_rtt(sk);
update_srrtt(sk);
/* Reset ECE handling if we already have more bandwidth
* than we received the last ECE.
*/
if(ca->ece_srrtt > 0){
if(tcp_snd_cwnd(tp) >= ca->ece_cwnd){
ca->ece_srrtt = 0;
}
}
/* ROCCET drain.
* Do not increase the cwnd for 100ms after a roccet congestion event
*/
@@ -502,13 +492,9 @@ __bpf_kfunc static void roccettcp_cong_avoid(struct sock *sk, u32 ack,
if (roccet_xj < sr_rtt_upper_bound)
roccet_xj = sr_rtt_upper_bound;
/* This is true if we recently received an ECE bit.
* Therefore we should respect the srRTT at this piont.
*/
if(ca->ece_srrtt < roccet_xj && ca->ece_srrtt > 0)
roccet_xj = ca->ece_srrtt;
if (ca->curr_srRTT > roccet_xj && (bw_limit_detect || ca->ece_srrtt > 0)) {
if (ca->curr_srRTT > roccet_xj && (bw_limit_detect || ca->ece_received)) {
if(ca->ece_received)
ca->ece_received = 0;
ca->epoch_start = 0;
ca->roccet_last_event_time_us = now;
ca->cnt = 100 * tcp_snd_cwnd(tp);
@@ -599,15 +585,13 @@ __bpf_kfunc static void roccettcp_acked(struct sock *sk,
__bpf_kfunc static void roccet_in_ack_event(struct sock *sk, u32 flags)
{
struct tcp_sock *tp = tcp_sk(sk);
struct roccettcp *ca = inet_csk_ca(sk);
/* Handle ECE bit.
* Pocessing of ECE events is done in roccettcp_cong_avoid()
*/
if (flags & CA_ACK_ECE) {
ca->ece_srrtt = ca->curr_srRTT;
ca->ece_cwnd = tcp_snd_cwnd(tp);
ca->ece_received = 1;
}
}

View File

@@ -40,8 +40,7 @@ struct roccettcp {
u32 curr_rtt; /* the minimum rtt of current round */
u32 roccet_last_event_time_us; /* The last time ROCCET was triggered */
u32 ece_cwnd; /* The cwnd when a ECE bit was received */
u32 ece_srrtt; /* The srRTT whent the ECE was received */
u32 ece_received; /* Set to true if an ECE bit was received */
u32 curr_min_rtt; /* The current observed minRTT */
struct TimedRTT curr_min_rtt_timed; /* The current observed minRTT with
the timestamp when it was observed */