5 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
4 changed files with 775 additions and 450 deletions
+16 -10
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,19 +29,11 @@ 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
``` ```
### Versions
- latest on master branch
- Improved min RTT probing
- Packet pacing
- Code refactor
- release-2026-06-12-v1
- Adds minimum RTT probing
## Build from source ## Build from source
Binary file not shown.
+707 -402
View File
File diff suppressed because it is too large Load Diff
+52 -38
View File
@@ -7,57 +7,71 @@
#include <linux/math64.h> #include <linux/math64.h>
/* State in which roccet currently opperates */ /* State in which roccet currently operates */
enum roccet_state { enum roccet_state {
LAUNCH, LAUNCH,
ORBITER, ORBITER,
RTT_PROBE, RTT_PROBE_ENTER,
RTT_PROBE_REFILL, RTT_PROBE,
DRAIN RTT_PROBE_REFILL,
}; DRAIN
/* TCP ROCCET helper type, storing data related to ack counting */
struct ack_rate {
u32 last_rate; /* Last ACK-rate */
u32 last_rate_time; /* Timestamp of the last ACK-rate */
u32 curr_rate; /* Current ACK-rate */
u32 cnt; /* Used for counting acks */
}; };
/* TCP ROCCET struct based on the original BICTCP struct with /* TCP ROCCET struct based on the original BICTCP struct with
* additions specific to the ROCCET-Algorithm. * additions specific to 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 */
u32 last_cwnd; /* the last snd_cwnd */ u32 last_cwnd; /* the last snd_cwnd */
u32 last_time; /* time when updated last_cwnd */ u32 last_time; /* time when updated last_cwnd */
u32 bic_origin_point; /* origin point of bic function */ u32 bic_origin_point; /* origin point of bic function */
u32 bic_K; /* time to origin point from the u32 bic_K; /* time to origin point from the
* beginning of the current epoch * beginning of the current epoch
*/ */
u32 delay_min; /* min delay (usec) */ u32 delay_min; /* min delay (usec) */
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; /* last sample rtt of current round */ u32 curr_rtt; /* last sample rtt of current round */
u32 roccet_last_event_time_us; /* The last time ROCCET was u32 roccet_last_event_time_us; /* The last time ROCCET was triggered */
* 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 */
u32 next_min_rtt_probe; /* Next time to probe the minRTT */ u32 next_min_rtt_probe; /* Next time to probe the minRTT */
u32 probe_min_rtt_until; /* End of minRTT probing period */ u32 probe_min_rtt_until; /* End of minRTT probing period.
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 probeing */
u32 curr_srrtt; /* srRTT calculated based on the latest ACK */
u32 next_srrtt_check; /* Next check for srRTT */
struct ack_rate ack_rate; /* The last and the current ACK rate */
u32 last_rtt; /* sample rtt of previous round.
* Used for jitter calculation
*/ */
enum roccet_state state; /* State in which roccet currently opperates */ 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
*/
}; };
#endif /* __TCP_ROCCET_H */ #endif /* __TCP_ROCCET_H */