14#include "ns3/simulator.h"
30 .AddConstructor<TcpBbr>()
31 .SetGroupName(
"Internet")
32 .AddAttribute(
"Stream",
33 "Random number stream (default is set to 4 to align with Linux results)",
37 .AddAttribute(
"HighGain",
42 .AddAttribute(
"BwWindowLength",
43 "Length of bandwidth windowed filter",
47 .AddAttribute(
"RttWindowLength",
48 "Length of RTT windowed filter",
52 .AddAttribute(
"ProbeRttDuration",
53 "Time to be spent in PROBE_RTT phase",
57 .AddAttribute(
"ExtraAckedRttWindowLength",
58 "Window length of extra acked window",
63 "AckEpochAckedResetThresh",
64 "Max allowed val for m_ackEpochAcked, after which sampling epoch is reset",
68 .AddTraceSource(
"MinRtt",
69 "Estimated two-way round-trip propagation delay of the path, estimated "
70 "from the windowed minimum recent round-trip delay sample",
72 "ns3::TracedValueCallback::Time")
73 .AddTraceSource(
"PacingGain",
74 "The dynamic pacing gain factor",
76 "ns3::TracedValueCallback::Double")
77 .AddTraceSource(
"CwndGain",
78 "The dynamic congestion window gain factor",
80 "ns3::TracedValueCallback::Double");
93 m_bandwidthWindowLength(sock.m_bandwidthWindowLength),
94 m_pacingGain(sock.m_pacingGain),
95 m_cWndGain(sock.m_cWndGain),
96 m_highGain(sock.m_highGain),
97 m_isPipeFilled(sock.m_isPipeFilled),
98 m_minPipeCwnd(sock.m_minPipeCwnd),
99 m_roundCount(sock.m_roundCount),
100 m_roundStart(sock.m_roundStart),
101 m_nextRoundDelivered(sock.m_nextRoundDelivered),
102 m_probeRttDuration(sock.m_probeRttDuration),
103 m_probeRtPropStamp(sock.m_probeRtPropStamp),
104 m_probeRttDoneStamp(sock.m_probeRttDoneStamp),
105 m_probeRttRoundDone(sock.m_probeRttRoundDone),
106 m_packetConservation(sock.m_packetConservation),
107 m_priorCwnd(sock.m_priorCwnd),
108 m_idleRestart(sock.m_idleRestart),
109 m_targetCWnd(sock.m_targetCWnd),
110 m_fullBandwidth(sock.m_fullBandwidth),
111 m_fullBandwidthCount(sock.m_fullBandwidthCount),
113 m_sendQuantum(sock.m_sendQuantum),
114 m_cycleStamp(sock.m_cycleStamp),
115 m_cycleIndex(sock.m_cycleIndex),
116 m_minRttExpired(sock.m_minRttExpired),
117 m_minRttFilterLen(sock.m_minRttFilterLen),
118 m_minRttStamp(sock.m_minRttStamp),
119 m_isInitialized(sock.m_isInitialized),
121 m_delivered(sock.m_delivered),
122 m_appLimited(sock.m_appLimited),
123 m_extraAckedGain(sock.m_extraAckedGain),
124 m_extraAckedWinRtt(sock.m_extraAckedWinRtt),
125 m_extraAckedWinRttLength(sock.m_extraAckedWinRttLength),
126 m_ackEpochAckedResetThresh(sock.m_ackEpochAckedResetThresh),
127 m_extraAckedIdx(sock.m_extraAckedIdx),
128 m_ackEpochTime(sock.m_ackEpochTime),
129 m_ackEpochAcked(sock.m_ackEpochAcked),
130 m_hasSeenRtt(sock.m_hasSeenRtt)
146 m_uv->SetStream(stream);
175 tcb->m_pacing =
true;
181 rtt =
MilliSeconds(std::max<long int>(tcb->m_minRtt.GetMilliSeconds(), 1));
225 rate = std::min(rate, tcb->m_maxPacingRate);
234 tcb->m_pacingRate = rate;
235 NS_LOG_DEBUG(
"Pacing rate updated. New value: " << tcb->m_pacingRate);
245 return tcb->m_initialCWnd * tcb->m_segmentSize;
252 return (gain * estimatedBdp) + quanta + (2 * tcb->m_segmentSize);
254 return (gain * estimatedBdp) + quanta;
277 return isFullLength &&
396 tcb->m_cWnd = std::max(
m_priorCwnd, tcb->m_cWnd.Get());
489 aggrCwndBytes = std::min(aggrCwndBytes, maxAggrBytes);
491 return aggrCwndBytes;
531 extraAck = std::min(extraAck, tcb->m_cWnd.Get());
546 std::max((
int)tcb->m_cWnd.Get() - (
int)rs.
m_bytesLoss, (
int)tcb->m_segmentSize);
551 tcb->m_cWnd = std::max(tcb->m_cWnd.Get(), tcb->m_bytesInFlight.Get() + rs.
m_ackedSacked);
596 NS_LOG_DEBUG(
"Congestion window updated. New value:" << tcb->m_cWnd);
719 NS_LOG_DEBUG(
"CongestionStateSet triggered to CA_OPEN :: " << newState);
723 tcb->m_ssThresh = tcb->m_initialSsThresh;
742 NS_LOG_DEBUG(
"CongestionStateSet triggered to CA_LOSS :: " << newState);
748 NS_LOG_DEBUG(
"CongestionStateSet triggered to CA_RECOVERY :: " << newState);
751 tcb->m_bytesInFlight.Get() + std::max(tcb->m_lastAckedSackedBytes, tcb->m_segmentSize);
762 NS_LOG_DEBUG(
"CwndEvent triggered to CA_EVENT_COMPLETE_CWR :: " << event);
768 NS_LOG_DEBUG(
"CwndEvent triggered to CA_EVENT_TX_START :: " << event);
793 return tcb->m_ssThresh;
Class for representing data rates.
uint64_t GetBitRate() const
Get the underlying bitrate.
This class can be used to hold variables of floating point type such as 'double' or 'float'.
friend Ptr< T > CopyObject(Ptr< T > object)
Copy an Object.
Smart pointer class similar to boost::intrusive_ptr.
static Time Now()
Return the current simulation virtual time.
BBR congestion control algorithm.
MaxBandwidthFilter_t m_maxBwFilter
Maximum bandwidth filter.
bool m_hasSeenRtt
Have we seen RTT sample yet?
Time m_minRttFilterLen
A constant specifying the length of the RTProp min filter window, default 10 secs.
void ModulateCwndForProbeRTT(Ptr< TcpSocketState > tcb)
Modulates congestion window in BBR_PROBE_RTT.
uint32_t m_nextRoundDelivered
Denotes the end of a packet-timed round trip.
BbrMode_t
BBR has the following 4 modes for deciding how fast to send:
@ BBR_PROBE_RTT
Cut inflight to min to probe min_rtt.
@ BBR_DRAIN
Drain any queue created during startup.
@ BBR_STARTUP
Ramp up sending rate rapidly to fill pipe.
@ BBR_PROBE_BW
Discover, share bw: pace around estimated bw.
uint32_t m_roundCount
Count of packet-timed round trips.
uint32_t m_priorCwnd
The last-known good congestion window.
uint32_t m_extraAckedWinRttLength
Window length of extra acked window.
bool m_minRttExpired
A boolean recording whether the BBR.RTprop has expired.
virtual void SetStream(uint32_t stream)
Assign a fixed random variable stream number to the random variables used by this model.
uint32_t m_extraAckedIdx
Current index in extra acked array.
std::string GetName() const override
Get the name of the congestion control algorithm.
void CongControl(Ptr< TcpSocketState > tcb, const TcpRateOps::TcpRateConnection &rc, const TcpRateOps::TcpRateSample &rs) override
Called when packets are delivered to update cwnd and pacing rate.
void CwndEvent(Ptr< TcpSocketState > tcb, const TcpSocketState::TcpCAEvent_t event) override
Trigger events/calculations on occurrence of congestion window event.
uint32_t GetSsThresh(Ptr< const TcpSocketState > tcb, uint32_t bytesInFlight) override
Get the slow start threshold after a loss event.
uint32_t m_bandwidthWindowLength
A constant specifying the length of the BBR.BtlBw max filter window, default 10 packet-timed round tr...
double m_highGain
A constant specifying highest gain factor, default is 2.89.
Time m_probeRttDuration
A constant specifying the minimum duration for which ProbeRTT state, default 200 millisecs.
void CheckCyclePhase(Ptr< TcpSocketState > tcb, const TcpRateOps::TcpRateSample &rs)
Checks whether to advance pacing gain in BBR_PROBE_BW state, and if allowed calls AdvanceCyclePhase (...
uint32_t AckAggregationCwnd()
Find Cwnd increment based on ack aggregation.
bool m_idleRestart
When restarting from idle, set it true.
Ptr< UniformRandomVariable > m_uv
Uniform Random Variable.
static TypeId GetTypeId()
Get the type ID.
uint32_t m_minPipeCwnd
The minimal congestion window value BBR tries to target, default 4 Segment size.
Ptr< TcpCongestionOps > Fork() override
Copy the congestion control algorithm across sockets.
uint32_t GetBbrState()
Gets BBR state.
bool HasCongControl() const override
Returns true when Congestion Control Algorithm implements CongControl.
TracedValue< double > m_cWndGain
The dynamic congestion window gain factor.
double GetCwndGain()
Gets current cwnd gain.
void UpdateRound(Ptr< TcpSocketState > tcb, const TcpRateOps::TcpRateSample &rs)
Updates round counting related variables.
BbrMode_t m_state
Current state of BBR state machine.
bool m_roundStart
A boolean that BBR sets to true once per packet-timed round trip.
void AdvanceCyclePhase()
Advances pacing gain using cycle gain algorithm, while in BBR_PROBE_BW state.
double m_pacingMargin
BBR intentionally reduces the pacing rate by 1% to drain any standing queues.
void EnterProbeBW()
Updates variables specific to BBR_PROBE_BW state.
double GetPacingGain()
Gets current pacing gain.
uint64_t m_delivered
The total amount of data in bytes delivered so far.
void InitPacingRate(Ptr< TcpSocketState > tcb)
Initializes the pacing rate.
bool IsNextCyclePhase(Ptr< TcpSocketState > tcb, const TcpRateOps::TcpRateSample &rs)
Checks whether to move to next value of pacing gain while in BBR_PROBE_BW.
bool m_isInitialized
Set to true after first time initialization variables.
void RestoreCwnd(Ptr< TcpSocketState > tcb)
Helper to restore the last-known good congestion window.
bool ModulateCwndForRecovery(Ptr< TcpSocketState > tcb, const TcpRateOps::TcpRateSample &rs)
Modulates congestion window in CA_RECOVERY.
static const char *const BbrModeName[BBR_PROBE_RTT+1]
Literal names of BBR mode for use in log messages.
void UpdateRTprop(Ptr< TcpSocketState > tcb)
Updates minimum RTT.
void CheckDrain(Ptr< TcpSocketState > tcb)
Checks whether its time to enter BBR_DRAIN or BBR_PROBE_BW state.
void SetBbrState(BbrMode_t state)
Sets BBR state.
void UpdateBottleneckBandwidth(Ptr< TcpSocketState > tcb, const TcpRateOps::TcpRateSample &rs)
Updates maximum bottleneck.
void HandleRestartFromIdle(Ptr< TcpSocketState > tcb, const TcpRateOps::TcpRateSample &rs)
Updates pacing rate if socket is restarting from idle state.
static const double PACING_GAIN_CYCLE[]
BBR uses an eight-phase cycle with the given pacing_gain value in the BBR ProbeBW gain cycle.
WindowedFilter< DataRate, MaxFilter< DataRate >, uint32_t, uint32_t > MaxBandwidthFilter_t
Definition of max bandwidth filter.
bool m_isPipeFilled
A boolean that records whether BBR has filled the pipe.
void EnterStartup()
Updates variables specific to BBR_STARTUP state.
void InitRoundCounting()
Initializes the round counting related variables.
void InitFullPipe()
Initializes the full pipe estimator.
void UpdateAckAggregation(Ptr< TcpSocketState > tcb, const TcpRateOps::TcpRateSample &rs)
Estimates max degree of aggregation.
bool m_packetConservation
Enable/Disable packet conservation mode.
uint32_t InFlight(Ptr< TcpSocketState > tcb, double gain)
Estimates the target value for congestion window.
uint32_t m_extraAckedWinRtt
Age of extra acked in rtt.
void SetPacingRate(Ptr< TcpSocketState > tcb, double gain)
Updates pacing rate based on network model.
void SaveCwnd(Ptr< const TcpSocketState > tcb)
Helper to remember the last-known good congestion window or the latest congestion window unmodulated ...
void EnterDrain()
Updates variables specific to BBR_DRAIN state.
void CongestionStateSet(Ptr< TcpSocketState > tcb, const TcpSocketState::TcpCongState_t newState) override
Trigger events/calculations specific to a congestion state.
Time m_probeRttDoneStamp
Time to exit from BBR_PROBE_RTT state.
uint32_t m_extraAcked[2]
Maximum excess data acked in epoch.
uint32_t m_appLimited
The index of the last transmitted packet marked as application-limited.
void UpdateModelAndState(Ptr< TcpSocketState > tcb, const TcpRateOps::TcpRateSample &rs)
Updates BBR network model (Maximum bandwidth and minimum RTT).
Time m_minRttStamp
The wall clock time at which the current BBR.RTProp sample was obtained.
void UpdateControlParameters(Ptr< TcpSocketState > tcb, const TcpRateOps::TcpRateSample &rs)
Updates control parameters congestion windowm, pacing rate, send quantum.
Time m_ackEpochTime
Starting of ACK sampling epoch time.
Time m_cycleStamp
Last time gain cycle updated.
void CheckFullPipe(const TcpRateOps::TcpRateSample &rs)
Identifies whether pipe or BDP is already full.
TracedValue< Time > m_minRtt
Estimated two-way round-trip propagation delay of the path, estimated from the windowed minimum recen...
void EnterProbeRTT()
Updates variables specific to BBR_PROBE_RTT state.
DataRate m_fullBandwidth
Value of full bandwidth recorded.
void HandleProbeRTT(Ptr< TcpSocketState > tcb)
Handles the steps for BBR_PROBE_RTT state.
uint32_t m_targetCWnd
Target value for congestion window, adapted to the estimated BDP.
uint32_t m_sendQuantum
The maximum size of a data aggregate scheduled and transmitted together.
void SetSendQuantum(Ptr< TcpSocketState > tcb)
Updates send quantum based on the network model.
uint32_t m_ackEpochAckedResetThresh
Max allowed val for m_ackEpochAcked, after which sampling epoch is reset.
void ExitProbeRTT()
Called on exiting from BBR_PROBE_RTT state, it eithers invoke EnterProbeBW () or EnterStartup ()
bool m_probeRttRoundDone
True when it is time to exit BBR_PROBE_RTT.
uint32_t m_fullBandwidthCount
Count of full bandwidth recorded consistently.
void UpdateTargetCwnd(Ptr< TcpSocketState > tcb)
Updates target congestion window.
uint32_t m_cycleIndex
Current index of gain cycle.
uint32_t m_extraAckedGain
Gain factor for adding extra ack to cwnd.
void CheckProbeRTT(Ptr< TcpSocketState > tcb, const TcpRateOps::TcpRateSample &rs)
This method handles the steps related to the ProbeRTT state.
static const uint8_t GAIN_CYCLE_LENGTH
The number of phases in the BBR ProbeBW gain cycle.
void SetCwnd(Ptr< TcpSocketState > tcb, const TcpRateOps::TcpRateSample &rs)
Updates congestion window based on the network model.
TracedValue< double > m_pacingGain
The dynamic pacing gain factor.
uint32_t m_ackEpochAcked
Bytes ACked in sampling epoch.
Congestion control abstract class.
TcpCAEvent_t
Congestion avoidance events.
@ CA_EVENT_COMPLETE_CWR
end of congestion recovery
@ CA_EVENT_TX_START
first transmit when no packets in flight
TcpCongState_t
Definition of the Congestion state machine.
@ CA_RECOVERY
CWND was reduced, we are fast-retransmitting.
@ CA_LOSS
CWND was reduced due to RTO timeout or SACK reneging.
@ CA_OPEN
Normal state, no dubious events.
Simulation virtual time values and global simulation resolution.
double GetSeconds() const
Get an approximation of the time stored in this instance in the indicated unit.
static Time Max()
Maximum representable Time Not to be confused with Max(Time,Time).
bool IsZero() const
Exactly equivalent to t == 0.
a unique identifier for an interface.
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Hold an unsigned integer type.
void Update(T new_sample, TimeT new_time)
Updates best estimates with |sample|, and expires and updates best estimates as necessary.
T GetBest() const
Returns Max/Min value so far among the windowed samples.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_LOG_WARN(msg)
Use NS_LOG to output a message of level LOG_WARN.
Ptr< T > CreateObject(Args &&... args)
Create an object by type, with varying number of constructor parameters.
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Time Seconds(double value)
Construct a Time in the indicated unit.
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit.
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
Create a TraceSourceAccessor which will control access to the underlying trace source.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Ptr< const AttributeChecker > MakeUintegerChecker()
Ptr< const AttributeAccessor > MakeTimeAccessor(T1 a1)
Ptr< const AttributeAccessor > MakeUintegerAccessor(T1 a1)
Ptr< const AttributeChecker > MakeDoubleChecker()
Ptr< const AttributeAccessor > MakeDoubleAccessor(T1 a1)
Ptr< const AttributeChecker > MakeTimeChecker()
Helper to make an unbounded Time checker.
Information about the connection rate.
bool m_isAppLimited
Indicates whether the rate sample is application-limited.
uint32_t m_ackedSacked
The amount of data acked and sacked in the last received ack.
DataRate m_deliveryRate
The delivery rate sample.
uint32_t m_priorInFlight
The value if bytes in flight prior to last received ack.
Time m_interval
The length of the sampling interval.
uint32_t m_priorDelivered
The delivered count of the most recent packet delivered.
int32_t m_delivered
The amount of data marked as delivered over the sampling interval.
uint32_t m_bytesLoss
The amount of data marked as lost from the most recent ack received.