masque_sever_session: unnest different MASQUE implementations
This puts all current and future MASQUE implementations on equal
footing and makes it easier to refactor those implementation into
different functions later.
PiperOrigin-RevId: 530397999
diff --git a/quiche/quic/masque/masque_server_session.cc b/quiche/quic/masque/masque_server_session.cc
index 493b9f6..5d51677 100644
--- a/quiche/quic/masque/masque_server_session.cc
+++ b/quiche/quic/masque/masque_server_session.cc
@@ -323,44 +323,6 @@
QUIC_DVLOG(1) << "Ignoring OnEvent fd " << fd << " event mask " << events;
return;
}
- 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()) {
- auto it2 = absl::c_find_if(connect_ip_server_states_,
- [fd](const ConnectIpServerState& connect_ip) {
- return connect_ip.fd() == fd;
- });
- if (it2 == connect_ip_server_states_.end()) {
- QUIC_BUG(quic_bug_10974_1)
- << "Got unexpected event mask " << events << " on unknown fd " << fd;
- return;
- }
-
- 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 = it2->stream()->SendHttp3Datagram(
- absl::string_view(datagram, 1 + read_size));
- QUIC_DVLOG(1) << "Encapsulated IP packet of length " << read_size
- << " with stream ID " << it2->stream()->id()
- << " and got message status "
- << MessageStatusToString(message_status);
- }
- if (!event_loop_->SupportsEdgeTriggered()) {
- if (!event_loop_->RearmSocket(fd, kSocketEventReadable)) {
- QUIC_BUG(MasqueServerSession_ConnectIp_OnSocketEvent_Rearm)
- << "Failed to re-arm socket " << fd << " for reading";
- }
- }
-
- return;
- }
auto rearm = absl::MakeCleanup([&]() {
if (!event_loop_->SupportsEdgeTriggered()) {
@@ -371,57 +333,97 @@
}
});
- 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.
+ 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()) {
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;
+ 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.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;
+ } 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()) {
+ break;
}
- 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;
+ 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);
}
- // 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;
+ } while (false);
+
+ QUIC_BUG(quic_bug_10974_1)
+ << "Got unexpected event mask " << events << " on unknown fd " << fd;
+ std::move(rearm).Cancel();
}
bool MasqueServerSession::OnSettingsFrame(const SettingsFrame& frame) {