OpenLCP/rdmnet/broker-protocol.h
2021-08-16 21:53:48 -04:00

301 lines
6.7 KiB
C++

/*
broker-protocol.h
Copyright (c) 2021 Kevin Matz (kevin.matz@gmail.com)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
#pragma once
#include "pdu.h"
#include "rdm/uid.h"
#include "uuid/uuid.h"
namespace RDMnet {
namespace BrokerProtocol {
/**
* @brief 1.2.2 Broker Protocol
*
* The Broker Protocol enables the scalability and multi-controller
* functionality of RDMnet. It uses a central server called a Broker to handle
* discovery, maintain the state of the system and facilitate message routing.
* The Broker routes messages between a set of other Components, which are
* referred to as Clients. The Broker Protocol contains a small set of messages
* that facilitate Client connection and discovery of other Clients.
*/
namespace ClientEntry {
/**
* @brief The ClientEntry::Pdu class
*/
class Pdu
: public RDMnet::Pdu
{
public:
Pdu();
void iStream(ACN::PDU::Stream) override;
};
/**
* @brief The ClientEntry::header struct
*/
struct entry_header
: ACN::PDU::pdu_header
{
UUID::uuid cid;
size_t streamSize() const override;
void iStream(ACN::PDU::Stream) override;
void oStream(ACN::PDU::Stream) const override;
};
/**
* @brief The ClientEntry::RptClientEntry_data struct
*/
struct entry_rpt_data
: ACN::PDU::pdu_data
{
RDM::UID client_uid;
uint8_t client_type;
UUID::uuid binding_cid;
size_t streamSize() const override { return 23; }
void iStream(ACN::PDU::Stream) override;
void oStream(ACN::PDU::Stream) const override;
};
/**
* @brief The ClientEntry::EptClientEntry_data struct
*/
struct entry_ept_data
: ACN::PDU::pdu_data
{
std::vector<uint8_t> subprotocol_list;
size_t streamSize() const override { return subprotocol_list.size(); }
void iStream(ACN::PDU::Stream) override;
void oStream(ACN::PDU::Stream) const override;
};
} // namespace CLientEntry
/**
* @brief The BrokerProtocol::Pdu class
*/
class Pdu
: public RDMnet::Pdu
{
public:
Pdu();
void iStream(ACN::PDU::Stream) override;
};
/**
* @brief The connection_flags union
*/
union connection_flags {
uint8_t byte;
struct __attribute__((packed)) {
bool incrementalUpdates : 1;
uint8_t flags_reserved : 7; //!< Brokers shall ignore.
};
};
/**
* @brief 6.3.1.2 Client Connect
*/
struct client_connect_data
: ACN::PDU::pdu_data
{
std::string clientScope;
uint16_t version;
std::string searchDomain;
connection_flags flags;
std::shared_ptr<ClientEntry::Pdu> pdu;
size_t streamSize() const override { return 297 + pdu->streamSize(); }
void iStream(ACN::PDU::Stream) override;
void oStream(ACN::PDU::Stream) const override;
};
/**
* @brief 6.3.1.3 Connect Reply
*/
struct connect_reply_data
: ACN::PDU::pdu_data
{
uint16_t code;
uint16_t version;
RDM::UID broker_uid;
RDM::UID client_uid;
size_t streamSize() const override { return 16; }
void iStream(ACN::PDU::Stream) override;
void oStream(ACN::PDU::Stream) const override;
};
/**
* @brief 6.3.1.4 Client Entry Update
*/
struct client_entry_update_data
: ACN::PDU::pdu_data
{
connection_flags flags;
std::shared_ptr<ClientEntry::Pdu> pdu;
size_t streamSize() const override { return 1 + pdu->streamSize(); }
void iStream(ACN::PDU::Stream) override;
void oStream(ACN::PDU::Stream) const override;
};
/**
* @brief 6.3.1.5 Client Redirect IPv4
*/
struct client_redirect_ipv4_data
: ACN::PDU::pdu_data
{
uint32_t ip;
uint16_t port;
size_t streamSize() const override { return 6; }
void iStream(ACN::PDU::Stream) override;
void oStream(ACN::PDU::Stream) const override;
};
/**
* @brief 6.3.1.6 Client Redirect IPv6
*/
struct client_redirect_ipv6_data
: ACN::PDU::pdu_data
{
uint8_t ip[16];
uint16_t port;
size_t streamSize() const override { return 18; }
void iStream(ACN::PDU::Stream) override;
void oStream(ACN::PDU::Stream) const override;
};
/**
* @brief The dynamic_uid_request struct
*/
struct dynamic_uid_request
: ACN::PDU::pdu_stream_object
{
RDM::UID uid;
UUID::uuid rid;
size_t streamSize() const override { return 22; }
void iStream(ACN::PDU::Stream) override;
void oStream(ACN::PDU::Stream) const override;
};
/**
* @brief 6.3.1.12 Request Dynamic UID Assignment
*/
struct request_dynamic_uid_data
: ACN::PDU::pdu_data
{
std::vector<dynamic_uid_request> list;
size_t streamSize() const override { return 22 * list.size(); }
void iStream(ACN::PDU::Stream) override;
void oStream(ACN::PDU::Stream) const override;
};
/**
* @brief The dynamic_uid_mapping struct
*/
struct dynamic_uid_mapping
: ACN::PDU::pdu_stream_object
{
RDM::UID uid;
UUID::uuid rid;
uint16_t status;
size_t streamSize() const override { return 24; }
void iStream(ACN::PDU::Stream) override;
void oStream(ACN::PDU::Stream) const override;
};
/**
* @brief 6.3.1.13 Dynamic UID Assignment List
*/
struct dynamic_uid_assignment_data
: ACN::PDU::pdu_data
{
std::vector<dynamic_uid_mapping> list;
size_t streamSize() const override { return 24 * list.size(); }
void iStream(ACN::PDU::Stream) override;
void oStream(ACN::PDU::Stream) const override;
};
/**
* @brief 6.3.1.14 Fetch Dynamic UID Assignment List
*/
struct fetch_dynamcic_assignment_data
: ACN::PDU::pdu_data
{
std::vector<RDM::UID> list;
size_t streamSize() const override { return 6 * list.size(); }
void iStream(ACN::PDU::Stream) override;
void oStream(ACN::PDU::Stream) const override;
};
/**
* @brief 6.3.1.15 Client Disconnect
*/
struct disconnect_data
: ACN::PDU::pdu_data
{
uint16_t reason;
size_t streamSize() const override { return 2; }
void iStream(ACN::PDU::Stream s) override { *s >> reason; }
void oStream(ACN::PDU::Stream s) const override { *s << reason; };
};
} // namespace BrokerProtocol
} // namespace RDMnet