void QuicServerTransport::registerAllTransportKnobParamHandlers()

in quic/server/QuicServerTransport.cpp [679:876]


void QuicServerTransport::registerAllTransportKnobParamHandlers() {
  registerTransportKnobParamHandler(
      static_cast<uint64_t>(
          TransportKnobParamId::ZERO_PMTU_BLACKHOLE_DETECTION),
      [](QuicServerTransport* serverTransport, uint64_t val) {
        CHECK(serverTransport);
        auto server_conn = serverTransport->serverConn_;
        if (static_cast<bool>(val)) {
          server_conn->d6d.noBlackholeDetection = true;
          VLOG(3)
              << "Knob param received, pmtu blackhole detection is turned off";
        }
      });

  registerTransportKnobParamHandler(
      static_cast<uint64_t>(
          TransportKnobParamId::FORCIBLY_SET_UDP_PAYLOAD_SIZE),
      [](QuicServerTransport* serverTransport, uint64_t val) {
        CHECK(serverTransport);
        auto server_conn = serverTransport->serverConn_;
        if (static_cast<bool>(val)) {
          server_conn->udpSendPacketLen = server_conn->peerMaxUdpPayloadSize;
          VLOG(3)
              << "Knob param received, udpSendPacketLen is forcibly set to max UDP payload size advertised by peer";
        }
      });

  registerTransportKnobParamHandler(
      static_cast<uint64_t>(TransportKnobParamId::CC_ALGORITHM_KNOB),
      [](QuicServerTransport* serverTransport, uint64_t val) {
        CHECK(serverTransport);
        auto server_conn = serverTransport->serverConn_;
        auto cctype = static_cast<CongestionControlType>(val);
        VLOG(3) << "Knob param received, set congestion control type to "
                << congestionControlTypeToString(cctype);
        if (cctype == server_conn->congestionController->type()) {
          return;
        }
        if (cctype == CongestionControlType::CCP) {
          bool ccpAvailable = false;
#ifdef CCP_ENABLED
          ccpAvailable = server_conn->ccpDatapath != nullptr;
#endif
          if (!ccpAvailable) {
            LOG(ERROR) << "ccp not enabled on this server";
            return;
          }
        }
        server_conn->congestionController =
            server_conn->congestionControllerFactory->makeCongestionController(
                *server_conn, cctype);
      });

  registerTransportKnobParamHandler(
      static_cast<uint64_t>(TransportKnobParamId::CC_AGRESSIVENESS_KNOB),
      [](QuicServerTransport* serverTransport, uint64_t val) {
        CHECK(serverTransport);
        auto server_conn = serverTransport->serverConn_;
        if (val < 25 || val > 100) {
          LOG(ERROR)
              << "Invalid CC_AGRESSIVENESS_KNOB value received from client, value = "
              << val << ". Supported values are between 25,100 (inclusive)";
          return;
        }
        float targetFactor = val / 100.0f;
        VLOG(3)
            << "CC_AGRESSIVENESS_KNOB KnobParam received from client, setting congestion control aggressiveness to "
            << targetFactor;
        server_conn->congestionController->setBandwidthUtilizationFactor(
            targetFactor);
      });

  registerTransportKnobParamHandler(
      static_cast<uint64_t>(TransportKnobParamId::STARTUP_RTT_FACTOR_KNOB),
      [](QuicServerTransport* serverTransport, uint64_t val) {
        CHECK(serverTransport);
        auto server_conn = serverTransport->serverConn_;
        uint8_t numerator = (val / 100);
        uint8_t denominator = (val - (numerator * 100));
        VLOG(3) << "Knob param received, set STARTUP rtt factor to ("
                << unsigned(numerator) << "," << unsigned(denominator) << ")";
        server_conn->transportSettings.startupRttFactor =
            std::make_pair(numerator, denominator);
      });

  registerTransportKnobParamHandler(
      static_cast<uint64_t>(TransportKnobParamId::DEFAULT_RTT_FACTOR_KNOB),
      [](QuicServerTransport* serverTransport, uint64_t val) {
        CHECK(serverTransport);
        auto server_conn = serverTransport->serverConn_;
        auto numerator = (uint8_t)(val / 100);
        auto denominator = (uint8_t)(val - (numerator * 100));
        VLOG(3) << "Knob param received, set DEFAULT rtt factor to ("
                << unsigned(numerator) << "," << unsigned(denominator) << ")";
        server_conn->transportSettings.defaultRttFactor =
            std::make_pair(numerator, denominator);
      });

  registerTransportKnobParamHandler(
      static_cast<uint64_t>(TransportKnobParamId::NOTSENT_BUFFER_SIZE_KNOB),
      [](QuicServerTransport* serverTransport, uint64_t val) {
        CHECK(serverTransport);
        auto server_conn = serverTransport->serverConn_;
        VLOG(3) << "Knob param received, set total buffer space available to ("
                << unsigned(val) << ")";
        server_conn->transportSettings.totalBufferSpaceAvailable = val;
      });

  registerTransportKnobParamHandler(
      static_cast<uint64_t>(TransportKnobParamId::MAX_PACING_RATE_KNOB),
      [](QuicServerTransport* serverTransport, uint64_t val) {
        CHECK(serverTransport);
        VLOG(3) << "Knob param received, set max pacing rate to ("
                << unsigned(val) << " bytes per second)";
        serverTransport->setMaxPacingRate(val);
      });

  registerTransportKnobParamHandler(
      static_cast<uint64_t>(TransportKnobParamId::AUTO_BACKGROUND_MODE),
      [](QuicServerTransport* serverTransport, uint64_t val) {
        CHECK(serverTransport);
        uint64_t priorityThreshold = val / kPriorityThresholdKnobMultiplier;
        uint64_t utilizationPercent = val % kPriorityThresholdKnobMultiplier;
        float utilizationFactor = float(utilizationPercent) / 100.0f;
        VLOG(3) << fmt::format(
            "AUTO_BACKGROUND_MODE KnobParam received, enabling auto background mode "
            "with Priority Threshold={}, Utilization Factor={}",
            priorityThreshold,
            utilizationFactor);
        serverTransport->setBackgroundModeParameters(
            PriorityLevel(priorityThreshold), utilizationFactor);
      });

  registerTransportKnobParamHandler(
      static_cast<uint64_t>(TransportKnobParamId::CC_EXPERIMENTAL),
      [](QuicServerTransport* serverTransport, uint64_t val) {
        CHECK(serverTransport);
        auto server_conn = serverTransport->serverConn_;
        if (server_conn->congestionController) {
          auto enableExperimental = static_cast<bool>(val);
          server_conn->congestionController->setExperimental(
              enableExperimental);
          VLOG(3) << fmt::format(
              "CC_EXPERIMENTAL KnobParam received, setting experimental={} "
              "settings for congestion controller. Current congestion controller={}",
              enableExperimental,
              congestionControlTypeToString(
                  server_conn->congestionController->type()));
        }
      });

  registerTransportKnobParamHandler(
      static_cast<uint64_t>(TransportKnobParamId::SHORT_HEADER_PADDING_KNOB),
      [](QuicServerTransport* serverTransport, uint64_t val) {
        CHECK(serverTransport);
        serverTransport->serverConn_->transportSettings.paddingModulo = val;
        VLOG(3) << fmt::format(
            "SHORT_HEADER_PADDING_KNOB KnobParam received, setting paddingModulo={}",
            val);
      });

  registerTransportKnobParamHandler(
      static_cast<uint64_t>(TransportKnobParamId::ADAPTIVE_LOSS_DETECTION),
      [](QuicServerTransport* serverTransport, uint64_t val) {
        CHECK(serverTransport);
        auto server_conn = serverTransport->serverConn_;
        auto useAdaptiveLossThresholds = static_cast<bool>(val);
        server_conn->transportSettings.useAdaptiveLossThresholds =
            useAdaptiveLossThresholds;
        VLOG(3) << fmt::format(
            "ADAPTIVE_LOSS_DETECTION KnobParam received, UseAdaptiveLossThresholds is now set to {}",
            useAdaptiveLossThresholds);
      });

  registerTransportKnobParamHandler(
      static_cast<uint64_t>(TransportKnobParamId::PACER_EXPERIMENTAL),
      [](QuicServerTransport* serverTransport, uint64_t val) {
        CHECK(serverTransport);
        auto server_conn = serverTransport->serverConn_;
        if (server_conn->pacer) {
          auto enableExperimental = static_cast<bool>(val);
          server_conn->pacer->setExperimental(enableExperimental);
          VLOG(3) << fmt::format(
              "PACER_EXPERIMENTAL KnobParam received, "
              "setting experimental={} for pacer",
              enableExperimental);
        }
      });
  registerTransportKnobParamHandler(
      static_cast<uint64_t>(TransportKnobParamId::KEEPALIVE_ENABLED),
      [](QuicServerTransport* serverTransport, uint64_t val) {
        CHECK(serverTransport);
        auto server_conn = serverTransport->serverConn_;
        server_conn->transportSettings.enableKeepalive = static_cast<bool>(val);
        VLOG(3) << "KEEPALIVE_ENABLED KnobParam received: "
                << static_cast<bool>(val);
      });
}