7 Commits

Author SHA1 Message Date
Lukas Prause 64d0e54f87 Update repository to the state of the latest kernel patch. 2026-09-16 15:22:54 +02:00
Lukas Prause b355d1eb50 Update Readme and add new performance report. 2026-07-22 13:35:32 +02:00
Lukas Prause b651be77b3 Adjusts sruct size and refactor of code. 2026-07-20 15:00:23 +02:00
Lukas Prause a6356c3297 Adds send and receive rate monitoring. 2026-07-16 13:25:58 +02:00
Lukas Prause 97a59b6f20 Removes apt repo. 2026-07-14 09:56:55 +02:00
Lukas Prause 35aa714256 Improves minimum RTT probing, adds packet pacing and refactors the code. 2026-07-13 16:20:23 +02:00
Lukas Prause 52cb1fe1f1 Adds minimum RTT probing. 2026-06-12 14:01:25 +02:00
4 changed files with 846 additions and 314 deletions
+16 -1
View File
@@ -5,8 +5,22 @@ Additionally, it is specially suited for 4G/5G cellular networks.
A peer-reviewed [paper on TCP ROCCET](https://opendl.ifip-tc6.org/db/conf/wons/wons2026/1571217211.pdf) was presented at the WONS 2026 conference. A peer-reviewed [paper on TCP ROCCET](https://opendl.ifip-tc6.org/db/conf/wons/wons2026/1571217211.pdf) was presented at the WONS 2026 conference.
## Install with apt A new performance report for the latest version of TCP ROCCET can be found under "doc/measurements/2026-07-21_performance-report.pdf".
### Versions
- latest on master branch (requires kernel version 7.1 or higher)
- Improved min RTT probing
- Packet pacing
- Code refactor
- Monitoring send and receive rate
- release-2026-06-12-v1
- Adds minimum RTT probing
## Install with apt (requires kernel version 6.10 or higher)
Add tcp-roccet-dkms to your source lists and install: Add tcp-roccet-dkms to your source lists and install:
``` ```
echo "deb [trusted=yes] https://apt.fury.io/timfuchs/ /" | sudo tee /etc/apt/sources.list.d/tcp-roccet.list echo "deb [trusted=yes] https://apt.fury.io/timfuchs/ /" | sudo tee /etc/apt/sources.list.d/tcp-roccet.list
sudo apt update sudo apt update
@@ -15,6 +29,7 @@ sudo apt install tcp-roccet-dkms
### Loading and using the congestion control ### Loading and using the congestion control
Note: This change is not persistent, the module will not be loaded at boot. Note: This change is not persistent, the module will not be loaded at boot.
``` ```
sudo modprobe tcp_roccet sudo modprobe tcp_roccet
sudo sysctl net.ipv4.tcp_congestion_control=roccet sudo sysctl net.ipv4.tcp_congestion_control=roccet
Binary file not shown.
+745 -249
View File
File diff suppressed because it is too large Load Diff
+46 -25
View File
@@ -7,25 +7,19 @@
#include <linux/math64.h> #include <linux/math64.h>
struct ack_rate { /* State in which roccet currently operates */
u16 last_rate; /* Last ACK-rate */ enum roccet_state {
u32 last_rate_time; /* Timestamp of the last ACK-rate */ LAUNCH,
u16 curr_rate; /* Current ACK-rate */ ORBITER,
u16 cnt; /* Used for counting acks */ RTT_PROBE_ENTER,
RTT_PROBE,
RTT_PROBE_REFILL,
DRAIN
}; };
struct bandwidth_limit_detect { /* TCP ROCCET struct based on the original BICTCP struct with
u32 sum_cwnd; /* sum of cwnd during time interval */ * additions specific to the ROCCET-Algorithm.
u32 sum_acked; /* sum of received acks during time interval */ */
u32 next_check; /* end/upper bound of time interval */
};
struct timed_rtt {
u32 time; /* Time of recording */
u32 rtt; /* Measured RTT */
};
/* Based on the BICTCP struct with additions specific for the ROCCET-Algorithm */
struct roccettcp { struct roccettcp {
u32 cnt; /* increase cwnd by 1 after ACKs */ u32 cnt; /* increase cwnd by 1 after ACKs */
u32 last_max_cwnd; /* last maximum snd_cwnd */ u32 last_max_cwnd; /* last maximum snd_cwnd */
@@ -39,18 +33,45 @@ struct roccettcp {
u32 epoch_start; /* beginning of an epoch */ u32 epoch_start; /* beginning of an epoch */
u32 ack_cnt; /* number of acks */ u32 ack_cnt; /* number of acks */
u32 tcp_cwnd; /* estimated tcp cwnd */ u32 tcp_cwnd; /* estimated tcp cwnd */
u32 curr_rtt; /* the minimum rtt of current round */ u32 curr_rtt; /* last sample rtt of current round */
u32 roccet_last_event_time_us; /* The last time ROCCET was triggered */ u32 roccet_last_event_time_us; /* The last time ROCCET was triggered */
bool ece_received; /* Set to true if an ECE bit was received */
u32 curr_min_rtt; /* The current observed minRTT */ u32 curr_min_rtt; /* The current observed minRTT */
struct timed_rtt curr_min_rtt_timed; /* The current observed minRTT with u32 next_min_rtt_probe; /* Next time to probe the minRTT */
* the timestamp when it was observed u32 probe_min_rtt_until; /* End of minRTT probing period.
* Set while in RTT_PROBE states
*/
u32 refill_until; /* End of pipe refill after minRTT probe.
* Set while in RTT_PROBE states
*/
u32 cwnd_before_min_rtt_probe; /* cwnd before min RTT probing. */
u32 curr_srrtt; /* srRTT calculated based on the latest ACK */
u32 next_srrtt_check_ts; /* Next check for srRTT */
u32 last_rtt; /* sample rtt of previous round.
* Used for jitter calculation
*/
u32 interval_snd_seq_start;
u32 interval_una_seq_start;
u32 ack_rate_last_rate_time; /* Timestamp of the last ACK-rate */
u16 ack_rate_last_rate; /* Last ACK-rate */
u16 ack_rate_curr_rate; /* Current ACK-rate */
u16 ack_rate_cnt; /* Used for counting acks */
enum roccet_state state : 3; /* Current operating state of roccet */
bool was_idle : 1; /* Tracks whether the connection was idle
* (had no in-flight packets)
*/
bool initial_limit_reached: 1; /* Set to true after the connection
* initially gets cwnd-limited
*/
bool is_in_initial_launch: 1; /* true if the connection is in
* the initial launch phase.
*/
u32 ack_carry_over; /* Used to carry over leftover acks from
* LAUNCH to ORBITER
*/ */
u32 curr_srrtt; /* The srRTT calculated based on the latest ACK */
struct ack_rate ack_rate; /* The last and the current ACK rate */
struct bandwidth_limit_detect bw_limit;
u32 last_rtt; /* Used for jitter calculation */
}; };
#endif /* __TCP_ROCCET_H */ #endif /* __TCP_ROCCET_H */