From 6dba4310844ef59e339634b90d91bdc517c0dec8 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 24 Jul 2015 11:38:51 -0700 Subject: [PATCH] initial version of the control packet class --- .../networking/src/udt/ControlPacket.cpp | 54 ++++++++++++++++++ libraries/networking/src/udt/ControlPacket.h | 55 +++++++++++++++++++ libraries/networking/src/udt/Packet.cpp | 2 +- 3 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 libraries/networking/src/udt/ControlPacket.cpp create mode 100644 libraries/networking/src/udt/ControlPacket.h diff --git a/libraries/networking/src/udt/ControlPacket.cpp b/libraries/networking/src/udt/ControlPacket.cpp new file mode 100644 index 0000000000..ee3fef9f3a --- /dev/null +++ b/libraries/networking/src/udt/ControlPacket.cpp @@ -0,0 +1,54 @@ +// +// ControlPacket.cpp +// libraries/networking/src/udt +// +// Created by Stephen Birarda on 2015-07-24. +// Copyright 2015 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include "ControlPacket.h" + +using namespace udt; + +std::unique_ptr ControlPacket::create(Type type, const SequenceNumberList& sequenceNumbers) { + return ControlPacket::create(type, sequenceNumbers); +} + +qint64 ControlPacket::localHeaderSize() { + return sizeof(TypeAndSubSequenceNumber); +} + +qint64 ControlPacket::totalHeadersSize() const { + return BasePacket::localHeaderSize() + localHeaderSize(); +} + +ControlPacket::ControlPacket(Type type, const SequenceNumberList& sequenceNumbers) : + BasePacket(localHeaderSize() + (sizeof(Packet::SequenceNumber) * sequenceNumbers.size())) +{ + qint64 headerSize = localHeaderSize(); + + _payloadCapacity -= headerSize; + _payloadStart += headerSize; + + open(QIODevice::ReadWrite); + + // pack in the sequence numbers + for(auto& sequenceNumber : sequenceNumbers) { + writePrimitive(sequenceNumber); + } +} + +ControlPacket::ControlPacket(ControlPacket&& other) : + BasePacket(std::move(other)) +{ + +} + +ControlPacket& ControlPacket::operator=(Packet&& other) { + BasePacket::operator=(std::move(other)); + + return *this; +} diff --git a/libraries/networking/src/udt/ControlPacket.h b/libraries/networking/src/udt/ControlPacket.h new file mode 100644 index 0000000000..2fa7200322 --- /dev/null +++ b/libraries/networking/src/udt/ControlPacket.h @@ -0,0 +1,55 @@ +// +// ControlPacket.h +// libraries/networking/src/udt +// +// Created by Stephen Birarda on 2015-07-24. +// Copyright 2015 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#pragma once + +#ifndef hifi_ControlPacket_h +#define hifi_ControlPacket_h + +#include + +#include "BasePacket.h" +#include "Packet.h" + +namespace udt { + +using SequenceNumberList = std::vector; + +class ControlPacket : public BasePacket { + Q_OBJECT +public: + using TypeAndSubSequenceNumber = uint32_t; + + enum class Type : uint16_t { + ACK, + ACK2, + NAK, + PacketPair + }; + + std::unique_ptr create(Type type, const SequenceNumberList& sequenceNumbers); + + static qint64 localHeaderSize(); // Current level's header size + virtual qint64 totalHeadersSize() const; // Cumulated size of all the headers + +private: + ControlPacket(Type type, const SequenceNumberList& sequenceNumbers); + ControlPacket(ControlPacket&& other); + ControlPacket(const Packet& other) = delete; + + ControlPacket& operator=(Packet&& other); + ControlPacket& operator=(const Packet& other) = delete; +}; + +} // namespace udt + + +#endif // hifi_ControlPacket_h diff --git a/libraries/networking/src/udt/Packet.cpp b/libraries/networking/src/udt/Packet.cpp index 47ea6ffef3..c041fec5da 100644 --- a/libraries/networking/src/udt/Packet.cpp +++ b/libraries/networking/src/udt/Packet.cpp @@ -50,7 +50,7 @@ qint64 Packet::maxPayloadSize() const { } qint64 Packet::totalHeadersSize() const { - return localHeaderSize(); + return BasePacket::localHeaderSize() + localHeaderSize(); } qint64 Packet::localHeaderSize() const {