mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-19 00:27:51 +01:00

There are numerous identifiers and sequences in SCTP, all of them being unsigned 16 or 32-bit integers. * Stream identifiers * Payload Protocol Identifier (PPID) * Stream Sequence Numbers (SSN) * Message Identifiers (MID) * Fragment Sequence Numbers (FSN) * Transmission Sequence Numbers (TSN) The first two of these are publicly exposed in the API, and the remaining ones are never exposed to the client and are all part of SCTP protocol. Then there are some more not as common sequence numbers, and some booleans. Not all will be in internal_types.h - it depends on if they can be scoped to a specific component instead. And not all types will likely become strong types. The unwrapped sequence numbers have been renamed to not cause conflicts and the current UnwrappedSequenceNumber class doesn't support wrapping strongly typed integers as it can't reach into the type of the underlying integer. That's something to explore later. Bug: webrtc:12614 Change-Id: I4e0016be26d5d4826783d6e0962044f56cbfa97d Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/213422 Commit-Queue: Victor Boivie <boivie@webrtc.org> Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org> Reviewed-by: Tommi <tommi@webrtc.org> Cr-Commit-Position: refs/heads/master@{#33620}
103 lines
3.5 KiB
C++
103 lines
3.5 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_PACKET_DATA_H_
|
|
#define NET_DCSCTP_PACKET_DATA_H_
|
|
|
|
#include <cstdint>
|
|
#include <utility>
|
|
#include <vector>
|
|
|
|
#include "net/dcsctp/common/internal_types.h"
|
|
#include "net/dcsctp/public/types.h"
|
|
|
|
namespace dcsctp {
|
|
|
|
// Represents data that is either received and extracted from a DATA/I-DATA
|
|
// chunk, or data that is supposed to be sent, and wrapped in a DATA/I-DATA
|
|
// chunk (depending on peer capabilities).
|
|
//
|
|
// The data wrapped in this structure is actually the same as the DATA/I-DATA
|
|
// chunk (actually the union of them), but to avoid having all components be
|
|
// aware of the implementation details of the different chunks, this abstraction
|
|
// is used instead. A notable difference is also that it doesn't carry a
|
|
// Transmission Sequence Number (TSN), as that is not known when a chunk is
|
|
// created (assigned late, just when sending), and that the TSNs in DATA/I-DATA
|
|
// are wrapped numbers, and within the library, unwrapped sequence numbers are
|
|
// preferably used.
|
|
struct Data {
|
|
// Indicates if a chunk is the first in a fragmented message and maps to the
|
|
// "beginning" flag in DATA/I-DATA chunk.
|
|
using IsBeginning = StrongAlias<class IsBeginningTag, bool>;
|
|
|
|
// Indicates if a chunk is the last in a fragmented message and maps to the
|
|
// "end" flag in DATA/I-DATA chunk.
|
|
using IsEnd = StrongAlias<class IsEndTag, bool>;
|
|
|
|
Data(StreamID stream_id,
|
|
SSN ssn,
|
|
MID message_id,
|
|
FSN fsn,
|
|
PPID ppid,
|
|
std::vector<uint8_t> payload,
|
|
IsBeginning is_beginning,
|
|
IsEnd is_end,
|
|
IsUnordered is_unordered)
|
|
: stream_id(stream_id),
|
|
ssn(ssn),
|
|
message_id(message_id),
|
|
fsn(fsn),
|
|
ppid(ppid),
|
|
payload(std::move(payload)),
|
|
is_beginning(is_beginning),
|
|
is_end(is_end),
|
|
is_unordered(is_unordered) {}
|
|
|
|
// Move-only, to avoid accidental copies.
|
|
Data(Data&& other) = default;
|
|
Data& operator=(Data&& other) = default;
|
|
|
|
// Creates a copy of this `Data` object.
|
|
Data Clone() {
|
|
return Data(stream_id, ssn, message_id, fsn, ppid, payload, is_beginning,
|
|
is_end, is_unordered);
|
|
}
|
|
|
|
// The size of this data, which translates to the size of its payload.
|
|
size_t size() const { return payload.size(); }
|
|
|
|
// Stream Identifier.
|
|
StreamID stream_id;
|
|
|
|
// Stream Sequence Number (SSN), per stream, for ordered chunks. Defined by
|
|
// RFC4960 and used only in DATA chunks (not I-DATA).
|
|
SSN ssn;
|
|
|
|
// Message Identifier (MID) per stream and ordered/unordered. Defined by
|
|
// RFC8260, and used together with options.is_unordered and stream_id to
|
|
// uniquely identify a message. Used only in I-DATA chunks (not DATA).
|
|
MID message_id;
|
|
// Fragment Sequence Number (FSN) per stream and ordered/unordered, as above.
|
|
FSN fsn;
|
|
|
|
// Payload Protocol Identifier (PPID).
|
|
PPID ppid;
|
|
|
|
// The actual data payload.
|
|
std::vector<uint8_t> payload;
|
|
|
|
// If this data represents the first, last or a middle chunk.
|
|
IsBeginning is_beginning;
|
|
IsEnd is_end;
|
|
// If this data is sent/received unordered.
|
|
IsUnordered is_unordered;
|
|
};
|
|
} // namespace dcsctp
|
|
|
|
#endif // NET_DCSCTP_PACKET_DATA_H_
|