summaryrefslogtreecommitdiffstats
path: root/src/vnet/tcp/tcp.h
diff options
context:
space:
mode:
authorFlorin Coras <fcoras@cisco.com>2018-09-25 14:00:34 -0700
committerDamjan Marion <dmarion@me.com>2018-11-09 11:24:22 +0000
commit2e31cc35ca5db7f16c8052578d79f1ec84c0acb5 (patch)
tree673f9bc946628d9d554c126f92d75eab4d67d0cb /src/vnet/tcp/tcp.h
parent97670eb3c643eefbecfbe2d61a8f06cde9516778 (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.h34
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
*