Instead there are direct member variables for the various relevant states, some weren't needed, some can be const but the `id` member in particular needs special handling and can't be const. For dealing with the stream id, we now have SctpSid. A class that does range validation, checks thread safety, handles the special `-1` case (for what's essentially an unsigned 16 bit int). Using a special type for this also has the effect that range checking happens more consistently (although I'm not modifying the structs in api/). With upcoming steps of avoiding thread hops, the ID may need to migrate to the network thread, which the thread checks will help with. Along the way, update SctpSidAllocator to use flat_set instead of std::set and moving some of the sctp data channel code to the cc file to help with more accurately tracking code coverage. Bug: webrtc:11547 Change-Id: Iea6e7647ab8f93052044c5afbcc449115206b4e9 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/296444 Commit-Queue: Tomas Gunnarsson <tommi@webrtc.org> Reviewed-by: Harald Alvestrand <hta@webrtc.org> Cr-Commit-Position: refs/heads/main@{#39539}
91 lines
3.5 KiB
C++
91 lines
3.5 KiB
C++
/*
|
|
* Copyright 2013 The WebRTC project authors. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
|
|
#ifndef PC_SCTP_UTILS_H_
|
|
#define PC_SCTP_UTILS_H_
|
|
|
|
#include <string>
|
|
|
|
#include "api/data_channel_interface.h"
|
|
#include "api/sequence_checker.h"
|
|
#include "api/transport/data_channel_transport_interface.h"
|
|
#include "media/base/media_channel.h"
|
|
#include "net/dcsctp/public/types.h"
|
|
#include "rtc_base/copy_on_write_buffer.h"
|
|
#include "rtc_base/ssl_stream_adapter.h" // For SSLRole
|
|
#include "rtc_base/system/no_unique_address.h"
|
|
|
|
namespace rtc {
|
|
class CopyOnWriteBuffer;
|
|
} // namespace rtc
|
|
|
|
namespace webrtc {
|
|
struct DataChannelInit;
|
|
|
|
// Wraps the `uint16_t` sctp data channel stream id value and does range
|
|
// checking. The class interface is `int` based to ease with DataChannelInit
|
|
// compatibility and types used in `DataChannelController`'s interface. Going
|
|
// forward, `int` compatibility won't be needed and we can either just use
|
|
// this class or the internal dcsctp::StreamID type.
|
|
class StreamId {
|
|
public:
|
|
StreamId();
|
|
explicit StreamId(int id);
|
|
explicit StreamId(const StreamId& sid);
|
|
|
|
// Returns `true` if a valid stream id is contained, in the range of
|
|
// kMinSctpSid - kSpecMaxSctpSid ([0..0xffff]). Note that this
|
|
// is different than having `kMaxSctpSid` as the upper bound, which is
|
|
// the limit that is internally used by `SctpSidAllocator`. Sid values may
|
|
// be assigned to `StreamId` outside of `SctpSidAllocator` and have a higher
|
|
// id value than supplied by `SctpSidAllocator`, yet is still valid.
|
|
bool HasValue() const;
|
|
|
|
// Provided for compatibility with existing code that hasn't been updated
|
|
// to use `StreamId` directly. New code should not use 'int' for the stream
|
|
// id but rather `StreamId` directly.
|
|
int stream_id_int() const;
|
|
void reset();
|
|
|
|
StreamId& operator=(const StreamId& sid);
|
|
bool operator==(const StreamId& sid) const;
|
|
bool operator<(const StreamId& sid) const;
|
|
bool operator!=(const StreamId& sid) const { return !(operator==(sid)); }
|
|
|
|
private:
|
|
RTC_NO_UNIQUE_ADDRESS webrtc::SequenceChecker thread_checker_;
|
|
absl::optional<dcsctp::StreamID> id_ RTC_GUARDED_BY(thread_checker_);
|
|
};
|
|
|
|
// Read the message type and return true if it's an OPEN message.
|
|
bool IsOpenMessage(const rtc::CopyOnWriteBuffer& payload);
|
|
|
|
bool ParseDataChannelOpenMessage(const rtc::CopyOnWriteBuffer& payload,
|
|
std::string* label,
|
|
DataChannelInit* config);
|
|
|
|
bool ParseDataChannelOpenAckMessage(const rtc::CopyOnWriteBuffer& payload);
|
|
|
|
bool WriteDataChannelOpenMessage(const std::string& label,
|
|
const std::string& protocol,
|
|
absl::optional<Priority> priority,
|
|
bool ordered,
|
|
absl::optional<int> max_retransmits,
|
|
absl::optional<int> max_retransmit_time,
|
|
rtc::CopyOnWriteBuffer* payload);
|
|
bool WriteDataChannelOpenMessage(const std::string& label,
|
|
const DataChannelInit& config,
|
|
rtc::CopyOnWriteBuffer* payload);
|
|
void WriteDataChannelOpenAckMessage(rtc::CopyOnWriteBuffer* payload);
|
|
|
|
} // namespace webrtc
|
|
|
|
#endif // PC_SCTP_UTILS_H_
|