#ifndef _NETINET_TCP_BBR_H_
#define _NETINET_TCP_BBR_H_
#define BBR_INITIAL_RTO 1000000
#define BBR_ACKED 0x0001
#define BBR_WAS_RENEGED 0x0002
#define BBR_RXT_CLEARED 0x0004
#define BBR_OVERMAX 0x0008
#define BBR_SACK_PASSED 0x0010
#define BBR_WAS_SACKPASS 0x0020
#define BBR_HAS_FIN 0x0040
#define BBR_TLP 0x0080
#define BBR_HAS_SYN 0x0100
#define BBR_MARKED_LOST 0x0200
#define BBR_RWND_COLLAPSED 0x0400
#define BBR_NUM_OF_RETRANS 7
#define BBR_INCL_ENET_OH 0x01
#define BBR_INCL_IP_OH 0x02
#define BBR_INCL_TCP_OH 0x03
struct bbr_sendmap {
TAILQ_ENTRY(bbr_sendmap) r_next;
TAILQ_ENTRY(bbr_sendmap) r_tnext;
uint32_t r_start;
uint32_t r_end;
uint32_t r_rtr_bytes;
uint32_t r_delivered;
uint32_t r_del_time;
uint8_t r_rtr_cnt:4,
r_rtt_not_allowed:1,
r_is_drain:1,
r_app_limited:1,
r_ts_valid:1;
uint8_t r_dupack;
uint8_t r_in_tmap:1,
r_is_smallmap:1,
r_is_gain:1,
r_bbr_state:5;
uint8_t r_limit_type;
uint16_t r_flags;
uint16_t r_spare16;
uint32_t r_del_ack_ts;
uint32_t r_tim_lastsent[BBR_NUM_OF_RETRANS];
uint32_t r_first_sent_time;
uint32_t r_pacing_delay;
uint32_t r_flight_at_send;
#ifdef _KERNEL
} __aligned(CACHE_LINE_SIZE);
#else
};
#endif
#define BBR_LIMIT_TYPE_SPLIT 1
TAILQ_HEAD(bbr_head, bbr_sendmap);
#define BBR_SEGMENT_TIME_SIZE 1500
#define BBR_MIN_SEG 1460
#define BBR_MAX_GAIN_VALUE 0xffff
#define BBR_TIMER_FUDGE 1500
#define BBR_RED_BW_CONGSIG 0
#define BBR_RED_BW_RATECAL 1
#define BBR_RED_BW_USELRBW 2
#define BBR_RED_BW_SETHIGHLOSS 3
#define BBR_RED_BW_PE_CLREARLY 4
#define BBR_RED_BW_PE_CLAFDEL 5
#define BBR_RED_BW_REC_ENDCLL 6
#define BBR_RED_BW_PE_NOEARLY_OUT 7
#define BBR_CALC_BW 1
#define BBR_CALC_LOSS 2
#define BBR_RTT_BY_TIMESTAMP 0
#define BBR_RTT_BY_EXACTMATCH 1
#define BBR_RTT_BY_EARLIER_RET 2
#define BBR_RTT_BY_THIS_RETRAN 3
#define BBR_RTT_BY_SOME_RETRAN 4
#define BBR_RTT_BY_TSMATCHING 5
#define BBR_PERSISTS_FROM_1 1
#define BBR_PERSISTS_FROM_2 2
#define BBR_PERSISTS_FROM_3 3
#define BBR_PERSISTS_FROM_4 4
#define BBR_PERSISTS_FROM_5 5
#define BBR_RTT_PROP 0
#define BBR_RTT_RACK 1
#define BBR_RTT_PKTRTT 2
#define BBR_SRTT 3
#define BBR_SACKED 0
#define BBR_CUM_ACKED 1
#define BBR_HIGH_SPEED 1000
#define BBR_HIGHSPEED_NUM_MSS 12
#define MAX_REDUCE_RXT 3
#define BBR_RS_RTT_EMPTY 0x00000001
#define BBR_RS_BW_EMPTY 0x00000002
#define BBR_RS_RTT_VALID 0x00000004
#define BBR_RS_BW_VAILD 0x00000008
#define BBR_RS_EMPTY (BBR_RS_RTT_EMPTY|BBR_RS_BW_EMPTY)
struct bbr_rtt_sample {
uint32_t rs_flags;
uint32_t rs_rtt_lowest;
uint32_t rs_rtt_lowest_sendtime;
uint32_t rs_rtt_low_seq_start;
uint32_t rs_rtt_highest;
uint32_t rs_rtt_cnt;
uint64_t rs_rtt_tot;
uint32_t cur_rtt;
uint32_t cur_rtt_bytecnt;
uint32_t cur_rtt_rsmcnt;
uint32_t rc_crtt_set:1,
avail_bits:31;
uint64_t rs_cDR;
};
#define BBR_RTTS_INIT 0
#define BBR_RTTS_NEWRTT 1
#define BBR_RTTS_RTTPROBE 2
#define BBR_RTTS_WASIDLE 3
#define BBR_RTTS_PERSIST 4
#define BBR_RTTS_REACHTAR 5
#define BBR_RTTS_ENTERPROBE 6
#define BBR_RTTS_SHRINK_PG 7
#define BBR_RTTS_SHRINK_PG_FINAL 8
#define BBR_RTTS_NEW_TARGET 9
#define BBR_RTTS_LEAVE_DRAIN 10
#define BBR_RTTS_RESETS_VALUES 11
#define BBR_NUM_RATES 5
#define BBR_RT_FLAG_FREE 0x00
#define BBR_RT_FLAG_INUSE 0x01
#define BBR_RT_FLAG_READY 0x02
#define BBR_RT_FLAG_CAPPED_PRE 0x04
#define BBR_RT_FLAG_CAPPED 0x08
#define BBR_RT_FLAG_PASTFA 0x10
#define BBR_RT_FLAG_LIMITED 0x20
#define BBR_RT_SEEN_A_ACK 0x40
#define BBR_RT_PREV_RTT_SET 0x80
#define BBR_RT_PREV_SEND_TIME 0x100
#define BBR_RT_SET_GRADIENT 0x200
#define BBR_RT_TS_VALID 0x400
struct bbr_log {
union {
struct bbr_sendmap *rsm;
uint64_t sb_acc;
};
struct tcpcb *tp;
uint32_t t_flags;
uint32_t th_seq;
uint32_t th_ack;
uint32_t snd_una;
uint32_t snd_nxt;
uint32_t snd_max;
uint32_t snd_cwnd;
uint32_t snd_wnd;
uint32_t rc_lost;
uint32_t target_cwnd;
uint32_t inflight;
uint32_t applimited;
uint32_t delivered;
uint64_t cur_del_rate;
uint64_t delRate;
uint64_t rttProp;
uint64_t lt_bw;
uint32_t timeStamp;
uint32_t time;
uint32_t slot;
uint32_t delayed_by;
uint32_t exp_del;
uint32_t pkts_out;
uint32_t new_win;
uint32_t hptsi_gain;
uint32_t cwnd_gain;
uint32_t epoch;
uint32_t lt_epoch;
uint32_t blk_start[4];
uint32_t blk_end[4];
uint32_t len;
uint8_t type;
uint8_t n_sackblks;
uint8_t applied;
uint8_t inhpts;
uint8_t __spare;
uint8_t use_lt_bw;
};
struct bbr_log_sysctl_out {
uint32_t bbr_log_at;
uint32_t bbr_log_max;
struct bbr_log entries[0];
};
#define BBR_TO_FRM_TMR 1
#define BBR_TO_FRM_TLP 2
#define BBR_TO_FRM_RACK 3
#define BBR_TO_FRM_KEEP 4
#define BBR_TO_FRM_PERSIST 5
#define BBR_TO_FRM_DELACK 6
#define BBR_SEES_STRETCH_ACK 1
#define BBR_SEES_COMPRESSED_ACKS 2
#define TT_BBR_FR_TMR 0x2001
#define BBR_SCALE 8
#define BBR_UNIT (1 << BBR_SCALE)
#define BBR_NUM_RTTS_FOR_DEL_LIMIT 8
#define BBR_NUM_RTTS_FOR_GOOG_DEL_LIMIT 10
#define BBR_SECONDS_NO_RTT 10
#define BBR_PROBERTT_MAX 200
#define BBR_PROBERTT_NUM_MSS 4
#define BBR_STARTUP_EPOCHS 3
#define USECS_IN_MSEC 1000
#define BBR_TIME_TO_SECONDS(a) (a / USECS_IN_SECOND)
#define BBR_TIME_TO_MILLI(a) (a / MS_IN_USEC)
#define BBR_TS_TO_MS(t) ((t+999)/MS_IN_USEC)
#define BBR_STATE_STARTUP 0x01
#define BBR_STATE_DRAIN 0x02
#define BBR_STATE_PROBE_BW 0x03
#define BBR_STATE_PROBE_RTT 0x04
#define BBR_STATE_IDLE_EXIT 0x05
#define BBR_SUB_GAIN 0
#define BBR_SUB_DRAIN 1
#define BBR_SUB_LEVEL1 2
#define BBR_SUB_LEVEL2 3
#define BBR_SUB_LEVEL3 4
#define BBR_SUB_LEVEL4 5
#define BBR_SUB_LEVEL5 6
#define BBR_SUB_LEVEL6 7
#define BBR_SUBSTATE_COUNT 8
#define BBR_REDUCE_AT_FR 5
#define BBR_BIG_LOG_SIZE 300000
struct bbr_stats {
uint64_t bbr_badfr;
uint64_t bbr_badfr_bytes;
uint64_t bbr_saw_oerr;
uint64_t bbr_saw_emsgsiz;
uint64_t bbr_reorder_seen;
uint64_t bbr_tlp_tot;
uint64_t bbr_tlp_newdata;
uint64_t bbr_offset_recovery;
uint64_t bbr_tlp_retran_fail;
uint64_t bbr_to_tot;
uint64_t bbr_to_arm_rack;
uint64_t bbr_enter_probertt;
uint64_t bbr_tlp_set;
uint64_t bbr_resends_set;
uint64_t bbr_force_output;
uint64_t bbr_to_arm_tlp;
uint64_t bbr_paced_segments;
uint64_t bbr_saw_enobuf;
uint64_t bbr_to_alloc_failed;
uint64_t bbr_to_alloc_emerg;
uint64_t bbr_sack_proc_all;
uint64_t bbr_sack_proc_short;
uint64_t bbr_sack_proc_restart;
uint64_t bbr_to_alloc;
uint64_t bbr_offset_drop;
uint64_t bbr_runt_sacks;
uint64_t bbr_sack_passed;
uint64_t bbr_rlock_left_ret0;
uint64_t bbr_rlock_left_ret1;
uint64_t bbr_dynamic_rwnd;
uint64_t bbr_static_rwnd;
uint64_t bbr_sack_blocks;
uint64_t bbr_sack_blocks_skip;
uint64_t bbr_sack_search_both;
uint64_t bbr_sack_search_fwd;
uint64_t bbr_sack_search_back;
uint64_t bbr_plain_acks;
uint64_t bbr_acks_with_sacks;
uint64_t bbr_progress_drops;
uint64_t bbr_early;
uint64_t bbr_reneges_seen;
uint64_t bbr_persist_reneg;
uint64_t bbr_dropped_af_data;
uint64_t bbr_failed_mbuf_aloc;
uint64_t bbr_cwnd_limited;
uint64_t bbr_rwnd_limited;
uint64_t bbr_app_limited;
uint64_t bbr_force_timer_start;
uint64_t bbr_hpts_min_time;
uint64_t bbr_meets_tso_thresh;
uint64_t bbr_miss_tso_rwnd;
uint64_t bbr_miss_tso_cwnd;
uint64_t bbr_miss_tso_app;
uint64_t bbr_miss_retran;
uint64_t bbr_miss_tlp;
uint64_t bbr_miss_unknown;
uint64_t bbr_hdwr_rl_add_ok;
uint64_t bbr_hdwr_rl_add_fail;
uint64_t bbr_hdwr_rl_mod_ok;
uint64_t bbr_hdwr_rl_mod_fail;
uint64_t bbr_collapsed_win;
uint64_t bbr_alloc_limited;
uint64_t bbr_alloc_limited_conns;
uint64_t bbr_split_limited;
};
struct bbr_opts_stats {
uint64_t tcp_bbr_pace_per_sec;
uint64_t tcp_bbr_pace_del_tar;
uint64_t tcp_bbr_pace_seg_max;
uint64_t tcp_bbr_pace_seg_min;
uint64_t tcp_bbr_pace_cross;
uint64_t tcp_bbr_drain_inc_extra;
uint64_t tcp_bbr_unlimited;
uint64_t tcp_bbr_iwintso;
uint64_t tcp_bbr_rec_over_hpts;
uint64_t tcp_bbr_recforce;
uint64_t tcp_bbr_startup_pg;
uint64_t tcp_bbr_drain_pg;
uint64_t tcp_bbr_rwnd_is_app;
uint64_t tcp_bbr_probe_rtt_int;
uint64_t tcp_bbr_one_retran;
uint64_t tcp_bbr_startup_loss_exit;
uint64_t tcp_bbr_use_lowgain;
uint64_t tcp_bbr_lowgain_thresh;
uint64_t tcp_bbr_lowgain_half;
uint64_t tcp_bbr_lowgain_fd;
uint64_t tcp_bbr_usedel_rate;
uint64_t tcp_bbr_min_rto;
uint64_t tcp_bbr_max_rto;
uint64_t tcp_rack_pace_max_seg;
uint64_t tcp_rack_min_to;
uint64_t tcp_rack_reord_thresh;
uint64_t tcp_rack_reord_fade;
uint64_t tcp_rack_tlp_thresh;
uint64_t tcp_rack_pkt_delay;
uint64_t tcp_bbr_startup_exit_epoch;
uint64_t tcp_bbr_ack_comp_alg;
uint64_t tcp_rack_cheat;
uint64_t tcp_iwnd_tso;
uint64_t tcp_utter_max_tso;
uint64_t tcp_hdwr_pacing;
uint64_t tcp_extra_state;
uint64_t tcp_floor_min_tso;
uint64_t tcp_bbr_algorithm;
uint64_t tcp_bbr_tslimits;
uint64_t tcp_bbr_probertt_len;
uint64_t tcp_bbr_probertt_gain;
uint64_t tcp_bbr_topaceout;
uint64_t tcp_use_rackcheat;
uint64_t tcp_delack;
uint64_t tcp_maxpeak;
uint64_t tcp_retran_wtso;
uint64_t tcp_data_ac;
uint64_t tcp_ts_raises;
uint64_t tcp_pacing_oh_tmr;
uint64_t tcp_pacing_oh;
uint64_t tcp_policer_det;
};
#ifdef _KERNEL
#define BBR_STAT_SIZE (sizeof(struct bbr_stats)/sizeof(uint64_t))
extern counter_u64_t bbr_stat_arry[BBR_STAT_SIZE];
#define BBR_STAT_ADD(name, amm) counter_u64_add(bbr_stat_arry[(offsetof(struct bbr_stats, name)/sizeof(uint64_t))], (amm))
#define BBR_STAT_INC(name) BBR_STAT_ADD(name, 1)
#define BBR_OPTS_SIZE (sizeof(struct bbr_stats)/sizeof(uint64_t))
extern counter_u64_t bbr_opts_arry[BBR_OPTS_SIZE];
#define BBR_OPTS_ADD(name, amm) counter_u64_add(bbr_opts_arry[(offsetof(struct bbr_opts_stats, name)/sizeof(uint64_t))], (amm))
#define BBR_OPTS_INC(name) BBR_OPTS_ADD(name, 1)
#endif
#define BBR_NUM_LOSS_RATES 3
#define BBR_NUM_BW_RATES 3
#define BBR_RECOVERY_LOWRTT 1
#define BBR_RECOVERY_MEDRTT 2
#define BBR_RECOVERY_HIGHRTT 3
#define BBR_RECOVERY_EXTREMERTT 4
struct bbr_control {
struct bbr_head rc_map;
struct bbr_head rc_tmap;
struct bbr_sendmap *rc_resend;
uint32_t rc_last_delay_val;
uint32_t rc_bbr_hptsi_gain:16,
rc_hpts_flags:16;
uint32_t rc_delivered;
uint32_t rc_hptsi_agg_delay;
uint32_t rc_flight_at_input;
uint32_t rc_lost_bytes;
struct time_filter rc_delrate;
struct bbr_head rc_free;
struct bbr_sendmap *rc_tlp_send;
uint32_t rc_del_time;
uint32_t rc_target_at_state;
uint16_t rc_free_cnt;
uint16_t rc_startup_pg;
uint32_t cur_rtt;
uint32_t rc_went_idle_time;
uint32_t rc_pace_max_segs:17,
rc_pace_min_segs:15;
uint32_t rc_rtt_shrinks;
uint32_t r_app_limited_until;
uint32_t rc_timer_exp;
uint32_t rc_rcv_epoch_start;
uint32_t rc_lost_at_pktepoch;
uint32_t r_measurement_count;
uint32_t rc_last_tlp_seq;
uint16_t rc_reorder_shift;
uint16_t rc_pkt_delay;
struct bbr_sendmap *rc_sacklast;
struct bbr_sendmap *rc_next;
uint32_t rc_sacked;
uint32_t rc_holes_rxt;
uint32_t rc_reorder_ts;
uint32_t rc_init_rwnd;
uint32_t rc_high_rwnd;
uint32_t rc_lowest_rtt;
uint32_t rc_last_rtt;
uint32_t bbr_cross_over;
struct sack_filter bbr_sf;
struct time_filter_small rc_rttprop;
uint32_t last_inbound_ts;
uint32_t rc_inc_tcp_oh: 1,
rc_inc_ip_oh: 1,
rc_inc_enet_oh:1,
rc_incr_tmrs:1,
restrict_growth:28;
uint32_t rc_lt_epoch_use;
uint32_t rc_recovery_start;
uint32_t rc_lt_del;
uint64_t rc_bbr_cur_del_rate;
uint32_t rc_cwnd_on_ent;
uint32_t rc_agg_early;
uint32_t rc_rcvtime;
uint32_t rc_pkt_epoch_del;
uint32_t rc_pkt_epoch;
uint32_t rc_pkt_epoch_time;
uint32_t rc_pkt_epoch_rtt;
uint32_t rc_rtt_epoch;
uint32_t lowest_rtt;
uint32_t bbr_smallest_srtt_this_state;
uint32_t rc_lt_epoch;
uint32_t rc_lost_at_startup;
uint32_t rc_bbr_state_atflight;
uint32_t rc_bbr_last_startup_epoch;
uint32_t rc_bbr_enters_probertt;
uint32_t rc_lt_time;
uint64_t rc_lt_bw;
uint64_t rc_bbr_lastbtlbw;
uint32_t rc_bbr_cwnd_gain;
uint32_t rc_pkt_epoch_loss_rate;
uint32_t rc_saved_cwnd;
uint32_t substate_pe;
uint32_t rc_lost;
uint32_t rc_exta_time_gd;
uint32_t rc_lt_lost;
uint32_t rc_bbr_state_time;
uint32_t rc_min_to;
uint32_t rc_initial_hptsi_bw;
uint32_t bbr_lost_at_state;
uint32_t rc_level_state_extra;
uint32_t rc_red_cwnd_pe;
const struct tcp_hwrate_limit_table *crte;
uint64_t red_bw;
uint32_t rc_probertt_int;
uint32_t rc_probertt_srttchktim;
uint32_t gain_epoch;
uint32_t rc_min_rto_ms;
uint32_t rc_reorder_fade;
uint32_t last_startup_measure;
int32_t bbr_hptsi_per_second;
int32_t bbr_hptsi_segments_delay_tar;
int32_t bbr_hptsi_segments_max;
uint32_t bbr_rttprobe_gain_val;
uint32_t cur_rtt_send_time;
uint32_t bbr_peer_tsratio;
uint32_t bbr_ts_check_tstmp;
uint32_t bbr_ts_check_our_cts;
uint32_t rc_tlp_rxt_last_time;
uint32_t bbr_smallest_srtt_state2;
uint32_t bbr_hdwr_cnt_noset_snt;
uint32_t startup_last_srtt;
uint32_t rc_ack_hdwr_delay;
uint32_t highest_hdwr_delay;
uint32_t non_gain_extra;
uint32_t recovery_lr;
uint32_t last_in_probertt;
uint32_t flightsize_at_drain;
uint32_t rc_pe_of_prtt;
uint32_t ts_in;
uint16_t rc_tlp_seg_send_cnt;
uint16_t rc_drain_pg;
uint32_t rc_num_maps_alloced;
uint32_t rc_num_split_allocs;
uint16_t rc_num_small_maps_alloced;
uint16_t bbr_hptsi_bytes_min;
uint16_t bbr_hptsi_segments_floor;
uint16_t bbr_utter_max;
uint16_t bbr_google_discount;
};
struct socket;
struct tcp_bbr {
int32_t(*r_substate) (struct mbuf *, struct tcphdr *,
struct socket *, struct tcpcb *, struct tcpopt *,
int32_t, int32_t, uint32_t, int32_t, int32_t, uint8_t);
struct tcpcb *rc_tp;
struct inpcb *rc_inp;
struct timeval rc_tv;
uint32_t rc_pacer_started;
uint16_t no_pacing_until:8,
ts_can_raise:1,
skip_gain:1,
gain_is_limited:1,
output_error_seen:1,
oerror_cnt:4,
hw_pacing_set:1;
uint16_t xxx_r_ack_count;
uint16_t bbr_segs_rcvd;
uint8_t bbr_timer_src:4,
bbr_use_rack_cheat:1,
bbr_init_win_cheat:1,
bbr_attempt_hdwr_pace:1,
bbr_hdrw_pacing:1;
uint8_t bbr_hdw_pace_ena:1,
bbr_prev_in_rec:1,
pkt_conservation:1,
use_policer_detection:1,
xxx_bbr_hdw_pace_idx:4;
uint16_t r_wanted_output:1,
rtt_valid:1,
rc_timer_first:1,
rc_output_starts_timer:1,
rc_resends_use_tso:1,
rc_all_timers_stopped:1,
rc_loss_exit:1,
rc_ack_was_delayed:1,
rc_lt_is_sampling:1,
rc_filled_pipe:1,
rc_tlp_new_data:1,
rc_hit_state_1:1,
rc_ts_valid:1,
rc_prtt_set_ts:1,
rc_is_pkt_epoch_now:1,
rc_has_collapsed:1;
uint8_t r_state:4,
r_agg_early_set:1,
r_init_rtt:1,
r_use_policer:1,
r_recovery_bw:1;
uint8_t r_timer_override:1,
rc_in_persist:1,
rc_lt_use_bw:1,
rc_allow_data_af_clo:1,
rc_tlp_rtx_out:1,
rc_tlp_in_progress:1,
rc_use_idle_restart:1;
uint8_t rc_bbr_state:3,
rc_bbr_substate:3,
r_is_v6:1,
rc_past_init_win:1;
uint8_t rc_last_options;
uint8_t rc_tlp_threshold;
uint8_t rc_max_rto_sec;
uint8_t rc_cwnd_limited:1,
rc_tmr_stopped:7;
uint8_t rc_use_google:1,
rc_use_ts_limit:1,
rc_ts_data_set:1,
rc_ts_clock_set:1,
rc_ts_cant_be_used:1,
rc_ack_is_cumack:1,
rc_no_pacing:1,
alloc_limit_reported:1;
uint8_t rc_init_win;
struct bbr_control r_ctl;
#ifdef _KERNEL
} __aligned(CACHE_LINE_SIZE);
#else
};
#endif
#endif