load("@fbcode//quic:defs.bzl", "mvfst_cpp_library")

oncall("traffic_protocols")

mvfst_cpp_library(
    name = "bandwidth",
    srcs = [
        "Bandwidth.cpp",
    ],
    headers = [
        "Bandwidth.h",
    ],
    deps = [
        "fbsource//third-party/fmt:fmt",
        "//folly/lang:assume",
    ],
)

mvfst_cpp_library(
    name = "congestion_controller",
    headers = [
        "CongestionController.h",
    ],
    exported_deps = [
        ":bandwidth",
        "//quic:constants",
        "//quic/state:cloned_packet_identifier",
        "//quic/state:loss_event",
        "//quic/state:outstanding_packet",
    ],
)

mvfst_cpp_library(
    name = "congestion_control_functions",
    srcs = [
        "CongestionControlFunctions.cpp",
    ],
    headers = [
        "CongestionControlFunctions.h",
    ],
    deps = [
        "//quic/common:time_util",
    ],
    exported_deps = [
        "//quic/common:mvfst_logging",
        "//quic/state:quic_state_machine",
    ],
)

mvfst_cpp_library(
    name = "congestion_controller_factory",
    srcs = select({
        "DEFAULT": ["CongestionControllerFactory.cpp"],
        "ovr_config//os/constraints:android": ["CongestionControllerFactoryMobile.cpp"],
        "ovr_config//os/constraints:iphoneos": ["CongestionControllerFactoryMobile.cpp"],
    }),
    headers = [
        "CongestionControllerFactory.h",
    ],
    deps = select({
        "DEFAULT": [
            ":bbr",
            ":bbr2",
            ":bbr_bandwidth_sampler",
            ":bbr_rtt_sampler",
            ":copa",
            ":cubic",
            ":newreno",
            "//quic/congestion_control/modular:bbr2_startup",
        ],
        "ovr_config//os/constraints:android": [
            ":copa",
            ":cubic",
        ],
        "ovr_config//os/constraints:iphoneos": [
            ":copa",
            ":cubic",
        ],
    })
    + [
        "//quic/common:mvfst_logging",
    ],
    exported_deps = [
        "//quic:constants",
    ],
)

mvfst_cpp_library(
    name = "static_cwnd_congestion_controller",
    srcs = [
        "StaticCwndCongestionController.cpp",
    ],
    headers = [
        "StaticCwndCongestionController.h",
    ],
    deps = [
        ":congestion_control_functions",
    ],
    exported_deps = [
        ":congestion_controller",
        "//quic/state:ack_event",
        "//quic/state:quic_state_machine",
        "//quic/state:transport_settings",
    ],
)

mvfst_cpp_library(
    name = "server_congestion_controller_factory",
    srcs = [
        "ServerCongestionControllerFactory.cpp",
    ],
    headers = [
        "ServerCongestionControllerFactory.h",
    ],
    deps = [
        ":bbr",
        ":bbr2",
        ":bbr_bandwidth_sampler",
        ":bbr_rtt_sampler",
        ":copa",
        ":cubic",
        ":newreno",
        "//quic/congestion_control/modular:bbr2_startup",
    ],
    exported_deps = [
        ":congestion_controller_factory",
    ],
)

mvfst_cpp_library(
    name = "cubic",
    srcs = [
        "QuicCubic.cpp",
    ],
    headers = [
        "QuicCubic.h",
    ],
    deps = [
        ":ecn_l4s_tracker",
        "//folly:chrono",
        "//quic/common:mvfst_logging",
        "//quic/logging:qlogger_constants",
        "//quic/logging:qlogger_macros",
        "//quic/logging/oops_logger:oops_logger",
        "//quic/state:connection_oops_fields",
        "//quic/state:state_functions",
    ],
    exported_deps = [
        ":congestion_control_functions",
        ":congestion_controller",
        "//quic:exception",
        "//quic/state:ack_event",
        "//quic/state:quic_state_machine",
    ],
)

mvfst_cpp_library(
    name = "newreno",
    srcs = [
        "NewReno.cpp",
    ],
    headers = [
        "NewReno.h",
    ],
    deps = [
        ":congestion_control_functions",
        "//quic/common:mvfst_logging",
        "//quic/logging:qlogger_constants",
        "//quic/logging:qlogger_macros",
        "//quic/logging/oops_logger:oops_logger",
        "//quic/state:connection_oops_fields",
    ],
    exported_deps = [
        ":congestion_controller",
        "//quic:exception",
        "//quic/state:ack_event",
        "//quic/state:quic_state_machine",
    ],
)

mvfst_cpp_library(
    name = "copa",
    srcs = [
        "Copa.cpp",
    ],
    headers = [
        "Copa.h",
    ],
    deps = [
        ":congestion_control_functions",
        "//quic/common:mvfst_logging",
        "//quic/common:time_util",
        "//quic/logging:qlogger_constants",
        "//quic/logging:qlogger_macros",
        "//quic/logging/oops_logger:oops_logger",
        "//quic/state:connection_oops_fields",
    ],
    exported_deps = [
        ":congestion_controller",
        "//quic:exception",
        "//quic/common:optional",
        "//quic/congestion_control/third_party:chromium_windowed_filter",
        "//quic/state:ack_event",
        "//quic/state:quic_state_machine",
    ],
)

