E2SAR 0.2.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 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 inline const 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 } __attribute__((__packed__));
86
87 constexpr u_int8_t lbhdrVersion = 2;
93 struct LBHdr
94 {
95 char preamble[2] {'L', 'B'};
96 u_int8_t version{lbhdrVersion};
97 u_int8_t nextProto{rehdrVersion};
98 u_int16_t rsvd{0};
99 u_int16_t entropy{0};
100 EventNum_t eventNum{0L};
101
105 inline void set(u_int16_t ent, EventNum_t event_num)
106 {
107 entropy = htobe16(ent);
108 eventNum = htobe64(event_num);
109 }
110
114 u_int8_t get_version() const
115 {
116 return version;
117 }
118
122 u_int8_t get_nextProto() const
123 {
124 return nextProto;
125 }
126
130 u_int16_t get_entropy() const
131 {
132 return be16toh(entropy);
133 }
134
138 EventNum_t get_eventNum() const
139 {
140 return be64toh(eventNum);
141 }
142
154 const boost::tuple<u_int8_t, u_int8_t, u_int16_t, EventNum_t> get_Fields() const
155 {
156 return boost::make_tuple(version, nextProto, get_entropy(), get_eventNum());
157 }
158 } __attribute__((__packed__));
159
160 // for memory allocation purposes we need them concatenated
161 struct LBREHdr {
162 struct LBHdr lb;
163 struct REHdr re;
164 } __attribute__((__packed__));
165
166 constexpr u_int8_t synchdrVersion = 2;
172 struct SyncHdr
173 {
174 char preamble[2] {'L', 'C'};
175 u_int8_t version{synchdrVersion};
176 u_int8_t rsvd{0};
177 u_int32_t eventSrcId{0};
178 EventNum_t eventNumber{0LL};
179 EventRate_t avgEventRateHz{0};
180 UnixTimeNano_t unixTimeNano{0LL};
181
185 inline void set(u_int32_t esid, EventNum_t event_num, EventRate_t avg_rate, UnixTimeNano_t ut)
186 {
187 eventSrcId = htobe32(esid);
188 eventNumber = htobe64(event_num);
189 avgEventRateHz = htobe32(avg_rate);
190 unixTimeNano = htobe64(ut);
191 }
192
196 inline u_int32_t get_eventSrcId() const
197 {
198 return be32toh(eventSrcId);
199 }
203 inline EventNum_t get_eventNumber() const
204 {
205 return be64toh(eventNumber);
206 }
210 inline u_int32_t get_avgEventRateHz() const
211 {
212 return be32toh(avgEventRateHz);
213 }
217 inline UnixTimeNano_t get_unixTimeNano() const
218 {
219 return be64toh(unixTimeNano);
220 }
232 const boost::tuple<u_int32_t, EventNum_t, u_int32_t, UnixTimeNano_t> get_Fields() const
233 {
234 return boost::make_tuple(get_eventSrcId(), get_eventNumber(), get_avgEventRateHz(), get_unixTimeNano());
235 }
236 } __attribute__((__packed__));
237
238 // various useful header lengths
239 constexpr size_t IP_HDRLEN = 20;
240 constexpr size_t UDP_HDRLEN = 8;
241 constexpr size_t TOTAL_HDR_LEN{IP_HDRLEN + UDP_HDRLEN + sizeof(LBHdr) + sizeof(REHdr)};
242}
243
244#endif
Definition e2sar.hpp:11
Definition e2sarHeaders.hpp:94
void set(u_int16_t ent, EventNum_t event_num)
Definition e2sarHeaders.hpp:105
u_int8_t get_version() const
Definition e2sarHeaders.hpp:114
EventNum_t get_eventNum() const
Definition e2sarHeaders.hpp:138
u_int8_t get_nextProto() const
Definition e2sarHeaders.hpp:122
u_int16_t get_entropy() const
Definition e2sarHeaders.hpp:130
const boost::tuple< u_int8_t, u_int8_t, u_int16_t, EventNum_t > get_Fields() const
Definition e2sarHeaders.hpp:154
Definition e2sarHeaders.hpp:161
Definition e2sarHeaders.hpp:22
EventNum_t get_eventNum() const
Definition e2sarHeaders.hpp:43
u_int16_t get_dataId() const
Definition e2sarHeaders.hpp:67
const boost::tuple< u_int16_t, u_int32_t, u_int32_t, EventNum_t > get_Fields() const
Definition e2sarHeaders.hpp:81
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:173
EventNum_t get_eventNumber() const
Definition e2sarHeaders.hpp:203
u_int32_t get_eventSrcId() const
Definition e2sarHeaders.hpp:196
u_int32_t get_avgEventRateHz() const
Definition e2sarHeaders.hpp:210
void set(u_int32_t esid, EventNum_t event_num, EventRate_t avg_rate, UnixTimeNano_t ut)
Definition e2sarHeaders.hpp:185
const boost::tuple< u_int32_t, EventNum_t, u_int32_t, UnixTimeNano_t > get_Fields() const
Definition e2sarHeaders.hpp:232
UnixTimeNano_t get_unixTimeNano() const
Definition e2sarHeaders.hpp:217