mirror of
https://github.com/facebookincubator/mvfst.git
synced 2025-08-08 09:42:06 +03:00
elide malloc calls
Summary: - optimizing `setSupportedExtensionTransportParameters()` to elide invocations to malloc() Reviewed By: mjoras Differential Revision: D43844018 fbshipit-source-id: 38da5c62786f795a3a79e7592d06d4da1d7487ba
This commit is contained in:
committed by
Facebook GitHub Bot
parent
3452070d5c
commit
6cd4f47735
@@ -1745,11 +1745,11 @@ bool hasInitialOrHandshakeCiphers(QuicConnectionStateBase& conn) {
|
||||
}
|
||||
|
||||
bool setCustomTransportParameter(
|
||||
std::unique_ptr<CustomTransportParameter> customParam,
|
||||
const CustomTransportParameter& customParam,
|
||||
std::vector<TransportParameter>& customTransportParameters) {
|
||||
// Check that the parameter id is in the "private parameter" range, as
|
||||
// described by the spec.
|
||||
if (static_cast<uint16_t>(customParam->getParameterId()) <
|
||||
if (static_cast<uint16_t>(customParam.getParameterId()) <
|
||||
kCustomTransportParameterThreshold) {
|
||||
LOG(ERROR) << "invalid parameter id";
|
||||
return false;
|
||||
@@ -1761,7 +1761,7 @@ bool setCustomTransportParameter(
|
||||
customTransportParameters.begin(),
|
||||
customTransportParameters.end(),
|
||||
[&customParam](const TransportParameter& param) {
|
||||
return param.parameter == customParam->getParameterId();
|
||||
return param.parameter == customParam.getParameterId();
|
||||
});
|
||||
|
||||
// if a match has been found, we return failure
|
||||
@@ -1770,7 +1770,7 @@ bool setCustomTransportParameter(
|
||||
return false;
|
||||
}
|
||||
|
||||
customTransportParameters.push_back(customParam->encode());
|
||||
customTransportParameters.push_back(customParam.encode());
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@@ -332,7 +332,7 @@ bool writeLoopTimeLimit(
|
||||
* - checks that the param is not in the provided vector already
|
||||
*/
|
||||
bool setCustomTransportParameter(
|
||||
std::unique_ptr<CustomTransportParameter> customParam,
|
||||
const CustomTransportParameter& customParam,
|
||||
std::vector<TransportParameter>& customTransportParameters);
|
||||
|
||||
bool toWriteInitialAcks(const quic::QuicConnectionStateBase& conn);
|
||||
|
@@ -4535,28 +4535,26 @@ TEST_F(QuicTransportFunctionsTest, CustomTransportParamTest) {
|
||||
|
||||
// Add new param.
|
||||
EXPECT_TRUE(setCustomTransportParameter(
|
||||
std::make_unique<CustomIntegralTransportParameter>(
|
||||
kCustomTransportParameterThreshold, 0),
|
||||
CustomIntegralTransportParameter(kCustomTransportParameterThreshold, 0),
|
||||
customTransportParameters));
|
||||
EXPECT_EQ(customTransportParameters.size(), 1);
|
||||
|
||||
// Existing param not added.
|
||||
EXPECT_FALSE(setCustomTransportParameter(
|
||||
std::make_unique<CustomIntegralTransportParameter>(
|
||||
kCustomTransportParameterThreshold, 1),
|
||||
CustomIntegralTransportParameter(kCustomTransportParameterThreshold, 1),
|
||||
customTransportParameters));
|
||||
EXPECT_EQ(customTransportParameters.size(), 1);
|
||||
|
||||
// Bad param id is not added.
|
||||
EXPECT_FALSE(setCustomTransportParameter(
|
||||
std::make_unique<CustomIntegralTransportParameter>(
|
||||
CustomIntegralTransportParameter(
|
||||
kCustomTransportParameterThreshold - 1, 2),
|
||||
customTransportParameters));
|
||||
EXPECT_EQ(customTransportParameters.size(), 1);
|
||||
|
||||
// Another valid param added.
|
||||
EXPECT_TRUE(setCustomTransportParameter(
|
||||
std::make_unique<CustomIntegralTransportParameter>(
|
||||
CustomIntegralTransportParameter(
|
||||
kCustomTransportParameterThreshold + 1, 0),
|
||||
customTransportParameters));
|
||||
EXPECT_EQ(customTransportParameters.size(), 2);
|
||||
|
@@ -1655,54 +1655,48 @@ void QuicClientTransport::setSelfOwning() {
|
||||
}
|
||||
|
||||
void QuicClientTransport::setSupportedExtensionTransportParameters() {
|
||||
if (conn_->transportSettings.minAckDelay.hasValue()) {
|
||||
auto minAckDelayParam = std::make_unique<CustomIntegralTransportParameter>(
|
||||
const auto& ts = conn_->transportSettings;
|
||||
|
||||
if (ts.minAckDelay.hasValue()) {
|
||||
CustomIntegralTransportParameter minAckDelayParam(
|
||||
static_cast<uint64_t>(TransportParameterId::min_ack_delay),
|
||||
conn_->transportSettings.minAckDelay.value().count());
|
||||
customTransportParameters_.push_back(minAckDelayParam->encode());
|
||||
}
|
||||
if (conn_->transportSettings.datagramConfig.enabled) {
|
||||
auto maxDatagramFrameSize =
|
||||
std::make_unique<CustomIntegralTransportParameter>(
|
||||
static_cast<uint64_t>(
|
||||
TransportParameterId::max_datagram_frame_size),
|
||||
conn_->datagramState.maxReadFrameSize);
|
||||
customTransportParameters_.push_back(maxDatagramFrameSize->encode());
|
||||
ts.minAckDelay.value().count());
|
||||
customTransportParameters_.push_back(minAckDelayParam.encode());
|
||||
}
|
||||
|
||||
auto ackReceiveTimestampsEnabled =
|
||||
std::make_unique<CustomIntegralTransportParameter>(
|
||||
static_cast<uint64_t>(
|
||||
TransportParameterId::ack_receive_timestamps_enabled),
|
||||
conn_->transportSettings.maybeAckReceiveTimestampsConfigSentToPeer
|
||||
.has_value()
|
||||
? 1
|
||||
: 0);
|
||||
customTransportParameters_.push_back(ackReceiveTimestampsEnabled->encode());
|
||||
if (conn_->transportSettings.maybeAckReceiveTimestampsConfigSentToPeer
|
||||
.has_value()) {
|
||||
auto maxReceiveTimestampsPerAck =
|
||||
std::make_unique<CustomIntegralTransportParameter>(
|
||||
static_cast<uint64_t>(
|
||||
TransportParameterId::max_receive_timestamps_per_ack),
|
||||
conn_->transportSettings.maybeAckReceiveTimestampsConfigSentToPeer
|
||||
.value()
|
||||
.max_receive_timestamps_per_ack);
|
||||
customTransportParameters_.push_back(maxReceiveTimestampsPerAck->encode());
|
||||
auto receiveTimestampsExponent =
|
||||
std::make_unique<CustomIntegralTransportParameter>(
|
||||
static_cast<uint64_t>(
|
||||
TransportParameterId::receive_timestamps_exponent),
|
||||
conn_->transportSettings.maybeAckReceiveTimestampsConfigSentToPeer
|
||||
.value()
|
||||
.receive_timestamps_exponent);
|
||||
customTransportParameters_.push_back(receiveTimestampsExponent->encode());
|
||||
if (ts.datagramConfig.enabled) {
|
||||
CustomIntegralTransportParameter maxDatagramFrameSize(
|
||||
static_cast<uint64_t>(TransportParameterId::max_datagram_frame_size),
|
||||
conn_->datagramState.maxReadFrameSize);
|
||||
customTransportParameters_.push_back(maxDatagramFrameSize.encode());
|
||||
}
|
||||
|
||||
if (conn_->transportSettings.advertisedKnobFrameSupport) {
|
||||
auto knobFrameSupport = std::make_unique<CustomIntegralTransportParameter>(
|
||||
CustomIntegralTransportParameter ackReceiveTimestampsEnabled(
|
||||
static_cast<uint64_t>(
|
||||
TransportParameterId::ack_receive_timestamps_enabled),
|
||||
ts.maybeAckReceiveTimestampsConfigSentToPeer.has_value() ? 1 : 0);
|
||||
customTransportParameters_.push_back(ackReceiveTimestampsEnabled.encode());
|
||||
|
||||
if (ts.maybeAckReceiveTimestampsConfigSentToPeer.has_value()) {
|
||||
CustomIntegralTransportParameter maxReceiveTimestampsPerAck(
|
||||
static_cast<uint64_t>(
|
||||
TransportParameterId::max_receive_timestamps_per_ack),
|
||||
ts.maybeAckReceiveTimestampsConfigSentToPeer.value()
|
||||
.max_receive_timestamps_per_ack);
|
||||
customTransportParameters_.push_back(maxReceiveTimestampsPerAck.encode());
|
||||
|
||||
CustomIntegralTransportParameter receiveTimestampsExponent(
|
||||
static_cast<uint64_t>(
|
||||
TransportParameterId::receive_timestamps_exponent),
|
||||
ts.maybeAckReceiveTimestampsConfigSentToPeer.value()
|
||||
.receive_timestamps_exponent);
|
||||
customTransportParameters_.push_back(receiveTimestampsExponent.encode());
|
||||
}
|
||||
|
||||
if (ts.advertisedKnobFrameSupport) {
|
||||
CustomIntegralTransportParameter knobFrameSupport(
|
||||
static_cast<uint64_t>(TransportParameterId::knob_frames_supported), 1);
|
||||
customTransportParameters_.push_back(knobFrameSupport->encode());
|
||||
customTransportParameters_.push_back(knobFrameSupport.encode());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1810,13 +1804,12 @@ void QuicClientTransport::maybeEnableStreamGroups() {
|
||||
return;
|
||||
}
|
||||
|
||||
auto streamGroupsEnabledParam =
|
||||
std::make_unique<CustomIntegralTransportParameter>(
|
||||
static_cast<uint64_t>(TransportParameterId::stream_groups_enabled),
|
||||
conn_->transportSettings.advertisedMaxStreamGroups);
|
||||
CustomIntegralTransportParameter streamGroupsEnabledParam(
|
||||
static_cast<uint64_t>(TransportParameterId::stream_groups_enabled),
|
||||
conn_->transportSettings.advertisedMaxStreamGroups);
|
||||
|
||||
if (!setCustomTransportParameter(
|
||||
std::move(streamGroupsEnabledParam), customTransportParameters_)) {
|
||||
streamGroupsEnabledParam, customTransportParameters_)) {
|
||||
LOG(ERROR) << "failed to set stream groups enabled transport parameter";
|
||||
}
|
||||
}
|
||||
|
@@ -236,12 +236,11 @@ TEST_P(
|
||||
std::vector<TransportParameter> transportParams;
|
||||
|
||||
if (GetParam().peerMaxGroupsIn > 0) {
|
||||
auto streamGroupsEnabledParam =
|
||||
std::make_unique<CustomIntegralTransportParameter>(
|
||||
static_cast<uint64_t>(TransportParameterId::stream_groups_enabled),
|
||||
GetParam().peerMaxGroupsIn);
|
||||
CHECK(setCustomTransportParameter(
|
||||
std::move(streamGroupsEnabledParam), transportParams));
|
||||
CustomIntegralTransportParameter streamGroupsEnabledParam(
|
||||
static_cast<uint64_t>(TransportParameterId::stream_groups_enabled),
|
||||
GetParam().peerMaxGroupsIn);
|
||||
CHECK(
|
||||
setCustomTransportParameter(streamGroupsEnabledParam, transportParams));
|
||||
}
|
||||
ServerTransportParameters serverTransportParams = {
|
||||
std::move(transportParams)};
|
||||
|
@@ -80,7 +80,7 @@ TransportParameter encodeIntegerParameter(
|
||||
return {id, std::move(data)};
|
||||
}
|
||||
|
||||
TransportParameterId CustomTransportParameter::getParameterId() {
|
||||
TransportParameterId CustomTransportParameter::getParameterId() const {
|
||||
return static_cast<TransportParameterId>(id_);
|
||||
}
|
||||
|
||||
|
@@ -56,7 +56,7 @@ struct TransportParameter {
|
||||
|
||||
class CustomTransportParameter {
|
||||
public:
|
||||
TransportParameterId getParameterId();
|
||||
TransportParameterId getParameterId() const;
|
||||
|
||||
virtual TransportParameter encode() const = 0;
|
||||
|
||||
|
@@ -1562,60 +1562,50 @@ QuicServerConnectionState::createAndAddNewSelfConnId() {
|
||||
std::vector<TransportParameter> setSupportedExtensionTransportParameters(
|
||||
QuicServerConnectionState& conn) {
|
||||
std::vector<TransportParameter> customTransportParams;
|
||||
if (conn.transportSettings.datagramConfig.enabled) {
|
||||
auto maxDatagramFrameSize =
|
||||
std::make_unique<CustomIntegralTransportParameter>(
|
||||
static_cast<uint64_t>(
|
||||
TransportParameterId::max_datagram_frame_size),
|
||||
conn.datagramState.maxReadFrameSize);
|
||||
customTransportParams.push_back(maxDatagramFrameSize->encode());
|
||||
const auto& ts = conn.transportSettings;
|
||||
if (ts.datagramConfig.enabled) {
|
||||
CustomIntegralTransportParameter maxDatagramFrameSize(
|
||||
static_cast<uint64_t>(TransportParameterId::max_datagram_frame_size),
|
||||
conn.datagramState.maxReadFrameSize);
|
||||
}
|
||||
|
||||
if (conn.transportSettings.advertisedMaxStreamGroups > 0) {
|
||||
auto streamGroupsEnabledParam =
|
||||
std::make_unique<CustomIntegralTransportParameter>(
|
||||
static_cast<uint64_t>(TransportParameterId::stream_groups_enabled),
|
||||
conn.transportSettings.advertisedMaxStreamGroups);
|
||||
if (ts.advertisedMaxStreamGroups > 0) {
|
||||
CustomIntegralTransportParameter streamGroupsEnabledParam(
|
||||
static_cast<uint64_t>(TransportParameterId::stream_groups_enabled),
|
||||
ts.advertisedMaxStreamGroups);
|
||||
|
||||
if (!setCustomTransportParameter(
|
||||
std::move(streamGroupsEnabledParam), customTransportParams)) {
|
||||
streamGroupsEnabledParam, customTransportParams)) {
|
||||
LOG(ERROR) << "failed to set stream groups enabled transport parameter";
|
||||
}
|
||||
}
|
||||
|
||||
auto ackReceiveTimestampsEnabled =
|
||||
std::make_unique<CustomIntegralTransportParameter>(
|
||||
static_cast<uint64_t>(
|
||||
TransportParameterId::ack_receive_timestamps_enabled),
|
||||
conn.transportSettings.maybeAckReceiveTimestampsConfigSentToPeer
|
||||
.has_value()
|
||||
? 1
|
||||
: 0);
|
||||
customTransportParams.push_back(ackReceiveTimestampsEnabled->encode());
|
||||
if (conn.transportSettings.maybeAckReceiveTimestampsConfigSentToPeer
|
||||
.has_value()) {
|
||||
auto maxReceiveTimestampsPerAck =
|
||||
std::make_unique<CustomIntegralTransportParameter>(
|
||||
static_cast<uint64_t>(
|
||||
TransportParameterId::max_receive_timestamps_per_ack),
|
||||
conn.transportSettings.maybeAckReceiveTimestampsConfigSentToPeer
|
||||
.value()
|
||||
.max_receive_timestamps_per_ack);
|
||||
customTransportParams.push_back(maxReceiveTimestampsPerAck->encode());
|
||||
auto receiveTimestampsExponent =
|
||||
std::make_unique<CustomIntegralTransportParameter>(
|
||||
static_cast<uint64_t>(
|
||||
TransportParameterId::receive_timestamps_exponent),
|
||||
conn.transportSettings.maybeAckReceiveTimestampsConfigSentToPeer
|
||||
.value()
|
||||
.receive_timestamps_exponent);
|
||||
customTransportParams.push_back(receiveTimestampsExponent->encode());
|
||||
CustomIntegralTransportParameter ackReceiveTimestampsEnabled(
|
||||
static_cast<uint64_t>(
|
||||
TransportParameterId::ack_receive_timestamps_enabled),
|
||||
ts.maybeAckReceiveTimestampsConfigSentToPeer.has_value() ? 1 : 0);
|
||||
customTransportParams.push_back(ackReceiveTimestampsEnabled.encode());
|
||||
|
||||
if (ts.maybeAckReceiveTimestampsConfigSentToPeer.has_value()) {
|
||||
CustomIntegralTransportParameter maxReceiveTimestampsPerAck(
|
||||
static_cast<uint64_t>(
|
||||
TransportParameterId::max_receive_timestamps_per_ack),
|
||||
ts.maybeAckReceiveTimestampsConfigSentToPeer.value()
|
||||
.max_receive_timestamps_per_ack);
|
||||
customTransportParams.push_back(maxReceiveTimestampsPerAck.encode());
|
||||
|
||||
CustomIntegralTransportParameter receiveTimestampsExponent(
|
||||
static_cast<uint64_t>(
|
||||
TransportParameterId::receive_timestamps_exponent),
|
||||
ts.maybeAckReceiveTimestampsConfigSentToPeer.value()
|
||||
.receive_timestamps_exponent);
|
||||
customTransportParams.push_back(receiveTimestampsExponent.encode());
|
||||
}
|
||||
|
||||
if (conn.transportSettings.advertisedKnobFrameSupport) {
|
||||
auto knobFrameSupport = std::make_unique<CustomIntegralTransportParameter>(
|
||||
if (ts.advertisedKnobFrameSupport) {
|
||||
CustomIntegralTransportParameter knobFrameSupport(
|
||||
static_cast<uint64_t>(TransportParameterId::knob_frames_supported), 1);
|
||||
customTransportParams.push_back(knobFrameSupport->encode());
|
||||
customTransportParams.push_back(knobFrameSupport.encode());
|
||||
}
|
||||
|
||||
return customTransportParams;
|
||||
|
@@ -296,12 +296,11 @@ TEST_P(
|
||||
std::vector<TransportParameter> transportParams;
|
||||
|
||||
if (GetParam().peerMaxGroupsIn > 0) {
|
||||
auto streamGroupsEnabledParam =
|
||||
std::make_unique<CustomIntegralTransportParameter>(
|
||||
static_cast<uint64_t>(TransportParameterId::stream_groups_enabled),
|
||||
GetParam().peerMaxGroupsIn);
|
||||
CHECK(setCustomTransportParameter(
|
||||
std::move(streamGroupsEnabledParam), transportParams));
|
||||
CustomIntegralTransportParameter streamGroupsEnabledParam(
|
||||
static_cast<uint64_t>(TransportParameterId::stream_groups_enabled),
|
||||
GetParam().peerMaxGroupsIn);
|
||||
CHECK(
|
||||
setCustomTransportParameter(streamGroupsEnabledParam, transportParams));
|
||||
}
|
||||
ClientTransportParameters clientTransportParams = {
|
||||
std::move(transportParams)};
|
||||
|
Reference in New Issue
Block a user