artdaq  v3_12_02
RoutingPacket.hh
1 #ifndef artdaq_DAQrate_detail_RoutingPacket_hh
2 #define artdaq_DAQrate_detail_RoutingPacket_hh
3 
4 #include "TRACE/tracemf.h" // Pre-empt TRACE/trace.h from Fragment.hh.
5 #include "artdaq-core/Data/Fragment.hh"
6 
7 #include <string>
8 #include <vector>
9 
10 namespace artdaq {
11 namespace detail {
12 struct RoutingPacketEntry;
18 using RoutingPacket = std::vector<RoutingPacketEntry>;
19 struct RoutingPacketHeader;
20 struct RoutingConnectHeader;
21 struct RoutingRequest;
22 struct RoutingToken;
23 
27 enum class RoutingManagerMode : uint8_t
28 {
31  DataFlow,
32  INVALID
33 };
38 {
39 public:
45  static RoutingManagerMode stringToRoutingManagerMode(std::string const& modeString)
46  {
47  if (modeString == "EventBuilding" || modeString == "eventbuilding") return RoutingManagerMode::EventBuilding;
48  if (modeString == "RequestBasedEventBuilding" || modeString == "requestbasedeventbuilding" || modeString == "RequestBased" || modeString == "requestbased") return RoutingManagerMode::RequestBasedEventBuilding;
49  if (modeString == "DataFlow" || modeString == "dataflow") return RoutingManagerMode::DataFlow;
50  return RoutingManagerMode::INVALID;
51  }
58  {
59  switch (mode)
60  {
62  return "EventBuilding";
64  return "RequestBasedEventBuilding";
66  return "DataFlow";
67  case RoutingManagerMode::INVALID:
68  return "INVALID";
69  }
70  return "Unknown Mode";
71  }
72 };
73 } // namespace detail
74 } // namespace artdaq
79 {
89  RoutingPacketEntry(Fragment::sequence_id_t seq, int rank)
90  : sequence_id(seq), destination_rank(rank) {}
91 
92  Fragment::sequence_id_t sequence_id{Fragment::InvalidSequenceID};
93  int32_t destination_rank{-1};
94 };
95 
99 #define ROUTING_MAGIC 0x1337beef
100 
105 {
106  uint32_t header{0};
107  uint64_t nEntries{0};
108 
113  explicit RoutingPacketHeader(size_t n)
114  : header(ROUTING_MAGIC), nEntries(n) {}
119 };
120 
125 {
129  enum class RequestMode : uint8_t
130  {
131  Connect = 0,
132  Disconnect = 1,
133  Request = 2,
134  Invalid = 255,
135  };
136 
142  static std::string RequestModeToString(RequestMode m)
143  {
144  switch (m)
145  {
146  case RequestMode::Connect:
147  return "Connect";
148  case RequestMode::Disconnect:
149  return "Disconnect";
150  case RequestMode::Request:
151  return "Request";
152  case RequestMode::Invalid:
153  return "Invalid";
154  }
155  return "UNKNOWN";
156  }
157 
158  uint32_t header{0};
159  int32_t rank{-1};
160  Fragment::sequence_id_t sequence_id{artdaq::Fragment::InvalidSequenceID};
161  RequestMode mode{RequestMode::Invalid};
162 
170  RoutingRequest(int r, RequestMode m = RequestMode::Connect)
171  : header(ROUTING_MAGIC), rank(r), mode(m) {}
172 
178  RoutingRequest(int r, Fragment::sequence_id_t seq)
179  : header(ROUTING_MAGIC), rank(r), sequence_id(seq), mode(RequestMode::Request) {}
180 
182 };
183 
187 #define TOKEN_MAGIC 0xbeefcafe
188 
194 {
195  uint32_t header;
196  int rank;
197  unsigned new_slots_free;
198  unsigned run_number;
199 };
200 
201 #endif // artdaq_Application_Routing_RoutingPacket_hh
RequestMode mode
Mode of the request.
A row of the Routing Table.
static std::string RequestModeToString(RequestMode m)
Convert a RequestMode enumeration value to string.
Convert RoutingManagerMode to/from strings.
unsigned new_slots_free
The number of slots free in the token sender (usually 1)
RoutingManagerMode
Mode indicating whether the RoutingManager is routing events by Sequence ID or by Send Count...
The RoutingToken contains the magic bytes, the rank of the token sender, and the number of slots free...
RoutingPacketEntry(Fragment::sequence_id_t seq, int rank)
Construct a RoutingPacketEntry with the given sequence ID and destination rank.
The header of the Routing Table, containing the magic bytes and the number of entries.
uint64_t nEntries
The number of RoutingPacketEntries in the RoutingPacket.
uint32_t header
Magic bytes to make sure the packet wasn&#39;t garbled.
Multiple sources sending to a single destination. RoutingManager pushes table updates to all senders...
std::vector< RoutingPacketEntry > RoutingPacket
A RoutingPacket is simply a vector of RoutingPacketEntry objects. It is not suitable for network tran...
int rank
The rank from which the RoutingToken came.
Fragment::sequence_id_t sequence_id
The sequence ID of the RoutingPacketEntry.
static RoutingManagerMode stringToRoutingManagerMode(std::string const &modeString)
Convert String to RoutingManagerMode.
Fragment::sequence_id_t sequence_id
The sequence ID being requested in Request mode.
RoutingPacketHeader(size_t n)
Construct a RoutingPacketHeader declaring a given number of entries.
RoutingRequest(int r, RequestMode m=RequestMode::Connect)
Create a request using the given rank and mode.
Multiple sources sending to a single destination. Table updates are triggered by senders requesting r...
RoutingPacketHeader()
Default Constructor.
RoutingRequest()
Default constructor.
unsigned run_number
The Run with which this token should be associated.
RequestMode
The mode of this request, whether Request or Connect/Disconnect control messages. ...
int32_t destination_rank
The destination rank for this sequence ID.
int32_t rank
The rank of the request sender.
static std::string routingManagerModeToString(RoutingManagerMode mode)
Convert RoutingManagerMode to string.
Represents a request sent to the RoutingManager for routing information.
One source sending to one destination (i.e. moving around completed events). Uses request-based routi...
uint32_t header
Magic bytes for identifying message type on wire.
RoutingPacketEntry()
Default Constructor.
RoutingRequest(int r, Fragment::sequence_id_t seq)
Create a RoutingRequest using the given rank and sequence ID.
uint32_t header
The magic bytes that help validate the RoutingToken.