/******************************************************************************** * Copyright (C) 2018 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH * * * * This software is distributed under the terms of the * * GNU Lesser General Public Licence (LGPL) version 3, * * copied verbatim in the file "LICENSE" * ********************************************************************************/ #ifndef FAIR_MQ_OFI_CONTROLMESSAGES_H #define FAIR_MQ_OFI_CONTROLMESSAGES_H #include #include #include #include #include #include namespace boost { namespace asio { template auto buffer(const PodType& obj) -> boost::asio::const_buffer { return boost::asio::const_buffer(static_cast(&obj), sizeof(PodType)); } } // namespace asio } // namespace boost namespace fair { namespace mq { namespace ofi { enum class ControlMessageType { DataAddressAnnouncement = 1, PostBuffer, PostBufferAcknowledgement }; struct ControlMessage { ControlMessageType type; }; struct DataAddressAnnouncement : ControlMessage { uint32_t ipv4; // in_addr_t from uint32_t port; // in_port_t from }; struct PostBuffer : ControlMessage { uint64_t size; // buffer size (size_t) }; template auto MakeControlMessage(Args&&... args) -> T { T ctrl = T(std::forward(args)...); if (std::is_same::value) { ctrl.type = ControlMessageType::DataAddressAnnouncement; } else if (std::is_same::value) { ctrl.type = ControlMessageType::PostBuffer; } return ctrl; } } // namespace ofi } // namespace mq } // namespace fair #endif /* FAIR_MQ_OFI_CONTROLMESSAGES_H */