suricata
flow.h
Go to the documentation of this file.
1 /* Copyright (C) 2007-2024 Open Information Security Foundation
2  *
3  * You can copy, redistribute or modify this Program under the terms of
4  * the GNU General Public License version 2 as published by the Free
5  * Software Foundation.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * version 2 along with this program; if not, write to the Free Software
14  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
15  * 02110-1301, USA.
16  */
17 
18 /**
19  * \file
20  *
21  * \author Victor Julien <victor@inliniac.net>
22  */
23 
24 #ifndef SURICATA_FLOW_H
25 #define SURICATA_FLOW_H
26 
27 /* forward declaration for macset include */
28 typedef struct FlowStorageId FlowStorageId;
29 
30 #include "decode.h"
31 #include "util-time.h"
32 #include "util-exception-policy.h"
34 #include "util-var.h"
35 #include "util-optimize.h"
36 #include "app-layer-protos.h"
37 
38 /* Part of the flow structure, so we declare it here.
39  * The actual declaration is in app-layer-parser.c */
41 
42 #define FLOW_QUIET true
43 
44 #define TOSERVER 0
45 #define TOCLIENT 1
46 
47 /* per flow flags */
48 
49 /** At least one packet from the source address was seen */
50 #define FLOW_TO_SRC_SEEN BIT_U32(0)
51 /** At least one packet from the destination address was seen */
52 #define FLOW_TO_DST_SEEN BIT_U32(1)
53 
54 // vacancy
55 
56 /** Flow was inspected against IP-Only sigs in the toserver direction */
57 #define FLOW_TOSERVER_IPONLY_SET BIT_U32(3)
58 /** Flow was inspected against IP-Only sigs in the toclient direction */
59 #define FLOW_TOCLIENT_IPONLY_SET BIT_U32(4)
60 
61 /** Packet belonging to this flow should not be inspected at all */
62 #define FLOW_NOPACKET_INSPECTION BIT_U32(5)
63 /** Packet payloads belonging to this flow should not be inspected */
64 #define FLOW_NOPAYLOAD_INSPECTION BIT_U32(6)
65 
66 /** All packets in this flow should be dropped */
67 #define FLOW_ACTION_DROP BIT_U32(7)
68 
69 /** Sgh for toserver direction set (even if it's NULL) */
70 #define FLOW_SGH_TOSERVER BIT_U32(8)
71 /** Sgh for toclient direction set (even if it's NULL) */
72 #define FLOW_SGH_TOCLIENT BIT_U32(9)
73 
74 /** packet to server direction has been logged in drop file (only in IPS mode) */
75 #define FLOW_TOSERVER_DROP_LOGGED BIT_U32(10)
76 /** packet to client direction has been logged in drop file (only in IPS mode) */
77 #define FLOW_TOCLIENT_DROP_LOGGED BIT_U32(11)
78 
79 /** flow has alerts */
80 #define FLOW_HAS_ALERTS BIT_U32(12)
81 
82 /** Pattern matcher alproto detection done */
83 #define FLOW_TS_PM_ALPROTO_DETECT_DONE BIT_U32(13)
84 /** Probing parser alproto detection done */
85 #define FLOW_TS_PP_ALPROTO_DETECT_DONE BIT_U32(14)
86 /** Expectation alproto detection done */
87 #define FLOW_TS_PE_ALPROTO_DETECT_DONE BIT_U32(15)
88 /** Pattern matcher alproto detection done */
89 #define FLOW_TC_PM_ALPROTO_DETECT_DONE BIT_U32(16)
90 /** Probing parser alproto detection done */
91 #define FLOW_TC_PP_ALPROTO_DETECT_DONE BIT_U32(17)
92 /** Expectation alproto detection done */
93 #define FLOW_TC_PE_ALPROTO_DETECT_DONE BIT_U32(18)
94 #define FLOW_TIMEOUT_REASSEMBLY_DONE BIT_U32(19)
95 
96 /** flow is ipv4 */
97 #define FLOW_IPV4 BIT_U32(20)
98 /** flow is ipv6 */
99 #define FLOW_IPV6 BIT_U32(21)
100 
101 #define FLOW_PROTO_DETECT_TS_DONE BIT_U32(22)
102 #define FLOW_PROTO_DETECT_TC_DONE BIT_U32(23)
103 
104 /** Indicate that alproto detection for flow should be done again */
105 #define FLOW_CHANGE_PROTO BIT_U32(24)
106 
107 #define FLOW_WRONG_THREAD BIT_U32(25)
108 /** Protocol detection told us flow is picked up in wrong direction (midstream) */
109 #define FLOW_DIR_REVERSED BIT_U32(26)
110 /** Indicate that the flow did trigger an expectation creation */
111 #define FLOW_HAS_EXPECTATION BIT_U32(27)
112 
113 /** All packets in this flow should be passed */
114 #define FLOW_ACTION_PASS BIT_U32(28)
115 
116 #define FLOW_TS_APP_UPDATED BIT_U32(29)
117 #define FLOW_TC_APP_UPDATED BIT_U32(30)
118 
119 /* File flags */
120 
121 #define FLOWFILE_INIT 0
122 
123 /** no magic on files in this flow */
124 #define FLOWFILE_NO_MAGIC_TS BIT_U16(0)
125 #define FLOWFILE_NO_MAGIC_TC BIT_U16(1)
126 
127 /** even if the flow has files, don't store 'm */
128 #define FLOWFILE_NO_STORE_TS BIT_U16(2)
129 #define FLOWFILE_NO_STORE_TC BIT_U16(3)
130 /** no md5 on files in this flow */
131 #define FLOWFILE_NO_MD5_TS BIT_U16(4)
132 #define FLOWFILE_NO_MD5_TC BIT_U16(5)
133 
134 /** no sha1 on files in this flow */
135 #define FLOWFILE_NO_SHA1_TS BIT_U16(6)
136 #define FLOWFILE_NO_SHA1_TC BIT_U16(7)
137 
138 /** no sha256 on files in this flow */
139 #define FLOWFILE_NO_SHA256_TS BIT_U16(8)
140 #define FLOWFILE_NO_SHA256_TC BIT_U16(9)
141 
142 /** no size tracking of files in this flow */
143 #define FLOWFILE_NO_SIZE_TS BIT_U16(10)
144 #define FLOWFILE_NO_SIZE_TC BIT_U16(11)
145 
146 /** store files in the flow */
147 #define FLOWFILE_STORE_TS BIT_U16(12)
148 #define FLOWFILE_STORE_TC BIT_U16(13)
149 
150 #define FLOWFILE_NONE_TS (FLOWFILE_NO_MAGIC_TS | \
151  FLOWFILE_NO_STORE_TS | \
152  FLOWFILE_NO_MD5_TS | \
153  FLOWFILE_NO_SHA1_TS | \
154  FLOWFILE_NO_SHA256_TS| \
155  FLOWFILE_NO_SIZE_TS)
156 #define FLOWFILE_NONE_TC (FLOWFILE_NO_MAGIC_TC | \
157  FLOWFILE_NO_STORE_TC | \
158  FLOWFILE_NO_MD5_TC | \
159  FLOWFILE_NO_SHA1_TC | \
160  FLOWFILE_NO_SHA256_TC| \
161  FLOWFILE_NO_SIZE_TC)
162 #define FLOWFILE_NONE (FLOWFILE_NONE_TS|FLOWFILE_NONE_TC)
163 
164 #define FLOW_IS_IPV4(f) \
165  (((f)->flags & FLOW_IPV4) == FLOW_IPV4)
166 #define FLOW_IS_IPV6(f) \
167  (((f)->flags & FLOW_IPV6) == FLOW_IPV6)
168 
169 #define FLOW_GET_SP(f) \
170  ((f)->flags & FLOW_DIR_REVERSED) ? (f)->dp : (f)->sp;
171 #define FLOW_GET_DP(f) \
172  ((f)->flags & FLOW_DIR_REVERSED) ? (f)->sp : (f)->dp;
173 
174 #define FLOW_COPY_IPV4_ADDR_TO_PACKET(fa, pa) do { \
175  (pa)->family = AF_INET; \
176  (pa)->addr_data32[0] = (fa)->addr_data32[0]; \
177  } while (0)
178 
179 #define FLOW_COPY_IPV6_ADDR_TO_PACKET(fa, pa) do { \
180  (pa)->family = AF_INET6; \
181  (pa)->addr_data32[0] = (fa)->addr_data32[0]; \
182  (pa)->addr_data32[1] = (fa)->addr_data32[1]; \
183  (pa)->addr_data32[2] = (fa)->addr_data32[2]; \
184  (pa)->addr_data32[3] = (fa)->addr_data32[3]; \
185  } while (0)
186 
187 /* Set the IPv4 addressesinto the Addrs of the Packet.
188  * Make sure p->ip4h is initialized and validated.
189  *
190  * We set the rest of the struct to 0 so we can
191  * prevent using memset. */
192 #define FLOW_SET_IPV4_SRC_ADDR_FROM_PACKET(p, a) do { \
193  (a)->addr_data32[0] = (uint32_t)(p)->ip4h->s_ip_src.s_addr; \
194  (a)->addr_data32[1] = 0; \
195  (a)->addr_data32[2] = 0; \
196  (a)->addr_data32[3] = 0; \
197  } while (0)
198 
199 #define FLOW_SET_IPV4_DST_ADDR_FROM_PACKET(p, a) do { \
200  (a)->addr_data32[0] = (uint32_t)(p)->ip4h->s_ip_dst.s_addr; \
201  (a)->addr_data32[1] = 0; \
202  (a)->addr_data32[2] = 0; \
203  (a)->addr_data32[3] = 0; \
204  } while (0)
205 
206 /* Set the IPv6 addressesinto the Addrs of the Packet.
207  * Make sure p->ip6h is initialized and validated. */
208 #define FLOW_SET_IPV6_SRC_ADDR_FROM_PACKET(p, a) do { \
209  (a)->addr_data32[0] = (p)->ip6h->s_ip6_src[0]; \
210  (a)->addr_data32[1] = (p)->ip6h->s_ip6_src[1]; \
211  (a)->addr_data32[2] = (p)->ip6h->s_ip6_src[2]; \
212  (a)->addr_data32[3] = (p)->ip6h->s_ip6_src[3]; \
213  } while (0)
214 
215 #define FLOW_SET_IPV6_DST_ADDR_FROM_PACKET(p, a) do { \
216  (a)->addr_data32[0] = (p)->ip6h->s_ip6_dst[0]; \
217  (a)->addr_data32[1] = (p)->ip6h->s_ip6_dst[1]; \
218  (a)->addr_data32[2] = (p)->ip6h->s_ip6_dst[2]; \
219  (a)->addr_data32[3] = (p)->ip6h->s_ip6_dst[3]; \
220  } while (0)
221 
222 /* pkt flow flags */
223 #define FLOW_PKT_TOSERVER 0x01
224 #define FLOW_PKT_TOCLIENT 0x02
225 #define FLOW_PKT_ESTABLISHED 0x04
226 #define FLOW_PKT_TOSERVER_IPONLY_SET 0x08
227 #define FLOW_PKT_TOCLIENT_IPONLY_SET 0x10
228 #define FLOW_PKT_TOSERVER_FIRST 0x20
229 #define FLOW_PKT_TOCLIENT_FIRST 0x40
230 /** last pseudo packet in the flow. Can be used to trigger final clean,
231  * logging, etc. */
232 #define FLOW_PKT_LAST_PSEUDO 0x80
233 
234 #define FLOW_END_FLAG_STATE_NEW 0x01
235 #define FLOW_END_FLAG_STATE_ESTABLISHED 0x02
236 #define FLOW_END_FLAG_STATE_CLOSED 0x04
237 #define FLOW_END_FLAG_EMERGENCY 0x08
238 #define FLOW_END_FLAG_TIMEOUT 0x10
239 #define FLOW_END_FLAG_FORCED 0x20
240 #define FLOW_END_FLAG_SHUTDOWN 0x40
241 #define FLOW_END_FLAG_STATE_BYPASSED 0x80
242 
243 /** Mutex or RWLocks for the flow. */
244 //#define FLOWLOCK_RWLOCK
245 #define FLOWLOCK_MUTEX
246 
247 #ifdef FLOWLOCK_RWLOCK
248  #ifdef FLOWLOCK_MUTEX
249  #error Cannot enable both FLOWLOCK_RWLOCK and FLOWLOCK_MUTEX
250  #endif
251 #endif
252 
253 #ifdef FLOWLOCK_RWLOCK
254  #define FLOWLOCK_INIT(fb) SCRWLockInit(&(fb)->r, NULL)
255  #define FLOWLOCK_DESTROY(fb) SCRWLockDestroy(&(fb)->r)
256  #define FLOWLOCK_RDLOCK(fb) SCRWLockRDLock(&(fb)->r)
257  #define FLOWLOCK_WRLOCK(fb) SCRWLockWRLock(&(fb)->r)
258  #define FLOWLOCK_TRYRDLOCK(fb) SCRWLockTryRDLock(&(fb)->r)
259  #define FLOWLOCK_TRYWRLOCK(fb) SCRWLockTryWRLock(&(fb)->r)
260  #define FLOWLOCK_UNLOCK(fb) SCRWLockUnlock(&(fb)->r)
261 #elif defined FLOWLOCK_MUTEX
262  #define FLOWLOCK_INIT(fb) SCMutexInit(&(fb)->m, NULL)
263  #define FLOWLOCK_DESTROY(fb) SCMutexDestroy(&(fb)->m)
264  #define FLOWLOCK_RDLOCK(fb) SCMutexLock(&(fb)->m)
265  #define FLOWLOCK_WRLOCK(fb) SCMutexLock(&(fb)->m)
266  #define FLOWLOCK_TRYRDLOCK(fb) SCMutexTrylock(&(fb)->m)
267  #define FLOWLOCK_TRYWRLOCK(fb) SCMutexTrylock(&(fb)->m)
268  #define FLOWLOCK_UNLOCK(fb) SCMutexUnlock(&(fb)->m)
269 #else
270  #error Enable FLOWLOCK_RWLOCK or FLOWLOCK_MUTEX
271 #endif
272 
273 #define FLOW_IS_PM_DONE(f, dir) (((dir) & STREAM_TOSERVER) ? ((f)->flags & FLOW_TS_PM_ALPROTO_DETECT_DONE) : ((f)->flags & FLOW_TC_PM_ALPROTO_DETECT_DONE))
274 #define FLOW_IS_PP_DONE(f, dir) (((dir) & STREAM_TOSERVER) ? ((f)->flags & FLOW_TS_PP_ALPROTO_DETECT_DONE) : ((f)->flags & FLOW_TC_PP_ALPROTO_DETECT_DONE))
275 #define FLOW_IS_PE_DONE(f, dir) (((dir) & STREAM_TOSERVER) ? ((f)->flags & FLOW_TS_PE_ALPROTO_DETECT_DONE) : ((f)->flags & FLOW_TC_PE_ALPROTO_DETECT_DONE))
276 
277 #define FLOW_SET_PM_DONE(f, dir) (((dir) & STREAM_TOSERVER) ? ((f)->flags |= FLOW_TS_PM_ALPROTO_DETECT_DONE) : ((f)->flags |= FLOW_TC_PM_ALPROTO_DETECT_DONE))
278 #define FLOW_SET_PP_DONE(f, dir) (((dir) & STREAM_TOSERVER) ? ((f)->flags |= FLOW_TS_PP_ALPROTO_DETECT_DONE) : ((f)->flags |= FLOW_TC_PP_ALPROTO_DETECT_DONE))
279 #define FLOW_SET_PE_DONE(f, dir) (((dir) & STREAM_TOSERVER) ? ((f)->flags |= FLOW_TS_PE_ALPROTO_DETECT_DONE) : ((f)->flags |= FLOW_TC_PE_ALPROTO_DETECT_DONE))
280 
281 #define FLOW_RESET_PM_DONE(f, dir) (((dir) & STREAM_TOSERVER) ? ((f)->flags &= ~FLOW_TS_PM_ALPROTO_DETECT_DONE) : ((f)->flags &= ~FLOW_TC_PM_ALPROTO_DETECT_DONE))
282 #define FLOW_RESET_PP_DONE(f, dir) (((dir) & STREAM_TOSERVER) ? ((f)->flags &= ~FLOW_TS_PP_ALPROTO_DETECT_DONE) : ((f)->flags &= ~FLOW_TC_PP_ALPROTO_DETECT_DONE))
283 #define FLOW_RESET_PE_DONE(f, dir) (((dir) & STREAM_TOSERVER) ? ((f)->flags &= ~FLOW_TS_PE_ALPROTO_DETECT_DONE) : ((f)->flags &= ~FLOW_TC_PE_ALPROTO_DETECT_DONE))
284 
285 /* global flow config */
286 typedef struct FlowCnf_
287 {
288  uint32_t hash_rand;
289  uint32_t hash_size;
290  uint32_t prealloc;
291 
292  uint32_t timeout_new;
293  uint32_t timeout_est;
294 
296 
298 
299  SC_ATOMIC_DECLARE(uint64_t, memcap);
301 
302 /* Hash key for the flow hash */
303 typedef struct FlowKey_
304 {
307  uint8_t proto;
309  uint16_t livedev_id;
312 
313 typedef struct FlowAddress_ {
314  union {
315  uint32_t address_un_data32[4]; /* type-specific field */
316  uint16_t address_un_data16[8]; /* type-specific field */
317  uint8_t address_un_data8[16]; /* type-specific field */
320 
321 #define addr_data32 address.address_un_data32
322 #define addr_data16 address.address_un_data16
323 #define addr_data8 address.address_un_data8
324 
325 typedef unsigned short FlowStateType;
326 
327 /** Local Thread ID */
328 typedef uint16_t FlowThreadId;
329 
330 #include "util-storage.h"
331 
332 /**
333  * \brief Flow data structure.
334  *
335  * The flow is a global data structure that is created for new packets of a
336  * flow and then looked up for the following packets of a flow.
337  *
338  * Locking
339  *
340  * The flow is updated/used by multiple packets at the same time. This is why
341  * there is a flow-mutex. It's a mutex and not a spinlock because some
342  * operations on the flow can be quite expensive, thus spinning would be
343  * too expensive.
344  *
345  * The flow "header" (addresses, ports, proto, recursion level) are static
346  * after the initialization and remain read-only throughout the entire live
347  * of a flow. This is why we can access those without protection of the lock.
348  */
349 
350 typedef struct Flow_
351 {
352  /* flow "header", used for hashing and flow lookup. Static after init,
353  * so safe to look at without lock */
355  union {
356  Port sp; /**< tcp/udp source port */
357  struct {
358  uint8_t type; /**< icmp type */
359  uint8_t code; /**< icmp code */
361 
362  struct {
363  uint32_t spi; /**< esp spi */
364  } esp;
365  };
366  union {
367  Port dp; /**< tcp/udp destination port */
368  struct {
369  uint8_t type; /**< icmp type */
370  uint8_t code; /**< icmp code */
372  };
373  uint8_t proto;
376 
377  uint8_t vlan_idx;
378 
379  /* track toserver/toclient flow timeout needs */
380  union {
381  struct {
382  uint8_t ffr_ts:4;
383  uint8_t ffr_tc:4;
384  };
385  uint8_t ffr;
386  };
387 
388  /** timestamp in seconds of the moment this flow will timeout
389  * according to the timeout policy. Does *not* take emergency
390  * mode into account. */
391  uint32_t timeout_at;
392 
393  /** Thread ID for the stream/detect portion of this flow */
395 
396  struct Flow_ *next; /* (hash) list next */
397  /** Incoming interface */
399 
400  /** flow hash - the flow hash before hash table size mod. */
401  uint32_t flow_hash;
402 
403  /** timeout policy value in seconds to add to the lastts.tv_sec
404  * when a packet has been received. */
405  uint32_t timeout_policy;
406 
407  /* time stamp of last update (last packet). Set/updated under the
408  * flow and flow hash row locks, safe to read under either the
409  * flow lock or flow hash row lock. */
411 
413 
414  /** flow tenant id, used to setup flow timeout and stream pseudo
415  * packets with the correct tenant id set */
416  uint32_t tenant_id;
417 
420 
421  uint32_t flags; /**< generic flags */
422 
423  uint16_t file_flags; /**< file tracking/extraction flags */
424 
425  /** destination port to be used in protocol detection. This is meant
426  * for use with STARTTLS and HTTP CONNECT detection */
427  uint16_t protodetect_dp; /**< 0 if not used */
428 
429  /* Parent flow id for protocol like ftp */
430  int64_t parent_id;
431 
432 #ifdef FLOWLOCK_RWLOCK
433  SCRWLock r;
434 #elif defined FLOWLOCK_MUTEX
436 #else
437  #error Enable FLOWLOCK_RWLOCK or FLOWLOCK_MUTEX
438 #endif
439 
440  /** protocol specific data pointer, e.g. for TcpSession */
441  void *protoctx;
442 
443  /** mapping to Flow's protocol specific protocols for timeouts
444  and state and free functions. */
445  uint8_t protomap;
446 
447  uint8_t flow_end_flags;
448  /* coccinelle: Flow:flow_end_flags:FLOW_END_FLAG_ */
449 
450  AppProto alproto; /**< \brief application level protocol */
453 
454  /** original application level protocol. Used to indicate the previous
455  protocol when changing to another protocol , e.g. with STARTTLS. */
457  /** expected app protocol: used in protocol change/upgrade like in
458  * STARTTLS. */
460 
461  /** detection engine ctx version used to inspect this flow. Set at initial
462  * inspection. If it doesn't match the currently in use de_ctx, the
463  * stored sgh ptrs are reset. */
464  uint32_t de_ctx_version;
465 
466  /** ttl tracking */
471 
472  /** application level storage ptrs.
473  *
474  */
475  AppLayerParserState *alparser; /**< parser internal state */
476  void *alstate; /**< application layer state */
477 
478  /** toclient sgh for this flow. Only use when FLOW_SGH_TOCLIENT flow flag
479  * has been set. */
481  /** toserver sgh for this flow. Only use when FLOW_SGH_TOSERVER flow flag
482  * has been set. */
484 
485  /* pointer to the var list */
487 
488  struct FlowBucket_ *fb;
489 
491 
492  uint32_t todstpktcnt;
493  uint32_t tosrcpktcnt;
494  uint64_t todstbytecnt;
495  uint64_t tosrcbytecnt;
496 
499 
500 enum FlowState {
505 #ifdef CAPTURE_OFFLOAD
506  FLOW_STATE_CAPTURE_BYPASSED,
507 #endif
508 };
509 #ifdef CAPTURE_OFFLOAD
510 #define FLOW_STATE_SIZE 5
511 #else
512 #define FLOW_STATE_SIZE 4
513 #endif
514 
515 typedef struct FlowProtoTimeout_ {
516  uint32_t new_timeout;
517  uint32_t est_timeout;
518  uint32_t closed_timeout;
521 
522 typedef struct FlowProtoFreeFunc_ {
523  void (*Freefunc)(void *);
525 
526 typedef struct FlowBypassInfo_ {
527  bool (* BypassUpdate)(Flow *f, void *data, time_t tsec);
528  void (* BypassFree)(void *data);
529  void *bypass_data;
530  uint64_t tosrcpktcnt;
531  uint64_t tosrcbytecnt;
532  uint64_t todstpktcnt;
533  uint64_t todstbytecnt;
535 
536 #include "flow-queue.h"
537 
538 typedef struct FlowLookupStruct_ // TODO name
539 {
540  /** thread store of spare queues */
546 
547 /** \brief prepare packet for a life with flow
548  * Set PKT_WANTS_FLOW flag to indicate workers should do a flow lookup
549  * and calc the hash value to be used in the lookup and autofp flow
550  * balancing. */
551 void FlowSetupPacket(Packet *p);
553 void FlowInitConfig(bool);
554 void FlowReset(void);
555 void FlowShutdown(void);
556 void FlowSetIPOnlyFlag(Flow *, int);
557 void FlowSetHasAlertsFlag(Flow *);
558 int FlowHasAlerts(const Flow *);
561 int FlowChangeProto(Flow *);
562 void FlowSwap(Flow *);
563 
564 void FlowRegisterTests(void);
565 int FlowSetProtoFreeFunc(uint8_t, void (*Free)(void *));
566 
567 static inline void FlowSetNoPacketInspectionFlag(Flow *);
568 static inline void FlowSetNoPayloadInspectionFlag(Flow *);
569 
570 int FlowGetPacketDirection(const Flow *, const Packet *);
571 
572 void FlowCleanupAppLayer(Flow *);
573 
574 void FlowUpdateState(Flow *f, enum FlowState s);
575 
576 int FlowSetMemcap(uint64_t size);
577 uint64_t FlowGetMemcap(void);
578 uint64_t FlowGetMemuse(void);
580 
582 void RegisterFlowBypassInfo(void);
583 
584 void FlowGetLastTimeAsParts(Flow *flow, uint64_t *secs, uint64_t *usecs);
585 uint32_t FlowGetFlags(Flow *flow);
586 uint16_t FlowGetSourcePort(Flow *flow);
587 uint16_t FlowGetDestinationPort(Flow *flow);
588 
589 /** ----- Inline functions ----- */
590 
591 static inline AppProto FlowGetAppProtocol(const Flow *f)
592 {
593  return f->alproto;
594 }
595 
596 static inline void *FlowGetAppState(const Flow *f)
597 {
598  return f->alstate;
599 }
600 
601 /** \brief Set the No Packet Inspection Flag without locking the flow.
602  *
603  * \param f Flow to set the flag in
604  */
605 static inline void FlowSetNoPacketInspectionFlag(Flow *f)
606 {
607  SCEnter();
608 
609  SCLogDebug("flow %p", f);
611 
612  SCReturn;
613 }
614 
615 /** \brief Set the No payload inspection Flag without locking the flow.
616  *
617  * \param f Flow to set the flag in
618  */
619 static inline void FlowSetNoPayloadInspectionFlag(Flow *f)
620 {
621  SCEnter();
622 
623  SCLogDebug("flow %p", f);
625 
626  SCReturn;
627 }
628 
629 /** \brief Reference the flow
630  * \note This should only be called once for a destination
631  * pointer */
632 static inline void FlowReference(Flow **d, Flow *f)
633 {
634  if (likely(f != NULL)) {
635 #ifdef DEBUG_VALIDATION
636  BUG_ON(*d == f);
637 #else
638  if (*d == f)
639  return;
640 #endif
641  *d = f;
642  }
643 }
644 
645 static inline void FlowDeReference(Flow **d)
646 {
647  if (likely(*d != NULL)) {
648  *d = NULL;
649  }
650 }
651 
652 /** \brief create a flow id that is as unique as possible
653  * \retval flow_id signed 64bit id
654  * \note signed because of the signedness of json_integer_t in
655  * the json output
656  */
657 static inline int64_t FlowGetId(const Flow *f)
658 {
659  int64_t id = (uint64_t)(SCTIME_SECS(f->startts) & 0x0000FFFF) << 48 |
660  (uint64_t)(SCTIME_USECS(f->startts) & 0x0000FFFF) << 32 | (int64_t)f->flow_hash;
661  /* reduce to 51 bits as JavaScript and even JSON often seem to
662  * max out there. */
663  id &= 0x7ffffffffffffLL;
664  return id;
665 }
666 
667 static inline void FlowSetEndFlags(Flow *f)
668 {
669  const int state = f->flow_state;
670  if (state == FLOW_STATE_NEW)
672  else if (state == FLOW_STATE_ESTABLISHED)
674  else if (state == FLOW_STATE_CLOSED)
676  else if (state == FLOW_STATE_LOCAL_BYPASSED)
678 #ifdef CAPTURE_OFFLOAD
679  else if (state == FLOW_STATE_CAPTURE_BYPASSED)
681 #endif
682 }
683 
684 static inline bool FlowIsBypassed(const Flow *f)
685 {
686  if (
687 #ifdef CAPTURE_OFFLOAD
688  f->flow_state == FLOW_STATE_CAPTURE_BYPASSED ||
689 #endif
691  return true;
692  }
693  return false;
694 }
695 
696 int FlowClearMemory(Flow *,uint8_t );
697 
698 AppProto FlowGetAppProtocol(const Flow *f);
699 void *FlowGetAppState(const Flow *f);
700 uint8_t FlowGetDisruptionFlags(const Flow *f, uint8_t flags);
701 
703 
704 #endif /* SURICATA_FLOW_H */
FlowStorageId
Definition: flow-storage.h:31
Flow_::ffr_tc
uint8_t ffr_tc
Definition: flow.h:383
FlowLookupStruct_::work_queue
FlowQueuePrivate work_queue
Definition: flow.h:543
FlowSetMemcap
int FlowSetMemcap(uint64_t size)
Update memcap value.
Definition: flow.c:104
FlowGetDisruptionFlags
uint8_t FlowGetDisruptionFlags(const Flow *f, uint8_t flags)
get 'disruption' flags: GAP/DEPTH/PASS
Definition: flow.c:1132
FlowBucket_
Definition: flow-hash.h:43
Flow_::ffr_ts
uint8_t ffr_ts
Definition: flow.h:382
Flow_::recursion_level
uint8_t recursion_level
Definition: flow.h:374
FlowAddress_
Definition: flow.h:313
FLOW_STATE_ESTABLISHED
@ FLOW_STATE_ESTABLISHED
Definition: flow.h:502
FlowLookupStruct_::dtv
DecodeThreadVars * dtv
Definition: flow.h:542
Flow_::icmp_d
struct Flow_::@119::@125 icmp_d
Flow_::startts
SCTime_t startts
Definition: flow.h:490
SigGroupHead_
Container for matching data for a signature group.
Definition: detect.h:1448
FlowKey_::src
Address src
Definition: flow.h:305
FLOW_END_FLAG_STATE_NEW
#define FLOW_END_FLAG_STATE_NEW
Definition: flow.h:234
FlowBypassInfo_
Definition: flow.h:526
FlowCnf_::emergency_recovery
uint32_t emergency_recovery
Definition: flow.h:295
FlowCnf_::hash_size
uint32_t hash_size
Definition: flow.h:289
FlowHandlePacket
void FlowHandlePacket(ThreadVars *, FlowLookupStruct *, Packet *)
Entry point for packet flow handling.
Definition: flow.c:508
FlowAddress_::address_un_data32
uint32_t address_un_data32[4]
Definition: flow.h:315
SCLogDebug
#define SCLogDebug(...)
Definition: util-debug.h:269
FlowLookupStruct
struct FlowLookupStruct_ FlowLookupStruct
Flow_::proto
uint8_t proto
Definition: flow.h:373
AppProto
uint16_t AppProto
Definition: app-layer-protos.h:81
FlowInitConfig
void FlowInitConfig(bool)
initialize the configuration
Definition: flow.c:522
FlowGetPacketDirection
int FlowGetPacketDirection(const Flow *, const Packet *)
determine the direction of the packet compared to the flow
Definition: flow.c:290
FlowClearMemory
int FlowClearMemory(Flow *, uint8_t)
Function clear the flow memory before queueing it to spare flow queue.
Definition: flow.c:1088
Flow_
Flow data structure.
Definition: flow.h:351
Flow_::protomap
uint8_t protomap
Definition: flow.h:445
LiveDevice_
Definition: util-device.h:50
FlowProtoTimeout_
Definition: flow.h:515
FLOW_END_FLAG_STATE_ESTABLISHED
#define FLOW_END_FLAG_STATE_ESTABLISHED
Definition: flow.h:235
FLOW_NOPAYLOAD_INSPECTION
#define FLOW_NOPAYLOAD_INSPECTION
Definition: flow.h:64
FlowLookupStruct_
Definition: flow.h:539
Flow_::alproto_orig
AppProto alproto_orig
Definition: flow.h:456
Flow
struct Flow_ Flow
Flow data structure.
FLOW_END_FLAG_STATE_BYPASSED
#define FLOW_END_FLAG_STATE_BYPASSED
Definition: flow.h:241
util-exception-policy-types.h
FlowProtoTimeout_::bypassed_timeout
uint32_t bypassed_timeout
Definition: flow.h:519
FlowBypassInfo_::tosrcbytecnt
uint64_t tosrcbytecnt
Definition: flow.h:531
Address_
Definition: decode.h:116
FlowSetupPacket
void FlowSetupPacket(Packet *p)
prepare packet for a life with flow Set PKT_WANTS_FLOW flag to indicate workers should do a flow look...
Definition: flow-hash.c:520
Flow_::max_ttl_toserver
uint8_t max_ttl_toserver
Definition: flow.h:468
Flow_::dp
Port dp
Definition: flow.h:367
Flow_::protoctx
void * protoctx
Definition: flow.h:441
FlowUnsetChangeProtoFlag
void FlowUnsetChangeProtoFlag(Flow *)
Unset flag to indicate to change proto for the flow.
Definition: flow.c:196
util-var.h
Storage
Definition: util-storage.h:39
FlowCnf_::prealloc
uint32_t prealloc
Definition: flow.h:290
Flow_::flow_state
FlowStateType flow_state
Definition: flow.h:412
Flow_::spi
uint32_t spi
Definition: flow.h:363
Flow_::sgh_toserver
const struct SigGroupHead_ * sgh_toserver
Definition: flow.h:483
FlowLookupStruct_::emerg_spare_sync_stamp
uint32_t emerg_spare_sync_stamp
Definition: flow.h:544
Flow_::tosrcbytecnt
uint64_t tosrcbytecnt
Definition: flow.h:495
FlowConfig
struct FlowCnf_ FlowConfig
Flow_::alparser
AppLayerParserState * alparser
Definition: flow.h:475
Flow_::dst
FlowAddress dst
Definition: flow.h:354
FlowProtoFreeFunc
struct FlowProtoFreeFunc_ FlowProtoFreeFunc
Flow_::fb
struct FlowBucket_ * fb
Definition: flow.h:488
FLOW_STATE_LOCAL_BYPASSED
@ FLOW_STATE_LOCAL_BYPASSED
Definition: flow.h:504
Flow_::min_ttl_toserver
uint8_t min_ttl_toserver
Definition: flow.h:467
Flow_::esp
struct Flow_::@117::@124 esp
Flow_::protodetect_dp
uint16_t protodetect_dp
Definition: flow.h:427
decode.h
FlowBypassInfo_::todstbytecnt
uint64_t todstbytecnt
Definition: flow.h:533
FlowGetDestinationPort
uint16_t FlowGetDestinationPort(Flow *flow)
Get flow destination port.
Definition: flow.c:1211
AppLayerParserState_
Definition: app-layer-parser.c:132
RegisterFlowBypassInfo
void RegisterFlowBypassInfo(void)
Definition: flow-util.c:230
FlowBypassInfo_::BypassUpdate
bool(* BypassUpdate)(Flow *f, void *data, time_t tsec)
Definition: flow.h:527
FlowBypassInfo_::BypassFree
void(* BypassFree)(void *data)
Definition: flow.h:528
Flow_::todstpktcnt
uint32_t todstpktcnt
Definition: flow.h:492
FlowSetIPOnlyFlag
void FlowSetIPOnlyFlag(Flow *, int)
Set the IPOnly scanned flag for 'direction'.
Definition: flow.c:152
util-exception-policy.h
Flow_::lastts
SCTime_t lastts
Definition: flow.h:410
FlowSwap
void FlowSwap(Flow *)
swap the flow's direction
Definition: flow.c:257
FlowKey_::recursion_level
uint8_t recursion_level
Definition: flow.h:308
SCEnter
#define SCEnter(...)
Definition: util-debug.h:271
ThreadVars_
Per thread variable structure.
Definition: threadvars.h:57
FlowShutdown
void FlowShutdown(void)
shutdown the flow engine
Definition: flow.c:670
FlowGetMemuse
uint64_t FlowGetMemuse(void)
Definition: flow.c:125
Flow_::flow_end_flags
uint8_t flow_end_flags
Definition: flow.h:447
FlowCnf_
Definition: flow.h:287
FlowState
FlowState
Definition: flow.h:500
FlowBypassInfo_::todstpktcnt
uint64_t todstpktcnt
Definition: flow.h:532
FlowProtoTimeout_::new_timeout
uint32_t new_timeout
Definition: flow.h:516
FlowProtoTimeout_::closed_timeout
uint32_t closed_timeout
Definition: flow.h:518
util-time.h
FlowBypassInfo_::bypass_data
void * bypass_data
Definition: flow.h:529
Flow_::m
SCMutex m
Definition: flow.h:435
FlowBypassInfo
struct FlowBypassInfo_ FlowBypassInfo
FlowCnf_::timeout_new
uint32_t timeout_new
Definition: flow.h:292
FlowKey_::livedev_id
uint16_t livedev_id
Definition: flow.h:309
Flow_::todstbytecnt
uint64_t todstbytecnt
Definition: flow.h:494
Flow_::icmp_s
struct Flow_::@117::@123 icmp_s
FlowGetLastTimeAsParts
void FlowGetLastTimeAsParts(Flow *flow, uint64_t *secs, uint64_t *usecs)
Get flow last time as individual values.
Definition: flow.c:1187
BUG_ON
#define BUG_ON(x)
Definition: suricata-common.h:300
Flow_::sgh_toclient
const struct SigGroupHead_ * sgh_toclient
Definition: flow.h:480
FlowChangeProto
int FlowChangeProto(Flow *)
Check if change proto flag is set for flow.
Definition: flow.c:206
FlowThreadId
uint16_t FlowThreadId
Definition: flow.h:328
FlowKey_::sp
Port sp
Definition: flow.h:306
SCReturn
#define SCReturn
Definition: util-debug.h:273
Packet_
Definition: decode.h:437
Flow_::type
uint8_t type
Definition: flow.h:358
FlowRegisterTests
void FlowRegisterTests(void)
Function to register the Flow Unitests.
Definition: flow.c:1439
Port
uint16_t Port
Definition: decode.h:230
SCTime_t
Definition: util-time.h:40
FlowProtoFreeFunc_::Freefunc
void(* Freefunc)(void *)
Definition: flow.h:523
FlowAddress_::address_un_data16
uint16_t address_un_data16[8]
Definition: flow.h:316
FlowCnf_::hash_rand
uint32_t hash_rand
Definition: flow.h:288
Flow_::vlan_idx
uint8_t vlan_idx
Definition: flow.h:377
FlowHandlePacketUpdate
void FlowHandlePacketUpdate(Flow *f, Packet *p, ThreadVars *tv, DecodeThreadVars *dtv)
Update Packet and Flow.
Definition: flow.c:388
Flow_::min_ttl_toclient
uint8_t min_ttl_toclient
Definition: flow.h:469
FlowGetFlags
uint32_t FlowGetFlags(Flow *flow)
Get flow flags.
Definition: flow.c:1222
flow-queue.h
FlowCleanupAppLayer
void FlowCleanupAppLayer(Flow *)
Definition: flow.c:136
FlowBypassInfo_::tosrcpktcnt
uint64_t tosrcpktcnt
Definition: flow.h:530
Flow_::probing_parser_toclient_alproto_masks
uint32_t probing_parser_toclient_alproto_masks
Definition: flow.h:419
FlowCnf_::SC_ATOMIC_DECLARE
SC_ATOMIC_DECLARE(uint64_t, memcap)
Flow_::flow_hash
uint32_t flow_hash
Definition: flow.h:401
Flow_::alproto_expect
AppProto alproto_expect
Definition: flow.h:459
GetFlowBypassInfoID
FlowStorageId GetFlowBypassInfoID(void)
Definition: flow-util.c:212
Flow_::src
FlowAddress src
Definition: flow.h:354
Flow_::flowvar
GenericVar * flowvar
Definition: flow.h:486
FlowReset
void FlowReset(void)
Definition: flow.c:652
Flow_::next
struct Flow_ * next
Definition: flow.h:396
Flow_::probing_parser_toserver_alproto_masks
uint32_t probing_parser_toserver_alproto_masks
Definition: flow.h:418
dtv
DecodeThreadVars * dtv
Definition: fuzz_decodepcapfile.c:33
FlowLookupStruct_::spare_queue
FlowQueuePrivate spare_queue
Definition: flow.h:541
FlowProtoTimeout
struct FlowProtoTimeout_ FlowProtoTimeout
Flow_::ffr
uint8_t ffr
Definition: flow.h:385
FlowStateType
unsigned short FlowStateType
Definition: flow.h:325
flags
uint8_t flags
Definition: decode-gre.h:0
FLOW_STATE_NEW
@ FLOW_STATE_NEW
Definition: flow.h:501
Flow_::code
uint8_t code
Definition: flow.h:359
GenericVar_
Definition: util-var.h:48
FlowAddress
struct FlowAddress_ FlowAddress
FlowKey_::dst
Address dst
Definition: flow.h:305
SCTIME_SECS
#define SCTIME_SECS(t)
Definition: util-time.h:57
FlowGetMemcapExceptionPolicy
enum ExceptionPolicy FlowGetMemcapExceptionPolicy(void)
Definition: flow.c:131
VLAN_MAX_LAYERS
#define VLAN_MAX_LAYERS
Definition: decode-vlan.h:51
Flow_::max_ttl_toclient
uint8_t max_ttl_toclient
Definition: flow.h:470
Flow_::parent_id
int64_t parent_id
Definition: flow.h:430
FLOW_END_FLAG_STATE_CLOSED
#define FLOW_END_FLAG_STATE_CLOSED
Definition: flow.h:236
FlowCnf_::timeout_est
uint32_t timeout_est
Definition: flow.h:293
Flow_::timeout_policy
uint32_t timeout_policy
Definition: flow.h:405
tv
ThreadVars * tv
Definition: fuzz_decodepcapfile.c:32
Flow_::livedev
struct LiveDevice_ * livedev
Definition: flow.h:398
util-optimize.h
FlowQueuePrivate_
Definition: flow-queue.h:41
FlowCnf_::memcap_policy
enum ExceptionPolicy memcap_policy
Definition: flow.h:297
FlowAddress_::address_un_data8
uint8_t address_un_data8[16]
Definition: flow.h:317
FlowKey_::proto
uint8_t proto
Definition: flow.h:307
FLOW_STATE_CLOSED
@ FLOW_STATE_CLOSED
Definition: flow.h:503
DecodeThreadVars_
Structure to hold thread specific data for all decode modules.
Definition: decode.h:685
Flow_::alproto_ts
AppProto alproto_ts
Definition: flow.h:451
Flow_::alstate
void * alstate
Definition: flow.h:476
Flow_::flags
uint32_t flags
Definition: flow.h:421
SCRWLock
#define SCRWLock
Definition: threads-debug.h:363
FlowGetMemcap
uint64_t FlowGetMemcap(void)
Return memcap value.
Definition: flow.c:119
FlowKey_
Definition: flow.h:304
app-layer-protos.h
Flow_::vlan_id
uint16_t vlan_id[VLAN_MAX_LAYERS]
Definition: flow.h:375
likely
#define likely(expr)
Definition: util-optimize.h:32
FLOW_NOPACKET_INSPECTION
#define FLOW_NOPACKET_INSPECTION
Definition: flow.h:62
FlowProtoTimeout_::est_timeout
uint32_t est_timeout
Definition: flow.h:517
Flow_::sp
Port sp
Definition: flow.h:356
FlowKey_::vlan_id
uint16_t vlan_id[VLAN_MAX_LAYERS]
Definition: flow.h:310
Flow_::alproto_tc
AppProto alproto_tc
Definition: flow.h:452
FlowSetChangeProtoFlag
void FlowSetChangeProtoFlag(Flow *)
Set flag to indicate to change proto for the flow.
Definition: flow.c:187
FlowAddress_::address
union FlowAddress_::@116 address
Flow_::file_flags
uint16_t file_flags
Definition: flow.h:423
Flow_::alproto
AppProto alproto
application level protocol
Definition: flow.h:450
FlowUpdateState
void FlowUpdateState(Flow *f, enum FlowState s)
Definition: flow.c:1153
ExceptionPolicy
ExceptionPolicy
Definition: util-exception-policy-types.h:25
Flow_::timeout_at
uint32_t timeout_at
Definition: flow.h:391
FlowKey_::dp
Port dp
Definition: flow.h:306
Flow_::storage
Storage storage[]
Definition: flow.h:497
FlowKey
struct FlowKey_ FlowKey
SCMutex
#define SCMutex
Definition: threads-debug.h:114
FlowSetProtoFreeFunc
int FlowSetProtoFreeFunc(uint8_t, void(*Free)(void *))
Function to set the function to get protocol specific flow state.
Definition: flow.c:1116
Flow_::tenant_id
uint32_t tenant_id
Definition: flow.h:416
Flow_::tosrcpktcnt
uint32_t tosrcpktcnt
Definition: flow.h:493
FlowSetHasAlertsFlag
void FlowSetHasAlertsFlag(Flow *)
Set flag to indicate that flow has alerts.
Definition: flow.c:163
util-storage.h
FlowGetSourcePort
uint16_t FlowGetSourcePort(Flow *flow)
Get flow source port.
Definition: flow.c:1199
Flow_::thread_id
FlowThreadId thread_id[2]
Definition: flow.h:394
FlowHasAlerts
int FlowHasAlerts(const Flow *)
Check if flow has alerts.
Definition: flow.c:174
SCTIME_USECS
#define SCTIME_USECS(t)
Definition: util-time.h:56
FlowProtoFreeFunc_
Definition: flow.h:522
Flow_::de_ctx_version
uint32_t de_ctx_version
Definition: flow.h:464