E2SAR 0.3.0
Loading...
Searching...
No Matches
e2sarHeaders.hpp
1#ifndef E2SARHEADERSHPP
2#define E2SARHEADERSHPP
3
4#include <boost/tuple/tuple.hpp>
5#include "portable_endian.h"
6
7namespace e2sar
8{
9 using EventNum_t = u_int64_t;
10 using UnixTimeNano_t = u_int64_t;
11 using UnixTimeMicro_t = u_int64_t;
12 using EventRate_t = u_int32_t;
13
14 constexpr u_int8_t rehdrVersion = 1;
15 constexpr u_int8_t rehdrVersionNibble = rehdrVersion << 4; // shifted up by 4 bits to be in the upper nibble
16 /*
17 The Reassembly Header. You should always use the provided methods to set
18 and interrogate fields as the structure maintains Big-Endian order
19 internally.
20 */
21 struct REHdr
22 {
23 const u_int8_t preamble[2] {rehdrVersionNibble, 0}; // 4 bit version + reserved
24 u_int16_t dataId{0}; // source identifier
25 u_int32_t bufferOffset{0};
26 u_int32_t bufferLength{0}; // this is event length, not the length of the buffer being sent
27 EventNum_t eventNum{0};
28
32 inline void set(u_int16_t data_id, u_int32_t buff_off, u_int32_t buff_len, EventNum_t event_num)
33 {
34 dataId = htobe16(data_id);
35 bufferOffset = htobe32(buff_off);
36 bufferLength = htobe32(buff_len);
37 eventNum = htobe64(event_num);
38 }
39
43 inline EventNum_t get_eventNum() const
44 {
45 return be64toh(eventNum);
46 }
47
51 inline u_int32_t get_bufferLength() const
52 {
53 return be32toh(bufferLength);
54 }
55
59 inline u_int32_t get_bufferOffset() const
60 {
61 return be32toh(bufferOffset);
62 }
63
67 inline u_int16_t get_dataId() const
68 {
69 return be16toh(dataId);
70 }
71
81 const inline boost::tuple<u_int16_t, u_int32_t, u_int32_t, EventNum_t> get_Fields() const
82 {
83 return boost::make_tuple(get_dataId(), get_bufferOffset(), get_bufferLength(), get_eventNum());
84 }
85
89 inline u_int8_t get_HeaderVersion() const
90 {
91 return preamble[0] >> 4;
92 }
93
98 inline bool validate() const
99 {
100 return (preamble[0] == rehdrVersionNibble) && (preamble[1] == 0);
101 }
102 } __attribute__((__packed__));
103
104 constexpr u_int8_t lbhdrVersion2 = 2;
105 constexpr u_int8_t lbhdrVersion3 = 3;
111 struct LBHdrV2
112 {
113 const char preamble[2] {'L', 'B'};
114 u_int8_t version{lbhdrVersion2};
115 u_int8_t nextProto{rehdrVersion};
116 u_int16_t rsvd{0};
117 u_int16_t entropy{0};
118 EventNum_t eventNum{0L};
119
123 inline void set(u_int16_t ent, EventNum_t event_num)
124 {
125 entropy = htobe16(ent);
126 eventNum = htobe64(event_num);
127 }
128
132 inline u_int8_t get_version() const
133 {
134 return version;
135 }
136
140 inline bool check_version() const
141 {
142 return version == lbhdrVersion2;
143 }
144
148 inline u_int8_t get_nextProto() const
149 {
150 return nextProto;
151 }
152
156 inline u_int16_t get_entropy() const
157 {
158 return be16toh(entropy);
159 }
160
164 inline EventNum_t get_eventNum() const
165 {
166 return be64toh(eventNum);
167 }
168
180 const inline boost::tuple<u_int8_t, u_int8_t, u_int16_t, EventNum_t> get_Fields() const
181 {
182 return boost::make_tuple(version, nextProto, get_entropy(), get_eventNum());
183 }
184 } __attribute__((__packed__));
185
191 struct LBHdrV3
192 {
193 const char preamble[2] {'L', 'B'};
194 u_int8_t version{lbhdrVersion3};
195 u_int8_t nextProto{rehdrVersion};
196 u_int16_t slotSelect{0};
197 u_int16_t portSelect{0};
198 EventNum_t tick{0L};
199
203 inline void set(u_int16_t slt, u_int16_t prt, EventNum_t tk)
204 {
205 slotSelect = htobe16(slt);
206 portSelect = htobe16(prt);
207 tick = htobe64(tk);
208 }
209
213 inline u_int8_t get_version() const
214 {
215 return version;
216 }
217
221 inline bool check_version() const
222 {
223 return version == lbhdrVersion3;
224 }
225
229 inline u_int8_t get_nextProto() const
230 {
231 return nextProto;
232 }
233
237 inline u_int16_t get_slotSelect() const
238 {
239 return be16toh(slotSelect);
240 }
241
245 inline u_int16_t get_portSelect() const
246 {
247 return be16toh(portSelect);
248 }
249
253 inline EventNum_t get_tick() const
254 {
255 return be64toh(tick);
256 }
257
270 const inline boost::tuple<u_int8_t, u_int8_t, u_int16_t, u_int16_t, EventNum_t> get_Fields() const
271 {
272 return boost::make_tuple(version, nextProto, get_slotSelect(), get_portSelect(), get_tick());
273 }
274 } __attribute__((__packed__));
275
276
277 // union of LB headers (they are all the same lengths)
278 union LBHdrU {
279 struct LBHdrV2 lb2;
280 struct LBHdrV3 lb3;
281 // explicit c-tor because it's a union
282 LBHdrU()
283 {
284 ;
285 }
286 // c-tor that builds a specific header version
287 LBHdrU(u_int8_t ver)
288 {
289 switch(ver) {
290 default:
291 case 2:
292 new (this) LBHdrV2();
293 break;
294 case 3:
295 new (this) LBHdrV3();
296 break;
297 }
298 }
299 } __attribute__((__packed__));
300
301 // for memory allocation purposes we need them concatenated
302 struct LBREHdr {
303 union LBHdrU lbu;
304 struct REHdr re;
305 LBREHdr()
306 {
307 new (&lbu) LBHdrU();
308 new (&re) REHdr();
309 }
310 LBREHdr(u_int8_t ver)
311 {
312 new (&lbu) LBHdrU(ver);
313 new (&re) REHdr();
314 }
315 } __attribute__((__packed__));
316
317 constexpr u_int8_t synchdrVersion2 = 2;
323 struct SyncHdr
324 {
325 const char preamble[2] {'L', 'C'};
326 u_int8_t version{synchdrVersion2};
327 u_int8_t rsvd{0};
328 u_int32_t eventSrcId{0};
329 EventNum_t eventNumber{0LL};
330 EventRate_t avgEventRateHz{0};
331 UnixTimeNano_t unixTimeNano{0LL};
332
336 inline void set(u_int32_t esid, EventNum_t event_num, EventRate_t avg_rate, UnixTimeNano_t ut)
337 {
338 eventSrcId = htobe32(esid);
339 eventNumber = htobe64(event_num);
340 avgEventRateHz = htobe32(avg_rate);
341 unixTimeNano = htobe64(ut);
342 }
343
347 u_int8_t get_version() const
348 {
349 return version;
350 }
351
355 bool check_version() const
356 {
357 return version == synchdrVersion2;
358 }
359
363 inline u_int32_t get_eventSrcId() const
364 {
365 return be32toh(eventSrcId);
366 }
370 inline EventNum_t get_eventNumber() const
371 {
372 return be64toh(eventNumber);
373 }
377 inline u_int32_t get_avgEventRateHz() const
378 {
379 return be32toh(avgEventRateHz);
380 }
384 inline UnixTimeNano_t get_unixTimeNano() const
385 {
386 return be64toh(unixTimeNano);
387 }
399 const boost::tuple<u_int32_t, EventNum_t, u_int32_t, UnixTimeNano_t> get_Fields() const
400 {
401 return boost::make_tuple(get_eventSrcId(), get_eventNumber(), get_avgEventRateHz(), get_unixTimeNano());
402 }
403 } __attribute__((__packed__));
404
405 // various useful header lengths
406 constexpr size_t IPV4_HDRLEN = 20;
407 constexpr size_t IPV6_HDRLEN = 40;
408 constexpr size_t UDP_HDRLEN = 8;
409
410 // Legacy constant for backward compatibility (IPv4 only)
411 constexpr size_t IP_HDRLEN = IPV4_HDRLEN;
412 constexpr size_t TOTAL_HDR_LEN{IP_HDRLEN + UDP_HDRLEN + sizeof(LBHdrV2) + sizeof(REHdr)};
413
414 // Protocol-aware header length functions
415 inline constexpr size_t getIPHeaderLength(bool useIPv6) {
416 return useIPv6 ? IPV6_HDRLEN : IPV4_HDRLEN;
417 }
418
419 inline constexpr size_t getTotalHeaderLength(bool useIPv6) {
420 return getIPHeaderLength(useIPv6) + UDP_HDRLEN + sizeof(LBHdrV2) + sizeof(REHdr);
421 }
422}
423
424#endif
Definition e2sar.hpp:11
Definition e2sarHeaders.hpp:112
u_int8_t get_version() const
Definition e2sarHeaders.hpp:132
u_int16_t get_entropy() const
Definition e2sarHeaders.hpp:156
void set(u_int16_t ent, EventNum_t event_num)
Definition e2sarHeaders.hpp:123
u_int8_t get_nextProto() const
Definition e2sarHeaders.hpp:148
EventNum_t get_eventNum() const
Definition e2sarHeaders.hpp:164
const boost::tuple< u_int8_t, u_int8_t, u_int16_t, EventNum_t > get_Fields() const
Definition e2sarHeaders.hpp:180
bool check_version() const
Definition e2sarHeaders.hpp:140
Definition e2sarHeaders.hpp:192
bool check_version() const
Definition e2sarHeaders.hpp:221
u_int16_t get_portSelect() const
Definition e2sarHeaders.hpp:245
void set(u_int16_t slt, u_int16_t prt, EventNum_t tk)
Definition e2sarHeaders.hpp:203
EventNum_t get_tick() const
Definition e2sarHeaders.hpp:253
u_int16_t get_slotSelect() const
Definition e2sarHeaders.hpp:237
const boost::tuple< u_int8_t, u_int8_t, u_int16_t, u_int16_t, EventNum_t > get_Fields() const
Definition e2sarHeaders.hpp:270
u_int8_t get_version() const
Definition e2sarHeaders.hpp:213
u_int8_t get_nextProto() const
Definition e2sarHeaders.hpp:229
Definition e2sarHeaders.hpp:302
Definition e2sarHeaders.hpp:22
EventNum_t get_eventNum() const
Definition e2sarHeaders.hpp:43
u_int16_t get_dataId() const
Definition e2sarHeaders.hpp:67
bool validate() const
Definition e2sarHeaders.hpp:98
const boost::tuple< u_int16_t, u_int32_t, u_int32_t, EventNum_t > get_Fields() const
Definition e2sarHeaders.hpp:81
u_int8_t get_HeaderVersion() const
Definition e2sarHeaders.hpp:89
u_int32_t get_bufferLength() const
Definition e2sarHeaders.hpp:51
u_int32_t get_bufferOffset() const
Definition e2sarHeaders.hpp:59
void set(u_int16_t data_id, u_int32_t buff_off, u_int32_t buff_len, EventNum_t event_num)
Definition e2sarHeaders.hpp:32
Definition e2sarHeaders.hpp:324
EventNum_t get_eventNumber() const
Definition e2sarHeaders.hpp:370
u_int8_t get_version() const
Definition e2sarHeaders.hpp:347
u_int32_t get_eventSrcId() const
Definition e2sarHeaders.hpp:363
u_int32_t get_avgEventRateHz() const
Definition e2sarHeaders.hpp:377
void set(u_int32_t esid, EventNum_t event_num, EventRate_t avg_rate, UnixTimeNano_t ut)
Definition e2sarHeaders.hpp:336
const boost::tuple< u_int32_t, EventNum_t, u_int32_t, UnixTimeNano_t > get_Fields() const
Definition e2sarHeaders.hpp:399
UnixTimeNano_t get_unixTimeNano() const
Definition e2sarHeaders.hpp:384
bool check_version() const
Definition e2sarHeaders.hpp:355
Definition e2sarHeaders.hpp:278