summaryrefslogtreecommitdiffstats
path: root/third_party/libwebrtc/net/dcsctp/packet/error_cause
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/libwebrtc/net/dcsctp/packet/error_cause')
-rw-r--r--third_party/libwebrtc/net/dcsctp/packet/error_cause/cookie_received_while_shutting_down_cause.cc45
-rw-r--r--third_party/libwebrtc/net/dcsctp/packet/error_cause/cookie_received_while_shutting_down_cause.h50
-rw-r--r--third_party/libwebrtc/net/dcsctp/packet/error_cause/cookie_received_while_shutting_down_cause_test.cc35
-rw-r--r--third_party/libwebrtc/net/dcsctp/packet/error_cause/error_cause.cc83
-rw-r--r--third_party/libwebrtc/net/dcsctp/packet/error_cause/error_cause.h38
-rw-r--r--third_party/libwebrtc/net/dcsctp/packet/error_cause/invalid_mandatory_parameter_cause.cc45
-rw-r--r--third_party/libwebrtc/net/dcsctp/packet/error_cause/invalid_mandatory_parameter_cause.h48
-rw-r--r--third_party/libwebrtc/net/dcsctp/packet/error_cause/invalid_mandatory_parameter_cause_test.cc35
-rw-r--r--third_party/libwebrtc/net/dcsctp/packet/error_cause/invalid_stream_identifier_cause.cc60
-rw-r--r--third_party/libwebrtc/net/dcsctp/packet/error_cause/invalid_stream_identifier_cause.h56
-rw-r--r--third_party/libwebrtc/net/dcsctp/packet/error_cause/invalid_stream_identifier_cause_test.cc36
-rw-r--r--third_party/libwebrtc/net/dcsctp/packet/error_cause/missing_mandatory_parameter_cause.cc90
-rw-r--r--third_party/libwebrtc/net/dcsctp/packet/error_cause/missing_mandatory_parameter_cause.h60
-rw-r--r--third_party/libwebrtc/net/dcsctp/packet/error_cause/missing_mandatory_parameter_cause_test.cc59
-rw-r--r--third_party/libwebrtc/net/dcsctp/packet/error_cause/no_user_data_cause.cc57
-rw-r--r--third_party/libwebrtc/net/dcsctp/packet/error_cause/no_user_data_cause.h53
-rw-r--r--third_party/libwebrtc/net/dcsctp/packet/error_cause/no_user_data_cause_test.cc36
-rw-r--r--third_party/libwebrtc/net/dcsctp/packet/error_cause/out_of_resource_error_cause.cc44
-rw-r--r--third_party/libwebrtc/net/dcsctp/packet/error_cause/out_of_resource_error_cause.h48
-rw-r--r--third_party/libwebrtc/net/dcsctp/packet/error_cause/out_of_resource_error_cause_test.cc34
-rw-r--r--third_party/libwebrtc/net/dcsctp/packet/error_cause/protocol_violation_cause.cc65
-rw-r--r--third_party/libwebrtc/net/dcsctp/packet/error_cause/protocol_violation_cause.h56
-rw-r--r--third_party/libwebrtc/net/dcsctp/packet/error_cause/protocol_violation_cause_test.cc61
-rw-r--r--third_party/libwebrtc/net/dcsctp/packet/error_cause/restart_of_an_association_with_new_address_cause.cc58
-rw-r--r--third_party/libwebrtc/net/dcsctp/packet/error_cause/restart_of_an_association_with_new_address_cause.h59
-rw-r--r--third_party/libwebrtc/net/dcsctp/packet/error_cause/restart_of_an_association_with_new_address_cause_test.cc41
-rw-r--r--third_party/libwebrtc/net/dcsctp/packet/error_cause/stale_cookie_error_cause.cc57
-rw-r--r--third_party/libwebrtc/net/dcsctp/packet/error_cause/stale_cookie_error_cause.h54
-rw-r--r--third_party/libwebrtc/net/dcsctp/packet/error_cause/stale_cookie_error_cause_test.cc35
-rw-r--r--third_party/libwebrtc/net/dcsctp/packet/error_cause/unrecognized_chunk_type_cause.cc64
-rw-r--r--third_party/libwebrtc/net/dcsctp/packet/error_cause/unrecognized_chunk_type_cause.h59
-rw-r--r--third_party/libwebrtc/net/dcsctp/packet/error_cause/unrecognized_chunk_type_cause_test.cc37
-rw-r--r--third_party/libwebrtc/net/dcsctp/packet/error_cause/unrecognized_parameter_cause.cc54
-rw-r--r--third_party/libwebrtc/net/dcsctp/packet/error_cause/unrecognized_parameter_cause.h60
-rw-r--r--third_party/libwebrtc/net/dcsctp/packet/error_cause/unrecognized_parameter_cause_test.cc39
-rw-r--r--third_party/libwebrtc/net/dcsctp/packet/error_cause/unresolvable_address_cause.cc53
-rw-r--r--third_party/libwebrtc/net/dcsctp/packet/error_cause/unresolvable_address_cause.h60
-rw-r--r--third_party/libwebrtc/net/dcsctp/packet/error_cause/unresolvable_address_cause_test.cc39
-rw-r--r--third_party/libwebrtc/net/dcsctp/packet/error_cause/user_initiated_abort_cause.cc67
-rw-r--r--third_party/libwebrtc/net/dcsctp/packet/error_cause/user_initiated_abort_cause.h56
-rw-r--r--third_party/libwebrtc/net/dcsctp/packet/error_cause/user_initiated_abort_cause_test.cc62
41 files changed, 2148 insertions, 0 deletions
diff --git a/third_party/libwebrtc/net/dcsctp/packet/error_cause/cookie_received_while_shutting_down_cause.cc b/third_party/libwebrtc/net/dcsctp/packet/error_cause/cookie_received_while_shutting_down_cause.cc
new file mode 100644
index 0000000000..ef67c2a49f
--- /dev/null
+++ b/third_party/libwebrtc/net/dcsctp/packet/error_cause/cookie_received_while_shutting_down_cause.cc
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2021 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.
+ */
+#include "net/dcsctp/packet/error_cause/cookie_received_while_shutting_down_cause.h"
+
+#include <stdint.h>
+
+#include <vector>
+
+#include "absl/types/optional.h"
+#include "api/array_view.h"
+
+namespace dcsctp {
+
+// https://tools.ietf.org/html/rfc4960#section-3.3.10.10
+
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+// | Cause Code=10 | Cause Length=4 |
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+constexpr int CookieReceivedWhileShuttingDownCause::kType;
+
+absl::optional<CookieReceivedWhileShuttingDownCause>
+CookieReceivedWhileShuttingDownCause::Parse(
+ rtc::ArrayView<const uint8_t> data) {
+ if (!ParseTLV(data).has_value()) {
+ return absl::nullopt;
+ }
+ return CookieReceivedWhileShuttingDownCause();
+}
+
+void CookieReceivedWhileShuttingDownCause::SerializeTo(
+ std::vector<uint8_t>& out) const {
+ AllocateTLV(out);
+}
+
+std::string CookieReceivedWhileShuttingDownCause::ToString() const {
+ return "Cookie Received While Shutting Down";
+}
+} // namespace dcsctp
diff --git a/third_party/libwebrtc/net/dcsctp/packet/error_cause/cookie_received_while_shutting_down_cause.h b/third_party/libwebrtc/net/dcsctp/packet/error_cause/cookie_received_while_shutting_down_cause.h
new file mode 100644
index 0000000000..362f181fba
--- /dev/null
+++ b/third_party/libwebrtc/net/dcsctp/packet/error_cause/cookie_received_while_shutting_down_cause.h
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2021 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 NET_DCSCTP_PACKET_ERROR_CAUSE_COOKIE_RECEIVED_WHILE_SHUTTING_DOWN_CAUSE_H_
+#define NET_DCSCTP_PACKET_ERROR_CAUSE_COOKIE_RECEIVED_WHILE_SHUTTING_DOWN_CAUSE_H_
+#include <stddef.h>
+#include <stdint.h>
+
+#include <string>
+#include <vector>
+
+#include "absl/strings/string_view.h"
+#include "api/array_view.h"
+#include "net/dcsctp/packet/error_cause/error_cause.h"
+#include "net/dcsctp/packet/tlv_trait.h"
+
+namespace dcsctp {
+
+// https://tools.ietf.org/html/rfc4960#section-3.3.10.10
+struct CookieReceivedWhileShuttingDownCauseConfig : public ParameterConfig {
+ static constexpr int kType = 10;
+ static constexpr size_t kHeaderSize = 4;
+ static constexpr size_t kVariableLengthAlignment = 0;
+};
+
+class CookieReceivedWhileShuttingDownCause
+ : public Parameter,
+ public TLVTrait<CookieReceivedWhileShuttingDownCauseConfig> {
+ public:
+ static constexpr int kType =
+ CookieReceivedWhileShuttingDownCauseConfig::kType;
+
+ CookieReceivedWhileShuttingDownCause() {}
+
+ static absl::optional<CookieReceivedWhileShuttingDownCause> Parse(
+ rtc::ArrayView<const uint8_t> data);
+
+ void SerializeTo(std::vector<uint8_t>& out) const override;
+ std::string ToString() const override;
+};
+
+} // namespace dcsctp
+
+#endif // NET_DCSCTP_PACKET_ERROR_CAUSE_COOKIE_RECEIVED_WHILE_SHUTTING_DOWN_CAUSE_H_
diff --git a/third_party/libwebrtc/net/dcsctp/packet/error_cause/cookie_received_while_shutting_down_cause_test.cc b/third_party/libwebrtc/net/dcsctp/packet/error_cause/cookie_received_while_shutting_down_cause_test.cc
new file mode 100644
index 0000000000..afb8364c32
--- /dev/null
+++ b/third_party/libwebrtc/net/dcsctp/packet/error_cause/cookie_received_while_shutting_down_cause_test.cc
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2021 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.
+ */
+#include "net/dcsctp/packet/error_cause/cookie_received_while_shutting_down_cause.h"
+
+#include <stdint.h>
+
+#include <type_traits>
+#include <vector>
+
+#include "net/dcsctp/testing/testing_macros.h"
+#include "rtc_base/gunit.h"
+
+namespace dcsctp {
+namespace {
+
+TEST(CookieReceivedWhileShuttingDownCauseTest, SerializeAndDeserialize) {
+ CookieReceivedWhileShuttingDownCause parameter;
+
+ std::vector<uint8_t> serialized;
+ parameter.SerializeTo(serialized);
+
+ ASSERT_HAS_VALUE_AND_ASSIGN(
+ CookieReceivedWhileShuttingDownCause deserialized,
+ CookieReceivedWhileShuttingDownCause::Parse(serialized));
+}
+
+} // namespace
+} // namespace dcsctp
diff --git a/third_party/libwebrtc/net/dcsctp/packet/error_cause/error_cause.cc b/third_party/libwebrtc/net/dcsctp/packet/error_cause/error_cause.cc
new file mode 100644
index 0000000000..dcd07472ed
--- /dev/null
+++ b/third_party/libwebrtc/net/dcsctp/packet/error_cause/error_cause.cc
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 2021 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.
+ */
+#include "net/dcsctp/packet/error_cause/error_cause.h"
+
+#include <stddef.h>
+
+#include <cstdint>
+#include <memory>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "absl/types/optional.h"
+#include "api/array_view.h"
+#include "net/dcsctp/common/math.h"
+#include "net/dcsctp/packet/error_cause/cookie_received_while_shutting_down_cause.h"
+#include "net/dcsctp/packet/error_cause/invalid_mandatory_parameter_cause.h"
+#include "net/dcsctp/packet/error_cause/invalid_stream_identifier_cause.h"
+#include "net/dcsctp/packet/error_cause/missing_mandatory_parameter_cause.h"
+#include "net/dcsctp/packet/error_cause/no_user_data_cause.h"
+#include "net/dcsctp/packet/error_cause/out_of_resource_error_cause.h"
+#include "net/dcsctp/packet/error_cause/protocol_violation_cause.h"
+#include "net/dcsctp/packet/error_cause/restart_of_an_association_with_new_address_cause.h"
+#include "net/dcsctp/packet/error_cause/stale_cookie_error_cause.h"
+#include "net/dcsctp/packet/error_cause/unrecognized_chunk_type_cause.h"
+#include "net/dcsctp/packet/error_cause/unrecognized_parameter_cause.h"
+#include "net/dcsctp/packet/error_cause/unresolvable_address_cause.h"
+#include "net/dcsctp/packet/error_cause/user_initiated_abort_cause.h"
+#include "rtc_base/strings/string_builder.h"
+
+namespace dcsctp {
+
+template <class ErrorCause>
+bool ParseAndPrint(ParameterDescriptor descriptor, rtc::StringBuilder& sb) {
+ if (descriptor.type == ErrorCause::kType) {
+ absl::optional<ErrorCause> p = ErrorCause::Parse(descriptor.data);
+ if (p.has_value()) {
+ sb << p->ToString();
+ } else {
+ sb << "Failed to parse error cause of type " << ErrorCause::kType;
+ }
+ return true;
+ }
+ return false;
+}
+
+std::string ErrorCausesToString(const Parameters& parameters) {
+ rtc::StringBuilder sb;
+
+ std::vector<ParameterDescriptor> descriptors = parameters.descriptors();
+ for (size_t i = 0; i < descriptors.size(); ++i) {
+ if (i > 0) {
+ sb << "\n";
+ }
+
+ const ParameterDescriptor& d = descriptors[i];
+ if (!ParseAndPrint<InvalidStreamIdentifierCause>(d, sb) &&
+ !ParseAndPrint<MissingMandatoryParameterCause>(d, sb) &&
+ !ParseAndPrint<StaleCookieErrorCause>(d, sb) &&
+ !ParseAndPrint<OutOfResourceErrorCause>(d, sb) &&
+ !ParseAndPrint<UnresolvableAddressCause>(d, sb) &&
+ !ParseAndPrint<UnrecognizedChunkTypeCause>(d, sb) &&
+ !ParseAndPrint<InvalidMandatoryParameterCause>(d, sb) &&
+ !ParseAndPrint<UnrecognizedParametersCause>(d, sb) &&
+ !ParseAndPrint<NoUserDataCause>(d, sb) &&
+ !ParseAndPrint<CookieReceivedWhileShuttingDownCause>(d, sb) &&
+ !ParseAndPrint<RestartOfAnAssociationWithNewAddressesCause>(d, sb) &&
+ !ParseAndPrint<UserInitiatedAbortCause>(d, sb) &&
+ !ParseAndPrint<ProtocolViolationCause>(d, sb)) {
+ sb << "Unhandled parameter of type: " << d.type;
+ }
+ }
+
+ return sb.Release();
+}
+} // namespace dcsctp
diff --git a/third_party/libwebrtc/net/dcsctp/packet/error_cause/error_cause.h b/third_party/libwebrtc/net/dcsctp/packet/error_cause/error_cause.h
new file mode 100644
index 0000000000..fa2bf81478
--- /dev/null
+++ b/third_party/libwebrtc/net/dcsctp/packet/error_cause/error_cause.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2021 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 NET_DCSCTP_PACKET_ERROR_CAUSE_ERROR_CAUSE_H_
+#define NET_DCSCTP_PACKET_ERROR_CAUSE_ERROR_CAUSE_H_
+
+#include <stddef.h>
+
+#include <cstdint>
+#include <iosfwd>
+#include <memory>
+#include <string>
+#include <type_traits>
+#include <utility>
+#include <vector>
+
+#include "absl/algorithm/container.h"
+#include "absl/strings/string_view.h"
+#include "absl/types/optional.h"
+#include "api/array_view.h"
+#include "net/dcsctp/packet/parameter/parameter.h"
+#include "net/dcsctp/packet/tlv_trait.h"
+
+namespace dcsctp {
+
+// Converts the Error Causes in `parameters` to a human readable string,
+// to be used in error reporting and logging.
+std::string ErrorCausesToString(const Parameters& parameters);
+
+} // namespace dcsctp
+
+#endif // NET_DCSCTP_PACKET_ERROR_CAUSE_ERROR_CAUSE_H_
diff --git a/third_party/libwebrtc/net/dcsctp/packet/error_cause/invalid_mandatory_parameter_cause.cc b/third_party/libwebrtc/net/dcsctp/packet/error_cause/invalid_mandatory_parameter_cause.cc
new file mode 100644
index 0000000000..0187544226
--- /dev/null
+++ b/third_party/libwebrtc/net/dcsctp/packet/error_cause/invalid_mandatory_parameter_cause.cc
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2021 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.
+ */
+#include "net/dcsctp/packet/error_cause/invalid_mandatory_parameter_cause.h"
+
+#include <stdint.h>
+
+#include <vector>
+
+#include "absl/types/optional.h"
+#include "api/array_view.h"
+
+namespace dcsctp {
+
+// https://tools.ietf.org/html/rfc4960#section-3.3.10.7
+
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+// | Cause Code=7 | Cause Length=4 |
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+constexpr int InvalidMandatoryParameterCause::kType;
+
+absl::optional<InvalidMandatoryParameterCause>
+InvalidMandatoryParameterCause::Parse(rtc::ArrayView<const uint8_t> data) {
+ if (!ParseTLV(data).has_value()) {
+ return absl::nullopt;
+ }
+ return InvalidMandatoryParameterCause();
+}
+
+void InvalidMandatoryParameterCause::SerializeTo(
+ std::vector<uint8_t>& out) const {
+ AllocateTLV(out);
+}
+
+std::string InvalidMandatoryParameterCause::ToString() const {
+ return "Invalid Mandatory Parameter";
+}
+
+} // namespace dcsctp
diff --git a/third_party/libwebrtc/net/dcsctp/packet/error_cause/invalid_mandatory_parameter_cause.h b/third_party/libwebrtc/net/dcsctp/packet/error_cause/invalid_mandatory_parameter_cause.h
new file mode 100644
index 0000000000..e192b5a42f
--- /dev/null
+++ b/third_party/libwebrtc/net/dcsctp/packet/error_cause/invalid_mandatory_parameter_cause.h
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2021 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 NET_DCSCTP_PACKET_ERROR_CAUSE_INVALID_MANDATORY_PARAMETER_CAUSE_H_
+#define NET_DCSCTP_PACKET_ERROR_CAUSE_INVALID_MANDATORY_PARAMETER_CAUSE_H_
+#include <stddef.h>
+#include <stdint.h>
+
+#include <string>
+#include <vector>
+
+#include "absl/strings/string_view.h"
+#include "api/array_view.h"
+#include "net/dcsctp/packet/error_cause/error_cause.h"
+#include "net/dcsctp/packet/tlv_trait.h"
+
+namespace dcsctp {
+
+// https://tools.ietf.org/html/rfc4960#section-3.3.10.7
+struct InvalidMandatoryParameterCauseConfig : public ParameterConfig {
+ static constexpr int kType = 7;
+ static constexpr size_t kHeaderSize = 4;
+ static constexpr size_t kVariableLengthAlignment = 0;
+};
+
+class InvalidMandatoryParameterCause
+ : public Parameter,
+ public TLVTrait<InvalidMandatoryParameterCauseConfig> {
+ public:
+ static constexpr int kType = InvalidMandatoryParameterCauseConfig::kType;
+
+ InvalidMandatoryParameterCause() {}
+
+ static absl::optional<InvalidMandatoryParameterCause> Parse(
+ rtc::ArrayView<const uint8_t> data);
+
+ void SerializeTo(std::vector<uint8_t>& out) const override;
+ std::string ToString() const override;
+};
+} // namespace dcsctp
+
+#endif // NET_DCSCTP_PACKET_ERROR_CAUSE_INVALID_MANDATORY_PARAMETER_CAUSE_H_
diff --git a/third_party/libwebrtc/net/dcsctp/packet/error_cause/invalid_mandatory_parameter_cause_test.cc b/third_party/libwebrtc/net/dcsctp/packet/error_cause/invalid_mandatory_parameter_cause_test.cc
new file mode 100644
index 0000000000..3d532d09b1
--- /dev/null
+++ b/third_party/libwebrtc/net/dcsctp/packet/error_cause/invalid_mandatory_parameter_cause_test.cc
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2021 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.
+ */
+#include "net/dcsctp/packet/error_cause/invalid_mandatory_parameter_cause.h"
+
+#include <stdint.h>
+
+#include <type_traits>
+#include <vector>
+
+#include "net/dcsctp/testing/testing_macros.h"
+#include "rtc_base/gunit.h"
+
+namespace dcsctp {
+namespace {
+
+TEST(InvalidMandatoryParameterCauseTest, SerializeAndDeserialize) {
+ InvalidMandatoryParameterCause parameter;
+
+ std::vector<uint8_t> serialized;
+ parameter.SerializeTo(serialized);
+
+ ASSERT_HAS_VALUE_AND_ASSIGN(
+ InvalidMandatoryParameterCause deserialized,
+ InvalidMandatoryParameterCause::Parse(serialized));
+}
+
+} // namespace
+} // namespace dcsctp
diff --git a/third_party/libwebrtc/net/dcsctp/packet/error_cause/invalid_stream_identifier_cause.cc b/third_party/libwebrtc/net/dcsctp/packet/error_cause/invalid_stream_identifier_cause.cc
new file mode 100644
index 0000000000..b2ddd6f4ef
--- /dev/null
+++ b/third_party/libwebrtc/net/dcsctp/packet/error_cause/invalid_stream_identifier_cause.cc
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2021 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.
+ */
+#include "net/dcsctp/packet/error_cause/invalid_stream_identifier_cause.h"
+
+#include <stdint.h>
+
+#include <string>
+#include <type_traits>
+#include <vector>
+
+#include "absl/types/optional.h"
+#include "api/array_view.h"
+#include "net/dcsctp/packet/bounded_byte_reader.h"
+#include "net/dcsctp/packet/bounded_byte_writer.h"
+#include "net/dcsctp/packet/tlv_trait.h"
+#include "rtc_base/strings/string_builder.h"
+
+namespace dcsctp {
+
+// https://tools.ietf.org/html/rfc4960#section-3.3.10.1
+
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+// | Cause Code=1 | Cause Length=8 |
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+// | Stream Identifier | (Reserved) |
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+constexpr int InvalidStreamIdentifierCause::kType;
+
+absl::optional<InvalidStreamIdentifierCause>
+InvalidStreamIdentifierCause::Parse(rtc::ArrayView<const uint8_t> data) {
+ absl::optional<BoundedByteReader<kHeaderSize>> reader = ParseTLV(data);
+ if (!reader.has_value()) {
+ return absl::nullopt;
+ }
+
+ StreamID stream_id(reader->Load16<4>());
+ return InvalidStreamIdentifierCause(stream_id);
+}
+
+void InvalidStreamIdentifierCause::SerializeTo(
+ std::vector<uint8_t>& out) const {
+ BoundedByteWriter<kHeaderSize> writer = AllocateTLV(out);
+
+ writer.Store16<4>(*stream_id_);
+}
+
+std::string InvalidStreamIdentifierCause::ToString() const {
+ rtc::StringBuilder sb;
+ sb << "Invalid Stream Identifier, stream_id=" << *stream_id_;
+ return sb.Release();
+}
+
+} // namespace dcsctp
diff --git a/third_party/libwebrtc/net/dcsctp/packet/error_cause/invalid_stream_identifier_cause.h b/third_party/libwebrtc/net/dcsctp/packet/error_cause/invalid_stream_identifier_cause.h
new file mode 100644
index 0000000000..b7dfe177b8
--- /dev/null
+++ b/third_party/libwebrtc/net/dcsctp/packet/error_cause/invalid_stream_identifier_cause.h
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2021 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 NET_DCSCTP_PACKET_ERROR_CAUSE_INVALID_STREAM_IDENTIFIER_CAUSE_H_
+#define NET_DCSCTP_PACKET_ERROR_CAUSE_INVALID_STREAM_IDENTIFIER_CAUSE_H_
+#include <stddef.h>
+#include <stdint.h>
+
+#include <string>
+#include <vector>
+
+#include "absl/strings/string_view.h"
+#include "api/array_view.h"
+#include "net/dcsctp/packet/error_cause/error_cause.h"
+#include "net/dcsctp/packet/tlv_trait.h"
+#include "net/dcsctp/public/types.h"
+
+namespace dcsctp {
+
+// https://tools.ietf.org/html/rfc4960#section-3.3.10.1
+struct InvalidStreamIdentifierCauseConfig : public ParameterConfig {
+ static constexpr int kType = 1;
+ static constexpr size_t kHeaderSize = 8;
+ static constexpr size_t kVariableLengthAlignment = 0;
+};
+
+class InvalidStreamIdentifierCause
+ : public Parameter,
+ public TLVTrait<InvalidStreamIdentifierCauseConfig> {
+ public:
+ static constexpr int kType = InvalidStreamIdentifierCauseConfig::kType;
+
+ explicit InvalidStreamIdentifierCause(StreamID stream_id)
+ : stream_id_(stream_id) {}
+
+ static absl::optional<InvalidStreamIdentifierCause> Parse(
+ rtc::ArrayView<const uint8_t> data);
+
+ void SerializeTo(std::vector<uint8_t>& out) const override;
+ std::string ToString() const override;
+
+ StreamID stream_id() const { return stream_id_; }
+
+ private:
+ StreamID stream_id_;
+};
+
+} // namespace dcsctp
+
+#endif // NET_DCSCTP_PACKET_ERROR_CAUSE_INVALID_STREAM_IDENTIFIER_CAUSE_H_
diff --git a/third_party/libwebrtc/net/dcsctp/packet/error_cause/invalid_stream_identifier_cause_test.cc b/third_party/libwebrtc/net/dcsctp/packet/error_cause/invalid_stream_identifier_cause_test.cc
new file mode 100644
index 0000000000..a282ce5ee8
--- /dev/null
+++ b/third_party/libwebrtc/net/dcsctp/packet/error_cause/invalid_stream_identifier_cause_test.cc
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2021 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.
+ */
+#include "net/dcsctp/packet/error_cause/invalid_stream_identifier_cause.h"
+
+#include <stdint.h>
+
+#include <type_traits>
+#include <vector>
+
+#include "net/dcsctp/testing/testing_macros.h"
+#include "rtc_base/gunit.h"
+
+namespace dcsctp {
+namespace {
+
+TEST(InvalidStreamIdentifierCauseTest, SerializeAndDeserialize) {
+ InvalidStreamIdentifierCause parameter(StreamID(1));
+
+ std::vector<uint8_t> serialized;
+ parameter.SerializeTo(serialized);
+
+ ASSERT_HAS_VALUE_AND_ASSIGN(InvalidStreamIdentifierCause deserialized,
+ InvalidStreamIdentifierCause::Parse(serialized));
+
+ EXPECT_EQ(*deserialized.stream_id(), 1);
+}
+
+} // namespace
+} // namespace dcsctp
diff --git a/third_party/libwebrtc/net/dcsctp/packet/error_cause/missing_mandatory_parameter_cause.cc b/third_party/libwebrtc/net/dcsctp/packet/error_cause/missing_mandatory_parameter_cause.cc
new file mode 100644
index 0000000000..b89f86e43e
--- /dev/null
+++ b/third_party/libwebrtc/net/dcsctp/packet/error_cause/missing_mandatory_parameter_cause.cc
@@ -0,0 +1,90 @@
+/*
+ * Copyright (c) 2021 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.
+ */
+#include "net/dcsctp/packet/error_cause/missing_mandatory_parameter_cause.h"
+
+#include <stddef.h>
+
+#include <cstdint>
+#include <string>
+#include <type_traits>
+#include <vector>
+
+#include "absl/types/optional.h"
+#include "api/array_view.h"
+#include "net/dcsctp/common/str_join.h"
+#include "net/dcsctp/packet/bounded_byte_reader.h"
+#include "net/dcsctp/packet/bounded_byte_writer.h"
+#include "net/dcsctp/packet/tlv_trait.h"
+#include "rtc_base/logging.h"
+#include "rtc_base/strings/string_builder.h"
+
+namespace dcsctp {
+
+// https://tools.ietf.org/html/rfc4960#section-3.3.10.2
+
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+// | Cause Code=2 | Cause Length=8+N*2 |
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+// | Number of missing params=N |
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+// | Missing Param Type #1 | Missing Param Type #2 |
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+// | Missing Param Type #N-1 | Missing Param Type #N |
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+constexpr int MissingMandatoryParameterCause::kType;
+
+absl::optional<MissingMandatoryParameterCause>
+MissingMandatoryParameterCause::Parse(rtc::ArrayView<const uint8_t> data) {
+ absl::optional<BoundedByteReader<kHeaderSize>> reader = ParseTLV(data);
+ if (!reader.has_value()) {
+ return absl::nullopt;
+ }
+
+ uint32_t count = reader->Load32<4>();
+ if (reader->variable_data_size() / kMissingParameterSize != count) {
+ RTC_DLOG(LS_WARNING) << "Invalid number of missing parameters";
+ return absl::nullopt;
+ }
+
+ std::vector<uint16_t> missing_parameter_types;
+ missing_parameter_types.reserve(count);
+ for (uint32_t i = 0; i < count; ++i) {
+ BoundedByteReader<kMissingParameterSize> sub_reader =
+ reader->sub_reader<kMissingParameterSize>(i * kMissingParameterSize);
+
+ missing_parameter_types.push_back(sub_reader.Load16<0>());
+ }
+ return MissingMandatoryParameterCause(missing_parameter_types);
+}
+
+void MissingMandatoryParameterCause::SerializeTo(
+ std::vector<uint8_t>& out) const {
+ size_t variable_size =
+ missing_parameter_types_.size() * kMissingParameterSize;
+ BoundedByteWriter<kHeaderSize> writer = AllocateTLV(out, variable_size);
+
+ writer.Store32<4>(missing_parameter_types_.size());
+
+ for (size_t i = 0; i < missing_parameter_types_.size(); ++i) {
+ BoundedByteWriter<kMissingParameterSize> sub_writer =
+ writer.sub_writer<kMissingParameterSize>(i * kMissingParameterSize);
+
+ sub_writer.Store16<0>(missing_parameter_types_[i]);
+ }
+}
+
+std::string MissingMandatoryParameterCause::ToString() const {
+ rtc::StringBuilder sb;
+ sb << "Missing Mandatory Parameter, missing_parameter_types="
+ << StrJoin(missing_parameter_types_, ",");
+ return sb.Release();
+}
+
+} // namespace dcsctp
diff --git a/third_party/libwebrtc/net/dcsctp/packet/error_cause/missing_mandatory_parameter_cause.h b/third_party/libwebrtc/net/dcsctp/packet/error_cause/missing_mandatory_parameter_cause.h
new file mode 100644
index 0000000000..4435424295
--- /dev/null
+++ b/third_party/libwebrtc/net/dcsctp/packet/error_cause/missing_mandatory_parameter_cause.h
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2021 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 NET_DCSCTP_PACKET_ERROR_CAUSE_MISSING_MANDATORY_PARAMETER_CAUSE_H_
+#define NET_DCSCTP_PACKET_ERROR_CAUSE_MISSING_MANDATORY_PARAMETER_CAUSE_H_
+#include <stddef.h>
+
+#include <cstdint>
+#include <string>
+#include <vector>
+
+#include "absl/strings/string_view.h"
+#include "api/array_view.h"
+#include "net/dcsctp/packet/error_cause/error_cause.h"
+#include "net/dcsctp/packet/tlv_trait.h"
+
+namespace dcsctp {
+
+// https://tools.ietf.org/html/rfc4960#section-3.3.10.2
+struct MissingMandatoryParameterCauseConfig : public ParameterConfig {
+ static constexpr int kType = 2;
+ static constexpr size_t kHeaderSize = 8;
+ static constexpr size_t kVariableLengthAlignment = 2;
+};
+
+class MissingMandatoryParameterCause
+ : public Parameter,
+ public TLVTrait<MissingMandatoryParameterCauseConfig> {
+ public:
+ static constexpr int kType = MissingMandatoryParameterCauseConfig::kType;
+
+ explicit MissingMandatoryParameterCause(
+ rtc::ArrayView<const uint16_t> missing_parameter_types)
+ : missing_parameter_types_(missing_parameter_types.begin(),
+ missing_parameter_types.end()) {}
+
+ static absl::optional<MissingMandatoryParameterCause> Parse(
+ rtc::ArrayView<const uint8_t> data);
+
+ void SerializeTo(std::vector<uint8_t>& out) const override;
+ std::string ToString() const override;
+
+ rtc::ArrayView<const uint16_t> missing_parameter_types() const {
+ return missing_parameter_types_;
+ }
+
+ private:
+ static constexpr size_t kMissingParameterSize = 2;
+ std::vector<uint16_t> missing_parameter_types_;
+};
+
+} // namespace dcsctp
+
+#endif // NET_DCSCTP_PACKET_ERROR_CAUSE_MISSING_MANDATORY_PARAMETER_CAUSE_H_
diff --git a/third_party/libwebrtc/net/dcsctp/packet/error_cause/missing_mandatory_parameter_cause_test.cc b/third_party/libwebrtc/net/dcsctp/packet/error_cause/missing_mandatory_parameter_cause_test.cc
new file mode 100644
index 0000000000..1c526ff0e2
--- /dev/null
+++ b/third_party/libwebrtc/net/dcsctp/packet/error_cause/missing_mandatory_parameter_cause_test.cc
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2021 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.
+ */
+#include "net/dcsctp/packet/error_cause/missing_mandatory_parameter_cause.h"
+
+#include <stdint.h>
+
+#include <type_traits>
+#include <vector>
+
+#include "api/array_view.h"
+#include "net/dcsctp/testing/testing_macros.h"
+#include "rtc_base/gunit.h"
+#include "test/gmock.h"
+
+namespace dcsctp {
+namespace {
+using ::testing::ElementsAre;
+using ::testing::IsEmpty;
+
+TEST(MissingMandatoryParameterCauseTest, SerializeAndDeserialize) {
+ uint16_t parameter_types[] = {1, 2, 3};
+ MissingMandatoryParameterCause parameter(parameter_types);
+
+ std::vector<uint8_t> serialized;
+ parameter.SerializeTo(serialized);
+
+ ASSERT_HAS_VALUE_AND_ASSIGN(
+ MissingMandatoryParameterCause deserialized,
+ MissingMandatoryParameterCause::Parse(serialized));
+
+ EXPECT_THAT(deserialized.missing_parameter_types(), ElementsAre(1, 2, 3));
+}
+
+TEST(MissingMandatoryParameterCauseTest, HandlesDeserializeZeroParameters) {
+ uint8_t serialized[] = {0, 2, 0, 8, 0, 0, 0, 0};
+
+ ASSERT_HAS_VALUE_AND_ASSIGN(
+ MissingMandatoryParameterCause deserialized,
+ MissingMandatoryParameterCause::Parse(serialized));
+
+ EXPECT_THAT(deserialized.missing_parameter_types(), IsEmpty());
+}
+
+TEST(MissingMandatoryParameterCauseTest, HandlesOverflowParameterCount) {
+ // 0x80000004 * 2 = 2**32 + 8 -> if overflow, would validate correctly.
+ uint8_t serialized[] = {0, 2, 0, 8, 0x80, 0x00, 0x00, 0x04};
+
+ EXPECT_FALSE(MissingMandatoryParameterCause::Parse(serialized).has_value());
+}
+
+} // namespace
+} // namespace dcsctp
diff --git a/third_party/libwebrtc/net/dcsctp/packet/error_cause/no_user_data_cause.cc b/third_party/libwebrtc/net/dcsctp/packet/error_cause/no_user_data_cause.cc
new file mode 100644
index 0000000000..2853915b0c
--- /dev/null
+++ b/third_party/libwebrtc/net/dcsctp/packet/error_cause/no_user_data_cause.cc
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2021 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.
+ */
+#include "net/dcsctp/packet/error_cause/no_user_data_cause.h"
+
+#include <stdint.h>
+
+#include <string>
+#include <type_traits>
+#include <vector>
+
+#include "absl/types/optional.h"
+#include "api/array_view.h"
+#include "net/dcsctp/packet/bounded_byte_reader.h"
+#include "net/dcsctp/packet/bounded_byte_writer.h"
+#include "net/dcsctp/packet/tlv_trait.h"
+#include "rtc_base/strings/string_builder.h"
+
+namespace dcsctp {
+
+// https://tools.ietf.org/html/rfc4960#section-3.3.10.9
+
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+// | Cause Code=9 | Cause Length=8 |
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+// / TSN value /
+// \ \
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+constexpr int NoUserDataCause::kType;
+
+absl::optional<NoUserDataCause> NoUserDataCause::Parse(
+ rtc::ArrayView<const uint8_t> data) {
+ absl::optional<BoundedByteReader<kHeaderSize>> reader = ParseTLV(data);
+ if (!reader.has_value()) {
+ return absl::nullopt;
+ }
+ TSN tsn(reader->Load32<4>());
+ return NoUserDataCause(tsn);
+}
+
+void NoUserDataCause::SerializeTo(std::vector<uint8_t>& out) const {
+ BoundedByteWriter<kHeaderSize> writer = AllocateTLV(out);
+ writer.Store32<4>(*tsn_);
+}
+
+std::string NoUserDataCause::ToString() const {
+ rtc::StringBuilder sb;
+ sb << "No User Data, tsn=" << *tsn_;
+ return sb.Release();
+}
+} // namespace dcsctp
diff --git a/third_party/libwebrtc/net/dcsctp/packet/error_cause/no_user_data_cause.h b/third_party/libwebrtc/net/dcsctp/packet/error_cause/no_user_data_cause.h
new file mode 100644
index 0000000000..1087dcc97c
--- /dev/null
+++ b/third_party/libwebrtc/net/dcsctp/packet/error_cause/no_user_data_cause.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2021 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 NET_DCSCTP_PACKET_ERROR_CAUSE_NO_USER_DATA_CAUSE_H_
+#define NET_DCSCTP_PACKET_ERROR_CAUSE_NO_USER_DATA_CAUSE_H_
+#include <stddef.h>
+#include <stdint.h>
+
+#include <string>
+#include <vector>
+
+#include "absl/strings/string_view.h"
+#include "api/array_view.h"
+#include "net/dcsctp/common/internal_types.h"
+#include "net/dcsctp/packet/error_cause/error_cause.h"
+#include "net/dcsctp/packet/tlv_trait.h"
+namespace dcsctp {
+
+// https://tools.ietf.org/html/rfc4960#section-3.3.10.9
+struct NoUserDataCauseConfig : public ParameterConfig {
+ static constexpr int kType = 9;
+ static constexpr size_t kHeaderSize = 8;
+ static constexpr size_t kVariableLengthAlignment = 0;
+};
+
+class NoUserDataCause : public Parameter,
+ public TLVTrait<NoUserDataCauseConfig> {
+ public:
+ static constexpr int kType = NoUserDataCauseConfig::kType;
+
+ explicit NoUserDataCause(TSN tsn) : tsn_(tsn) {}
+
+ static absl::optional<NoUserDataCause> Parse(
+ rtc::ArrayView<const uint8_t> data);
+
+ void SerializeTo(std::vector<uint8_t>& out) const override;
+ std::string ToString() const override;
+
+ TSN tsn() const { return tsn_; }
+
+ private:
+ TSN tsn_;
+};
+
+} // namespace dcsctp
+
+#endif // NET_DCSCTP_PACKET_ERROR_CAUSE_NO_USER_DATA_CAUSE_H_
diff --git a/third_party/libwebrtc/net/dcsctp/packet/error_cause/no_user_data_cause_test.cc b/third_party/libwebrtc/net/dcsctp/packet/error_cause/no_user_data_cause_test.cc
new file mode 100644
index 0000000000..0a535bf4fa
--- /dev/null
+++ b/third_party/libwebrtc/net/dcsctp/packet/error_cause/no_user_data_cause_test.cc
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2021 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.
+ */
+#include "net/dcsctp/packet/error_cause/no_user_data_cause.h"
+
+#include <stdint.h>
+
+#include <type_traits>
+#include <vector>
+
+#include "net/dcsctp/testing/testing_macros.h"
+#include "rtc_base/gunit.h"
+
+namespace dcsctp {
+namespace {
+
+TEST(NoUserDataCauseTest, SerializeAndDeserialize) {
+ NoUserDataCause parameter(TSN(123));
+
+ std::vector<uint8_t> serialized;
+ parameter.SerializeTo(serialized);
+
+ ASSERT_HAS_VALUE_AND_ASSIGN(NoUserDataCause deserialized,
+ NoUserDataCause::Parse(serialized));
+
+ EXPECT_EQ(*deserialized.tsn(), 123u);
+}
+
+} // namespace
+} // namespace dcsctp
diff --git a/third_party/libwebrtc/net/dcsctp/packet/error_cause/out_of_resource_error_cause.cc b/third_party/libwebrtc/net/dcsctp/packet/error_cause/out_of_resource_error_cause.cc
new file mode 100644
index 0000000000..e5c7c0e787
--- /dev/null
+++ b/third_party/libwebrtc/net/dcsctp/packet/error_cause/out_of_resource_error_cause.cc
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2021 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.
+ */
+#include "net/dcsctp/packet/error_cause/out_of_resource_error_cause.h"
+
+#include <stdint.h>
+
+#include <vector>
+
+#include "absl/types/optional.h"
+#include "api/array_view.h"
+
+namespace dcsctp {
+
+// https://tools.ietf.org/html/rfc4960#section-3.3.10.4
+
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+// | Cause Code=4 | Cause Length=4 |
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+constexpr int OutOfResourceErrorCause::kType;
+
+absl::optional<OutOfResourceErrorCause> OutOfResourceErrorCause::Parse(
+ rtc::ArrayView<const uint8_t> data) {
+ if (!ParseTLV(data).has_value()) {
+ return absl::nullopt;
+ }
+ return OutOfResourceErrorCause();
+}
+
+void OutOfResourceErrorCause::SerializeTo(std::vector<uint8_t>& out) const {
+ AllocateTLV(out);
+}
+
+std::string OutOfResourceErrorCause::ToString() const {
+ return "Out Of Resource";
+}
+
+} // namespace dcsctp
diff --git a/third_party/libwebrtc/net/dcsctp/packet/error_cause/out_of_resource_error_cause.h b/third_party/libwebrtc/net/dcsctp/packet/error_cause/out_of_resource_error_cause.h
new file mode 100644
index 0000000000..fc798ca4ac
--- /dev/null
+++ b/third_party/libwebrtc/net/dcsctp/packet/error_cause/out_of_resource_error_cause.h
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2021 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 NET_DCSCTP_PACKET_ERROR_CAUSE_OUT_OF_RESOURCE_ERROR_CAUSE_H_
+#define NET_DCSCTP_PACKET_ERROR_CAUSE_OUT_OF_RESOURCE_ERROR_CAUSE_H_
+#include <stddef.h>
+#include <stdint.h>
+
+#include <string>
+#include <vector>
+
+#include "absl/strings/string_view.h"
+#include "api/array_view.h"
+#include "net/dcsctp/packet/error_cause/error_cause.h"
+#include "net/dcsctp/packet/tlv_trait.h"
+
+namespace dcsctp {
+
+// https://tools.ietf.org/html/rfc4960#section-3.3.10.4
+struct OutOfResourceParameterConfig : public ParameterConfig {
+ static constexpr int kType = 4;
+ static constexpr size_t kHeaderSize = 4;
+ static constexpr size_t kVariableLengthAlignment = 0;
+};
+
+class OutOfResourceErrorCause : public Parameter,
+ public TLVTrait<OutOfResourceParameterConfig> {
+ public:
+ static constexpr int kType = OutOfResourceParameterConfig::kType;
+
+ OutOfResourceErrorCause() {}
+
+ static absl::optional<OutOfResourceErrorCause> Parse(
+ rtc::ArrayView<const uint8_t> data);
+
+ void SerializeTo(std::vector<uint8_t>& out) const override;
+ std::string ToString() const override;
+};
+
+} // namespace dcsctp
+
+#endif // NET_DCSCTP_PACKET_ERROR_CAUSE_OUT_OF_RESOURCE_ERROR_CAUSE_H_
diff --git a/third_party/libwebrtc/net/dcsctp/packet/error_cause/out_of_resource_error_cause_test.cc b/third_party/libwebrtc/net/dcsctp/packet/error_cause/out_of_resource_error_cause_test.cc
new file mode 100644
index 0000000000..501fc201cd
--- /dev/null
+++ b/third_party/libwebrtc/net/dcsctp/packet/error_cause/out_of_resource_error_cause_test.cc
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2021 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.
+ */
+#include "net/dcsctp/packet/error_cause/out_of_resource_error_cause.h"
+
+#include <stdint.h>
+
+#include <type_traits>
+#include <vector>
+
+#include "net/dcsctp/testing/testing_macros.h"
+#include "rtc_base/gunit.h"
+
+namespace dcsctp {
+namespace {
+
+TEST(OutOfResourceErrorCauseTest, SerializeAndDeserialize) {
+ OutOfResourceErrorCause parameter;
+
+ std::vector<uint8_t> serialized;
+ parameter.SerializeTo(serialized);
+
+ ASSERT_HAS_VALUE_AND_ASSIGN(OutOfResourceErrorCause deserialized,
+ OutOfResourceErrorCause::Parse(serialized));
+}
+
+} // namespace
+} // namespace dcsctp
diff --git a/third_party/libwebrtc/net/dcsctp/packet/error_cause/protocol_violation_cause.cc b/third_party/libwebrtc/net/dcsctp/packet/error_cause/protocol_violation_cause.cc
new file mode 100644
index 0000000000..1b8d423afb
--- /dev/null
+++ b/third_party/libwebrtc/net/dcsctp/packet/error_cause/protocol_violation_cause.cc
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2021 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.
+ */
+#include "net/dcsctp/packet/error_cause/protocol_violation_cause.h"
+
+#include <stdint.h>
+
+#include <string>
+#include <type_traits>
+#include <vector>
+
+#include "absl/types/optional.h"
+#include "api/array_view.h"
+#include "net/dcsctp/packet/bounded_byte_reader.h"
+#include "net/dcsctp/packet/bounded_byte_writer.h"
+#include "net/dcsctp/packet/tlv_trait.h"
+#include "rtc_base/strings/string_builder.h"
+
+namespace dcsctp {
+
+// https://tools.ietf.org/html/rfc4960#section-3.3.10.13
+
+// 0 1 2 3
+// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+// | Cause Code=13 | Cause Length=Variable |
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+// / Additional Information /
+// \ \
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+constexpr int ProtocolViolationCause::kType;
+
+absl::optional<ProtocolViolationCause> ProtocolViolationCause::Parse(
+ rtc::ArrayView<const uint8_t> data) {
+ absl::optional<BoundedByteReader<kHeaderSize>> reader = ParseTLV(data);
+ if (!reader.has_value()) {
+ return absl::nullopt;
+ }
+ return ProtocolViolationCause(
+ std::string(reinterpret_cast<const char*>(reader->variable_data().data()),
+ reader->variable_data().size()));
+}
+
+void ProtocolViolationCause::SerializeTo(std::vector<uint8_t>& out) const {
+ BoundedByteWriter<kHeaderSize> writer =
+ AllocateTLV(out, additional_information_.size());
+ writer.CopyToVariableData(rtc::MakeArrayView(
+ reinterpret_cast<const uint8_t*>(additional_information_.data()),
+ additional_information_.size()));
+}
+
+std::string ProtocolViolationCause::ToString() const {
+ rtc::StringBuilder sb;
+ sb << "Protocol Violation, additional_information="
+ << additional_information_;
+ return sb.Release();
+}
+
+} // namespace dcsctp
diff --git a/third_party/libwebrtc/net/dcsctp/packet/error_cause/protocol_violation_cause.h b/third_party/libwebrtc/net/dcsctp/packet/error_cause/protocol_violation_cause.h
new file mode 100644
index 0000000000..3081e1f28c
--- /dev/null
+++ b/third_party/libwebrtc/net/dcsctp/packet/error_cause/protocol_violation_cause.h
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2021 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 NET_DCSCTP_PACKET_ERROR_CAUSE_PROTOCOL_VIOLATION_CAUSE_H_
+#define NET_DCSCTP_PACKET_ERROR_CAUSE_PROTOCOL_VIOLATION_CAUSE_H_
+#include <stddef.h>
+#include <stdint.h>
+
+#include <string>
+#include <vector>
+
+#include "absl/strings/string_view.h"
+#include "api/array_view.h"
+#include "net/dcsctp/packet/error_cause/error_cause.h"
+#include "net/dcsctp/packet/tlv_trait.h"
+
+namespace dcsctp {
+
+// https://tools.ietf.org/html/rfc4960#section-3.3.10.13
+struct ProtocolViolationCauseConfig : public ParameterConfig {
+ static constexpr int kType = 13;
+ static constexpr size_t kHeaderSize = 4;
+ static constexpr size_t kVariableLengthAlignment = 1;
+};
+
+class ProtocolViolationCause : public Parameter,
+ public TLVTrait<ProtocolViolationCauseConfig> {
+ public:
+ static constexpr int kType = ProtocolViolationCauseConfig::kType;
+
+ explicit ProtocolViolationCause(absl::string_view additional_information)
+ : additional_information_(additional_information) {}
+
+ static absl::optional<ProtocolViolationCause> Parse(
+ rtc::ArrayView<const uint8_t> data);
+
+ void SerializeTo(std::vector<uint8_t>& out) const override;
+ std::string ToString() const override;
+
+ absl::string_view additional_information() const {
+ return additional_information_;
+ }
+
+ private:
+ std::string additional_information_;
+};
+
+} // namespace dcsctp
+
+#endif // NET_DCSCTP_PACKET_ERROR_CAUSE_PROTOCOL_VIOLATION_CAUSE_H_
diff --git a/third_party/libwebrtc/net/dcsctp/packet/error_cause/protocol_violation_cause_test.cc b/third_party/libwebrtc/net/dcsctp/packet/error_cause/protocol_violation_cause_test.cc
new file mode 100644
index 0000000000..902d867091
--- /dev/null
+++ b/third_party/libwebrtc/net/dcsctp/packet/error_cause/protocol_violation_cause_test.cc
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2021 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.
+ */
+#include "net/dcsctp/packet/error_cause/protocol_violation_cause.h"
+
+#include <stdint.h>
+
+#include <type_traits>
+#include <vector>
+
+#include "api/array_view.h"
+#include "net/dcsctp/packet/error_cause/error_cause.h"
+#include "net/dcsctp/packet/tlv_trait.h"
+#include "net/dcsctp/testing/testing_macros.h"
+#include "rtc_base/gunit.h"
+#include "test/gmock.h"
+
+namespace dcsctp {
+namespace {
+using ::testing::SizeIs;
+
+TEST(ProtocolViolationCauseTest, EmptyReason) {
+ Parameters causes =
+ Parameters::Builder().Add(ProtocolViolationCause("")).Build();
+
+ ASSERT_HAS_VALUE_AND_ASSIGN(Parameters deserialized,
+ Parameters::Parse(causes.data()));
+ ASSERT_THAT(deserialized.descriptors(), SizeIs(1));
+ EXPECT_EQ(deserialized.descriptors()[0].type, ProtocolViolationCause::kType);
+
+ ASSERT_HAS_VALUE_AND_ASSIGN(
+ ProtocolViolationCause cause,
+ ProtocolViolationCause::Parse(deserialized.descriptors()[0].data));
+
+ EXPECT_EQ(cause.additional_information(), "");
+}
+
+TEST(ProtocolViolationCauseTest, SetReason) {
+ Parameters causes = Parameters::Builder()
+ .Add(ProtocolViolationCause("Reason goes here"))
+ .Build();
+
+ ASSERT_HAS_VALUE_AND_ASSIGN(Parameters deserialized,
+ Parameters::Parse(causes.data()));
+ ASSERT_THAT(deserialized.descriptors(), SizeIs(1));
+ EXPECT_EQ(deserialized.descriptors()[0].type, ProtocolViolationCause::kType);
+
+ ASSERT_HAS_VALUE_AND_ASSIGN(
+ ProtocolViolationCause cause,
+ ProtocolViolationCause::Parse(deserialized.descriptors()[0].data));
+
+ EXPECT_EQ(cause.additional_information(), "Reason goes here");
+}
+} // namespace
+} // namespace dcsctp
diff --git a/third_party/libwebrtc/net/dcsctp/packet/error_cause/restart_of_an_association_with_new_address_cause.cc b/third_party/libwebrtc/net/dcsctp/packet/error_cause/restart_of_an_association_with_new_address_cause.cc
new file mode 100644
index 0000000000..abe5de6211
--- /dev/null
+++ b/third_party/libwebrtc/net/dcsctp/packet/error_cause/restart_of_an_association_with_new_address_cause.cc
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 2021 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.
+ */
+#include "net/dcsctp/packet/error_cause/restart_of_an_association_with_new_address_cause.h"
+
+#include <stdint.h>
+
+#include <type_traits>
+#include <vector>
+
+#include "absl/types/optional.h"
+#include "api/array_view.h"
+#include "net/dcsctp/packet/bounded_byte_reader.h"
+#include "net/dcsctp/packet/bounded_byte_writer.h"
+#include "net/dcsctp/packet/tlv_trait.h"
+
+namespace dcsctp {
+
+// https://tools.ietf.org/html/rfc4960#section-3.3.10.11
+
+// 0 1 2 3
+// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+// | Cause Code=11 | Cause Length=Variable |
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+// / New Address TLVs /
+// \ \
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+constexpr int RestartOfAnAssociationWithNewAddressesCause::kType;
+
+absl::optional<RestartOfAnAssociationWithNewAddressesCause>
+RestartOfAnAssociationWithNewAddressesCause::Parse(
+ rtc::ArrayView<const uint8_t> data) {
+ absl::optional<BoundedByteReader<kHeaderSize>> reader = ParseTLV(data);
+ if (!reader.has_value()) {
+ return absl::nullopt;
+ }
+ return RestartOfAnAssociationWithNewAddressesCause(reader->variable_data());
+}
+
+void RestartOfAnAssociationWithNewAddressesCause::SerializeTo(
+ std::vector<uint8_t>& out) const {
+ BoundedByteWriter<kHeaderSize> writer =
+ AllocateTLV(out, new_address_tlvs_.size());
+ writer.CopyToVariableData(new_address_tlvs_);
+}
+
+std::string RestartOfAnAssociationWithNewAddressesCause::ToString() const {
+ return "Restart of an Association with New Addresses";
+}
+
+} // namespace dcsctp
diff --git a/third_party/libwebrtc/net/dcsctp/packet/error_cause/restart_of_an_association_with_new_address_cause.h b/third_party/libwebrtc/net/dcsctp/packet/error_cause/restart_of_an_association_with_new_address_cause.h
new file mode 100644
index 0000000000..a1cccdc8a1
--- /dev/null
+++ b/third_party/libwebrtc/net/dcsctp/packet/error_cause/restart_of_an_association_with_new_address_cause.h
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2021 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 NET_DCSCTP_PACKET_ERROR_CAUSE_RESTART_OF_AN_ASSOCIATION_WITH_NEW_ADDRESS_CAUSE_H_
+#define NET_DCSCTP_PACKET_ERROR_CAUSE_RESTART_OF_AN_ASSOCIATION_WITH_NEW_ADDRESS_CAUSE_H_
+#include <stddef.h>
+
+#include <cstdint>
+#include <string>
+#include <vector>
+
+#include "absl/strings/string_view.h"
+#include "api/array_view.h"
+#include "net/dcsctp/packet/error_cause/error_cause.h"
+#include "net/dcsctp/packet/tlv_trait.h"
+
+namespace dcsctp {
+
+// https://tools.ietf.org/html/rfc4960#section-3.3.10.11
+struct RestartOfAnAssociationWithNewAddressesCauseConfig
+ : public ParameterConfig {
+ static constexpr int kType = 11;
+ static constexpr size_t kHeaderSize = 4;
+ static constexpr size_t kVariableLengthAlignment = 1;
+};
+
+class RestartOfAnAssociationWithNewAddressesCause
+ : public Parameter,
+ public TLVTrait<RestartOfAnAssociationWithNewAddressesCauseConfig> {
+ public:
+ static constexpr int kType =
+ RestartOfAnAssociationWithNewAddressesCauseConfig::kType;
+
+ explicit RestartOfAnAssociationWithNewAddressesCause(
+ rtc::ArrayView<const uint8_t> new_address_tlvs)
+ : new_address_tlvs_(new_address_tlvs.begin(), new_address_tlvs.end()) {}
+
+ static absl::optional<RestartOfAnAssociationWithNewAddressesCause> Parse(
+ rtc::ArrayView<const uint8_t> data);
+
+ void SerializeTo(std::vector<uint8_t>& out) const override;
+ std::string ToString() const override;
+
+ rtc::ArrayView<const uint8_t> new_address_tlvs() const {
+ return new_address_tlvs_;
+ }
+
+ private:
+ std::vector<uint8_t> new_address_tlvs_;
+};
+} // namespace dcsctp
+
+#endif // NET_DCSCTP_PACKET_ERROR_CAUSE_RESTART_OF_AN_ASSOCIATION_WITH_NEW_ADDRESS_CAUSE_H_
diff --git a/third_party/libwebrtc/net/dcsctp/packet/error_cause/restart_of_an_association_with_new_address_cause_test.cc b/third_party/libwebrtc/net/dcsctp/packet/error_cause/restart_of_an_association_with_new_address_cause_test.cc
new file mode 100644
index 0000000000..b8ab8b6803
--- /dev/null
+++ b/third_party/libwebrtc/net/dcsctp/packet/error_cause/restart_of_an_association_with_new_address_cause_test.cc
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2021 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.
+ */
+#include "net/dcsctp/packet/error_cause/restart_of_an_association_with_new_address_cause.h"
+
+#include <stdint.h>
+
+#include <type_traits>
+#include <vector>
+
+#include "api/array_view.h"
+#include "net/dcsctp/testing/testing_macros.h"
+#include "rtc_base/gunit.h"
+#include "test/gmock.h"
+
+namespace dcsctp {
+namespace {
+using ::testing::ElementsAre;
+
+TEST(RestartOfAnAssociationWithNewAddressesCauseTest, SerializeAndDeserialize) {
+ uint8_t data[] = {1, 2, 3};
+ RestartOfAnAssociationWithNewAddressesCause parameter(data);
+
+ std::vector<uint8_t> serialized;
+ parameter.SerializeTo(serialized);
+
+ ASSERT_HAS_VALUE_AND_ASSIGN(
+ RestartOfAnAssociationWithNewAddressesCause deserialized,
+ RestartOfAnAssociationWithNewAddressesCause::Parse(serialized));
+
+ EXPECT_THAT(deserialized.new_address_tlvs(), ElementsAre(1, 2, 3));
+}
+
+} // namespace
+} // namespace dcsctp
diff --git a/third_party/libwebrtc/net/dcsctp/packet/error_cause/stale_cookie_error_cause.cc b/third_party/libwebrtc/net/dcsctp/packet/error_cause/stale_cookie_error_cause.cc
new file mode 100644
index 0000000000..d77d8488f1
--- /dev/null
+++ b/third_party/libwebrtc/net/dcsctp/packet/error_cause/stale_cookie_error_cause.cc
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2021 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.
+ */
+#include "net/dcsctp/packet/error_cause/stale_cookie_error_cause.h"
+
+#include <stdint.h>
+
+#include <string>
+#include <type_traits>
+#include <vector>
+
+#include "absl/types/optional.h"
+#include "api/array_view.h"
+#include "net/dcsctp/packet/bounded_byte_reader.h"
+#include "net/dcsctp/packet/bounded_byte_writer.h"
+#include "net/dcsctp/packet/tlv_trait.h"
+#include "rtc_base/strings/string_builder.h"
+
+namespace dcsctp {
+
+// https://tools.ietf.org/html/rfc4960#section-3.3.10.3
+
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+// | Cause Code=3 | Cause Length=8 |
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+// | Measure of Staleness (usec.) |
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+constexpr int StaleCookieErrorCause::kType;
+
+absl::optional<StaleCookieErrorCause> StaleCookieErrorCause::Parse(
+ rtc::ArrayView<const uint8_t> data) {
+ absl::optional<BoundedByteReader<kHeaderSize>> reader = ParseTLV(data);
+ if (!reader.has_value()) {
+ return absl::nullopt;
+ }
+ uint32_t staleness_us = reader->Load32<4>();
+ return StaleCookieErrorCause(staleness_us);
+}
+
+void StaleCookieErrorCause::SerializeTo(std::vector<uint8_t>& out) const {
+ BoundedByteWriter<kHeaderSize> writer = AllocateTLV(out);
+ writer.Store32<4>(staleness_us_);
+}
+
+std::string StaleCookieErrorCause::ToString() const {
+ rtc::StringBuilder sb;
+ sb << "Stale Cookie Error, staleness_us=" << staleness_us_;
+ return sb.Release();
+}
+
+} // namespace dcsctp
diff --git a/third_party/libwebrtc/net/dcsctp/packet/error_cause/stale_cookie_error_cause.h b/third_party/libwebrtc/net/dcsctp/packet/error_cause/stale_cookie_error_cause.h
new file mode 100644
index 0000000000..d8b7b5b5bd
--- /dev/null
+++ b/third_party/libwebrtc/net/dcsctp/packet/error_cause/stale_cookie_error_cause.h
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2021 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 NET_DCSCTP_PACKET_ERROR_CAUSE_STALE_COOKIE_ERROR_CAUSE_H_
+#define NET_DCSCTP_PACKET_ERROR_CAUSE_STALE_COOKIE_ERROR_CAUSE_H_
+#include <stddef.h>
+#include <stdint.h>
+
+#include <string>
+#include <vector>
+
+#include "absl/strings/string_view.h"
+#include "api/array_view.h"
+#include "net/dcsctp/packet/error_cause/error_cause.h"
+#include "net/dcsctp/packet/tlv_trait.h"
+
+namespace dcsctp {
+
+// https://tools.ietf.org/html/rfc4960#section-3.3.10.3
+struct StaleCookieParameterConfig : public ParameterConfig {
+ static constexpr int kType = 3;
+ static constexpr size_t kHeaderSize = 8;
+ static constexpr size_t kVariableLengthAlignment = 0;
+};
+
+class StaleCookieErrorCause : public Parameter,
+ public TLVTrait<StaleCookieParameterConfig> {
+ public:
+ static constexpr int kType = StaleCookieParameterConfig::kType;
+
+ explicit StaleCookieErrorCause(uint32_t staleness_us)
+ : staleness_us_(staleness_us) {}
+
+ static absl::optional<StaleCookieErrorCause> Parse(
+ rtc::ArrayView<const uint8_t> data);
+
+ void SerializeTo(std::vector<uint8_t>& out) const override;
+ std::string ToString() const override;
+
+ uint16_t staleness_us() const { return staleness_us_; }
+
+ private:
+ uint32_t staleness_us_;
+};
+
+} // namespace dcsctp
+
+#endif // NET_DCSCTP_PACKET_ERROR_CAUSE_STALE_COOKIE_ERROR_CAUSE_H_
diff --git a/third_party/libwebrtc/net/dcsctp/packet/error_cause/stale_cookie_error_cause_test.cc b/third_party/libwebrtc/net/dcsctp/packet/error_cause/stale_cookie_error_cause_test.cc
new file mode 100644
index 0000000000..c0d1ac1c58
--- /dev/null
+++ b/third_party/libwebrtc/net/dcsctp/packet/error_cause/stale_cookie_error_cause_test.cc
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2021 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.
+ */
+#include "net/dcsctp/packet/error_cause/stale_cookie_error_cause.h"
+
+#include <stdint.h>
+
+#include <type_traits>
+#include <vector>
+
+#include "net/dcsctp/testing/testing_macros.h"
+#include "rtc_base/gunit.h"
+
+namespace dcsctp {
+namespace {
+
+TEST(StaleCookieErrorCauseTest, SerializeAndDeserialize) {
+ StaleCookieErrorCause parameter(123);
+
+ std::vector<uint8_t> serialized;
+ parameter.SerializeTo(serialized);
+
+ ASSERT_HAS_VALUE_AND_ASSIGN(StaleCookieErrorCause deserialized,
+ StaleCookieErrorCause::Parse(serialized));
+
+ EXPECT_EQ(deserialized.staleness_us(), 123);
+}
+} // namespace
+} // namespace dcsctp
diff --git a/third_party/libwebrtc/net/dcsctp/packet/error_cause/unrecognized_chunk_type_cause.cc b/third_party/libwebrtc/net/dcsctp/packet/error_cause/unrecognized_chunk_type_cause.cc
new file mode 100644
index 0000000000..04b960d992
--- /dev/null
+++ b/third_party/libwebrtc/net/dcsctp/packet/error_cause/unrecognized_chunk_type_cause.cc
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2021 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.
+ */
+#include "net/dcsctp/packet/error_cause/unrecognized_chunk_type_cause.h"
+
+#include <cstdint>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "absl/types/optional.h"
+#include "api/array_view.h"
+#include "net/dcsctp/packet/bounded_byte_reader.h"
+#include "net/dcsctp/packet/bounded_byte_writer.h"
+#include "net/dcsctp/packet/tlv_trait.h"
+#include "rtc_base/strings/string_builder.h"
+
+namespace dcsctp {
+
+// https://tools.ietf.org/html/rfc4960#section-3.3.10.6
+
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+// | Cause Code=6 | Cause Length |
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+// / Unrecognized Chunk /
+// \ \
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+constexpr int UnrecognizedChunkTypeCause::kType;
+
+absl::optional<UnrecognizedChunkTypeCause> UnrecognizedChunkTypeCause::Parse(
+ rtc::ArrayView<const uint8_t> data) {
+ absl::optional<BoundedByteReader<kHeaderSize>> reader = ParseTLV(data);
+ if (!reader.has_value()) {
+ return absl::nullopt;
+ }
+ std::vector<uint8_t> unrecognized_chunk(reader->variable_data().begin(),
+ reader->variable_data().end());
+ return UnrecognizedChunkTypeCause(std::move(unrecognized_chunk));
+}
+
+void UnrecognizedChunkTypeCause::SerializeTo(std::vector<uint8_t>& out) const {
+ BoundedByteWriter<kHeaderSize> writer =
+ AllocateTLV(out, unrecognized_chunk_.size());
+ writer.CopyToVariableData(unrecognized_chunk_);
+}
+
+std::string UnrecognizedChunkTypeCause::ToString() const {
+ rtc::StringBuilder sb;
+ sb << "Unrecognized Chunk Type, chunk_type=";
+ if (!unrecognized_chunk_.empty()) {
+ sb << static_cast<int>(unrecognized_chunk_[0]);
+ } else {
+ sb << "<missing>";
+ }
+ return sb.Release();
+}
+
+} // namespace dcsctp
diff --git a/third_party/libwebrtc/net/dcsctp/packet/error_cause/unrecognized_chunk_type_cause.h b/third_party/libwebrtc/net/dcsctp/packet/error_cause/unrecognized_chunk_type_cause.h
new file mode 100644
index 0000000000..26d3d3b8f9
--- /dev/null
+++ b/third_party/libwebrtc/net/dcsctp/packet/error_cause/unrecognized_chunk_type_cause.h
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2021 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 NET_DCSCTP_PACKET_ERROR_CAUSE_UNRECOGNIZED_CHUNK_TYPE_CAUSE_H_
+#define NET_DCSCTP_PACKET_ERROR_CAUSE_UNRECOGNIZED_CHUNK_TYPE_CAUSE_H_
+#include <stddef.h>
+#include <stdint.h>
+
+#include <cstdint>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "absl/strings/string_view.h"
+#include "api/array_view.h"
+#include "net/dcsctp/packet/error_cause/error_cause.h"
+#include "net/dcsctp/packet/tlv_trait.h"
+
+namespace dcsctp {
+
+// https://tools.ietf.org/html/rfc4960#section-3.3.10.6
+struct UnrecognizedChunkTypeCauseConfig : public ParameterConfig {
+ static constexpr int kType = 6;
+ static constexpr size_t kHeaderSize = 4;
+ static constexpr size_t kVariableLengthAlignment = 1;
+};
+
+class UnrecognizedChunkTypeCause
+ : public Parameter,
+ public TLVTrait<UnrecognizedChunkTypeCauseConfig> {
+ public:
+ static constexpr int kType = UnrecognizedChunkTypeCauseConfig::kType;
+
+ explicit UnrecognizedChunkTypeCause(std::vector<uint8_t> unrecognized_chunk)
+ : unrecognized_chunk_(std::move(unrecognized_chunk)) {}
+
+ static absl::optional<UnrecognizedChunkTypeCause> Parse(
+ rtc::ArrayView<const uint8_t> data);
+
+ void SerializeTo(std::vector<uint8_t>& out) const override;
+ std::string ToString() const override;
+
+ rtc::ArrayView<const uint8_t> unrecognized_chunk() const {
+ return unrecognized_chunk_;
+ }
+
+ private:
+ std::vector<uint8_t> unrecognized_chunk_;
+};
+
+} // namespace dcsctp
+
+#endif // NET_DCSCTP_PACKET_ERROR_CAUSE_UNRECOGNIZED_CHUNK_TYPE_CAUSE_H_
diff --git a/third_party/libwebrtc/net/dcsctp/packet/error_cause/unrecognized_chunk_type_cause_test.cc b/third_party/libwebrtc/net/dcsctp/packet/error_cause/unrecognized_chunk_type_cause_test.cc
new file mode 100644
index 0000000000..baff852f40
--- /dev/null
+++ b/third_party/libwebrtc/net/dcsctp/packet/error_cause/unrecognized_chunk_type_cause_test.cc
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2021 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.
+ */
+#include "net/dcsctp/packet/error_cause/unrecognized_chunk_type_cause.h"
+
+#include <cstdint>
+#include <type_traits>
+#include <vector>
+
+#include "api/array_view.h"
+#include "net/dcsctp/testing/testing_macros.h"
+#include "rtc_base/gunit.h"
+#include "test/gmock.h"
+
+namespace dcsctp {
+namespace {
+using ::testing::ElementsAre;
+
+TEST(UnrecognizedChunkTypeCauseTest, SerializeAndDeserialize) {
+ UnrecognizedChunkTypeCause parameter({1, 2, 3});
+
+ std::vector<uint8_t> serialized;
+ parameter.SerializeTo(serialized);
+
+ ASSERT_HAS_VALUE_AND_ASSIGN(UnrecognizedChunkTypeCause deserialized,
+ UnrecognizedChunkTypeCause::Parse(serialized));
+
+ EXPECT_THAT(deserialized.unrecognized_chunk(), ElementsAre(1, 2, 3));
+}
+} // namespace
+} // namespace dcsctp
diff --git a/third_party/libwebrtc/net/dcsctp/packet/error_cause/unrecognized_parameter_cause.cc b/third_party/libwebrtc/net/dcsctp/packet/error_cause/unrecognized_parameter_cause.cc
new file mode 100644
index 0000000000..80001a9eae
--- /dev/null
+++ b/third_party/libwebrtc/net/dcsctp/packet/error_cause/unrecognized_parameter_cause.cc
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2021 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.
+ */
+#include "net/dcsctp/packet/error_cause/unrecognized_parameter_cause.h"
+
+#include <stdint.h>
+
+#include <type_traits>
+#include <vector>
+
+#include "absl/types/optional.h"
+#include "api/array_view.h"
+#include "net/dcsctp/packet/bounded_byte_reader.h"
+#include "net/dcsctp/packet/bounded_byte_writer.h"
+#include "net/dcsctp/packet/tlv_trait.h"
+
+namespace dcsctp {
+
+// https://tools.ietf.org/html/rfc4960#section-3.3.10.8
+
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+// | Cause Code=8 | Cause Length |
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+// / Unrecognized Parameters /
+// \ \
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+constexpr int UnrecognizedParametersCause::kType;
+
+absl::optional<UnrecognizedParametersCause> UnrecognizedParametersCause::Parse(
+ rtc::ArrayView<const uint8_t> data) {
+ absl::optional<BoundedByteReader<kHeaderSize>> reader = ParseTLV(data);
+ if (!reader.has_value()) {
+ return absl::nullopt;
+ }
+ return UnrecognizedParametersCause(reader->variable_data());
+}
+
+void UnrecognizedParametersCause::SerializeTo(std::vector<uint8_t>& out) const {
+ BoundedByteWriter<kHeaderSize> writer =
+ AllocateTLV(out, unrecognized_parameters_.size());
+ writer.CopyToVariableData(unrecognized_parameters_);
+}
+
+std::string UnrecognizedParametersCause::ToString() const {
+ return "Unrecognized Parameters";
+}
+
+} // namespace dcsctp
diff --git a/third_party/libwebrtc/net/dcsctp/packet/error_cause/unrecognized_parameter_cause.h b/third_party/libwebrtc/net/dcsctp/packet/error_cause/unrecognized_parameter_cause.h
new file mode 100644
index 0000000000..ebec5ed4c3
--- /dev/null
+++ b/third_party/libwebrtc/net/dcsctp/packet/error_cause/unrecognized_parameter_cause.h
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2021 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 NET_DCSCTP_PACKET_ERROR_CAUSE_UNRECOGNIZED_PARAMETER_CAUSE_H_
+#define NET_DCSCTP_PACKET_ERROR_CAUSE_UNRECOGNIZED_PARAMETER_CAUSE_H_
+#include <stddef.h>
+#include <stdint.h>
+
+#include <cstdint>
+#include <string>
+#include <vector>
+
+#include "absl/strings/string_view.h"
+#include "api/array_view.h"
+#include "net/dcsctp/packet/error_cause/error_cause.h"
+#include "net/dcsctp/packet/tlv_trait.h"
+
+namespace dcsctp {
+
+// https://tools.ietf.org/html/rfc4960#section-3.3.10.8
+struct UnrecognizedParametersCauseConfig : public ParameterConfig {
+ static constexpr int kType = 8;
+ static constexpr size_t kHeaderSize = 4;
+ static constexpr size_t kVariableLengthAlignment = 1;
+};
+
+class UnrecognizedParametersCause
+ : public Parameter,
+ public TLVTrait<UnrecognizedParametersCauseConfig> {
+ public:
+ static constexpr int kType = UnrecognizedParametersCauseConfig::kType;
+
+ explicit UnrecognizedParametersCause(
+ rtc::ArrayView<const uint8_t> unrecognized_parameters)
+ : unrecognized_parameters_(unrecognized_parameters.begin(),
+ unrecognized_parameters.end()) {}
+
+ static absl::optional<UnrecognizedParametersCause> Parse(
+ rtc::ArrayView<const uint8_t> data);
+
+ void SerializeTo(std::vector<uint8_t>& out) const override;
+ std::string ToString() const override;
+
+ rtc::ArrayView<const uint8_t> unrecognized_parameters() const {
+ return unrecognized_parameters_;
+ }
+
+ private:
+ std::vector<uint8_t> unrecognized_parameters_;
+};
+
+} // namespace dcsctp
+
+#endif // NET_DCSCTP_PACKET_ERROR_CAUSE_UNRECOGNIZED_PARAMETER_CAUSE_H_
diff --git a/third_party/libwebrtc/net/dcsctp/packet/error_cause/unrecognized_parameter_cause_test.cc b/third_party/libwebrtc/net/dcsctp/packet/error_cause/unrecognized_parameter_cause_test.cc
new file mode 100644
index 0000000000..0449599ca6
--- /dev/null
+++ b/third_party/libwebrtc/net/dcsctp/packet/error_cause/unrecognized_parameter_cause_test.cc
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2021 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.
+ */
+#include "net/dcsctp/packet/error_cause/unrecognized_parameter_cause.h"
+
+#include <stdint.h>
+
+#include <type_traits>
+#include <vector>
+
+#include "api/array_view.h"
+#include "net/dcsctp/testing/testing_macros.h"
+#include "rtc_base/gunit.h"
+#include "test/gmock.h"
+
+namespace dcsctp {
+namespace {
+using ::testing::ElementsAre;
+
+TEST(UnrecognizedParametersCauseTest, SerializeAndDeserialize) {
+ uint8_t unrecognized_parameters[] = {1, 2, 3};
+ UnrecognizedParametersCause parameter(unrecognized_parameters);
+
+ std::vector<uint8_t> serialized;
+ parameter.SerializeTo(serialized);
+
+ ASSERT_HAS_VALUE_AND_ASSIGN(UnrecognizedParametersCause deserialized,
+ UnrecognizedParametersCause::Parse(serialized));
+
+ EXPECT_THAT(deserialized.unrecognized_parameters(), ElementsAre(1, 2, 3));
+}
+} // namespace
+} // namespace dcsctp
diff --git a/third_party/libwebrtc/net/dcsctp/packet/error_cause/unresolvable_address_cause.cc b/third_party/libwebrtc/net/dcsctp/packet/error_cause/unresolvable_address_cause.cc
new file mode 100644
index 0000000000..8108d31aa7
--- /dev/null
+++ b/third_party/libwebrtc/net/dcsctp/packet/error_cause/unresolvable_address_cause.cc
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2021 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.
+ */
+#include "net/dcsctp/packet/error_cause/unresolvable_address_cause.h"
+
+#include <stdint.h>
+
+#include <type_traits>
+#include <vector>
+
+#include "absl/types/optional.h"
+#include "api/array_view.h"
+#include "net/dcsctp/packet/bounded_byte_reader.h"
+#include "net/dcsctp/packet/bounded_byte_writer.h"
+#include "net/dcsctp/packet/tlv_trait.h"
+
+namespace dcsctp {
+
+// https://tools.ietf.org/html/rfc4960#section-3.3.10.5
+
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+// | Cause Code=5 | Cause Length |
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+// / Unresolvable Address /
+// \ \
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+constexpr int UnresolvableAddressCause::kType;
+
+absl::optional<UnresolvableAddressCause> UnresolvableAddressCause::Parse(
+ rtc::ArrayView<const uint8_t> data) {
+ absl::optional<BoundedByteReader<kHeaderSize>> reader = ParseTLV(data);
+ if (!reader.has_value()) {
+ return absl::nullopt;
+ }
+ return UnresolvableAddressCause(reader->variable_data());
+}
+
+void UnresolvableAddressCause::SerializeTo(std::vector<uint8_t>& out) const {
+ BoundedByteWriter<kHeaderSize> writer =
+ AllocateTLV(out, unresolvable_address_.size());
+ writer.CopyToVariableData(unresolvable_address_);
+}
+
+std::string UnresolvableAddressCause::ToString() const {
+ return "Unresolvable Address";
+}
+} // namespace dcsctp
diff --git a/third_party/libwebrtc/net/dcsctp/packet/error_cause/unresolvable_address_cause.h b/third_party/libwebrtc/net/dcsctp/packet/error_cause/unresolvable_address_cause.h
new file mode 100644
index 0000000000..c63b3779ef
--- /dev/null
+++ b/third_party/libwebrtc/net/dcsctp/packet/error_cause/unresolvable_address_cause.h
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2021 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 NET_DCSCTP_PACKET_ERROR_CAUSE_UNRESOLVABLE_ADDRESS_CAUSE_H_
+#define NET_DCSCTP_PACKET_ERROR_CAUSE_UNRESOLVABLE_ADDRESS_CAUSE_H_
+#include <stddef.h>
+#include <stdint.h>
+
+#include <cstdint>
+#include <string>
+#include <vector>
+
+#include "absl/strings/string_view.h"
+#include "api/array_view.h"
+#include "net/dcsctp/packet/error_cause/error_cause.h"
+#include "net/dcsctp/packet/tlv_trait.h"
+
+namespace dcsctp {
+
+// https://tools.ietf.org/html/rfc4960#section-3.3.10.5
+struct UnresolvableAddressCauseConfig : public ParameterConfig {
+ static constexpr int kType = 5;
+ static constexpr size_t kHeaderSize = 4;
+ static constexpr size_t kVariableLengthAlignment = 1;
+};
+
+class UnresolvableAddressCause
+ : public Parameter,
+ public TLVTrait<UnresolvableAddressCauseConfig> {
+ public:
+ static constexpr int kType = UnresolvableAddressCauseConfig::kType;
+
+ explicit UnresolvableAddressCause(
+ rtc::ArrayView<const uint8_t> unresolvable_address)
+ : unresolvable_address_(unresolvable_address.begin(),
+ unresolvable_address.end()) {}
+
+ static absl::optional<UnresolvableAddressCause> Parse(
+ rtc::ArrayView<const uint8_t> data);
+
+ void SerializeTo(std::vector<uint8_t>& out) const override;
+ std::string ToString() const override;
+
+ rtc::ArrayView<const uint8_t> unresolvable_address() const {
+ return unresolvable_address_;
+ }
+
+ private:
+ std::vector<uint8_t> unresolvable_address_;
+};
+
+} // namespace dcsctp
+
+#endif // NET_DCSCTP_PACKET_ERROR_CAUSE_UNRESOLVABLE_ADDRESS_CAUSE_H_
diff --git a/third_party/libwebrtc/net/dcsctp/packet/error_cause/unresolvable_address_cause_test.cc b/third_party/libwebrtc/net/dcsctp/packet/error_cause/unresolvable_address_cause_test.cc
new file mode 100644
index 0000000000..688730e6b3
--- /dev/null
+++ b/third_party/libwebrtc/net/dcsctp/packet/error_cause/unresolvable_address_cause_test.cc
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2021 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.
+ */
+#include "net/dcsctp/packet/error_cause/unresolvable_address_cause.h"
+
+#include <stdint.h>
+
+#include <type_traits>
+#include <vector>
+
+#include "api/array_view.h"
+#include "net/dcsctp/testing/testing_macros.h"
+#include "rtc_base/gunit.h"
+#include "test/gmock.h"
+
+namespace dcsctp {
+namespace {
+using ::testing::ElementsAre;
+
+TEST(UnresolvableAddressCauseTest, SerializeAndDeserialize) {
+ uint8_t unresolvable_address[] = {1, 2, 3};
+ UnresolvableAddressCause parameter(unresolvable_address);
+
+ std::vector<uint8_t> serialized;
+ parameter.SerializeTo(serialized);
+
+ ASSERT_HAS_VALUE_AND_ASSIGN(UnresolvableAddressCause deserialized,
+ UnresolvableAddressCause::Parse(serialized));
+
+ EXPECT_THAT(deserialized.unresolvable_address(), ElementsAre(1, 2, 3));
+}
+} // namespace
+} // namespace dcsctp
diff --git a/third_party/libwebrtc/net/dcsctp/packet/error_cause/user_initiated_abort_cause.cc b/third_party/libwebrtc/net/dcsctp/packet/error_cause/user_initiated_abort_cause.cc
new file mode 100644
index 0000000000..da99aacbfa
--- /dev/null
+++ b/third_party/libwebrtc/net/dcsctp/packet/error_cause/user_initiated_abort_cause.cc
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2021 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.
+ */
+#include "net/dcsctp/packet/error_cause/user_initiated_abort_cause.h"
+
+#include <stdint.h>
+
+#include <string>
+#include <type_traits>
+#include <vector>
+
+#include "absl/types/optional.h"
+#include "api/array_view.h"
+#include "net/dcsctp/packet/bounded_byte_reader.h"
+#include "net/dcsctp/packet/bounded_byte_writer.h"
+#include "net/dcsctp/packet/tlv_trait.h"
+#include "rtc_base/strings/string_builder.h"
+
+namespace dcsctp {
+
+// https://tools.ietf.org/html/rfc4960#section-3.3.10.12
+
+// 0 1 2 3
+// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+// | Cause Code=12 | Cause Length=Variable |
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+// / Upper Layer Abort Reason /
+// \ \
+// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+constexpr int UserInitiatedAbortCause::kType;
+
+absl::optional<UserInitiatedAbortCause> UserInitiatedAbortCause::Parse(
+ rtc::ArrayView<const uint8_t> data) {
+ absl::optional<BoundedByteReader<kHeaderSize>> reader = ParseTLV(data);
+ if (!reader.has_value()) {
+ return absl::nullopt;
+ }
+ if (reader->variable_data().empty()) {
+ return UserInitiatedAbortCause("");
+ }
+ return UserInitiatedAbortCause(
+ std::string(reinterpret_cast<const char*>(reader->variable_data().data()),
+ reader->variable_data().size()));
+}
+
+void UserInitiatedAbortCause::SerializeTo(std::vector<uint8_t>& out) const {
+ BoundedByteWriter<kHeaderSize> writer =
+ AllocateTLV(out, upper_layer_abort_reason_.size());
+ writer.CopyToVariableData(rtc::MakeArrayView(
+ reinterpret_cast<const uint8_t*>(upper_layer_abort_reason_.data()),
+ upper_layer_abort_reason_.size()));
+}
+
+std::string UserInitiatedAbortCause::ToString() const {
+ rtc::StringBuilder sb;
+ sb << "User-Initiated Abort, reason=" << upper_layer_abort_reason_;
+ return sb.Release();
+}
+
+} // namespace dcsctp
diff --git a/third_party/libwebrtc/net/dcsctp/packet/error_cause/user_initiated_abort_cause.h b/third_party/libwebrtc/net/dcsctp/packet/error_cause/user_initiated_abort_cause.h
new file mode 100644
index 0000000000..9eb16657b4
--- /dev/null
+++ b/third_party/libwebrtc/net/dcsctp/packet/error_cause/user_initiated_abort_cause.h
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2021 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 NET_DCSCTP_PACKET_ERROR_CAUSE_USER_INITIATED_ABORT_CAUSE_H_
+#define NET_DCSCTP_PACKET_ERROR_CAUSE_USER_INITIATED_ABORT_CAUSE_H_
+#include <stddef.h>
+#include <stdint.h>
+
+#include <string>
+#include <vector>
+
+#include "absl/strings/string_view.h"
+#include "api/array_view.h"
+#include "net/dcsctp/packet/error_cause/error_cause.h"
+#include "net/dcsctp/packet/tlv_trait.h"
+
+namespace dcsctp {
+
+// https://tools.ietf.org/html/rfc4960#section-3.3.10.12
+struct UserInitiatedAbortCauseConfig : public ParameterConfig {
+ static constexpr int kType = 12;
+ static constexpr size_t kHeaderSize = 4;
+ static constexpr size_t kVariableLengthAlignment = 1;
+};
+
+class UserInitiatedAbortCause : public Parameter,
+ public TLVTrait<UserInitiatedAbortCauseConfig> {
+ public:
+ static constexpr int kType = UserInitiatedAbortCauseConfig::kType;
+
+ explicit UserInitiatedAbortCause(absl::string_view upper_layer_abort_reason)
+ : upper_layer_abort_reason_(upper_layer_abort_reason) {}
+
+ static absl::optional<UserInitiatedAbortCause> Parse(
+ rtc::ArrayView<const uint8_t> data);
+
+ void SerializeTo(std::vector<uint8_t>& out) const override;
+ std::string ToString() const override;
+
+ absl::string_view upper_layer_abort_reason() const {
+ return upper_layer_abort_reason_;
+ }
+
+ private:
+ std::string upper_layer_abort_reason_;
+};
+
+} // namespace dcsctp
+
+#endif // NET_DCSCTP_PACKET_ERROR_CAUSE_USER_INITIATED_ABORT_CAUSE_H_
diff --git a/third_party/libwebrtc/net/dcsctp/packet/error_cause/user_initiated_abort_cause_test.cc b/third_party/libwebrtc/net/dcsctp/packet/error_cause/user_initiated_abort_cause_test.cc
new file mode 100644
index 0000000000..250959e3df
--- /dev/null
+++ b/third_party/libwebrtc/net/dcsctp/packet/error_cause/user_initiated_abort_cause_test.cc
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2021 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.
+ */
+#include "net/dcsctp/packet/error_cause/user_initiated_abort_cause.h"
+
+#include <stdint.h>
+
+#include <type_traits>
+#include <vector>
+
+#include "api/array_view.h"
+#include "net/dcsctp/packet/error_cause/error_cause.h"
+#include "net/dcsctp/packet/tlv_trait.h"
+#include "net/dcsctp/testing/testing_macros.h"
+#include "rtc_base/gunit.h"
+#include "test/gmock.h"
+
+namespace dcsctp {
+namespace {
+using ::testing::SizeIs;
+
+TEST(UserInitiatedAbortCauseTest, EmptyReason) {
+ Parameters causes =
+ Parameters::Builder().Add(UserInitiatedAbortCause("")).Build();
+
+ ASSERT_HAS_VALUE_AND_ASSIGN(Parameters deserialized,
+ Parameters::Parse(causes.data()));
+ ASSERT_THAT(deserialized.descriptors(), SizeIs(1));
+ EXPECT_EQ(deserialized.descriptors()[0].type, UserInitiatedAbortCause::kType);
+
+ ASSERT_HAS_VALUE_AND_ASSIGN(
+ UserInitiatedAbortCause cause,
+ UserInitiatedAbortCause::Parse(deserialized.descriptors()[0].data));
+
+ EXPECT_EQ(cause.upper_layer_abort_reason(), "");
+}
+
+TEST(UserInitiatedAbortCauseTest, SetReason) {
+ Parameters causes = Parameters::Builder()
+ .Add(UserInitiatedAbortCause("User called Close"))
+ .Build();
+
+ ASSERT_HAS_VALUE_AND_ASSIGN(Parameters deserialized,
+ Parameters::Parse(causes.data()));
+ ASSERT_THAT(deserialized.descriptors(), SizeIs(1));
+ EXPECT_EQ(deserialized.descriptors()[0].type, UserInitiatedAbortCause::kType);
+
+ ASSERT_HAS_VALUE_AND_ASSIGN(
+ UserInitiatedAbortCause cause,
+ UserInitiatedAbortCause::Parse(deserialized.descriptors()[0].data));
+
+ EXPECT_EQ(cause.upper_layer_abort_reason(), "User called Close");
+}
+
+} // namespace
+} // namespace dcsctp