X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Ftcp%2Ftcp.h;h=7ccc06aea9c82df6daca40ff4d88699486b91791;hb=88d29a9206bbaa70f7772fa157ec6b1ccaf567a8;hp=8b943cdd5b5b1bf134b28a25ac098617d8847ca2;hpb=4f731f829f29c5579257ecf1ef4b129a9d79fac8;p=vpp.git diff --git a/src/vnet/tcp/tcp.h b/src/vnet/tcp/tcp.h index 8b943cdd5b5..7ccc06aea9c 100644 --- a/src/vnet/tcp/tcp.h +++ b/src/vnet/tcp/tcp.h @@ -183,6 +183,7 @@ typedef struct _sack_scoreboard u32 high_rxt; /**< Highest retransmitted sequence */ u32 rescue_rxt; /**< Rescue sequence number */ u32 lost_bytes; /**< Bytes lost as per RFC6675 */ + u32 last_lost_bytes; /**< Number of bytes last lost */ u32 cur_rxt_hole; /**< Retransmitting from this hole */ #if TCP_SCOREBOARD_TRACE @@ -248,18 +249,24 @@ typedef struct tcp_bt_sample_ u32 prev; /**< Previous sample index in list */ u32 min_seq; /**< Min seq number in sample */ u32 max_seq; /**< Max seq number. Set for rxt samples */ - u64 delivered; /**< Total delivered when sample taken */ + u64 delivered; /**< Total delivered bytes for sample */ f64 delivered_time; /**< Delivered time when sample taken */ + f64 tx_time; /**< Transmit time for the burst */ u64 tx_rate; /**< Tx pacing rate */ tcp_bts_flags_t flags; /**< Sample flag */ } tcp_bt_sample_t; typedef struct tcp_rate_sample_ { - u64 sample_delivered; /**< Delivered of sample used for rate */ - u32 delivered; /**< Bytes delivered in ack time */ - f64 ack_time; /**< Time to ack the bytes delivered */ + u64 prior_delivered; /**< Delivered of sample used for rate, i.e., + total bytes delivered at prior_time */ + f64 prior_time; /**< Delivered time of sample used for rate */ + f64 interval_time; /**< Time to ack the bytes delivered */ + f64 rtt_time; /**< RTT for sample */ u64 tx_rate; /**< Tx pacing rate */ + u32 delivered; /**< Bytes delivered in interval_time */ + u32 acked_and_sacked; /**< Bytes acked + sacked now */ + u32 lost; /**< Bytes lost now */ tcp_bts_flags_t flags; /**< Rate sample flags from bt sample */ } tcp_rate_sample_t; @@ -288,6 +295,11 @@ typedef enum _tcp_cc_ack_t TCP_CC_PARTIALACK } tcp_cc_ack_t; +typedef enum tcp_cc_event_ +{ + TCP_CC_EVT_START_TX, +} tcp_cc_event_t; + typedef struct _tcp_connection { CLIB_CACHE_LINE_ALIGN_MARK (cacheline0); @@ -372,6 +384,7 @@ typedef struct _tcp_connection u32 last_fib_check; /**< Last time we checked fib route for peer */ u16 mss; /**< Our max seg size that includes options */ + u32 timestamp_delta; } tcp_connection_t; /* *INDENT-OFF* */ @@ -379,13 +392,16 @@ struct _tcp_cc_algorithm { const char *name; uword (*unformat_cfg) (unformat_input_t * input); + void (*init) (tcp_connection_t * tc); + void (*cleanup) (tcp_connection_t * tc); void (*rcv_ack) (tcp_connection_t * tc, tcp_rate_sample_t *rs); void (*rcv_cong_ack) (tcp_connection_t * tc, tcp_cc_ack_t ack, tcp_rate_sample_t *rs); void (*congestion) (tcp_connection_t * tc); + void (*loss) (tcp_connection_t * tc); void (*recovered) (tcp_connection_t * tc); - void (*init) (tcp_connection_t * tc); - void (*cleanup) (tcp_connection_t * tc); + void (*undo_recovery) (tcp_connection_t * tc); + void (*event) (tcp_connection_t *tc, tcp_cc_event_t evt); }; /* *INDENT-ON* */ @@ -900,7 +916,7 @@ int tcp_fast_retransmit_sack (tcp_worker_ctx_t * wrk, tcp_connection_t * tc, int tcp_fast_retransmit (tcp_worker_ctx_t * wrk, tcp_connection_t * tc, u32 burst_size); void tcp_cc_init_congestion (tcp_connection_t * tc); -void tcp_cc_fastrecovery_exit (tcp_connection_t * tc); +void tcp_cc_fastrecovery_clear (tcp_connection_t * tc); fib_node_index_t tcp_lookup_rmt_in_fib (tcp_connection_t * tc); @@ -920,6 +936,16 @@ tcp_time_now_w_thread (u32 thread_index) return tcp_main.wrk_ctx[thread_index].time_now; } +/** + * Generate timestamp for tcp connection + */ +always_inline u32 +tcp_tstamp (tcp_connection_t * tc) +{ + return (tcp_main.wrk_ctx[tc->c_thread_index].time_now - + tc->timestamp_delta); +} + always_inline f64 tcp_time_now_us (u32 thread_index) { @@ -958,6 +984,32 @@ tcp_cc_rcv_cong_ack (tcp_connection_t * tc, tcp_cc_ack_t ack_type, tc->cc_algo->rcv_cong_ack (tc, ack_type, rs); } +static inline void +tcp_cc_loss (tcp_connection_t * tc) +{ + tc->cc_algo->loss (tc); +} + +static inline void +tcp_cc_recovered (tcp_connection_t * tc) +{ + tc->cc_algo->recovered (tc); +} + +static inline void +tcp_cc_undo_recovery (tcp_connection_t * tc) +{ + if (tc->cc_algo->undo_recovery) + tc->cc_algo->undo_recovery (tc); +} + +static inline void +tcp_cc_event (tcp_connection_t * tc, tcp_cc_event_t evt) +{ + if (tc->cc_algo->event) + tc->cc_algo->event (tc, evt); +} + always_inline void tcp_timer_set (tcp_connection_t * tc, u8 timer_id, u32 interval) {