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