| /* |
| * 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" |
| #include "rtc_base/copy_on_write_buffer.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 = webrtc::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 = webrtc::StrongAlias<class IsEndTag, bool>; |
| |
| Data(StreamID stream_id, |
| SSN ssn, |
| MID message_id, |
| FSN fsn, |
| PPID ppid, |
| rtc::CopyOnWriteBuffer 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() const { |
| 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. |
| rtc::CopyOnWriteBuffer 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_ |