00001 #ifndef artdaq_Application_Routing_RoutingPacket_hh 00002 #define artdaq_Application_Routing_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 00021 enum class RoutingMasterMode : uint8_t 00022 { 00023 RouteBySequenceID, 00024 RouteBySendCount, 00025 INVALID 00026 }; 00027 } 00028 } 00032 struct artdaq::detail::RoutingPacketEntry 00033 { 00037 RoutingPacketEntry() : sequence_id(Fragment::InvalidSequenceID), destination_rank(-1) {} 00043 RoutingPacketEntry(Fragment::sequence_id_t seq, int rank) : sequence_id(seq), destination_rank(rank) {} 00044 Fragment::sequence_id_t sequence_id; 00045 int destination_rank; 00046 }; 00047 00048 00052 #define ROUTING_MAGIC 0x1337beef 00053 00057 struct artdaq::detail::RoutingPacketHeader 00058 { 00059 uint32_t header; 00060 RoutingMasterMode mode; 00061 size_t nEntries; 00062 00068 explicit RoutingPacketHeader(RoutingMasterMode m, size_t n) : header(ROUTING_MAGIC), mode(m), nEntries(n) {} 00072 RoutingPacketHeader() : header(0), mode(RoutingMasterMode::INVALID), nEntries(0) {} 00073 }; 00074 00078 struct artdaq::detail::RoutingAckPacket 00079 { 00080 int rank; 00081 Fragment::sequence_id_t first_sequence_id; 00082 Fragment::sequence_id_t last_sequence_id; 00083 }; 00084 00085 00089 #define TOKEN_MAGIC 0xbeefcafe 00090 00095 struct artdaq::detail::RoutingToken 00096 { 00097 uint32_t header; 00098 int rank; 00099 unsigned new_slots_free; 00100 }; 00101 00102 #endif //artdaq_Application_Routing_RoutingPacket_hh