| /* |
| * 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_RX_REASSEMBLY_STREAMS_H_ |
| #define NET_DCSCTP_RX_REASSEMBLY_STREAMS_H_ |
| |
| #include <stddef.h> |
| #include <stdint.h> |
| |
| #include <functional> |
| #include <vector> |
| |
| #include "absl/strings/string_view.h" |
| #include "api/array_view.h" |
| #include "net/dcsctp/common/sequence_numbers.h" |
| #include "net/dcsctp/packet/chunk/forward_tsn_common.h" |
| #include "net/dcsctp/packet/data.h" |
| #include "net/dcsctp/public/dcsctp_handover_state.h" |
| #include "net/dcsctp/public/dcsctp_message.h" |
| |
| namespace dcsctp { |
| |
| // Implementations of this interface will be called when data is received, when |
| // data should be skipped/forgotten or when sequence number should be reset. |
| // |
| // As a result of these operations - mainly when data is received - the |
| // implementations of this interface should notify when a message has been |
| // assembled, by calling the provided callback of type `OnAssembledMessage`. How |
| // it assembles messages will depend on e.g. if a message was sent on an ordered |
| // or unordered stream. |
| // |
| // Implementations will - for each operation - indicate how much additional |
| // memory that has been used as a result of performing the operation. This is |
| // used to limit the maximum amount of memory used, to prevent out-of-memory |
| // situations. |
| class ReassemblyStreams { |
| public: |
| // This callback will be provided as an argument to the constructor of the |
| // concrete class implementing this interface and should be called when a |
| // message has been assembled as well as indicating from which TSNs this |
| // message was assembled from. |
| using OnAssembledMessage = |
| std::function<void(rtc::ArrayView<const UnwrappedTSN> tsns, |
| DcSctpMessage message)>; |
| |
| virtual ~ReassemblyStreams() = default; |
| |
| // Adds a data chunk to a stream as identified in `data`. |
| // If it was the last remaining chunk in a message, reassemble one (or |
| // several, in case of ordered chunks) messages. |
| // |
| // Returns the additional number of bytes added to the queue as a result of |
| // performing this operation. If this addition resulted in messages being |
| // assembled and delivered, this may be negative. |
| virtual int Add(UnwrappedTSN tsn, Data data) = 0; |
| |
| // Called for incoming FORWARD-TSN/I-FORWARD-TSN chunks - when the sender |
| // wishes the received to skip/forget about data up until the provided TSN. |
| // This is used to implement partial reliability, such as limiting the number |
| // of retransmissions or the an expiration duration. As a result of skipping |
| // data, this may result in the implementation being able to assemble messages |
| // in ordered streams. |
| // |
| // Returns the number of bytes removed from the queue as a result of |
| // this operation. |
| virtual size_t HandleForwardTsn( |
| UnwrappedTSN new_cumulative_ack_tsn, |
| rtc::ArrayView<const AnyForwardTsnChunk::SkippedStream> |
| skipped_streams) = 0; |
| |
| // Called for incoming (possibly deferred) RE_CONFIG chunks asking for |
| // either a few streams, or all streams (when the list is empty) to be |
| // reset - to have their next SSN or Message ID to be zero. |
| virtual void ResetStreams(rtc::ArrayView<const StreamID> stream_ids) = 0; |
| |
| virtual HandoverReadinessStatus GetHandoverReadiness() const = 0; |
| virtual void AddHandoverState(DcSctpSocketHandoverState& state) = 0; |
| virtual void RestoreFromState(const DcSctpSocketHandoverState& state) = 0; |
| }; |
| |
| } // namespace dcsctp |
| |
| #endif // NET_DCSCTP_RX_REASSEMBLY_STREAMS_H_ |