Revert "Refactor AsyncTcpSocket(s) to use rtc::ReceivedPackets"

This reverts commit 211daadb66.

Reason for revert: AsyncStunTCPSocket::ProcessInput , Bug introduced, not reading length of each stun message in a tcp fetch

Original change's description:
> Refactor AsyncTcpSocket(s) to use rtc::ReceivedPackets
>
> Instead of using raw pointers.
>
> Bug: webrtc:15368, webrtc:11943
> Change-Id: Id28a0a4fc3d00680e972bd95e0c60344c7886892
> Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/328500
> Reviewed-by: Harald Alvestrand <hta@webrtc.org>
> Commit-Queue: Per Kjellander <perkj@webrtc.org>
> Cr-Commit-Position: refs/heads/main@{#41237}

Bug: webrtc:15368, webrtc:11943
Change-Id: Id15261579a61dd200e7c3b1a013877575b87db2e
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/328760
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Reviewed-by: Per Kjellander <perkj@webrtc.org>
Commit-Queue: Per Kjellander <perkj@webrtc.org>
Bot-Commit: rubber-stamper@appspot.gserviceaccount.com <rubber-stamper@appspot.gserviceaccount.com>
Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#41245}
This commit is contained in:
Per Kjellander 2023-11-27 08:12:01 +00:00 committed by WebRTC LUCI CQ
parent d0f0f38f72
commit 264547d084
5 changed files with 41 additions and 54 deletions

View file

@ -14,15 +14,9 @@
#include <stdint.h>
#include <string.h>
#include <cstddef>
#include <cstdint>
#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<int>(cb);
}
size_t AsyncStunTCPSocket::ProcessInput(rtc::ArrayView<const uint8_t> 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<const uint8_t> 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);
}
}
}

View file

@ -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<const uint8_t> data) override;
void ProcessInput(char* data, size_t* len) override;
private:
// This method returns the message hdr + length written in the header.

View file

@ -19,7 +19,6 @@
#include <utility>
#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<const char*>(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) {

View file

@ -14,8 +14,6 @@
#include <string.h>
#include <algorithm>
#include <cstddef>
#include <cstdint>
#include <memory>
#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<char>(), &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<int>(cb);
}
size_t AsyncTCPSocket::ProcessInput(rtc::ArrayView<const uint8_t> 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);
}
}
}

View file

@ -16,7 +16,6 @@
#include <cstdint>
#include <memory>
#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<const uint8_t> 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<const uint8_t>) override;
void ProcessInput(char* data, size_t* len) override;
};
class AsyncTcpListenSocket : public AsyncListenSocket {