44#include " flowKey.hpp"
55#include " directionalField.hpp"
66#include " tcpFlags.hpp"
7+ #include " packet.hpp"
78
89#include < array>
910#include < bitset>
@@ -46,6 +47,14 @@ struct DirectionalData {
4647 TCPFlags tcpFlags = 0 ;
4748};
4849
50+ enum class FlowEndReason : uint8_t {
51+ FLOW_END_INACTIVE = 0x01 ,
52+ FLOW_END_ACTIVE = 0x02 ,
53+ FLOW_END_EOF = 0x03 ,
54+ FLOW_END_FORCED = 0x04 ,
55+ FLOW_END_NO_RES = 0x05
56+ };
57+
4958class FlowRecord {
5059public:
5160 uint64_t hash;
@@ -57,14 +66,122 @@ class FlowRecord {
5766
5867 DirectionalField<DirectionalData> directionalData;
5968
69+ FlowEndReason endReason;
70+
6071 // Bitset of flow fields that were specified as present
6172 mutable FieldsBitset fieldsAvailable = {};
6273 // Bitset of successfully constructed plugins (constructor accepted packet)
6374 PluginsBitset pluginsConstructed = {};
6475 // Bitset of plugins that still wants to process packets of the flow
6576 PluginsBitset pluginsUpdate = {};
6677 // Bitset of plugins that are available for the flow
67- const PluginsBitset pluginsAvailable;
78+ // TODO GET BACK CONST ?
79+ PluginsBitset pluginsAvailable;
80+
81+ void erase ()
82+ {
83+ hash = 0 ;
84+ timeCreation = timeLastUpdate = {};
85+ flowKey = {};
86+ // directionalData = {};
87+
88+ /* memset(&m_flow.time_first, 0, sizeof(m_flow.time_first));
89+ memset(&m_flow.time_last, 0, sizeof(m_flow.time_last));
90+ m_flow.ip_version = 0;
91+ m_flow.ip_proto = 0;
92+ memset(&m_flow.src_ip, 0, sizeof(m_flow.src_ip));
93+ memset(&m_flow.dst_ip, 0, sizeof(m_flow.dst_ip));
94+ m_flow.src_port = 0;
95+ m_flow.dst_port = 0;
96+ m_flow.src_packets = 0;
97+ m_flow.dst_packets = 0;
98+ m_flow.src_bytes = 0;
99+ m_flow.dst_bytes = 0;
100+ m_flow.src_tcp_flags = 0;
101+ m_flow.dst_tcp_flags = 0;*/
102+ }
103+
104+ void reuse ()
105+ {
106+ /* m_flow.remove_extensions();
107+ m_flow.time_first = m_flow.time_last;
108+ m_flow.src_packets = 0;
109+ m_flow.dst_packets = 0;
110+ m_flow.src_bytes = 0;
111+ m_flow.dst_bytes = 0;
112+ m_flow.src_tcp_flags = 0;
113+ m_flow.dst_tcp_flags = 0;*/
114+ }
115+
116+ inline __attribute__ ((always_inline)) bool is_empty() const
117+ {
118+ return hash == 0 ;
119+ }
120+
121+ inline __attribute__ ((always_inline)) bool belongs(uint64_t value) const
122+ {
123+ return hash == value;
124+ }
125+
126+ void create (const Packet& packet, uint64_t hash)
127+ {
128+ /* m_flow.src_packets = 1;
129+
130+ m_hash = hash;
131+
132+ m_flow.time_first = pkt.ts;
133+ m_flow.time_last = pkt.ts;
134+ m_flow.flow_hash = hash;
135+
136+ memcpy(m_flow.src_mac, pkt.src_mac, 6);
137+ memcpy(m_flow.dst_mac, pkt.dst_mac, 6);
138+
139+ if (pkt.ip_version == IP::v4) {
140+ m_flow.ip_version = pkt.ip_version;
141+ m_flow.ip_proto = pkt.ip_proto;
142+ m_flow.src_ip.v4 = pkt.src_ip.v4;
143+ m_flow.dst_ip.v4 = pkt.dst_ip.v4;
144+ m_flow.src_bytes = pkt.ip_len;
145+ } else if (pkt.ip_version == IP::v6) {
146+ m_flow.ip_version = pkt.ip_version;
147+ m_flow.ip_proto = pkt.ip_proto;
148+ memcpy(m_flow.src_ip.v6, pkt.src_ip.v6, 16);
149+ memcpy(m_flow.dst_ip.v6, pkt.dst_ip.v6, 16);
150+ m_flow.src_bytes = pkt.ip_len;
151+ }
152+
153+ if (pkt.ip_proto == IPPROTO_TCP) {
154+ m_flow.src_port = pkt.src_port;
155+ m_flow.dst_port = pkt.dst_port;
156+ m_flow.src_tcp_flags = pkt.tcp_flags;
157+ } else if (pkt.ip_proto == IPPROTO_UDP) {
158+ m_flow.src_port = pkt.src_port;
159+ m_flow.dst_port = pkt.dst_port;
160+ } else if (pkt.ip_proto == IPPROTO_ICMP || pkt.ip_proto == IPPROTO_ICMPV6) {
161+ m_flow.src_port = pkt.src_port;
162+ m_flow.dst_port = pkt.dst_port;
163+ }*/
164+ }
165+
166+ void update (const Packet& packet, bool src)
167+ {
168+ /* m_flow.time_last = pkt.ts;
169+ if (src) {
170+ m_flow.src_packets++;
171+ m_flow.src_bytes += pkt.ip_len;
172+
173+ if (pkt.ip_proto == IPPROTO_TCP) {
174+ m_flow.src_tcp_flags |= pkt.tcp_flags;
175+ }
176+ } else {
177+ m_flow.dst_packets++;
178+ m_flow.dst_bytes += pkt.ip_len;
179+
180+ if (pkt.ip_proto == IPPROTO_TCP) {
181+ m_flow.dst_tcp_flags |= pkt.tcp_flags;
182+ }
183+ }*/
184+ }
68185
69186 void * getPluginContext (std::size_t pluginIndex)
70187 {
0 commit comments