suricata
util-exception-policy.c
Go to the documentation of this file.
1 /* Copyright (C) 2022-2025 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 
22 #include "util-exception-policy.h"
23 #include "suricata-common.h"
24 #include "suricata.h"
25 #include "packet.h"
26 #include "util-misc.h"
27 #include "stream-tcp-reassemble.h"
28 #include "action-globals.h"
29 #include "conf.h"
30 #include "flow.h"
31 #include "stream-tcp.h"
32 #include "defrag-hash.h"
33 #include "app-layer-parser.h"
34 
36 /** true if exception policy was defined in config */
37 static bool g_eps_have_exception_policy = false;
38 
39 const char *ExceptionPolicyEnumToString(enum ExceptionPolicy policy, bool is_json)
40 {
41  switch (policy) {
43  return "ignore";
45  return "auto";
47  return "reject";
49  return "bypass";
51  return is_json ? "drop_flow" : "drop-flow";
53  return is_json ? "drop_packet" : "drop-packet";
55  return is_json ? "pass_packet" : "pass-packet";
57  return is_json ? "pass_flow" : "pass-flow";
58  }
59  // TODO we shouldn't reach this, but if we do, better not to leave this as simply null...
60  return "not set";
61 }
62 
64 {
65  g_eps_master_switch = ExceptionPolicyParse("exception-policy", true);
66 }
67 
68 static enum ExceptionPolicy GetMasterExceptionPolicy(void)
69 {
70  return g_eps_master_switch;
71 }
72 
73 static uint8_t ExceptionPolicyFlag(enum PacketDropReason drop_reason)
74 {
75  switch (drop_reason) {
88  default:
89  return 0;
90  }
91 
92  return 0;
93 }
94 
95 const char *ExceptionPolicyTargetFlagToString(uint8_t target_flag)
96 {
97  switch (target_flag) {
99  return "defrag_memcap";
101  return "stream_memcap";
103  return "stream_reassembly_memcap";
105  return "flow_memcap";
107  return "stream_midstream";
109  return "app_layer_error";
110  default:
111  return "none";
112  }
113 }
114 
115 enum ExceptionPolicy ExceptionPolicyTargetPolicy(uint8_t target_flag)
116 {
117  switch (target_flag) {
130  default:
132  }
134 }
135 
136 void ExceptionPolicyApply(Packet *p, enum ExceptionPolicy policy, enum PacketDropReason drop_reason)
137 {
138  SCLogDebug("start: pcap_cnt %" PRIu64 ", policy %u", p->pcap_cnt, policy);
139  if (p->flow) {
140  p->flow->applied_exception_policy |= ExceptionPolicyFlag(drop_reason);
141  }
142  switch (policy) {
144  break;
146  break;
148  SCLogDebug("EXCEPTION_POLICY_REJECT");
149  PacketDrop(p, ACTION_REJECT, drop_reason);
150  if (!EngineModeIsIPS()) {
151  break;
152  }
153  /* fall through */
155  SCLogDebug("EXCEPTION_POLICY_DROP_FLOW");
156  if (p->flow) {
157  p->flow->flags |= FLOW_ACTION_DROP;
158  FlowSetNoPayloadInspectionFlag(p->flow);
159  FlowSetNoPacketInspectionFlag(p->flow);
161  }
162  /* fall through */
164  SCLogDebug("EXCEPTION_POLICY_DROP_PACKET");
165  DecodeSetNoPayloadInspectionFlag(p);
166  DecodeSetNoPacketInspectionFlag(p);
167  PacketDrop(p, ACTION_DROP, drop_reason);
168  break;
171  /* fall through */
173  SCLogDebug("EXCEPTION_POLICY_PASS_FLOW");
174  if (p->flow) {
175  p->flow->flags |= FLOW_ACTION_PASS;
176  FlowSetNoPacketInspectionFlag(p->flow); // TODO util func
177  }
178  /* fall through */
180  SCLogDebug("EXCEPTION_POLICY_PASS_PACKET");
181  DecodeSetNoPayloadInspectionFlag(p);
182  DecodeSetNoPacketInspectionFlag(p);
183  break;
184  }
185  SCLogDebug("end");
186 }
187 
188 static enum ExceptionPolicy PickPacketAction(const char *option, enum ExceptionPolicy p)
189 {
190  switch (p) {
192  SCLogWarning(
193  "flow actions not supported for %s, defaulting to \"drop-packet\"", option);
196  SCLogWarning(
197  "flow actions not supported for %s, defaulting to \"pass-packet\"", option);
200  SCLogWarning("flow actions not supported for %s, defaulting to \"ignore\"", option);
202  /* add all cases, to make sure new cases not handle will raise
203  * errors */
205  break;
207  break;
209  break;
211  break;
213  break;
214  }
215  return p;
216 }
217 
218 static enum ExceptionPolicy ExceptionPolicyConfigValueParse(
219  const char *option, const char *value_str)
220 {
222  if (strcmp(value_str, "drop-flow") == 0) {
224  } else if (strcmp(value_str, "pass-flow") == 0) {
226  } else if (strcmp(value_str, "bypass") == 0) {
228  } else if (strcmp(value_str, "drop-packet") == 0) {
230  } else if (strcmp(value_str, "pass-packet") == 0) {
232  } else if (strcmp(value_str, "reject") == 0) {
233  policy = EXCEPTION_POLICY_REJECT;
234  } else if (strcmp(value_str, "ignore") == 0) { // TODO name?
235  policy = EXCEPTION_POLICY_NOT_SET;
236  } else if (strcmp(value_str, "auto") == 0) {
237  policy = EXCEPTION_POLICY_AUTO;
238  } else {
240  "\"%s\" is not a valid exception policy value. Valid options are drop-flow, "
241  "pass-flow, bypass, reject, drop-packet, pass-packet, ignore or auto.",
242  value_str);
243  }
244 
245  return policy;
246 }
247 
248 /* Select an exception policy in case the configuration value was set to 'auto' */
249 static enum ExceptionPolicy ExceptionPolicyPickAuto(bool midstream_enabled, bool support_flow)
250 {
252  if (!midstream_enabled && EngineModeIsIPS()) {
253  if (support_flow) {
255  } else {
257  }
258  }
259  return policy;
260 }
261 
262 static enum ExceptionPolicy ExceptionPolicyMasterParse(const char *value)
263 {
264  enum ExceptionPolicy policy = ExceptionPolicyConfigValueParse("exception-policy", value);
265  if (!EngineModeIsIPS() &&
266  (policy == EXCEPTION_POLICY_DROP_PACKET || policy == EXCEPTION_POLICY_DROP_FLOW)) {
267  policy = EXCEPTION_POLICY_NOT_SET;
268  }
269  g_eps_have_exception_policy = true;
270 
271  SCLogInfo("master exception-policy set to: %s", ExceptionPolicyEnumToString(policy, false));
272 
273  return policy;
274 }
275 
276 static enum ExceptionPolicy ExceptionPolicyGetDefault(
277  const char *option, bool support_flow, bool midstream)
278 {
280  if (g_eps_have_exception_policy) {
281  p = GetMasterExceptionPolicy();
282 
283  if (p == EXCEPTION_POLICY_AUTO) {
284  p = ExceptionPolicyPickAuto(midstream, support_flow);
285  }
286 
287  if (!support_flow) {
288  p = PickPacketAction(option, p);
289  }
290  SCLogConfig("%s: %s (defined via 'exception-policy' master switch)", option,
291  ExceptionPolicyEnumToString(p, false));
292  return p;
293  } else if (EngineModeIsIPS() && !midstream) {
295  }
296  SCLogConfig("%s: %s (defined via 'built-in default' for %s-mode)", option,
297  ExceptionPolicyEnumToString(p, false), EngineModeIsIPS() ? "IPS" : "IDS");
298 
299  return p;
300 }
301 
302 enum ExceptionPolicy ExceptionPolicyParse(const char *option, bool support_flow)
303 {
305  const char *value_str = NULL;
306 
307  if ((ConfGet(option, &value_str) == 1) && value_str != NULL) {
308  if (strcmp(option, "exception-policy") == 0) {
309  policy = ExceptionPolicyMasterParse(value_str);
310  } else {
311  policy = ExceptionPolicyConfigValueParse(option, value_str);
312  if (policy == EXCEPTION_POLICY_AUTO) {
313  policy = ExceptionPolicyPickAuto(false, support_flow);
314  }
315  if (!support_flow) {
316  policy = PickPacketAction(option, policy);
317  }
318  SCLogConfig("%s: %s", option, ExceptionPolicyEnumToString(policy, false));
319  }
320  } else {
321  policy = ExceptionPolicyGetDefault(option, support_flow, false);
322  }
323 
324  return policy;
325 }
326 
327 enum ExceptionPolicy ExceptionPolicyMidstreamParse(bool midstream_enabled)
328 {
330  const char *value_str = NULL;
331  /* policy was set directly */
332  if ((ConfGet("stream.midstream-policy", &value_str)) == 1 && value_str != NULL) {
333  policy = ExceptionPolicyConfigValueParse("midstream-policy", value_str);
334  if (policy == EXCEPTION_POLICY_AUTO) {
335  policy = ExceptionPolicyPickAuto(midstream_enabled, true);
336  } else if (midstream_enabled) {
337  if (policy != EXCEPTION_POLICY_NOT_SET && policy != EXCEPTION_POLICY_PASS_FLOW) {
339  "Error parsing stream.midstream-policy from config file. \"%s\" is "
340  "not a valid exception policy when midstream is enabled. Valid options "
341  "are pass-flow and ignore.",
342  value_str);
343  }
344  }
345  if (!EngineModeIsIPS()) {
346  if (policy == EXCEPTION_POLICY_DROP_FLOW) {
348  "Error parsing stream.midstream-policy from config file. \"%s\" is "
349  "not a valid exception policy in IDS mode. See our documentation for a "
350  "list of all possible values.",
351  value_str);
352  }
353  }
354  } else {
355  policy = ExceptionPolicyGetDefault("stream.midstream-policy", true, midstream_enabled);
356  }
357 
358  if (policy == EXCEPTION_POLICY_PASS_PACKET || policy == EXCEPTION_POLICY_DROP_PACKET) {
359  FatalErrorOnInit("Error parsing stream.midstream-policy from config file. \"%s\" is "
360  "not valid for this exception policy. See our documentation for a list of "
361  "all possible values.",
362  value_str);
363  }
364 
365  return policy;
366 }
367 
369  ExceptionPolicyStatsSetts *setting, enum ExceptionPolicy conf_policy,
370  const char *default_str, bool (*isExceptionPolicyValid)(enum ExceptionPolicy))
371 {
372  if (conf_policy != EXCEPTION_POLICY_NOT_SET) {
373  /* set-up policy counters */
374  for (enum ExceptionPolicy i = EXCEPTION_POLICY_NOT_SET + 1; i < EXCEPTION_POLICY_MAX; i++) {
375  if (isExceptionPolicyValid(i)) {
376  snprintf(setting->eps_name[i], sizeof(setting->eps_name[i]), "%s%s", default_str,
377  ExceptionPolicyEnumToString(i, true));
378  counter->eps_id[i] = StatsRegisterCounter(setting->eps_name[i], tv);
379  }
380  }
381  }
382 }
383 
384 #ifndef DEBUG
385 
386 int ExceptionSimulationCommandLineParser(const char *name, const char *arg)
387 {
388  return 0;
389 }
390 
391 #else
392 
393 /* exception policy simulation (eps) handling */
394 
395 uint64_t g_eps_applayer_error_offset_ts = UINT64_MAX;
396 uint64_t g_eps_applayer_error_offset_tc = UINT64_MAX;
397 uint64_t g_eps_pcap_packet_loss = UINT64_MAX;
398 uint64_t g_eps_stream_ssn_memcap = UINT64_MAX;
399 uint64_t g_eps_stream_reassembly_memcap = UINT64_MAX;
400 uint64_t g_eps_flow_memcap = UINT64_MAX;
401 uint64_t g_eps_defrag_memcap = UINT64_MAX;
402 bool g_eps_is_alert_queue_fail_mode = false;
403 
404 /* 1: parsed, 0: not for us, -1: error */
405 int ExceptionSimulationCommandLineParser(const char *name, const char *arg)
406 {
407  if (strcmp(name, "simulate-applayer-error-at-offset-ts") == 0) {
408  BUG_ON(arg == NULL);
409  uint64_t offset = 0;
410  if (ParseSizeStringU64(arg, &offset) < 0) {
411  return -1;
412  }
413  g_eps_applayer_error_offset_ts = offset;
414  } else if (strcmp(name, "simulate-applayer-error-at-offset-tc") == 0) {
415  BUG_ON(arg == NULL);
416  uint64_t offset = 0;
417  if (ParseSizeStringU64(arg, &offset) < 0) {
418  return TM_ECODE_FAILED;
419  }
420  g_eps_applayer_error_offset_tc = offset;
421  } else if (strcmp(name, "simulate-packet-loss") == 0) {
422  BUG_ON(arg == NULL);
423  uint64_t pkt_num = 0;
424  if (ParseSizeStringU64(arg, &pkt_num) < 0) {
425  return TM_ECODE_FAILED;
426  }
427  g_eps_pcap_packet_loss = pkt_num;
428  } else if (strcmp(name, "simulate-packet-tcp-reassembly-memcap") == 0) {
429  BUG_ON(arg == NULL);
430  uint64_t pkt_num = 0;
431  if (ParseSizeStringU64(arg, &pkt_num) < 0) {
432  return TM_ECODE_FAILED;
433  }
434  g_eps_stream_reassembly_memcap = pkt_num;
435  } else if (strcmp(name, "simulate-packet-tcp-ssn-memcap") == 0) {
436  BUG_ON(arg == NULL);
437  uint64_t pkt_num = 0;
438  if (ParseSizeStringU64(arg, &pkt_num) < 0) {
439  return TM_ECODE_FAILED;
440  }
441  g_eps_stream_ssn_memcap = pkt_num;
442  } else if (strcmp(name, "simulate-packet-flow-memcap") == 0) {
443  BUG_ON(arg == NULL);
444  uint64_t pkt_num = 0;
445  if (ParseSizeStringU64(arg, &pkt_num) < 0) {
446  return TM_ECODE_FAILED;
447  }
448  g_eps_flow_memcap = pkt_num;
449  } else if (strcmp(name, "simulate-packet-defrag-memcap") == 0) {
450  BUG_ON(arg == NULL);
451  uint64_t pkt_num = 0;
452  if (ParseSizeStringU64(arg, &pkt_num) < 0) {
453  return TM_ECODE_FAILED;
454  }
455  g_eps_defrag_memcap = pkt_num;
456  } else if (strcmp(name, "simulate-alert-queue-realloc-failure") == 0) {
457  g_eps_is_alert_queue_fail_mode = true;
458  } else {
459  // not for us
460  return 0;
461  }
462  return 1;
463 }
464 #endif
PKT_DROP_REASON_DEFRAG_MEMCAP
@ PKT_DROP_REASON_DEFRAG_MEMCAP
Definition: decode.h:363
ExceptionPolicyApply
void ExceptionPolicyApply(Packet *p, enum ExceptionPolicy policy, enum PacketDropReason drop_reason)
Definition: util-exception-policy.c:136
ExceptionSimulationCommandLineParser
int ExceptionSimulationCommandLineParser(const char *name, const char *arg)
Definition: util-exception-policy.c:386
EXCEPTION_POLICY_PASS_FLOW
@ EXCEPTION_POLICY_PASS_FLOW
Definition: util-exception-policy-types.h:29
offset
uint64_t offset
Definition: util-streaming-buffer.h:0
PacketBypassCallback
void PacketBypassCallback(Packet *p)
Definition: decode.c:504
stream-tcp.h
g_eps_master_switch
enum ExceptionPolicy g_eps_master_switch
Definition: util-exception-policy.c:35
PKT_DROP_REASON_STREAM_MEMCAP
@ PKT_DROP_REASON_STREAM_MEMCAP
Definition: decode.h:371
ACTION_REJECT
#define ACTION_REJECT
Definition: action-globals.h:31
PKT_DROP_REASON_FLOW_MEMCAP
@ PKT_DROP_REASON_FLOW_MEMCAP
Definition: decode.h:364
EXCEPTION_POLICY_DROP_PACKET
@ EXCEPTION_POLICY_DROP_PACKET
Definition: util-exception-policy-types.h:31
SCLogDebug
#define SCLogDebug(...)
Definition: util-debug.h:269
Packet_::pcap_cnt
uint64_t pcap_cnt
Definition: decode.h:595
ParseSizeStringU64
int ParseSizeStringU64(const char *size, uint64_t *res)
Definition: util-misc.c:190
action-globals.h
ExceptionPolicyStatsSetts_
Definition: util-exception-policy-types.h:56
EXCEPTION_TARGET_FLAG_APPLAYER_ERROR
#define EXCEPTION_TARGET_FLAG_APPLAYER_ERROR
Definition: util-exception-policy-types.h:49
PKT_DROP_REASON_STREAM_REASSEMBLY
@ PKT_DROP_REASON_STREAM_REASSEMBLY
Definition: decode.h:373
stream-tcp-reassemble.h
FLOW_ACTION_DROP
#define FLOW_ACTION_DROP
Definition: flow.h:68
EXCEPTION_POLICY_BYPASS_FLOW
@ EXCEPTION_POLICY_BYPASS_FLOW
Definition: util-exception-policy-types.h:30
TM_ECODE_FAILED
@ TM_ECODE_FAILED
Definition: tm-threads-common.h:81
PacketDropReason
PacketDropReason
Definition: decode.h:359
EXCEPTION_POLICY_NOT_SET
@ EXCEPTION_POLICY_NOT_SET
Definition: util-exception-policy-types.h:26
ExceptionPolicyParse
enum ExceptionPolicy ExceptionPolicyParse(const char *option, bool support_flow)
Definition: util-exception-policy.c:302
ExceptionPolicyTargetFlagToString
const char * ExceptionPolicyTargetFlagToString(uint8_t target_flag)
Definition: util-exception-policy.c:95
ConfGet
int ConfGet(const char *name, const char **vptr)
Retrieve the value of a configuration node.
Definition: conf.c:335
FLOW_ACTION_PASS
#define FLOW_ACTION_PASS
Definition: flow.h:115
EXCEPTION_POLICY_MAX
#define EXCEPTION_POLICY_MAX
Definition: util-exception-policy-types.h:36
EXCEPTION_TARGET_FLAG_DEFRAG_MEMCAP
#define EXCEPTION_TARGET_FLAG_DEFRAG_MEMCAP
Definition: util-exception-policy-types.h:44
ExceptionPolicyTargetPolicy
enum ExceptionPolicy ExceptionPolicyTargetPolicy(uint8_t target_flag)
Definition: util-exception-policy.c:115
ExceptionPolicyCounters_
Definition: util-exception-policy-types.h:51
EXCEPTION_POLICY_PASS_PACKET
@ EXCEPTION_POLICY_PASS_PACKET
Definition: util-exception-policy-types.h:28
PKT_DROP_REASON_APPLAYER_ERROR
@ PKT_DROP_REASON_APPLAYER_ERROR
Definition: decode.h:366
EXCEPTION_POLICY_AUTO
@ EXCEPTION_POLICY_AUTO
Definition: util-exception-policy-types.h:27
util-exception-policy.h
ExceptionPolicyCounters_::eps_id
uint16_t eps_id[EXCEPTION_POLICY_MAX]
Definition: util-exception-policy-types.h:53
ExceptionPolicySetStatsCounters
void ExceptionPolicySetStatsCounters(ThreadVars *tv, ExceptionPolicyCounters *counter, ExceptionPolicyStatsSetts *setting, enum ExceptionPolicy conf_policy, const char *default_str, bool(*isExceptionPolicyValid)(enum ExceptionPolicy))
Definition: util-exception-policy.c:368
ThreadVars_
Per thread variable structure.
Definition: threadvars.h:58
EXCEPTION_POLICY_DROP_FLOW
@ EXCEPTION_POLICY_DROP_FLOW
Definition: util-exception-policy-types.h:32
SCLogWarning
#define SCLogWarning(...)
Macro used to log WARNING messages.
Definition: util-debug.h:249
app-layer-parser.h
BUG_ON
#define BUG_ON(x)
Definition: suricata-common.h:309
ExceptionPolicyMidstreamParse
enum ExceptionPolicy ExceptionPolicyMidstreamParse(bool midstream_enabled)
Definition: util-exception-policy.c:327
Packet_
Definition: decode.h:476
conf.h
name
const char * name
Definition: tm-threads.c:2081
EXCEPTION_TARGET_FLAG_REASSEMBLY_MEMCAP
#define EXCEPTION_TARGET_FLAG_REASSEMBLY_MEMCAP
Definition: util-exception-policy-types.h:46
SCLogInfo
#define SCLogInfo(...)
Macro used to log INFORMATIONAL messages.
Definition: util-debug.h:224
EXCEPTION_TARGET_FLAG_MIDSTREAM
#define EXCEPTION_TARGET_FLAG_MIDSTREAM
Definition: util-exception-policy-types.h:48
StreamTcpReassemblyMemcapGetExceptionPolicy
enum ExceptionPolicy StreamTcpReassemblyMemcapGetExceptionPolicy(void)
Definition: stream-tcp.c:904
AppLayerErrorGetExceptionPolicy
enum ExceptionPolicy AppLayerErrorGetExceptionPolicy(void)
Definition: app-layer-parser.c:156
Packet_::flow
struct Flow_ * flow
Definition: decode.h:515
FlowGetMemcapExceptionPolicy
enum ExceptionPolicy FlowGetMemcapExceptionPolicy(void)
Definition: flow.c:132
Flow_::applied_exception_policy
uint8_t applied_exception_policy
Definition: flow.h:471
EXCEPTION_POLICY_REJECT
@ EXCEPTION_POLICY_REJECT
Definition: util-exception-policy-types.h:33
StreamTcpDisableAppLayer
void StreamTcpDisableAppLayer(Flow *f)
Definition: stream-tcp-reassemble.c:447
suricata-common.h
EXCEPTION_TARGET_FLAG_SESSION_MEMCAP
#define EXCEPTION_TARGET_FLAG_SESSION_MEMCAP
Definition: util-exception-policy-types.h:45
FatalErrorOnInit
#define FatalErrorOnInit(...)
Fatal error IF we're starting up, and configured to consider errors to be fatal errors.
Definition: util-debug.h:511
packet.h
ACTION_DROP
#define ACTION_DROP
Definition: action-globals.h:30
tv
ThreadVars * tv
Definition: fuzz_decodepcapfile.c:32
SCLogConfig
struct SCLogConfig_ SCLogConfig
Holds the config state used by the logging api.
ExceptionPolicyEnumToString
const char * ExceptionPolicyEnumToString(enum ExceptionPolicy policy, bool is_json)
Definition: util-exception-policy.c:39
StreamMidstreamGetExceptionPolicy
enum ExceptionPolicy StreamMidstreamGetExceptionPolicy(void)
Definition: stream-tcp.c:909
Flow_::flags
uint32_t flags
Definition: flow.h:419
StreamTcpSsnMemcapGetExceptionPolicy
enum ExceptionPolicy StreamTcpSsnMemcapGetExceptionPolicy(void)
Definition: stream-tcp.c:899
PacketDrop
void PacketDrop(Packet *p, const uint8_t action, enum PacketDropReason r)
issue drop action
Definition: packet.c:33
EngineModeIsIPS
int EngineModeIsIPS(void)
Definition: suricata.c:232
suricata.h
defrag-hash.h
EXCEPTION_TARGET_FLAG_FLOW_MEMCAP
#define EXCEPTION_TARGET_FLAG_FLOW_MEMCAP
Definition: util-exception-policy-types.h:47
SetMasterExceptionPolicy
void SetMasterExceptionPolicy(void)
Definition: util-exception-policy.c:63
util-misc.h
flow.h
PKT_DROP_REASON_STREAM_MIDSTREAM
@ PKT_DROP_REASON_STREAM_MIDSTREAM
Definition: decode.h:372
ExceptionPolicy
ExceptionPolicy
Definition: util-exception-policy-types.h:25
StatsRegisterCounter
uint16_t StatsRegisterCounter(const char *name, struct ThreadVars_ *tv)
Registers a normal, unqualified counter.
Definition: counters.c:951
DefragGetMemcapExceptionPolicy
enum ExceptionPolicy DefragGetMemcapExceptionPolicy(void)
Definition: defrag-hash.c:80
ExceptionPolicyStatsSetts_::eps_name
char eps_name[EXCEPTION_POLICY_MAX][EXCEPTION_POLICY_COUNTER_MAX_LEN]
Definition: util-exception-policy-types.h:57