89 lines
3.7 KiB
C++
89 lines
3.7 KiB
C++
/*
|
|
* 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;
|
|
};
|
|
|
|
} // namespace dcsctp
|
|
|
|
#endif // NET_DCSCTP_RX_REASSEMBLY_STREAMS_H_
|