diff options
author | Florin Coras <fcoras@cisco.com> | 2018-09-25 14:00:34 -0700 |
---|---|---|
committer | Damjan Marion <dmarion@me.com> | 2018-11-09 11:24:22 +0000 |
commit | 2e31cc35ca5db7f16c8052578d79f1ec84c0acb5 (patch) | |
tree | 673f9bc946628d9d554c126f92d75eab4d67d0cb /src/vnet/tcp/tcp.h | |
parent | 97670eb3c643eefbecfbe2d61a8f06cde9516778 (diff) |
tcp: basic cubic implementation
Because the code is not optimized, newreno is still the default
congestion control algorithm.
Change-Id: I7061cc80c5a75fa8e8265901fae4ea2888e35173
Signed-off-by: Florin Coras <fcoras@cisco.com>
Diffstat (limited to 'src/vnet/tcp/tcp.h')
-rw-r--r-- | src/vnet/tcp/tcp.h | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/src/vnet/tcp/tcp.h b/src/vnet/tcp/tcp.h index 843b90d987e..46262978a83 100644 --- a/src/vnet/tcp/tcp.h +++ b/src/vnet/tcp/tcp.h @@ -30,6 +30,7 @@ #define TCP_PAWS_IDLE 24 * 24 * 60 * 60 * THZ /**< 24 days */ #define TCP_FIB_RECHECK_PERIOD 1 * THZ /**< Recheck every 1s */ #define TCP_MAX_OPTION_SPACE 40 +#define TCP_CC_DATA_SZ 20 #define TCP_DUPACK_THRESHOLD 3 #define TCP_MAX_RX_FIFO_SIZE 32 << 20 @@ -249,6 +250,7 @@ u8 *format_tcp_scoreboard (u8 * s, va_list * args); typedef enum _tcp_cc_algorithm_type { TCP_CC_NEWRENO, + TCP_CC_CUBIC, } tcp_cc_algorithm_type_e; typedef struct _tcp_cc_algorithm tcp_cc_algorithm_t; @@ -262,6 +264,7 @@ typedef enum _tcp_cc_ack_t typedef struct _tcp_connection { + CLIB_CACHE_LINE_ALIGN_MARK (cacheline0); transport_connection_t connection; /**< Common transport data. First! */ u8 state; /**< TCP state as per tcp_state_t */ @@ -315,6 +318,7 @@ typedef struct _tcp_connection u32 tsecr_last_ack; /**< Timestamp echoed to us in last healthy ACK */ u32 snd_congestion; /**< snd_una_max when congestion is detected */ tcp_cc_algorithm_t *cc_algo; /**< Congestion control algorithm */ + u8 cc_data[TCP_CC_DATA_SZ]; /**< Congestion control algo private data */ /* RTT and RTO */ u32 rto; /**< Retransmission timeout */ @@ -329,6 +333,7 @@ typedef struct _tcp_connection u32 limited_transmit; /**< snd_nxt when limited transmit starts */ u32 last_fib_check; /**< Last time we checked fib route for peer */ u32 sw_if_index; /**< Interface for the connection */ + u32 tx_fifo_size; /**< Tx fifo size. Used to constrain cwnd */ } tcp_connection_t; struct _tcp_cc_algorithm @@ -460,6 +465,8 @@ typedef struct _tcp_main /** fault-injection */ f64 buffer_fail_fraction; + + u8 cc_algo; } tcp_main_t; extern tcp_main_t tcp_main; @@ -648,6 +655,25 @@ tcp_initial_cwnd (const tcp_connection_t * tc) return 4 * tc->snd_mss; } +/* + * Accumulate acked bytes for cwnd increase + * + * Once threshold bytes are accumulated, snd_mss bytes are added + * to the cwnd. + */ +always_inline void +tcp_cwnd_accumulate (tcp_connection_t * tc, u32 thresh, u32 bytes) +{ + tc->cwnd_acc_bytes += bytes; + if (tc->cwnd_acc_bytes >= thresh) + { + u32 inc = tc->cwnd_acc_bytes / thresh; + tc->cwnd_acc_bytes -= inc * thresh; + tc->cwnd += inc * tc->snd_mss; + tc->cwnd = clib_min (tc->cwnd, tc->tx_fifo_size); + } +} + always_inline u32 tcp_loss_wnd (const tcp_connection_t * tc) { @@ -870,6 +896,14 @@ void tcp_cc_algo_register (tcp_cc_algorithm_type_e type, tcp_cc_algorithm_t *tcp_cc_algo_get (tcp_cc_algorithm_type_e type); +static inline void * +tcp_cc_data (tcp_connection_t * tc) +{ + return (void *) tc->cc_data; +} + +void newreno_rcv_cong_ack (tcp_connection_t * tc, tcp_cc_ack_t ack_type); + /** * Push TCP header to buffer * |