Adopt StreamId in SctpDataChannelControllerInterface

Bug: webrtc:11547
Change-Id: Iea2d706228b5a533eb7fae84613462165d7c9b54
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/298300
Auto-Submit: Tomas Gunnarsson <tommi@webrtc.org>
Reviewed-by: Danil Chapovalov <danilchap@webrtc.org>
Commit-Queue: Tomas Gunnarsson <tommi@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#39618}
diff --git a/pc/BUILD.gn b/pc/BUILD.gn
index 812df05..7e07843 100644
--- a/pc/BUILD.gn
+++ b/pc/BUILD.gn
@@ -517,7 +517,6 @@
   deps = [
     "../api:libjingle_peerconnection_api",
     "../api:priority",
-    "../api:sequence_checker",
     "../api/transport:datagram_transport_interface",
     "../media:media_channel",
     "../media:rtc_data_sctp_transport_internal",
@@ -527,7 +526,6 @@
     "../rtc_base:copy_on_write_buffer",
     "../rtc_base:logging",
     "../rtc_base:ssl",
-    "../rtc_base/system:no_unique_address",
   ]
   absl_deps = [ "//third_party/abseil-cpp/absl/types:optional" ]
 }
diff --git a/pc/data_channel_controller.cc b/pc/data_channel_controller.cc
index 23e7a14..e307418 100644
--- a/pc/data_channel_controller.cc
+++ b/pc/data_channel_controller.cc
@@ -33,7 +33,7 @@
   return has_used_data_channels_;
 }
 
