mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-14 14:20:45 +01:00

To allow the transport to be able to know which ranges of stream identifiers it can be use, the negotiated incoming/inbound and outgoing/outbound stream counts will be exposed. This is first added to handover state, with the actual implementation to follow. Bug: webrtc:14277 Change-Id: Idd821ecbd8fcb588c88d69f617889318b4b03d43 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/272320 Reviewed-by: Florent Castelli <orphis@webrtc.org> Commit-Queue: Victor Boivie <boivie@webrtc.org> Cr-Commit-Position: refs/heads/main@{#37863}
135 lines
4.4 KiB
C++
135 lines
4.4 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_PUBLIC_DCSCTP_HANDOVER_STATE_H_
|
|
#define NET_DCSCTP_PUBLIC_DCSCTP_HANDOVER_STATE_H_
|
|
|
|
#include <cstdint>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include "rtc_base/strong_alias.h"
|
|
|
|
namespace dcsctp {
|
|
|
|
// Stores state snapshot of a dcSCTP socket. The snapshot can be used to
|
|
// recreate the socket - possibly in another process. This state should be
|
|
// treaded as opaque - the calling client should not inspect or alter it except
|
|
// for serialization. Serialization is not provided by dcSCTP. If needed it has
|
|
// to be implemented in the calling client.
|
|
struct DcSctpSocketHandoverState {
|
|
enum class SocketState {
|
|
kClosed,
|
|
kConnected,
|
|
};
|
|
SocketState socket_state = SocketState::kClosed;
|
|
|
|
uint32_t my_verification_tag = 0;
|
|
uint32_t my_initial_tsn = 0;
|
|
uint32_t peer_verification_tag = 0;
|
|
uint32_t peer_initial_tsn = 0;
|
|
uint64_t tie_tag = 0;
|
|
|
|
struct Capabilities {
|
|
bool partial_reliability = false;
|
|
bool message_interleaving = false;
|
|
bool reconfig = false;
|
|
uint16_t negotiated_maximum_incoming_streams = 0;
|
|
uint16_t negotiated_maximum_outgoing_streams = 0;
|
|
};
|
|
Capabilities capabilities;
|
|
|
|
struct OutgoingStream {
|
|
uint32_t id = 0;
|
|
uint32_t next_ssn = 0;
|
|
uint32_t next_unordered_mid = 0;
|
|
uint32_t next_ordered_mid = 0;
|
|
uint16_t priority = 0;
|
|
};
|
|
struct Transmission {
|
|
uint32_t next_tsn = 0;
|
|
uint32_t next_reset_req_sn = 0;
|
|
uint32_t cwnd = 0;
|
|
uint32_t rwnd = 0;
|
|
uint32_t ssthresh = 0;
|
|
uint32_t partial_bytes_acked = 0;
|
|
std::vector<OutgoingStream> streams;
|
|
};
|
|
Transmission tx;
|
|
|
|
struct OrderedStream {
|
|
uint32_t id = 0;
|
|
uint32_t next_ssn = 0;
|
|
};
|
|
struct UnorderedStream {
|
|
uint32_t id = 0;
|
|
};
|
|
struct Receive {
|
|
bool seen_packet = false;
|
|
uint32_t last_cumulative_acked_tsn = 0;
|
|
uint32_t last_assembled_tsn = 0;
|
|
uint32_t last_completed_deferred_reset_req_sn = 0;
|
|
uint32_t last_completed_reset_req_sn = 0;
|
|
std::vector<OrderedStream> ordered_streams;
|
|
std::vector<UnorderedStream> unordered_streams;
|
|
};
|
|
Receive rx;
|
|
};
|
|
|
|
// A list of possible reasons for a socket to be not ready for handover.
|
|
enum class HandoverUnreadinessReason : uint32_t {
|
|
kWrongConnectionState = 1,
|
|
kSendQueueNotEmpty = 2,
|
|
kPendingStreamResetRequest = 4,
|
|
kDataTrackerTsnBlocksPending = 8,
|
|
kPendingStreamReset = 16,
|
|
kReassemblyQueueDeliveredTSNsGap = 32,
|
|
kStreamResetDeferred = 64,
|
|
kOrderedStreamHasUnassembledChunks = 128,
|
|
kUnorderedStreamHasUnassembledChunks = 256,
|
|
kRetransmissionQueueOutstandingData = 512,
|
|
kRetransmissionQueueFastRecovery = 1024,
|
|
kRetransmissionQueueNotEmpty = 2048,
|
|
kMax = kRetransmissionQueueNotEmpty,
|
|
};
|
|
|
|
// Return value of `DcSctpSocketInterface::GetHandoverReadiness`. Set of
|
|
// `HandoverUnreadinessReason` bits. When no bit is set, the socket is in the
|
|
// state in which a snapshot of the state can be made by
|
|
// `GetHandoverStateAndClose()`.
|
|
class HandoverReadinessStatus
|
|
: public webrtc::StrongAlias<class HandoverReadinessStatusTag, uint32_t> {
|
|
public:
|
|
// Constructs an empty `HandoverReadinessStatus` which represents ready state.
|
|
constexpr HandoverReadinessStatus()
|
|
: webrtc::StrongAlias<class HandoverReadinessStatusTag, uint32_t>(0) {}
|
|
// Constructs status object that contains a single reason for not being
|
|
// handover ready.
|
|
constexpr explicit HandoverReadinessStatus(HandoverUnreadinessReason reason)
|
|
: webrtc::StrongAlias<class HandoverReadinessStatusTag, uint32_t>(
|
|
static_cast<uint32_t>(reason)) {}
|
|
|
|
// Convenience methods
|
|
constexpr bool IsReady() const { return value() == 0; }
|
|
constexpr bool Contains(HandoverUnreadinessReason reason) const {
|
|
return value() & static_cast<uint32_t>(reason);
|
|
}
|
|
HandoverReadinessStatus& Add(HandoverUnreadinessReason reason) {
|
|
return Add(HandoverReadinessStatus(reason));
|
|
}
|
|
HandoverReadinessStatus& Add(HandoverReadinessStatus status) {
|
|
value() |= status.value();
|
|
return *this;
|
|
}
|
|
std::string ToString() const;
|
|
};
|
|
|
|
} // namespace dcsctp
|
|
|
|
#endif // NET_DCSCTP_PUBLIC_DCSCTP_HANDOVER_STATE_H_
|