00001 #ifndef artdaq_DAQrate_detail_RoutingPacket_hh 00002 #define artdaq_DAQrate_detail_RoutingPacket_hh 00003 00004 #include "artdaq-core/Data/Fragment.hh" 00005 00006 namespace artdaq 00007 { 00008 namespace detail 00009 { 00010 struct RoutingPacketEntry; 00016 using RoutingPacket = std::vector<RoutingPacketEntry>; 00017 struct RoutingPacketHeader; 00018 struct RoutingAckPacket; 00019 struct RoutingToken; 00020 00024 enum class RoutingMasterMode : uint8_t 00025 { 00026 RouteBySequenceID, 00027 RouteBySendCount, 00028 INVALID 00029 }; 00030 } 00031 } 00035 struct artdaq::detail::RoutingPacketEntry 00036 { 00040 RoutingPacketEntry() : sequence_id(Fragment::InvalidSequenceID), destination_rank(-1) {} 00046 RoutingPacketEntry(Fragment::sequence_id_t seq, int rank) : sequence_id(seq), destination_rank(rank) {} 00047 Fragment::sequence_id_t sequence_id; 00048 int destination_rank; 00049 }; 00050 00051 00055 #define ROUTING_MAGIC 0x1337beef 00056 00060 struct artdaq::detail::RoutingPacketHeader 00061 { 00062 uint32_t header; 00063 RoutingMasterMode mode; 00064 size_t nEntries; 00065 00071 explicit RoutingPacketHeader(RoutingMasterMode m, size_t n) : header(ROUTING_MAGIC), mode(m), nEntries(n) {} 00075 RoutingPacketHeader() : header(0), mode(RoutingMasterMode::INVALID), nEntries(0) {} 00076 }; 00077 00081 struct artdaq::detail::RoutingAckPacket 00082 { 00083 int rank; 00084 Fragment::sequence_id_t first_sequence_id; 00085 Fragment::sequence_id_t last_sequence_id; 00086 }; 00087 00088 00092 #define TOKEN_MAGIC 0xbeefcafe 00093 00098 struct artdaq::detail::RoutingToken 00099 { 00100 uint32_t header; 00101 int rank; 00102 unsigned new_slots_free; 00103 }; 00104 00105 #endif //artdaq_Application_Routing_RoutingPacket_hh