From d08e99de242898c40e9410b9cb1e86c1bb8f830f Mon Sep 17 00:00:00 2001 From: James M Snell Date: Wed, 8 Jul 2020 07:28:37 -0700 Subject: [PATCH] quic: use getter/setter for stateless reset toggle PR-URL: https://github.com/nodejs/node/pull/34247 Reviewed-By: Anna Henningsen --- lib/internal/quic/core.js | 24 ++++++++++++++---------- src/quic/node_quic_socket-inl.h | 4 ++-- src/quic/node_quic_socket.cc | 9 +++++---- src/quic/node_quic_socket.h | 2 +- 4 files changed, 22 insertions(+), 17 deletions(-) diff --git a/lib/internal/quic/core.js b/lib/internal/quic/core.js index 1b18ec4a10e9a3..a80fed262db1e2 100644 --- a/lib/internal/quic/core.js +++ b/lib/internal/quic/core.js @@ -857,6 +857,7 @@ class QuicSocket extends EventEmitter { serverSecureContext: undefined, sessions: new Set(), state: kSocketUnbound, + statelessResetEnabled: true, stats: undefined, }; @@ -1613,16 +1614,19 @@ class QuicSocket extends EventEmitter { this[kHandle].setDiagnosticPacketLoss(rx, tx); } - // Toggles stateless reset on/off. By default, stateless reset tokens - // are generated when necessary. The disableStatelessReset option may - // be used when the QuicSocket is created to disable generation of - // stateless resets. The toggleStatelessReset method allows the setting - // to be switched on/off dynamically through the lifetime of the - // socket. - toggleStatelessReset() { - if (this[kInternalState].state === kSocketDestroyed) - throw new ERR_QUICSOCKET_DESTROYED('toggleStatelessReset'); - return this[kHandle].toggleStatelessReset(); + get statelessResetEnabled() { + return this[kInternalState].statelessResetEnabled; + } + + set statelessResetEnabled(on) { + const state = this[kInternalState]; + if (state.state === kSocketDestroyed) + throw new ERR_QUICSOCKET_DESTROYED('serverBusy'); + validateBoolean(on, 'on'); + if (state.statelessResetEnabled !== on) { + this[kHandle].enableStatelessReset(on); + state.statelessResetEnabled = on; + } } } diff --git a/src/quic/node_quic_socket-inl.h b/src/quic/node_quic_socket-inl.h index bcc85d82314f22..2d269ef87fe248 100644 --- a/src/quic/node_quic_socket-inl.h +++ b/src/quic/node_quic_socket-inl.h @@ -173,8 +173,8 @@ void QuicSocket::set_diagnostic_packet_loss(double rx, double tx) { tx_loss_ = tx; } -bool QuicSocket::ToggleStatelessReset() { - set_stateless_reset_disabled(!is_stateless_reset_disabled()); +bool QuicSocket::EnableStatelessReset(bool on) { + set_stateless_reset_disabled(!on); return !is_stateless_reset_disabled(); } diff --git a/src/quic/node_quic_socket.cc b/src/quic/node_quic_socket.cc index b51edee6c9be9a..49743ebf9a9d7e 100644 --- a/src/quic/node_quic_socket.cc +++ b/src/quic/node_quic_socket.cc @@ -1128,10 +1128,11 @@ void QuicSocketSetServerBusy(const FunctionCallbackInfo& args) { socket->ServerBusy(args[0]->IsTrue()); } -void QuicSocketToggleStatelessReset(const FunctionCallbackInfo& args) { +void QuicSocketEnableStatelessReset(const FunctionCallbackInfo& args) { QuicSocket* socket; ASSIGN_OR_RETURN_UNWRAP(&socket, args.Holder()); - args.GetReturnValue().Set(socket->ToggleStatelessReset()); + CHECK_EQ(args.Length(), 1); + args.GetReturnValue().Set(socket->EnableStatelessReset(args[0]->IsTrue())); } void QuicEndpointWaitForPendingCallbacks( @@ -1197,8 +1198,8 @@ void QuicSocket::Initialize( "stopListening", QuicSocketStopListening); env->SetProtoMethod(socket, - "toggleStatelessReset", - QuicSocketToggleStatelessReset); + "enableStatelessReset", + QuicSocketEnableStatelessReset); socket->Inherit(HandleWrap::GetConstructorTemplate(env)); target->Set(context, class_name, socket->GetFunction(env->context()).ToLocalChecked()).FromJust(); diff --git a/src/quic/node_quic_socket.h b/src/quic/node_quic_socket.h index a9d4058fb7a1e0..1fe9a04da0584b 100644 --- a/src/quic/node_quic_socket.h +++ b/src/quic/node_quic_socket.h @@ -384,7 +384,7 @@ class QuicSocket : public AsyncWrap, // Toggles whether or not stateless reset is enabled or not. // Returns true if stateless reset is enabled, false if it // is not. - inline bool ToggleStatelessReset(); + inline bool EnableStatelessReset(bool on = true); BaseObjectPtr server_secure_context() const { return server_secure_context_;