X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Ftcp%2Ftcp_types.h;h=aacfd8f2fd4c3a13fa07d764aebd42ed8dc15a2c;hb=f840880c2fd8fbd6acfa79948224aafe6e4a62d1;hp=ccb7ae86aedf20e63b9d8dbeec58905184f2804b;hpb=999840cf805f26a490e8e6b8acc1fe7a7c21a181;p=vpp.git diff --git a/src/vnet/tcp/tcp_types.h b/src/vnet/tcp/tcp_types.h index ccb7ae86aed..aacfd8f2fd4 100644 --- a/src/vnet/tcp/tcp_types.h +++ b/src/vnet/tcp/tcp_types.h @@ -21,14 +21,17 @@ #include #include -#define TCP_TICK 0.001 /**< TCP tick period (s) */ -#define THZ (u32) (1/TCP_TICK) /**< TCP tick frequency */ -#define TCP_TSTAMP_RESOLUTION TCP_TICK /**< Time stamp resolution */ -#define TCP_PAWS_IDLE 24 * 24 * 60 * 60 * THZ /**< 24 days */ +#define TCP_TICK 0.000001 /**< TCP tick period (s) */ +#define THZ (u32) (1/TCP_TICK) /**< TCP tick frequency */ + +#define TCP_TSTP_TICK 0.001 /**< Timestamp tick (s) */ +#define TCP_TSTP_HZ (u32) (1/TCP_TSTP_TICK) /**< Timestamp freq */ +#define TCP_PAWS_IDLE (24 * 86400 * TCP_TSTP_HZ)/**< 24 days */ +#define TCP_TSTP_TO_HZ (u32) (TCP_TSTP_TICK * THZ) + #define TCP_FIB_RECHECK_PERIOD 1 * THZ /**< Recheck every 1s */ #define TCP_MAX_OPTION_SPACE 40 #define TCP_CC_DATA_SZ 24 -#define TCP_MAX_GSO_SZ 65536 #define TCP_RXT_MAX_BURST 10 #define TCP_DUPACK_THRESHOLD 3 @@ -61,7 +64,6 @@ typedef enum _tcp_state /** TCP timers */ #define foreach_tcp_timer \ _(RETRANSMIT, "RETRANSMIT") \ - _(DELACK, "DELAYED ACK") \ _(PERSIST, "PERSIST") \ _(WAITCLOSE, "WAIT CLOSE") \ _(RETRANSMIT_SYN, "RETRANSMIT SYN") \ @@ -72,12 +74,12 @@ typedef enum _tcp_timers foreach_tcp_timer #undef _ TCP_N_TIMERS -} tcp_timers_e; +} __clib_packed tcp_timers_e; #define TCP_TIMER_HANDLE_INVALID ((u32) ~0) -#define TCP_TIMER_TICK 0.1 /**< Timer tick in seconds */ -#define TCP_TO_TIMER_TICK TCP_TICK*10 /**< Factor for converting +#define TCP_TIMER_TICK 0.0001 /**< Timer tick in seconds */ +#define TCP_TO_TIMER_TICK TCP_TICK*10000 /**< Factor for converting ticks to timer ticks */ #define TCP_RTO_MAX 60 * THZ /* Min max RTO (60s) as per RFC6298 */ @@ -145,15 +147,16 @@ typedef enum tcp_connection_flag_ } tcp_connection_flags_e; #define TCP_SCOREBOARD_TRACE (0) -#define TCP_MAX_SACK_BLOCKS 256 /**< Max number of SACK blocks stored */ +#define TCP_MAX_SACK_BLOCKS 255 /**< Max number of SACK blocks stored */ #define TCP_INVALID_SACK_HOLE_INDEX ((u32)~0) +#define TCP_MAX_SACK_REORDER 300 typedef struct _scoreboard_trace_elt { u32 start; u32 end; u32 ack; - u32 snd_una_max; + u32 snd_nxt; u32 group; } scoreboard_trace_elt_t; @@ -181,7 +184,8 @@ typedef struct _sack_scoreboard 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 */ - u8 is_reneging; + u32 reorder; /**< Estimate of segment reordering */ + u8 is_reneging; /**< Flag set if peer is reneging*/ #if TCP_SCOREBOARD_TRACE scoreboard_trace_elt_t *trace; @@ -280,6 +284,7 @@ typedef struct _tcp_connection u8 cfg_flags; /**< Connection configuration flags */ u16 flags; /**< Connection flags (see tcp_conn_flags_e) */ u32 timers[TCP_N_TIMERS]; /**< Timer handles into timer wheel */ + u32 pending_timers; /**< Expired timers not yet handled */ u64 segs_in; /** RFC4022/4898 tcpHCInSegs/tcpEStatsPerfSegsIn */ u64 bytes_in; /** RFC4898 tcpEStatsPerfHCDataOctetsIn */ @@ -288,7 +293,6 @@ typedef struct _tcp_connection /** Send sequence variables RFC793 */ u32 snd_una; /**< oldest unacknowledged sequence number */ - u32 snd_una_max; /**< newest unacknowledged sequence number + 1*/ u32 snd_wnd; /**< send window */ u32 snd_wl1; /**< seq number used for last snd.wnd update */ u32 snd_wl2; /**< ack number used for last snd.wnd update */ @@ -303,20 +307,19 @@ typedef struct _tcp_connection u32 rcv_wnd; /**< receive window we expect */ u32 rcv_las; /**< rcv_nxt at last ack sent/rcv_wnd update */ - u32 iss; /**< initial sent sequence */ - u32 irs; /**< initial remote sequence */ /* Options */ u8 snd_opts_len; /**< Tx options len */ + u8 snd_sack_pos; /**< Position in vec of first block to send */ u8 rcv_wscale; /**< Window scale to advertise to peer */ u8 snd_wscale; /**< Window scale to use when sending */ u32 tsval_recent; /**< Last timestamp received */ u32 tsval_recent_age; /**< When last updated tstamp_recent*/ + u32 timestamp_delta; /**< Offset for timestamp */ tcp_options_t snd_opts; /**< Tx options for connection */ tcp_options_t rcv_opts; /**< Rx options for connection */ sack_block_t *snd_sacks; /**< Vector of SACKs to send. XXX Fixed size? */ - u8 snd_sack_pos; /**< Position in vec of first block to send */ sack_block_t *snd_sacks_fl; /**< Vector for building new list */ sack_scoreboard_t sack_sb; /**< SACK "scoreboard" that tracks holes */ @@ -340,7 +343,7 @@ typedef struct _tcp_connection u32 rxt_delivered; /**< Rxt bytes delivered during current cc event */ u32 rxt_head; /**< snd_una last time we re rxted the head */ u32 tsecr_last_ack; /**< Timestamp echoed to us in last healthy ACK */ - u32 snd_congestion; /**< snd_una_max when congestion is detected */ + u32 snd_congestion; /**< snd_nxt when congestion is detected */ u32 tx_fifo_size; /**< Tx fifo size. Used to constrain cwnd */ tcp_cc_algorithm_t *cc_algo; /**< Congestion control algorithm */ u8 cc_data[TCP_CC_DATA_SZ]; /**< Congestion control algo private data */ @@ -354,7 +357,7 @@ typedef struct _tcp_connection /* RTT and RTO */ u32 rto; /**< Retransmission timeout */ u32 rto_boff; /**< Index for RTO backoff */ - u32 srtt; /**< Smoothed RTT */ + u32 srtt; /**< Smoothed RTT measured in @ref TCP_TICK */ u32 rttvar; /**< Smoothed mean RTT difference. Approximates variance */ u32 rtt_seq; /**< Sequence number for tracked ACK */ f64 rtt_ts; /**< Timestamp for tracked ACK */ @@ -376,10 +379,11 @@ typedef struct _tcp_connection tcp_errors_t errors; /**< Soft connection errors */ + u32 iss; /**< initial sent sequence */ + u32 irs; /**< initial remote sequence */ f64 start_ts; /**< Timestamp when connection initialized */ u32 last_fib_check; /**< Last time we checked fib route for peer */ u16 mss; /**< Our max seg size that includes options */ - u32 timestamp_delta; /**< Offset for timestamp */ u32 ipv6_flow_label; /**< flow label for ipv6 header */ #define rst_state snd_wl1 @@ -440,6 +444,36 @@ tcp_get_connection_from_transport (transport_connection_t * tconn) return (tcp_connection_t *) tconn; } +/* + * Define custom timer wheel geometry + */ + +#undef TW_TIMER_WHEELS +#undef TW_SLOTS_PER_RING +#undef TW_RING_SHIFT +#undef TW_RING_MASK +#undef TW_TIMERS_PER_OBJECT +#undef LOG2_TW_TIMERS_PER_OBJECT +#undef TW_SUFFIX +#undef TW_OVERFLOW_VECTOR +#undef TW_FAST_WHEEL_BITMAP +#undef TW_TIMER_ALLOW_DUPLICATE_STOP +#undef TW_START_STOP_TRACE_SIZE + +#define TW_TIMER_WHEELS 2 +#define TW_SLOTS_PER_RING 1024 +#define TW_RING_SHIFT 10 +#define TW_RING_MASK (TW_SLOTS_PER_RING -1) +#define TW_TIMERS_PER_OBJECT 16 +#define LOG2_TW_TIMERS_PER_OBJECT 4 +#define TW_SUFFIX _tcp_twsl +#define TW_FAST_WHEEL_BITMAP 0 +#define TW_TIMER_ALLOW_DUPLICATE_STOP 1 + +#include + +typedef tw_timer_wheel_tcp_twsl_t tcp_timer_wheel_t; + #endif /* SRC_VNET_TCP_TCP_TYPES_H_ */ /*