masque_server_session: factor out event handlers for connect-udp and connect-ip PiperOrigin-RevId: 530565627
diff --git a/quiche/quic/masque/masque_server_session.cc b/quiche/quic/masque/masque_server_session.cc index 5d51677..5a5f75b 100644 --- a/quiche/quic/masque/masque_server_session.cc +++ b/quiche/quic/masque/masque_server_session.cc
@@ -333,97 +333,103 @@ } }); - do { // CONNECT-UDP - auto it = absl::c_find_if(connect_udp_server_states_, - [fd](const ConnectUdpServerState& connect_udp) { - return connect_udp.fd() == fd; - }); - if (it == connect_udp_server_states_.end()) { + if (!(HandleConnectUdpSocketEvent(fd, events) || + HandleConnectIpSocketEvent(fd, events))) { + QUIC_BUG(MasqueServerSession_OnSocketEvent_UnhandledEvent) + << "Got unexpected event mask " << events << " on unknown fd " << fd; + std::move(rearm).Cancel(); + } +} + +bool MasqueServerSession::HandleConnectUdpSocketEvent( + QuicUdpSocketFd fd, QuicSocketEventMask events) { + auto it = absl::c_find_if(connect_udp_server_states_, + [fd](const ConnectUdpServerState& connect_udp) { + return connect_udp.fd() == fd; + }); + if (it == connect_udp_server_states_.end()) { + return false; + } + QuicSocketAddress expected_target_server_address = + it->target_server_address(); + QUICHE_DCHECK(expected_target_server_address.IsInitialized()); + QUIC_DVLOG(1) << "Received readable event on fd " << fd << " (mask " << events + << ") stream ID " << it->stream()->id() << " server " + << expected_target_server_address; + QuicUdpSocketApi socket_api; + BitMask64 packet_info_interested(QuicUdpPacketInfoBit::PEER_ADDRESS); + char packet_buffer[1 + kMaxIncomingPacketSize]; + packet_buffer[0] = 0; // context ID. + char control_buffer[kDefaultUdpPacketControlBufferSize]; + while (true) { + QuicUdpSocketApi::ReadPacketResult read_result; + read_result.packet_buffer = {packet_buffer + 1, sizeof(packet_buffer) - 1}; + read_result.control_buffer = {control_buffer, sizeof(control_buffer)}; + socket_api.ReadPacket(fd, packet_info_interested, &read_result); + if (!read_result.ok) { + // Most likely there is nothing left to read, break out of read loop. break; } - QuicSocketAddress expected_target_server_address = - it->target_server_address(); - QUICHE_DCHECK(expected_target_server_address.IsInitialized()); - QUIC_DVLOG(1) << "Received readable event on fd " << fd << " (mask " - << events << ") stream ID " << it->stream()->id() - << " server " << expected_target_server_address; - QuicUdpSocketApi socket_api; - BitMask64 packet_info_interested(QuicUdpPacketInfoBit::PEER_ADDRESS); - char packet_buffer[1 + kMaxIncomingPacketSize]; - packet_buffer[0] = 0; // context ID. - char control_buffer[kDefaultUdpPacketControlBufferSize]; - while (true) { - QuicUdpSocketApi::ReadPacketResult read_result; - read_result.packet_buffer = {packet_buffer + 1, - sizeof(packet_buffer) - 1}; - read_result.control_buffer = {control_buffer, sizeof(control_buffer)}; - socket_api.ReadPacket(fd, packet_info_interested, &read_result); - if (!read_result.ok) { - // Most likely there is nothing left to read, break out of read loop. - break; - } - if (!read_result.packet_info.HasValue( - QuicUdpPacketInfoBit::PEER_ADDRESS)) { - QUIC_BUG(quic_bug_10974_2) - << "Missing peer address when reading from fd " << fd; - continue; - } - if (read_result.packet_info.peer_address() != - expected_target_server_address) { - QUIC_DLOG(ERROR) << "Ignoring UDP packet on fd " << fd - << " from unexpected server address " - << read_result.packet_info.peer_address() - << " (expected " << expected_target_server_address - << ")"; - continue; - } - if (!connection()->connected()) { - QUIC_BUG(quic_bug_10974_3) - << "Unexpected incoming UDP packet on fd " << fd << " from " - << expected_target_server_address - << " because MASQUE connection is closed"; - return; - } - // The packet is valid, send it to the client in a DATAGRAM frame. - MessageStatus message_status = - it->stream()->SendHttp3Datagram(absl::string_view( - packet_buffer, read_result.packet_buffer.buffer_len + 1)); - QUIC_DVLOG(1) << "Sent UDP packet from " << expected_target_server_address - << " of length " << read_result.packet_buffer.buffer_len - << " with stream ID " << it->stream()->id() - << " and got message status " - << MessageStatusToString(message_status); + if (!read_result.packet_info.HasValue(QuicUdpPacketInfoBit::PEER_ADDRESS)) { + QUIC_BUG(MasqueServerSession_HandleConnectUdpSocketEvent_MissingPeer) + << "Missing peer address when reading from fd " << fd; + continue; } - } while (false); - - do { // CONNECT-IP - auto it = absl::c_find_if(connect_ip_server_states_, - [fd](const ConnectIpServerState& connect_ip) { - return connect_ip.fd() == fd; - }); - if (it == connect_ip_server_states_.end()) { + if (read_result.packet_info.peer_address() != + expected_target_server_address) { + QUIC_DLOG(ERROR) << "Ignoring UDP packet on fd " << fd + << " from unexpected server address " + << read_result.packet_info.peer_address() + << " (expected " << expected_target_server_address + << ")"; + continue; + } + if (!connection()->connected()) { + QUIC_BUG(MasqueServerSession_HandleConnectUdpSocketEvent_ConnectionClosed) + << "Unexpected incoming UDP packet on fd " << fd << " from " + << expected_target_server_address + << " because MASQUE connection is closed"; break; } - char datagram[1501]; - datagram[0] = 0; // Context ID. - while (true) { - ssize_t read_size = read(fd, datagram + 1, sizeof(datagram) - 1); - if (read_size < 0) { - break; - } - MessageStatus message_status = it->stream()->SendHttp3Datagram( - absl::string_view(datagram, 1 + read_size)); - QUIC_DVLOG(1) << "Encapsulated IP packet of length " << read_size - << " with stream ID " << it->stream()->id() - << " and got message status " - << MessageStatusToString(message_status); - } - return; - } while (false); + // The packet is valid, send it to the client in a DATAGRAM frame. + MessageStatus message_status = + it->stream()->SendHttp3Datagram(absl::string_view( + packet_buffer, read_result.packet_buffer.buffer_len + 1)); + QUIC_DVLOG(1) << "Sent UDP packet from " << expected_target_server_address + << " of length " << read_result.packet_buffer.buffer_len + << " with stream ID " << it->stream()->id() + << " and got message status " + << MessageStatusToString(message_status); + } + return true; +} - QUIC_BUG(quic_bug_10974_1) - << "Got unexpected event mask " << events << " on unknown fd " << fd; - std::move(rearm).Cancel(); +bool MasqueServerSession::HandleConnectIpSocketEvent( + QuicUdpSocketFd fd, QuicSocketEventMask events) { + auto it = absl::c_find_if(connect_ip_server_states_, + [fd](const ConnectIpServerState& connect_ip) { + return connect_ip.fd() == fd; + }); + if (it == connect_ip_server_states_.end()) { + return false; + } + QUIC_DVLOG(1) << "Received readable event on fd " << fd << " (mask " << events + << ") stream ID " << it->stream()->id(); + char datagram[1501]; + datagram[0] = 0; // Context ID. + while (true) { + ssize_t read_size = read(fd, datagram + 1, sizeof(datagram) - 1); + if (read_size < 0) { + break; + } + MessageStatus message_status = it->stream()->SendHttp3Datagram( + absl::string_view(datagram, 1 + read_size)); + QUIC_DVLOG(1) << "Encapsulated IP packet of length " << read_size + << " with stream ID " << it->stream()->id() + << " and got message status " + << MessageStatusToString(message_status); + } + return true; } bool MasqueServerSession::OnSettingsFrame(const SettingsFrame& frame) {
diff --git a/quiche/quic/masque/masque_server_session.h b/quiche/quic/masque/masque_server_session.h index 2dbed18..4b5ad94 100644 --- a/quiche/quic/masque/masque_server_session.h +++ b/quiche/quic/masque/masque_server_session.h
@@ -55,6 +55,11 @@ QuicEventLoop* event_loop() const { return event_loop_; } private: + bool HandleConnectUdpSocketEvent(QuicUdpSocketFd fd, + QuicSocketEventMask events); + bool HandleConnectIpSocketEvent(QuicUdpSocketFd fd, + QuicSocketEventMask events); + // State that the MasqueServerSession keeps for each CONNECT-UDP request. class QUIC_NO_EXPORT ConnectUdpServerState : public QuicSpdyStream::Http3DatagramVisitor {