Index: webrtc/media/sctp/sctpdataengine.cc |
diff --git a/webrtc/media/sctp/sctpdataengine.cc b/webrtc/media/sctp/sctpdataengine.cc |
index ce0f91ae3919c0d50059c438154f0374ed75c02d..ba3b8f2408444e590510a58391b5e3e6f4b9a5ec 100644 |
--- a/webrtc/media/sctp/sctpdataengine.cc |
+++ b/webrtc/media/sctp/sctpdataengine.cc |
@@ -19,7 +19,7 @@ |
#include "usrsctplib/usrsctp.h" |
#include "webrtc/base/arraysize.h" |
-#include "webrtc/base/buffer.h" |
+#include "webrtc/base/copyonwritebuffer.h" |
#include "webrtc/base/helpers.h" |
#include "webrtc/base/logging.h" |
#include "webrtc/base/safe_conversions.h" |
@@ -89,7 +89,7 @@ std::string ListArray(const uint16_t* array, int num_elems) { |
namespace cricket { |
typedef rtc::ScopedMessageData<SctpInboundPacket> InboundPacketMessage; |
-typedef rtc::ScopedMessageData<rtc::Buffer> OutboundPacketMessage; |
+typedef rtc::ScopedMessageData<rtc::CopyOnWriteBuffer> OutboundPacketMessage; |
// The biggest SCTP packet. Starting from a 'safe' wire MTU value of 1280, |
// take off 80 bytes for DTLS/TURN/TCP/IP overhead. |
@@ -103,7 +103,7 @@ enum { |
}; |
struct SctpInboundPacket { |
- rtc::Buffer buffer; |
+ rtc::CopyOnWriteBuffer buffer; |
ReceiveDataParams params; |
// The |flags| parameter is used by SCTP to distinguish notification packets |
// from other types of packets. |
@@ -165,11 +165,14 @@ static bool GetDataMediaType( |
} |
// Log the packet in text2pcap format, if log level is at LS_VERBOSE. |
-static void VerboseLogPacket(void *data, size_t length, int direction) { |
+static void VerboseLogPacket(const void *data, size_t length, int direction) { |
if (LOG_CHECK_LEVEL(LS_VERBOSE) && length > 0) { |
char *dump_buf; |
+ // Some downstream project uses an older version of usrsctp that expects |
+ // a non-const "void*" as first parameter when dumping the packet, so we |
+ // need to cast the const away here to avoid a compiler error. |
if ((dump_buf = usrsctp_dumppacket( |
- data, length, direction)) != NULL) { |
+ const_cast<void*>(data), length, direction)) != NULL) { |
joachim
2016/03/20 10:14:10
This is the change compared to https://codereview.
|
LOG(LS_VERBOSE) << dump_buf; |
usrsctp_freedumpbuffer(dump_buf); |
} |
@@ -189,7 +192,7 @@ static int OnSctpOutboundPacket(void* addr, void* data, size_t length, |
VerboseLogPacket(addr, length, SCTP_DUMP_OUTBOUND); |
// Note: We have to copy the data; the caller will delete it. |
auto* msg = new OutboundPacketMessage( |
- new rtc::Buffer(reinterpret_cast<uint8_t*>(data), length)); |
+ new rtc::CopyOnWriteBuffer(reinterpret_cast<uint8_t*>(data), length)); |
channel->worker_thread()->Post(channel, MSG_SCTPOUTBOUNDPACKET, msg); |
return 0; |
} |
@@ -581,7 +584,7 @@ bool SctpDataMediaChannel::RemoveRecvStream(uint32_t ssrc) { |
bool SctpDataMediaChannel::SendData( |
const SendDataParams& params, |
- const rtc::Buffer& payload, |
+ const rtc::CopyOnWriteBuffer& payload, |
SendDataResult* result) { |
if (result) { |
// Preset |result| to assume an error. If SendData succeeds, we'll |
@@ -651,7 +654,7 @@ bool SctpDataMediaChannel::SendData( |
// Called by network interface when a packet has been received. |
void SctpDataMediaChannel::OnPacketReceived( |
- rtc::Buffer* packet, const rtc::PacketTime& packet_time) { |
+ rtc::CopyOnWriteBuffer* packet, const rtc::PacketTime& packet_time) { |
RTC_DCHECK(rtc::Thread::Current() == worker_thread_); |
LOG(LS_VERBOSE) << debug_name_ << "->OnPacketReceived(...): " |
<< " length=" << packet->size() << ", sending: " << sending_; |
@@ -663,8 +666,8 @@ void SctpDataMediaChannel::OnPacketReceived( |
// Pass received packet to SCTP stack. Once processed by usrsctp, the data |
// will be will be given to the global OnSctpInboundData, and then, |
// marshalled by a Post and handled with OnMessage. |
- VerboseLogPacket(packet->data(), packet->size(), SCTP_DUMP_INBOUND); |
- usrsctp_conninput(this, packet->data(), packet->size(), 0); |
+ VerboseLogPacket(packet->cdata(), packet->size(), SCTP_DUMP_INBOUND); |
+ usrsctp_conninput(this, packet->cdata(), packet->size(), 0); |
} else { |
// TODO(ldixon): Consider caching the packet for very slightly better |
// reliability. |
@@ -686,25 +689,25 @@ void SctpDataMediaChannel::OnInboundPacketFromSctpToChannel( |
return; |
} |
if (packet->flags & MSG_NOTIFICATION) { |
- OnNotificationFromSctp(&packet->buffer); |
+ OnNotificationFromSctp(packet->buffer); |
} else { |
- OnDataFromSctpToChannel(packet->params, &packet->buffer); |
+ OnDataFromSctpToChannel(packet->params, packet->buffer); |
} |
} |
void SctpDataMediaChannel::OnDataFromSctpToChannel( |
- const ReceiveDataParams& params, rtc::Buffer* buffer) { |
+ const ReceiveDataParams& params, const rtc::CopyOnWriteBuffer& buffer) { |
if (receiving_) { |
LOG(LS_VERBOSE) << debug_name_ << "->OnDataFromSctpToChannel(...): " |
- << "Posting with length: " << buffer->size() |
+ << "Posting with length: " << buffer.size() |
<< " on stream " << params.ssrc; |
// Reports all received messages to upper layers, no matter whether the sid |
// is known. |
- SignalDataReceived(params, buffer->data<char>(), buffer->size()); |
+ SignalDataReceived(params, buffer.data<char>(), buffer.size()); |
} else { |
LOG(LS_WARNING) << debug_name_ << "->OnDataFromSctpToChannel(...): " |
<< "Not receiving packet with sid=" << params.ssrc |
- << " len=" << buffer->size() << " before SetReceive(true)."; |
+ << " len=" << buffer.size() << " before SetReceive(true)."; |
} |
} |
@@ -767,10 +770,11 @@ bool SctpDataMediaChannel::ResetStream(uint32_t ssrc) { |
return true; |
} |
-void SctpDataMediaChannel::OnNotificationFromSctp(rtc::Buffer* buffer) { |
+void SctpDataMediaChannel::OnNotificationFromSctp( |
+ const rtc::CopyOnWriteBuffer& buffer) { |
const sctp_notification& notification = |
- reinterpret_cast<const sctp_notification&>(*buffer->data()); |
- ASSERT(notification.sn_header.sn_length == buffer->size()); |
+ reinterpret_cast<const sctp_notification&>(*buffer.data()); |
+ ASSERT(notification.sn_header.sn_length == buffer.size()); |
// TODO(ldixon): handle notifications appropriately. |
switch (notification.sn_header.sn_type) { |
@@ -963,7 +967,7 @@ bool SctpDataMediaChannel::SetRecvCodecs(const std::vector<DataCodec>& codecs) { |
} |
void SctpDataMediaChannel::OnPacketFromSctpToNetwork( |
- rtc::Buffer* buffer) { |
+ rtc::CopyOnWriteBuffer* buffer) { |
// usrsctp seems to interpret the MTU we give it strangely -- it seems to |
// give us back packets bigger than that MTU, if only by a fixed amount. |
// This is that amount that we've observed. |