mvfst_cpp_library(
    name = "bbr",
    srcs = [
        "Bbr.cpp",
    ],
    headers = [
        "Bbr.h",
    ],
    deps = [
        ":congestion_control_functions",
        "//folly:random",
        "//quic:constants",
        "//quic/common:mvfst_logging",
        "//quic/common:time_util",
        "//quic/logging:qlogger_constants",
        "//quic/logging:qlogger_macros",
        "//quic/logging/oops_logger:oops_logger",
        "//quic/state:ack_frequency_functions",
        "//quic/state:connection_oops_fields",
    ],
    exported_deps = [
        ":bandwidth",
        ":congestion_controller",
        "//quic/congestion_control/third_party:chromium_windowed_filter",
        "//quic/state:quic_state_machine",
        "//quic/state:transport_settings",
    ],
)

mvfst_cpp_library(
    name = "bbr2",
    srcs = [
        "Bbr2.cpp",
    ],
    headers = [
        "Bbr2.h",
    ],
    deps = [
        ":congestion_control_functions",
        "//quic/common:mvfst_logging",
        "//quic/logging:qlogger_constants",
        "//quic/logging:qlogger_macros",
    ],
    exported_deps = [
        ":bandwidth",
        ":congestion_controller",
        "//quic/congestion_control/third_party:chromium_windowed_filter",
        "//quic/state:quic_state_machine",
        "//quic/state:transport_settings",
    ],
)

mvfst_cpp_library(
    name = "bbr_rtt_sampler",
    srcs = [
        "BbrRttSampler.cpp",
    ],
    headers = [
        "BbrRttSampler.h",
    ],
    exported_deps = [
        ":bbr",
        "//quic:constants",
    ],
)

mvfst_cpp_library(
    name = "bbr_bandwidth_sampler",
    srcs = [
        "BbrBandwidthSampler.cpp",
    ],
    headers = [
        "BbrBandwidthSampler.h",
    ],
    deps = [
        "//quic/logging:qlogger_macros",
        "//quic/logging/oops_logger:oops_logger",
        "//quic/state:connection_oops_fields",
    ],
    exported_deps = [
        ":bbr",
        "//quic/congestion_control/third_party:chromium_windowed_filter",
        "//quic/state:quic_state_machine",
    ],
)

mvfst_cpp_library(
    name = "pacer",
    srcs = [
        "TokenlessPacer.cpp",
    ],
    headers = [
        "Pacer.h",
        "TokenlessPacer.h",
    ],
    deps = [
        ":congestion_control_functions",
        "//quic/logging:qlogger_macros",
        "//quic/observer:socket_observer_macros",
    ],
    exported_deps = [
        "//quic/state:quic_state_machine",
    ],
)

mvfst_cpp_library(
    name = "pacer_factory",
    srcs = select({
        "DEFAULT": ["PacerFactory.cpp"],
        "ovr_config//os/constraints:android": ["PacerFactoryMobile.cpp"],
        "ovr_config//os/constraints:iphoneos": ["PacerFactoryMobile.cpp"],
    }),
    headers = [
        "PacerFactory.h",
    ],
    deps = select({
        "DEFAULT": [":pacer"],
        "ovr_config//os/constraints:android": [],
        "ovr_config//os/constraints:iphoneos": [],
    }),
)

mvfst_cpp_library(
    name = "packet_processor",
    headers = [
        "PacketProcessor.h",
    ],
    exported_deps = [
        "//folly/io:socket_option_map",
        "//quic/common:network_data",
        "//quic/common:optional",
        "//quic/state:cloned_packet_identifier",
        "//quic/state:outstanding_packet",
    ],
)

mvfst_cpp_library(
    name = "simulated_tbf",
    srcs = [
        "SimulatedTBF.cpp",
    ],
    headers = [
        "SimulatedTBF.h",
    ],
    deps = [
        "//quic:exception",
        "//quic/common:mvfst_logging",
    ],
    exported_deps = [
        "fbsource//third-party/glog:glog",
        "//folly:token_bucket",
        "//quic:constants",
    ],
)

mvfst_cpp_library(
    name = "throttling_signal_provider",
    headers = [
        "ThrottlingSignalProvider.h",
    ],
    exported_deps = [
        "//quic/common:optional",
    ],
)

mvfst_cpp_library(
    name = "ecn_l4s_tracker",
    srcs = [
        "EcnL4sTracker.cpp",
    ],
    headers = [
        "EcnL4sTracker.h",
    ],
    deps = [
        "//quic:exception",
        "//quic/logging:qlogger_macros",
        "//quic/observer:socket_observer_macros",
    ],
    exported_deps = [
        ":packet_processor",
        "//quic/state:quic_state_machine",
    ],
)
