blob: 829aa29938adb87739e2da1dd3fa21f95bdd9d8b [file] [log] [blame]
// Copyright (c) 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// State machine for congestion control. The state is updated by calls from
// other modules as they detect events, or decide on taking specific actions.
// Events include things like packet loss, or growing delay, while decisions
// include decisions to increase or decrease bitrates.
// This class should be called for every event and decision made by the
// congestion control, this class will coalesce all calls relative to the
// smoothed RTT.
#ifndef NET_QUIC_CONGESTION_CONTROL_INTER_ARRIVAL_STATE_MACHINE_H_
#define NET_QUIC_CONGESTION_CONTROL_INTER_ARRIVAL_STATE_MACHINE_H_
#include "net/base/net_export.h"
#include "net/quic/quic_clock.h"
#include "net/quic/quic_time.h"
namespace net {
// State transition diagram.
//
// kInterArrivalStatePacketLoss
// |
// kInterArrivalStateStable
// |
// kInterArrivalStateDelay
// | |
// kInterArrivalStateCompetingFlow -> kInterArrivalStateCompetingTcpFLow
enum NET_EXPORT_PRIVATE InterArrivalState {
// We are on a network with a delay that is too small to be reliably detected,
// such as a local ethernet.
kInterArrivalStatePacketLoss = 1,
// We are on an underutilized network operating with low delay and low loss.
kInterArrivalStateStable = 2,
// We are on a network where we can detect delay changes and suffer only
// low loss. Nothing indicates that we are competing with another flow.
kInterArrivalStateDelay = 3,
// We are on a network where we can detect delay changes and suffer only
// low loss. We have indications that we are compete with another flow.
kInterArrivalStateCompetingFlow = 4,
// We are on a network where we can detect delay changes, however we suffer
// packet loss due to sharing the bottleneck link with another flow, which is
// most likely a TCP flow.
kInterArrivalStateCompetingTcpFLow = 5,
};
class NET_EXPORT_PRIVATE InterArrivalStateMachine {
public:
explicit InterArrivalStateMachine(const QuicClock* clock);
InterArrivalState GetInterArrivalState();
// Inter arrival congestion control decided to increase bitrate.
void IncreaseBitrateDecision();
// Inter arrival congestion control decided to decrease bitrate.
void DecreaseBitrateDecision();
// Estimated smoothed round trip time.
// This should be called whenever the smoothed RTT estimate is updated.
void set_rtt(QuicTime::Delta rtt);
// This method is called when a packet loss was reported.
bool PacketLossEvent();
// This method is called when we believe that packet transit delay is
// increasing, presumably due to a growing queue along the path.
bool IncreasingDelayEvent();
private:
const QuicClock* clock_;
InterArrivalState current_state_;
QuicTime::Delta smoothed_rtt_;
int decrease_event_count_;
QuicTime last_decrease_event_;
int increase_event_count_;
QuicTime last_increase_event_;
int loss_event_count_;
QuicTime last_loss_event_;
int delay_event_count_;
QuicTime last_delay_event_;
DISALLOW_COPY_AND_ASSIGN(InterArrivalStateMachine);
};
} // namespace net
#endif // NET_QUIC_CONGESTION_CONTROL_INTER_ARRIVAL_STATE_MACHINE_H_