xref: /aosp_15_r20/external/webrtc/net/dcsctp/packet/data.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright (c) 2021 The WebRTC project authors. All Rights Reserved.
3*d9f75844SAndroid Build Coastguard Worker  *
4*d9f75844SAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker  */
10*d9f75844SAndroid Build Coastguard Worker #ifndef NET_DCSCTP_PACKET_DATA_H_
11*d9f75844SAndroid Build Coastguard Worker #define NET_DCSCTP_PACKET_DATA_H_
12*d9f75844SAndroid Build Coastguard Worker 
13*d9f75844SAndroid Build Coastguard Worker #include <cstdint>
14*d9f75844SAndroid Build Coastguard Worker #include <utility>
15*d9f75844SAndroid Build Coastguard Worker #include <vector>
16*d9f75844SAndroid Build Coastguard Worker 
17*d9f75844SAndroid Build Coastguard Worker #include "net/dcsctp/common/internal_types.h"
18*d9f75844SAndroid Build Coastguard Worker #include "net/dcsctp/public/types.h"
19*d9f75844SAndroid Build Coastguard Worker 
20*d9f75844SAndroid Build Coastguard Worker namespace dcsctp {
21*d9f75844SAndroid Build Coastguard Worker 
22*d9f75844SAndroid Build Coastguard Worker // Represents data that is either received and extracted from a DATA/I-DATA
23*d9f75844SAndroid Build Coastguard Worker // chunk, or data that is supposed to be sent, and wrapped in a DATA/I-DATA
24*d9f75844SAndroid Build Coastguard Worker // chunk (depending on peer capabilities).
25*d9f75844SAndroid Build Coastguard Worker //
26*d9f75844SAndroid Build Coastguard Worker // The data wrapped in this structure is actually the same as the DATA/I-DATA
27*d9f75844SAndroid Build Coastguard Worker // chunk (actually the union of them), but to avoid having all components be
28*d9f75844SAndroid Build Coastguard Worker // aware of the implementation details of the different chunks, this abstraction
29*d9f75844SAndroid Build Coastguard Worker // is used instead. A notable difference is also that it doesn't carry a
30*d9f75844SAndroid Build Coastguard Worker // Transmission Sequence Number (TSN), as that is not known when a chunk is
31*d9f75844SAndroid Build Coastguard Worker // created (assigned late, just when sending), and that the TSNs in DATA/I-DATA
32*d9f75844SAndroid Build Coastguard Worker // are wrapped numbers, and within the library, unwrapped sequence numbers are
33*d9f75844SAndroid Build Coastguard Worker // preferably used.
34*d9f75844SAndroid Build Coastguard Worker struct Data {
35*d9f75844SAndroid Build Coastguard Worker   // Indicates if a chunk is the first in a fragmented message and maps to the
36*d9f75844SAndroid Build Coastguard Worker   // "beginning" flag in DATA/I-DATA chunk.
37*d9f75844SAndroid Build Coastguard Worker   using IsBeginning = webrtc::StrongAlias<class IsBeginningTag, bool>;
38*d9f75844SAndroid Build Coastguard Worker 
39*d9f75844SAndroid Build Coastguard Worker   // Indicates if a chunk is the last in a fragmented message  and maps to the
40*d9f75844SAndroid Build Coastguard Worker   // "end" flag in DATA/I-DATA chunk.
41*d9f75844SAndroid Build Coastguard Worker   using IsEnd = webrtc::StrongAlias<class IsEndTag, bool>;
42*d9f75844SAndroid Build Coastguard Worker 
DataData43*d9f75844SAndroid Build Coastguard Worker   Data(StreamID stream_id,
44*d9f75844SAndroid Build Coastguard Worker        SSN ssn,
45*d9f75844SAndroid Build Coastguard Worker        MID message_id,
46*d9f75844SAndroid Build Coastguard Worker        FSN fsn,
47*d9f75844SAndroid Build Coastguard Worker        PPID ppid,
48*d9f75844SAndroid Build Coastguard Worker        std::vector<uint8_t> payload,
49*d9f75844SAndroid Build Coastguard Worker        IsBeginning is_beginning,
50*d9f75844SAndroid Build Coastguard Worker        IsEnd is_end,
51*d9f75844SAndroid Build Coastguard Worker        IsUnordered is_unordered)
52*d9f75844SAndroid Build Coastguard Worker       : stream_id(stream_id),
53*d9f75844SAndroid Build Coastguard Worker         ssn(ssn),
54*d9f75844SAndroid Build Coastguard Worker         message_id(message_id),
55*d9f75844SAndroid Build Coastguard Worker         fsn(fsn),
56*d9f75844SAndroid Build Coastguard Worker         ppid(ppid),
57*d9f75844SAndroid Build Coastguard Worker         payload(std::move(payload)),
58*d9f75844SAndroid Build Coastguard Worker         is_beginning(is_beginning),
59*d9f75844SAndroid Build Coastguard Worker         is_end(is_end),
60*d9f75844SAndroid Build Coastguard Worker         is_unordered(is_unordered) {}
61*d9f75844SAndroid Build Coastguard Worker 
62*d9f75844SAndroid Build Coastguard Worker   // Move-only, to avoid accidental copies.
63*d9f75844SAndroid Build Coastguard Worker   Data(Data&& other) = default;
64*d9f75844SAndroid Build Coastguard Worker   Data& operator=(Data&& other) = default;
65*d9f75844SAndroid Build Coastguard Worker 
66*d9f75844SAndroid Build Coastguard Worker   // Creates a copy of this `Data` object.
CloneData67*d9f75844SAndroid Build Coastguard Worker   Data Clone() const {
68*d9f75844SAndroid Build Coastguard Worker     return Data(stream_id, ssn, message_id, fsn, ppid, payload, is_beginning,
69*d9f75844SAndroid Build Coastguard Worker                 is_end, is_unordered);
70*d9f75844SAndroid Build Coastguard Worker   }
71*d9f75844SAndroid Build Coastguard Worker 
72*d9f75844SAndroid Build Coastguard Worker   // The size of this data, which translates to the size of its payload.
sizeData73*d9f75844SAndroid Build Coastguard Worker   size_t size() const { return payload.size(); }
74*d9f75844SAndroid Build Coastguard Worker 
75*d9f75844SAndroid Build Coastguard Worker   // Stream Identifier.
76*d9f75844SAndroid Build Coastguard Worker   StreamID stream_id;
77*d9f75844SAndroid Build Coastguard Worker 
78*d9f75844SAndroid Build Coastguard Worker   // Stream Sequence Number (SSN), per stream, for ordered chunks. Defined by
79*d9f75844SAndroid Build Coastguard Worker   // RFC4960 and used only in DATA chunks (not I-DATA).
80*d9f75844SAndroid Build Coastguard Worker   SSN ssn;
81*d9f75844SAndroid Build Coastguard Worker 
82*d9f75844SAndroid Build Coastguard Worker   // Message Identifier (MID) per stream and ordered/unordered. Defined by
83*d9f75844SAndroid Build Coastguard Worker   // RFC8260, and used together with options.is_unordered and stream_id to
84*d9f75844SAndroid Build Coastguard Worker   // uniquely identify a message. Used only in I-DATA chunks (not DATA).
85*d9f75844SAndroid Build Coastguard Worker   MID message_id;
86*d9f75844SAndroid Build Coastguard Worker   // Fragment Sequence Number (FSN) per stream and ordered/unordered, as above.
87*d9f75844SAndroid Build Coastguard Worker   FSN fsn;
88*d9f75844SAndroid Build Coastguard Worker 
89*d9f75844SAndroid Build Coastguard Worker   // Payload Protocol Identifier (PPID).
90*d9f75844SAndroid Build Coastguard Worker   PPID ppid;
91*d9f75844SAndroid Build Coastguard Worker 
92*d9f75844SAndroid Build Coastguard Worker   // The actual data payload.
93*d9f75844SAndroid Build Coastguard Worker   std::vector<uint8_t> payload;
94*d9f75844SAndroid Build Coastguard Worker 
95*d9f75844SAndroid Build Coastguard Worker   // If this data represents the first, last or a middle chunk.
96*d9f75844SAndroid Build Coastguard Worker   IsBeginning is_beginning;
97*d9f75844SAndroid Build Coastguard Worker   IsEnd is_end;
98*d9f75844SAndroid Build Coastguard Worker   // If this data is sent/received unordered.
99*d9f75844SAndroid Build Coastguard Worker   IsUnordered is_unordered;
100*d9f75844SAndroid Build Coastguard Worker };
101*d9f75844SAndroid Build Coastguard Worker }  // namespace dcsctp
102*d9f75844SAndroid Build Coastguard Worker 
103*d9f75844SAndroid Build Coastguard Worker #endif  // NET_DCSCTP_PACKET_DATA_H_
104