diff --git a/p2p/base/async_stun_tcp_socket.cc b/p2p/base/async_stun_tcp_socket.cc index 4f07676d26..4a35903dfe 100644 --- a/p2p/base/async_stun_tcp_socket.cc +++ b/p2p/base/async_stun_tcp_socket.cc @@ -14,15 +14,9 @@ #include #include -#include -#include - -#include "api/array_view.h" #include "api/transport/stun.h" -#include "api/units/timestamp.h" #include "rtc_base/byte_order.h" #include "rtc_base/checks.h" -#include "rtc_base/network/received_packet.h" #include "rtc_base/network/sent_packet.h" #include "rtc_base/time_utils.h" @@ -95,7 +89,7 @@ int AsyncStunTCPSocket::Send(const void* pv, return static_cast(cb); } -size_t AsyncStunTCPSocket::ProcessInput(rtc::ArrayView data) { +void AsyncStunTCPSocket::ProcessInput(char* data, size_t* len) { rtc::SocketAddress remote_addr(GetRemoteAddress()); // STUN packet - First 4 bytes. Total header size is 20 bytes. // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -107,26 +101,26 @@ size_t AsyncStunTCPSocket::ProcessInput(rtc::ArrayView data) { // | Channel Number | Length | // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - size_t processed_bytes = 0; while (true) { // We need at least 4 bytes to read the STUN or ChannelData packet length. - if (data.size() - processed_bytes < kPacketLenOffset + kPacketLenSize) - return processed_bytes; + if (*len < kPacketLenOffset + kPacketLenSize) + return; int pad_bytes; - size_t expected_pkt_len = - GetExpectedLength(data.data(), data.size(), &pad_bytes); + size_t expected_pkt_len = GetExpectedLength(data, *len, &pad_bytes); size_t actual_length = expected_pkt_len + pad_bytes; - if (data.size() - processed_bytes < actual_length) { - return processed_bytes; + if (*len < actual_length) { + return; } - rtc::ReceivedPacket received_packet( - data.subview(processed_bytes, expected_pkt_len), remote_addr, - webrtc::Timestamp::Micros(rtc::TimeMicros())); - NotifyPacketReceived(received_packet); - processed_bytes += actual_length; + SignalReadPacket(this, data, expected_pkt_len, remote_addr, + rtc::TimeMicros()); + + *len -= actual_length; + if (*len > 0) { + memmove(data, data + actual_length, *len); + } } } diff --git a/p2p/base/async_stun_tcp_socket.h b/p2p/base/async_stun_tcp_socket.h index 2c43d554fe..f0df42b52a 100644 --- a/p2p/base/async_stun_tcp_socket.h +++ b/p2p/base/async_stun_tcp_socket.h @@ -37,7 +37,7 @@ class AsyncStunTCPSocket : public rtc::AsyncTCPSocketBase { int Send(const void* pv, size_t cb, const rtc::PacketOptions& options) override; - size_t ProcessInput(rtc::ArrayView data) override; + void ProcessInput(char* data, size_t* len) override; private: // This method returns the message hdr + length written in the header. diff --git a/p2p/base/async_stun_tcp_socket_unittest.cc b/p2p/base/async_stun_tcp_socket_unittest.cc index 4e29f010c4..72d6a7fde0 100644 --- a/p2p/base/async_stun_tcp_socket_unittest.cc +++ b/p2p/base/async_stun_tcp_socket_unittest.cc @@ -19,7 +19,6 @@ #include #include "absl/memory/memory.h" -#include "rtc_base/network/received_packet.h" #include "rtc_base/network/sent_packet.h" #include "rtc_base/socket.h" #include "rtc_base/third_party/sigslot/sigslot.h" @@ -97,10 +96,11 @@ class AsyncStunTCPSocketTest : public ::testing::Test, } void OnReadPacket(rtc::AsyncPacketSocket* socket, - const rtc::ReceivedPacket& packet) { - recv_packets_.push_back( - std::string(reinterpret_cast(packet.payload().data()), - packet.payload().size())); + const char* data, + size_t len, + const rtc::SocketAddress& remote_addr, + const int64_t& /* packet_time_us */) { + recv_packets_.push_back(std::string(data, len)); } void OnSentPacket(rtc::AsyncPacketSocket* socket, @@ -111,10 +111,8 @@ class AsyncStunTCPSocketTest : public ::testing::Test, void OnNewConnection(rtc::AsyncListenSocket* /*server*/, rtc::AsyncPacketSocket* new_socket) { recv_socket_ = absl::WrapUnique(new_socket); - new_socket->RegisterReceivedPacketCallback( - [&](rtc::AsyncPacketSocket* socket, const rtc::ReceivedPacket& packet) { - OnReadPacket(socket, packet); - }); + new_socket->SignalReadPacket.connect(this, + &AsyncStunTCPSocketTest::OnReadPacket); } bool Send(const void* data, size_t len) { diff --git a/rtc_base/async_tcp_socket.cc b/rtc_base/async_tcp_socket.cc index d51f78ce83..eed4a31c38 100644 --- a/rtc_base/async_tcp_socket.cc +++ b/rtc_base/async_tcp_socket.cc @@ -14,8 +14,6 @@ #include #include -#include -#include #include #include "api/array_view.h" @@ -211,17 +209,15 @@ void AsyncTCPSocketBase::OnReadEvent(Socket* socket) { return; } - size_t processed = ProcessInput(inbuf_); - size_t bytes_remaining = inbuf_.size() - processed; - if (processed > inbuf_.size()) { + size_t size = inbuf_.size(); + ProcessInput(inbuf_.data(), &size); + + if (size > inbuf_.size()) { RTC_LOG(LS_ERROR) << "input buffer overflow"; RTC_DCHECK_NOTREACHED(); inbuf_.Clear(); } else { - if (bytes_remaining > 0) { - memmove(inbuf_.data(), inbuf_.data() + processed, bytes_remaining); - } - inbuf_.SetSize(bytes_remaining); + inbuf_.SetSize(size); } } @@ -287,23 +283,24 @@ int AsyncTCPSocket::Send(const void* pv, return static_cast(cb); } -size_t AsyncTCPSocket::ProcessInput(rtc::ArrayView data) { +void AsyncTCPSocket::ProcessInput(char* data, size_t* len) { SocketAddress remote_addr(GetRemoteAddress()); - size_t processed_bytes = 0; while (true) { - if (data.size() - processed_bytes < kPacketLenSize) - return processed_bytes; + if (*len < kPacketLenSize) + return; - PacketLength pkt_len = rtc::GetBE16(data.data()); - if (data.size() - processed_bytes < kPacketLenSize + pkt_len) - return processed_bytes; + PacketLength pkt_len = rtc::GetBE16(data); + if (*len < kPacketLenSize + pkt_len) + return; - rtc::ReceivedPacket received_packet( - data.subview(processed_bytes + kPacketLenSize, pkt_len), remote_addr, - webrtc::Timestamp::Micros(rtc::TimeMicros())); - NotifyPacketReceived(received_packet); - processed_bytes += kPacketLenSize + pkt_len; + NotifyPacketReceived(rtc::ReceivedPacket::CreateFromLegacy( + data + kPacketLenSize, pkt_len, rtc::TimeMicros(), remote_addr)); + + *len -= kPacketLenSize + pkt_len; + if (*len > 0) { + memmove(data, data + kPacketLenSize + pkt_len, *len); + } } } diff --git a/rtc_base/async_tcp_socket.h b/rtc_base/async_tcp_socket.h index d3aff60520..90f77d618e 100644 --- a/rtc_base/async_tcp_socket.h +++ b/rtc_base/async_tcp_socket.h @@ -16,7 +16,6 @@ #include #include -#include "api/array_view.h" #include "rtc_base/async_packet_socket.h" #include "rtc_base/buffer.h" #include "rtc_base/socket.h" @@ -39,8 +38,7 @@ class AsyncTCPSocketBase : public AsyncPacketSocket { int Send(const void* pv, size_t cb, const rtc::PacketOptions& options) override = 0; - // Must return the number of bytes processed. - virtual size_t ProcessInput(rtc::ArrayView data) = 0; + virtual void ProcessInput(char* data, size_t* len) = 0; SocketAddress GetLocalAddress() const override; SocketAddress GetRemoteAddress() const override; @@ -102,7 +100,7 @@ class AsyncTCPSocket : public AsyncTCPSocketBase { int Send(const void* pv, size_t cb, const rtc::PacketOptions& options) override; - size_t ProcessInput(rtc::ArrayView) override; + void ProcessInput(char* data, size_t* len) override; }; class AsyncTcpListenSocket : public AsyncListenSocket {