-bool DataChannelController::SendData(int sid,
+bool DataChannelController::SendData(StreamId sid,
                                      const SendDataParams& params,
                                      const rtc::CopyOnWriteBuffer& payload,
                                      cricket::SendDataResult* result) {
@@ -43,21 +43,21 @@
   return false;
 }
 
-void DataChannelController::AddSctpDataStream(int sid) {
+void DataChannelController::AddSctpDataStream(StreamId sid) {
   if (data_channel_transport()) {
     network_thread()->BlockingCall([this, sid] {
       if (data_channel_transport()) {
-        data_channel_transport()->OpenChannel(sid);
+        data_channel_transport()->OpenChannel(sid.stream_id_int());
       }
     });
   }
 }
 
-void DataChannelController::RemoveSctpDataStream(int sid) {
+void DataChannelController::RemoveSctpDataStream(StreamId sid) {
   if (data_channel_transport()) {
     network_thread()->BlockingCall([this, sid] {
       if (data_channel_transport()) {
-        data_channel_transport()->CloseChannel(sid);
+        data_channel_transport()->CloseChannel(sid.stream_id_int());
       }
     });
   }
@@ -375,7 +375,7 @@
 }
 
 bool DataChannelController::DataChannelSendData(
-    int sid,
+    StreamId sid,
     const SendDataParams& params,
     const rtc::CopyOnWriteBuffer& payload,
     cricket::SendDataResult* result) {
@@ -386,7 +386,8 @@
   RTC_DCHECK(data_channel_transport());
 
   RTCError error = network_thread()->BlockingCall([this, sid, params, payload] {
-    return data_channel_transport()->SendData(sid, params, payload);
+    return data_channel_transport()->SendData(sid.stream_id_int(), params,
+                                              payload);
   });
 
   if (error.ok()) {
diff --git a/pc/data_channel_controller.h b/pc/data_channel_controller.h
index 4dc1d97..936f9d5 100644
--- a/pc/data_channel_controller.h
+++ b/pc/data_channel_controller.h
@@ -47,12 +47,12 @@
 
   // Implements
   // SctpDataChannelProviderInterface.
-  bool SendData(int sid,
+  bool SendData(StreamId sid,
                 const SendDataParams& params,
                 const rtc::CopyOnWriteBuffer& payload,
                 cricket::SendDataResult* result) override;
-  void AddSctpDataStream(int sid) override;
-  void RemoveSctpDataStream(int sid) override;
+  void AddSctpDataStream(StreamId sid) override;
+  void RemoveSctpDataStream(StreamId sid) override;
   bool ReadyToSendData() const override;
   void OnChannelStateChanged(SctpDataChannel* channel,
                              DataChannelInterface::DataState state) override;
@@ -124,7 +124,7 @@
       RTC_RUN_ON(signaling_thread());
 
   // Called from SendData when data_channel_transport() is true.
-  bool DataChannelSendData(int sid,
+  bool DataChannelSendData(StreamId sid,
                            const SendDataParams& params,
                            const rtc::CopyOnWriteBuffer& payload,
                            cricket::SendDataResult* result);
diff --git a/pc/data_channel_unittest.cc b/pc/data_channel_unittest.cc
index 265340f..4eeeac1 100644
--- a/pc/data_channel_unittest.cc
+++ b/pc/data_channel_unittest.cc
@@ -134,12 +134,10 @@
 
   EXPECT_TRUE(controller_->IsConnected(dc.get()));
   // The sid is not set yet, so it should not have added the streams.
-  EXPECT_FALSE(controller_->IsSendStreamAdded(dc->id()));
-  EXPECT_FALSE(controller_->IsRecvStreamAdded(dc->id()));
+  EXPECT_FALSE(controller_->IsStreamAdded(dc->sid()));
 
   dc->SetSctpSid(StreamId(0));
-  EXPECT_TRUE(controller_->IsSendStreamAdded(dc->id()));
-  EXPECT_TRUE(controller_->IsRecvStreamAdded(dc->id()));
+  EXPECT_TRUE(controller_->IsStreamAdded(dc->sid()));
 }
 
 // Tests the state of the data channel.
diff --git a/pc/sctp_data_channel.cc b/pc/sctp_data_channel.cc
index 34bc909..5c534c9 100644
--- a/pc/sctp_data_channel.cc
+++ b/pc/sctp_data_channel.cc
@@ -211,7 +211,7 @@
   // Try to connect to the transport in case the transport channel already
   // exists.
   if (id_.HasValue()) {
-    controller_->AddSctpDataStream(id_.stream_id_int());
+    controller_->AddSctpDataStream(id_);
   }
 }
 
@@ -370,7 +370,7 @@
   RTC_DCHECK_EQ(state_, kConnecting);
 
   id_ = sid;
-  controller_->AddSctpDataStream(sid.stream_id_int());
+  controller_->AddSctpDataStream(sid);
 }
 
 void SctpDataChannel::OnClosingProcedureStartedRemotely() {
@@ -407,7 +407,7 @@
   // The sid may have been unassigned when controller_->ConnectDataChannel was
   // done. So always add the streams even if connected_to_transport_ is true.
   if (id_.HasValue()) {
-    controller_->AddSctpDataStream(id_.stream_id_int());
+    controller_->AddSctpDataStream(id_);
   }
 }
 
@@ -584,7 +584,7 @@
           // afterwards.
           if (!started_closing_procedure_ && controller_ && id_.HasValue()) {
             started_closing_procedure_ = true;
-            controller_->RemoveSctpDataStream(id_.stream_id_int());
+            controller_->RemoveSctpDataStream(id_);
           }
         }
       } else {
@@ -671,8 +671,8 @@
       buffer.binary ? DataMessageType::kBinary : DataMessageType::kText;
 
   cricket::SendDataResult send_result = cricket::SDR_SUCCESS;
-  bool success = controller_->SendData(id_.stream_id_int(), send_params,
-                                       buffer.data, &send_result);
+  bool success =
+      controller_->SendData(id_, send_params, buffer.data, &send_result);
 
   if (success) {
     ++messages_sent_;
@@ -749,8 +749,7 @@
   send_params.type = DataMessageType::kControl;
 
   cricket::SendDataResult send_result = cricket::SDR_SUCCESS;
-  bool retval = controller_->SendData(id_.stream_id_int(), send_params, buffer,
-                                      &send_result);
+  bool retval = controller_->SendData(id_, send_params, buffer, &send_result);
   if (retval) {
     RTC_DLOG(LS_VERBOSE) << "Sent CONTROL message on channel "
                          << id_.stream_id_int();
diff --git a/pc/sctp_data_channel.h b/pc/sctp_data_channel.h
index 628a905..e813f2b 100644
--- a/pc/sctp_data_channel.h
+++ b/pc/sctp_data_channel.h
@@ -39,15 +39,15 @@
 class SctpDataChannelControllerInterface {
  public:
   // Sends the data to the transport.
-  virtual bool SendData(int sid,
+  virtual bool SendData(StreamId sid,
                         const SendDataParams& params,
                         const rtc::CopyOnWriteBuffer& payload,
                         cricket::SendDataResult* result) = 0;
   // Adds the data channel SID to the transport for SCTP.
-  virtual void AddSctpDataStream(int sid) = 0;
+  virtual void AddSctpDataStream(StreamId sid) = 0;
   // Begins the closing procedure by sending an outgoing stream reset. Still
   // need to wait for callbacks to tell when this completes.
-  virtual void RemoveSctpDataStream(int sid) = 0;
+  virtual void RemoveSctpDataStream(StreamId sid) = 0;
   // Returns true if the transport channel is ready to send data.
   virtual bool ReadyToSendData() const = 0;
   // Notifies the controller of state changes.
diff --git a/pc/sctp_utils.cc b/pc/sctp_utils.cc
index 3677a9a..54742c2 100644
--- a/pc/sctp_utils.cc
+++ b/pc/sctp_utils.cc
@@ -16,7 +16,6 @@
 
 #include "absl/types/optional.h"
 #include "api/priority.h"
-#include "media/sctp/sctp_transport_internal.h"
 #include "rtc_base/byte_buffer.h"
 #include "rtc_base/copy_on_write_buffer.h"
 #include "rtc_base/logging.h"
@@ -47,53 +46,6 @@
   DCO_PRIORITY_HIGH = 1024,
 };
 
-StreamId::StreamId() : id_(absl::nullopt) {
-  thread_checker_.Detach();
-}
-
-StreamId::StreamId(int id)
-    : id_(id >= cricket::kMinSctpSid && id <= cricket::kSpecMaxSctpSid
-              ? absl::optional<uint16_t>(static_cast<uint16_t>(id))
-              : absl::nullopt) {
-  thread_checker_.Detach();
-}
-
-StreamId::StreamId(const StreamId& sid) : id_(sid.id_) {}
-
-bool StreamId::HasValue() const {
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  return id_.has_value();
-}
-
-int StreamId::stream_id_int() const {
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  return id_.has_value() ? static_cast<int>(id_.value().value()) : -1;
-}
-
-void StreamId::reset() {
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  id_ = absl::nullopt;
-}
-
-StreamId& StreamId::operator=(const StreamId& sid) {
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  RTC_DCHECK_RUN_ON(&sid.thread_checker_);
-  id_ = sid.id_;
-  return *this;
-}
-
-bool StreamId::operator==(const StreamId& sid) const {
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  RTC_DCHECK_RUN_ON(&sid.thread_checker_);
-  return id_ == sid.id_;
-}
-
-bool StreamId::operator<(const StreamId& sid) const {
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  RTC_DCHECK_RUN_ON(&sid.thread_checker_);
-  return id_ < sid.id_;
-}
-
 bool IsOpenMessage(const rtc::CopyOnWriteBuffer& payload) {
   // Format defined at
   // https://www.rfc-editor.org/rfc/rfc8832#section-5.1
diff --git a/pc/sctp_utils.h b/pc/sctp_utils.h
index d0c66de..868a8be 100644
--- a/pc/sctp_utils.h
+++ b/pc/sctp_utils.h
@@ -14,13 +14,12 @@
 #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 "media/sctp/sctp_transport_internal.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;
@@ -36,9 +35,13 @@
 // this class or the internal dcsctp::StreamID type.
 class StreamId {
  public:
-  StreamId();
-  explicit StreamId(int id);
-  explicit StreamId(const StreamId& sid);
+  StreamId() = default;
+  explicit StreamId(int id)
+      : id_(id >= cricket::kMinSctpSid && id <= cricket::kSpecMaxSctpSid
+                ? absl::optional<uint16_t>(static_cast<uint16_t>(id))
+                : absl::nullopt) {}
+  StreamId(const StreamId& sid) = default;
+  StreamId& operator=(const StreamId& sid) = default;
 
   // Returns `true` if a valid stream id is contained, in the range of
   // kMinSctpSid - kSpecMaxSctpSid ([0..0xffff]). Note that this
@@ -46,22 +49,23 @@
   // 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;
+  bool HasValue() const { return id_.has_value(); }
 
   // 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();
+  int stream_id_int() const {
+    return id_.has_value() ? static_cast<int>(id_.value().value()) : -1;
+  }
 
-  StreamId& operator=(const StreamId& sid);
-  bool operator==(const StreamId& sid) const;
-  bool operator<(const StreamId& sid) const;
+  void reset() { id_ = absl::nullopt; }
+
+  bool operator==(const StreamId& sid) const { return id_ == sid.id_; }
+  bool operator<(const StreamId& sid) const { return id_ < sid.id_; }
   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_);
+  absl::optional<dcsctp::StreamID> id_;
 };
 
 // Read the message type and return true if it's an OPEN message.
diff --git a/pc/test/fake_data_channel_controller.h b/pc/test/fake_data_channel_controller.h
index 8cb8098..4801c19 100644
--- a/pc/test/fake_data_channel_controller.h
+++ b/pc/test/fake_data_channel_controller.h
@@ -44,7 +44,7 @@
     return channel;
   }
 
-  bool SendData(int sid,
+  bool SendData(webrtc::StreamId sid,
                 const webrtc::SendDataParams& params,
                 const rtc::CopyOnWriteBuffer& payload,
                 cricket::SendDataResult* result) override {
@@ -60,28 +60,26 @@
       return false;
     }
 
-    last_sid_ = sid;
+    last_sid_ = sid.stream_id_int();
     last_send_data_params_ = params;
     return true;
   }
 
-  void AddSctpDataStream(int sid) override {
-    RTC_CHECK(sid >= 0);
+  void AddSctpDataStream(webrtc::StreamId sid) override {
+    RTC_CHECK(sid.HasValue());
     if (!transport_available_) {
       return;
     }
-    send_ssrcs_.insert(sid);
-    recv_ssrcs_.insert(sid);
+    known_stream_ids_.insert(sid);
   }
 
-  void RemoveSctpDataStream(int sid) override {
-    RTC_CHECK(sid >= 0);
-    send_ssrcs_.erase(sid);
-    recv_ssrcs_.erase(sid);
+  void RemoveSctpDataStream(webrtc::StreamId sid) override {
+    RTC_CHECK(sid.HasValue());
+    known_stream_ids_.erase(sid);
     // Unlike the real SCTP transport, act like the closing procedure finished
     // instantly, doing the same snapshot thing as below.
     auto it = absl::c_find_if(connected_channels_,
-                              [&](const auto* c) { return c->id() == sid; });
+                              [&](const auto* c) { return c->sid() == sid; });
     // This path mimics the DCC's OnChannelClosed handler since the FDCC
     // (this class) doesn't have a transport that would do that.
     if (it != connected_channels_.end())
@@ -146,12 +144,8 @@
     return connected_channels_.find(data_channel) != connected_channels_.end();
   }
 
-  bool IsSendStreamAdded(uint32_t stream) const {
-    return send_ssrcs_.find(stream) != send_ssrcs_.end();
-  }
-
-  bool IsRecvStreamAdded(uint32_t stream) const {
-    return recv_ssrcs_.find(stream) != recv_ssrcs_.end();
+  bool IsStreamAdded(webrtc::StreamId id) const {
+    return known_stream_ids_.find(id) != known_stream_ids_.end();
   }
 
   int channels_opened() const { return channels_opened_; }
@@ -167,8 +161,7 @@
   int channels_closed_ = 0;
   int channels_opened_ = 0;
   std::set<webrtc::SctpDataChannel*> connected_channels_;
-  std::set<uint32_t> send_ssrcs_;
-  std::set<uint32_t> recv_ssrcs_;
+  std::set<webrtc::StreamId> known_stream_ids_;
   rtc::WeakPtrFactory<FakeDataChannelController> weak_factory_{this};
 };
 #endif  // PC_TEST_FAKE_DATA_CHANNEL_CONTROLLER_H_