mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-15 14:50:39 +01:00

Before this CL, some components, e.g. the SendQueue, was first created and then later restored from handover state, while some were created from the handover state, as an optional parameter to their constructors. This CL will make it consistent, by always creating the components in a pristine state, and then modifying it when restoring them from handover state. The name "RestoreFromState" was used to be consistent with SendQueue and the socket. This is just refactoring. Bug: None Change-Id: Ifad2d2e84a74a12a93abbfb0fe1027ebb9580e73 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/267006 Reviewed-by: Harald Alvestrand <hta@webrtc.org> Commit-Queue: Victor Boivie <boivie@webrtc.org> Cr-Commit-Position: refs/heads/main@{#37384}
89 lines
3.8 KiB
C++
89 lines
3.8 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;
|
|
virtual void RestoreFromState(const DcSctpSocketHandoverState& state) = 0;
|
|
};
|
|
|
|
} // namespace dcsctp
|
|
|
|
#endif // NET_DCSCTP_RX_REASSEMBLY_STREAMS_H_
|