suricata
flow-private.h
Go to the documentation of this file.
1 /* Copyright (C) 2007-2016 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_PRIVATE_H
25 #define SURICATA_FLOW_PRIVATE_H
26 
27 #include "flow-hash.h"
28 #include "flow-queue.h"
29 
30 /* global flow flags */
31 
32 /** Flow engine is in emergency mode. This means it doesn't have enough spare
33  * flows for new flows and/or it's memcap limit it reached. In this state the
34  * flow engine with evaluate flows with lower timeout settings. */
35 #define FLOW_EMERGENCY 0x01
36 
37 /* Flow Time out values */
38 #define FLOW_DEFAULT_NEW_TIMEOUT 30
39 #define FLOW_DEFAULT_EST_TIMEOUT 300
40 #define FLOW_DEFAULT_BYPASSED_TIMEOUT 100
41 #define FLOW_IPPROTO_TCP_NEW_TIMEOUT 30
42 #define FLOW_IPPROTO_TCP_EST_TIMEOUT 300
43 #define FLOW_IPPROTO_TCP_CLOSED_TIMEOUT 10
44 #define FLOW_IPPROTO_TCP_BYPASSED_TIMEOUT 100
45 #define FLOW_IPPROTO_UDP_NEW_TIMEOUT 30
46 #define FLOW_IPPROTO_UDP_EST_TIMEOUT 300
47 #define FLOW_IPPROTO_UDP_BYPASSED_TIMEOUT 100
48 #define FLOW_IPPROTO_ICMP_NEW_TIMEOUT 30
49 #define FLOW_IPPROTO_ICMP_EST_TIMEOUT 300
50 #define FLOW_IPPROTO_ICMP_BYPASSED_TIMEOUT 100
51 
52 #define FLOW_DEFAULT_EMERG_NEW_TIMEOUT 10
53 #define FLOW_DEFAULT_EMERG_EST_TIMEOUT 100
54 #define FLOW_DEFAULT_EMERG_BYPASSED_TIMEOUT 50
55 #define FLOW_IPPROTO_TCP_EMERG_NEW_TIMEOUT 10
56 #define FLOW_IPPROTO_TCP_EMERG_EST_TIMEOUT 100
57 #define FLOW_IPPROTO_TCP_EMERG_CLOSED_TIMEOUT 5
58 #define FLOW_IPPROTO_UDP_EMERG_NEW_TIMEOUT 10
59 #define FLOW_IPPROTO_UDP_EMERG_EST_TIMEOUT 100
60 #define FLOW_IPPROTO_ICMP_EMERG_NEW_TIMEOUT 10
61 #define FLOW_IPPROTO_ICMP_EMERG_EST_TIMEOUT 100
62 
63 enum {
68 
69  /* should be last */
71 };
72 /* max used in app-layer (counters) */
73 #define FLOW_PROTO_APPLAYER_MAX (FLOW_PROTO_UDP + 1)
74 
75 /*
76  * Variables
77  */
78 
79 /** FlowProto specific timeouts and free/state functions */
80 
84 
85 /** spare/unused/prealloced flows live here */
86 //extern FlowQueue flow_spare_q;
87 
88 /** queue to pass flows to cleanup/log thread(s) */
90 
91 extern FlowBucket *flow_hash;
92 extern FlowConfig flow_config;
93 
94 /** flow memuse counter (atomic), for enforcing memcap limit */
95 SC_ATOMIC_EXTERN(uint64_t, flow_memuse);
96 
99 
100 static inline uint32_t FlowGetFlowTimeoutDirect(
101  const FlowProtoTimeoutPtr flow_timeouts,
102  const enum FlowState state, const uint8_t protomap)
103 {
104  uint32_t timeout;
105  switch (state) {
106  default:
107  case FLOW_STATE_NEW:
108  timeout = flow_timeouts[protomap].new_timeout;
109  break;
111  timeout = flow_timeouts[protomap].est_timeout;
112  break;
113  case FLOW_STATE_CLOSED:
114  timeout = flow_timeouts[protomap].closed_timeout;
115  break;
116 #ifdef CAPTURE_OFFLOAD
117  case FLOW_STATE_CAPTURE_BYPASSED:
118  timeout = flow_timeouts[protomap].bypassed_timeout;
119  break;
120 #endif
122  timeout = flow_timeouts[protomap].bypassed_timeout;
123  break;
124  }
125  return timeout;
126 }
127 
128 /** \internal
129  * \brief get timeout for flow
130  *
131  * \param f flow
132  * \param state flow state
133  *
134  * \retval timeout timeout in seconds
135  */
136 static inline uint32_t FlowGetFlowTimeout(const Flow *f, enum FlowState state)
137 {
138  FlowProtoTimeoutPtr flow_timeouts = SC_ATOMIC_GET(flow_timeouts);
139  return FlowGetFlowTimeoutDirect(flow_timeouts, state, f->protomap);
140 }
141 
142 /** \internal
143  * \brief get timeout policy for flow
144  * \note does not take emergency mode into account. Always
145  * returns the 'normal' policy.
146  *
147  * \param f flow
148  *
149  * \retval timeout timeout in seconds
150  */
151 static inline uint32_t FlowGetTimeoutPolicy(const Flow *f)
152 {
153  uint32_t timeout;
155  switch (f->flow_state) {
156  default:
157  case FLOW_STATE_NEW:
158  timeout = flow_timeouts[f->protomap].new_timeout;
159  break;
161  timeout = flow_timeouts[f->protomap].est_timeout;
162  break;
163  case FLOW_STATE_CLOSED:
164  timeout = flow_timeouts[f->protomap].closed_timeout;
165  break;
166 #ifdef CAPTURE_OFFLOAD
167  case FLOW_STATE_CAPTURE_BYPASSED:
168  timeout = flow_timeouts[f->protomap].bypassed_timeout;
169  break;
170 #endif
172  timeout = flow_timeouts[f->protomap].bypassed_timeout;
173  break;
174  }
175  return timeout;
176 }
177 #endif /* SURICATA_FLOW_PRIVATE_H */
flow_hash
FlowBucket * flow_hash
Definition: flow-hash.c:58
FLOW_STATE_ESTABLISHED
@ FLOW_STATE_ESTABLISHED
Definition: flow.h:510
FLOW_PROTO_MAX
@ FLOW_PROTO_MAX
Definition: flow-private.h:70
Flow_
Flow data structure.
Definition: flow.h:359
FLOW_PROTO_DEFAULT
@ FLOW_PROTO_DEFAULT
Definition: flow-private.h:67
Flow_::protomap
uint8_t protomap
Definition: flow.h:450
FlowProtoTimeout_
Definition: flow.h:523
flow-hash.h
FlowProtoTimeout_::bypassed_timeout
uint32_t bypassed_timeout
Definition: flow.h:527
Flow_::flow_state
FlowStateType flow_state
Definition: flow.h:425
FLOW_STATE_LOCAL_BYPASSED
@ FLOW_STATE_LOCAL_BYPASSED
Definition: flow.h:512
flow_freefuncs
FlowProtoFreeFunc flow_freefuncs[FLOW_PROTO_MAX]
Definition: flow.c:89
FlowCnf_
Definition: flow.h:295
FlowState
FlowState
Definition: flow.h:508
FlowProtoTimeout_::new_timeout
uint32_t new_timeout
Definition: flow.h:524
FlowProtoTimeout_::closed_timeout
uint32_t closed_timeout
Definition: flow.h:526
FlowProtoTimeoutPtr
FlowProtoTimeout * FlowProtoTimeoutPtr
Definition: flow-private.h:97
FLOW_PROTO_TCP
@ FLOW_PROTO_TCP
Definition: flow-private.h:64
flow_timeouts_emerg
FlowProtoTimeout flow_timeouts_emerg[FLOW_PROTO_MAX]
Definition: flow.c:87
flow-queue.h
FlowQueue_
Definition: flow-queue.h:48
flow_recycle_q
FlowQueue flow_recycle_q
Definition: flow-manager.c:66
FLOW_STATE_NEW
@ FLOW_STATE_NEW
Definition: flow.h:509
flow_config
FlowConfig flow_config
Definition: flow.c:91
FLOW_PROTO_ICMP
@ FLOW_PROTO_ICMP
Definition: flow-private.h:66
FLOW_STATE_CLOSED
@ FLOW_STATE_CLOSED
Definition: flow.h:511
FLOW_PROTO_UDP
@ FLOW_PROTO_UDP
Definition: flow-private.h:65
SC_ATOMIC_EXTERN
SC_ATOMIC_EXTERN(uint64_t, flow_memuse)
flow_timeouts_normal
FlowProtoTimeout flow_timeouts_normal[FLOW_PROTO_MAX]
Definition: flow.c:86
FlowProtoTimeout_::est_timeout
uint32_t est_timeout
Definition: flow.h:525
SC_ATOMIC_GET
#define SC_ATOMIC_GET(name)
Get the value from the atomic variable.
Definition: util-atomic.h:375
FlowProtoFreeFunc_
Definition: flow.h:530
f
Flow f
Definition: fuzz_dataset.c:32