suricata
runmode-netmap.c
Go to the documentation of this file.
1 /* Copyright (C) 2014-2018 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 * \ingroup netmap
20 *
21 * @{
22 */
23 
24 /**
25 * \file
26 *
27 * \author Aleksey Katargin <gureedo@gmail.com>
28 *
29 * Netmap runmode
30 *
31 */
32 
33 #include "suricata-common.h"
34 #include "config.h"
35 #include "tm-threads.h"
36 #include "conf.h"
37 #include "runmodes.h"
38 #include "runmode-netmap.h"
39 #include "output.h"
40 #include "log-httplog.h"
41 #include "detect-engine-mpm.h"
42 
43 #include "alert-fastlog.h"
44 #include "alert-prelude.h"
45 #include "alert-debuglog.h"
46 
47 #include "util-debug.h"
48 #include "util-time.h"
49 #include "util-cpu.h"
50 #include "util-affinity.h"
51 #include "util-device.h"
52 #include "util-runmodes.h"
53 #include "util-ioctl.h"
54 #include "util-byte.h"
55 
56 #include "source-netmap.h"
57 
58 extern int max_pending_packets;
59 
60 const char *RunModeNetmapGetDefaultMode(void)
61 {
62  return "workers";
63 }
64 
66 {
68  "Single threaded netmap mode",
71  "Workers netmap mode, each thread does all"
72  " tasks from acquisition to logging",
75  "Multi threaded netmap mode. Packets from "
76  "each flow are assigned to a single detect "
77  "thread.",
79  return;
80 }
81 
82 #ifdef HAVE_NETMAP
83 
84 static void NetmapDerefConfig(void *conf)
85 {
86  NetmapIfaceConfig *pfp = (NetmapIfaceConfig *)conf;
87  /* config is used only once but cost of this low. */
88  if (SC_ATOMIC_SUB(pfp->ref, 1) == 1) {
89  SCFree(pfp);
90  }
91 }
92 
93 static int ParseNetmapSettings(NetmapIfaceSettings *ns, const char *iface,
94  ConfNode *if_root, ConfNode *if_default)
95 {
96  ns->threads = 0;
97  ns->promisc = true;
100  strlcpy(ns->iface, iface, sizeof(ns->iface));
101 
102  if (ns->iface[0]) {
103  size_t len = strlen(ns->iface);
104  if (ns->iface[len-1] == '+') {
106  "netmap interface %s uses obsolete '+' notation. "
107  "Using '^' instead.", ns->iface);
108  ns->iface[len-1] = '^';
109  ns->sw_ring = true;
110  } else if (ns->iface[len-1] == '^') {
111  ns->sw_ring = true;
112  }
113  }
114 
115  /* prefixed with netmap or vale means it's not a real interface
116  * and we don't check offloading. */
117  if (strncmp(ns->iface, "netmap:", 7) != 0 &&
118  strncmp(ns->iface, "vale", 4) != 0) {
119  ns->real = true;
120  }
121 
122  const char *bpf_filter = NULL;
123  if (ConfGet("bpf-filter", &bpf_filter) == 1) {
124  if (strlen(bpf_filter) > 0) {
125  ns->bpf_filter = bpf_filter;
126  SCLogInfo("Going to use command-line provided bpf filter '%s'",
127  ns->bpf_filter);
128  }
129  }
130 
131  if (if_root == NULL && if_default == NULL) {
132  SCLogInfo("Unable to find netmap config for "
133  "interface \"%s\" or \"default\", using default values",
134  iface);
135  goto finalize;
136 
137  /* If there is no setting for current interface use default one as main iface */
138  } else if (if_root == NULL) {
139  if_root = if_default;
140  if_default = NULL;
141  }
142 
143  const char *threadsstr = NULL;
144  if (ConfGetChildValueWithDefault(if_root, if_default, "threads", &threadsstr) != 1) {
145  ns->threads = 0;
146  ns->threads_auto = true;
147  } else {
148  if (strcmp(threadsstr, "auto") == 0) {
149  ns->threads = 0;
150  ns->threads_auto = true;
151  } else {
152  if (StringParseUint16(&ns->threads, 10, 0, threadsstr) < 0) {
153  SCLogWarning(SC_ERR_INVALID_VALUE, "Invalid config value for "
154  "threads: %s, resetting to 0", threadsstr);
155  ns->threads = 0;
156  }
157  }
158  }
159 
160  /* load netmap bpf filter */
161  /* command line value has precedence */
162  if (ns->bpf_filter == NULL) {
163  if (ConfGetChildValueWithDefault(if_root, if_default, "bpf-filter", &bpf_filter) == 1) {
164  if (strlen(bpf_filter) > 0) {
165  ns->bpf_filter = bpf_filter;
166  SCLogInfo("Going to use bpf filter %s", ns->bpf_filter);
167  }
168  }
169  }
170 
171  int boolval = 0;
172  (void)ConfGetChildValueBoolWithDefault(if_root, if_default, "disable-promisc", (int *)&boolval);
173  if (boolval) {
174  SCLogInfo("Disabling promiscuous mode on iface %s", ns->iface);
175  ns->promisc = false;
176  }
177 
178  const char *tmpctype;
179  if (ConfGetChildValueWithDefault(if_root, if_default,
180  "checksum-checks", &tmpctype) == 1)
181  {
182  if (strcmp(tmpctype, "auto") == 0) {
184  } else if (ConfValIsTrue(tmpctype)) {
186  } else if (ConfValIsFalse(tmpctype)) {
188  } else {
189  SCLogWarning(SC_ERR_INVALID_ARGUMENT, "Invalid value for "
190  "checksum-checks for %s", iface);
191  }
192  }
193 
194  const char *copymodestr;
195  if (ConfGetChildValueWithDefault(if_root, if_default,
196  "copy-mode", &copymodestr) == 1)
197  {
198  if (strcmp(copymodestr, "ips") == 0) {
200  } else if (strcmp(copymodestr, "tap") == 0) {
202  } else {
203  SCLogWarning(SC_ERR_INVALID_ARGUMENT, "Invalid copy-mode "
204  "(valid are tap, ips)");
205  }
206  }
207 
208 finalize:
209 
210  ns->ips = (ns->copy_mode != NETMAP_COPY_MODE_NONE);
211 
212  if (ns->sw_ring) {
213  /* just one thread per interface supported */
214  ns->threads = 1;
215  } else if (ns->threads_auto) {
216  /* As NetmapGetRSSCount used to be broken on Linux,
217  * fall back to GetIfaceRSSQueuesNum if needed. */
218  ns->threads = NetmapGetRSSCount(ns->iface);
219  if (ns->threads == 0) {
221  }
222  }
223  if (ns->threads <= 0) {
224  ns->threads = 1;
225  }
226 
227  return 0;
228 }
229 
230 /**
231 * \brief extract information from config file
232 *
233 * The returned structure will be freed by the thread init function.
234 * This is thus necessary to or copy the structure before giving it
235 * to thread or to reparse the file for each thread (and thus have
236 * new structure.
237 *
238 * \return a NetmapIfaceConfig corresponding to the interface name
239 */
240 static void *ParseNetmapConfig(const char *iface_name)
241 {
242  ConfNode *if_root = NULL;
243  ConfNode *if_default = NULL;
244  const char *out_iface = NULL;
245 
246  if (iface_name == NULL) {
247  return NULL;
248  }
249 
250  NetmapIfaceConfig *aconf = SCMalloc(sizeof(*aconf));
251  if (unlikely(aconf == NULL)) {
252  return NULL;
253  }
254  memset(aconf, 0, sizeof(*aconf));
255 
256  aconf->DerefFunc = NetmapDerefConfig;
257  strlcpy(aconf->iface_name, iface_name, sizeof(aconf->iface_name));
258  SC_ATOMIC_INIT(aconf->ref);
259  (void) SC_ATOMIC_ADD(aconf->ref, 1);
260 
261  /* Find initial node */
262  ConfNode *netmap_node = ConfGetNode("netmap");
263  if (netmap_node == NULL) {
264  SCLogInfo("Unable to find netmap config using default value");
265  } else {
266  if_root = ConfFindDeviceConfig(netmap_node, aconf->iface_name);
267  if_default = ConfFindDeviceConfig(netmap_node, "default");
268  }
269 
270  /* parse settings for capture iface */
271  ParseNetmapSettings(&aconf->in, aconf->iface_name, if_root, if_default);
272 
273  /* if we have a copy iface, parse that as well */
274  if (netmap_node != NULL &&
275  ConfGetChildValueWithDefault(if_root, if_default, "copy-iface", &out_iface) == 1)
276  {
277  if (strlen(out_iface) > 0) {
278  if_root = ConfFindDeviceConfig(netmap_node, out_iface);
279  ParseNetmapSettings(&aconf->out, out_iface, if_root, if_default);
280 
281  /* if one side of the IPS peering uses a sw_ring, we will default
282  * to using a single ring/thread on the other side as well. Only
283  * if thread variable is set to 'auto'. So the user can override
284  * this. */
285  if (aconf->out.sw_ring && aconf->in.threads_auto) {
286  aconf->out.threads = aconf->in.threads = 1;
287  } else if (aconf->in.sw_ring && aconf->out.threads_auto) {
288  aconf->out.threads = aconf->in.threads = 1;
289  }
290  }
291  }
292 
293  /* netmap needs all offloading to be disabled */
294  if (aconf->in.real) {
295  char base_name[sizeof(aconf->in.iface)];
296  strlcpy(base_name, aconf->in.iface, sizeof(base_name));
297  /* for a sw_ring enabled device name, strip the trailing char */
298  if (aconf->in.sw_ring) {
299  base_name[strlen(base_name) - 1] = '\0';
300  }
301 
302  if (LiveGetOffload() == 0) {
303  (void)GetIfaceOffloading(base_name, 1, 1);
304  } else {
305  DisableIfaceOffloading(LiveGetDevice(base_name), 1, 1);
306  }
307  }
308 
309  SC_ATOMIC_RESET(aconf->ref);
310  (void) SC_ATOMIC_ADD(aconf->ref, aconf->in.threads);
311  SCLogPerf("Using %d threads for interface %s", aconf->in.threads,
312  aconf->iface_name);
313 
314  return aconf;
315 }
316 
317 static int NetmapConfigGeThreadsCount(void *conf)
318 {
319  NetmapIfaceConfig *aconf = (NetmapIfaceConfig *)conf;
320  return aconf->in.threads;
321 }
322 
323 int NetmapRunModeIsIPS()
324 {
325  int nlive = LiveGetDeviceCount();
326  int ldev;
327  ConfNode *if_root;
328  ConfNode *if_default = NULL;
329  ConfNode *netmap_node;
330  int has_ips = 0;
331  int has_ids = 0;
332 
333  /* Find initial node */
334  netmap_node = ConfGetNode("netmap");
335  if (netmap_node == NULL) {
336  return 0;
337  }
338 
339  if_default = ConfNodeLookupKeyValue(netmap_node, "interface", "default");
340 
341  for (ldev = 0; ldev < nlive; ldev++) {
342  const char *live_dev = LiveGetDeviceName(ldev);
343  if (live_dev == NULL) {
344  SCLogError(SC_ERR_INVALID_VALUE, "Problem with config file");
345  return 0;
346  }
347  const char *copymodestr = NULL;
348  if_root = ConfNodeLookupKeyValue(netmap_node, "interface", live_dev);
349 
350  if (if_root == NULL) {
351  if (if_default == NULL) {
352  SCLogError(SC_ERR_INVALID_VALUE, "Problem with config file");
353  return 0;
354  }
355  if_root = if_default;
356  }
357 
358  if (ConfGetChildValueWithDefault(if_root, if_default, "copy-mode", &copymodestr) == 1) {
359  if (strcmp(copymodestr, "ips") == 0) {
360  has_ips = 1;
361  } else {
362  has_ids = 1;
363  }
364  } else {
365  has_ids = 1;
366  }
367  }
368 
369  if (has_ids && has_ips) {
370  SCLogInfo("Netmap mode using IPS and IDS mode");
371  for (ldev = 0; ldev < nlive; ldev++) {
372  const char *live_dev = LiveGetDeviceName(ldev);
373  if (live_dev == NULL) {
374  SCLogError(SC_ERR_INVALID_VALUE, "Problem with config file");
375  return 0;
376  }
377  if_root = ConfNodeLookupKeyValue(netmap_node, "interface", live_dev);
378  const char *copymodestr = NULL;
379 
380  if (if_root == NULL) {
381  if (if_default == NULL) {
382  SCLogError(SC_ERR_INVALID_VALUE, "Problem with config file");
383  return 0;
384  }
385  if_root = if_default;
386  }
387 
388  if (! ((ConfGetChildValueWithDefault(if_root, if_default, "copy-mode", &copymodestr) == 1) &&
389  (strcmp(copymodestr, "ips") == 0))) {
391  "Netmap IPS mode used and interface '%s' is in IDS or TAP mode. "
392  "Sniffing '%s' but expect bad result as stream-inline is activated.",
393  live_dev, live_dev);
394  }
395  }
396  }
397 
398  return has_ips;
399 }
400 
401 #endif // #ifdef HAVE_NETMAP
402 
404 {
405  SCEnter();
406 
407 #ifdef HAVE_NETMAP
408  int ret;
409  const char *live_dev = NULL;
410 
412 
413  TimeModeSetLive();
414 
415  (void)ConfGet("netmap.live-interface", &live_dev);
416 
417  SCLogDebug("live_dev %s", live_dev);
418 
420  ParseNetmapConfig,
421  NetmapConfigGeThreadsCount,
422  "ReceiveNetmap",
423  "DecodeNetmap", thread_name_autofp,
424  live_dev);
425  if (ret != 0) {
426  FatalError(SC_ERR_FATAL, "Unable to start runmode");
427  }
428 
429  SCLogDebug("RunModeIdsNetmapAutoFp initialised");
430 #endif /* HAVE_NETMAP */
431 
432  SCReturnInt(0);
433 }
434 
435 /**
436 * \brief Single thread version of the netmap processing.
437 */
439 {
440  SCEnter();
441 
442 #ifdef HAVE_NETMAP
443  int ret;
444  const char *live_dev = NULL;
445 
447  TimeModeSetLive();
448 
449  (void)ConfGet("netmap.live-interface", &live_dev);
450 
452  ParseNetmapConfig,
453  NetmapConfigGeThreadsCount,
454  "ReceiveNetmap",
455  "DecodeNetmap", thread_name_single,
456  live_dev);
457  if (ret != 0) {
458  FatalError(SC_ERR_FATAL, "Unable to start runmode");
459  }
460 
461  SCLogDebug("RunModeIdsNetmapSingle initialised");
462 
463 #endif /* HAVE_NETMAP */
464  SCReturnInt(0);
465 }
466 
467 /**
468 * \brief Workers version of the netmap processing.
469 *
470 * Start N threads with each thread doing all the work.
471 *
472 */
474 {
475  SCEnter();
476 
477 #ifdef HAVE_NETMAP
478  int ret;
479  const char *live_dev = NULL;
480 
482  TimeModeSetLive();
483 
484  (void)ConfGet("netmap.live-interface", &live_dev);
485 
487  ParseNetmapConfig,
488  NetmapConfigGeThreadsCount,
489  "ReceiveNetmap",
490  "DecodeNetmap", thread_name_workers,
491  live_dev);
492  if (ret != 0) {
493  FatalError(SC_ERR_FATAL, "Unable to start runmode");
494  }
495 
496  SCLogDebug("RunModeIdsNetmapWorkers initialised");
497 
498 #endif /* HAVE_NETMAP */
499  SCReturnInt(0);
500 }
501 
502 /**
503 * @}
504 */
thread_name_workers
const char * thread_name_workers
Definition: runmodes.c:63
RunModeIdsNetmapSingle
int RunModeIdsNetmapSingle(void)
Single thread version of the netmap processing.
Definition: runmode-netmap.c:438
util-byte.h
tm-threads.h
len
uint8_t len
Definition: app-layer-dnp3.h:2
StringParseUint16
int StringParseUint16(uint16_t *res, int base, uint16_t len, const char *str)
Definition: util-byte.c:336
RunModeSetLiveCaptureWorkers
int RunModeSetLiveCaptureWorkers(ConfigIfaceParserFunc ConfigParser, ConfigIfaceThreadsCountFunc ModThreadsCount, const char *recv_mod_name, const char *decode_mod_name, const char *thread_name, const char *live_dev)
Definition: util-runmodes.c:341
SC_ERR_INVALID_VALUE
@ SC_ERR_INVALID_VALUE
Definition: util-error.h:160
alert-debuglog.h
GetIfaceRSSQueuesNum
int GetIfaceRSSQueuesNum(const char *pcap_dev)
Definition: util-ioctl.c:737
SC_ATOMIC_INIT
#define SC_ATOMIC_INIT(name)
wrapper for initializing an atomic variable.
Definition: util-atomic.h:286
unlikely
#define unlikely(expr)
Definition: util-optimize.h:35
NetmapIfaceSettings_::checksum_mode
ChecksumValidationMode checksum_mode
Definition: source-netmap.h:53
ConfGetChildValueBoolWithDefault
int ConfGetChildValueBoolWithDefault(const ConfNode *base, const ConfNode *dflt, const char *name, int *val)
Definition: conf.c:542
SCLogDebug
#define SCLogDebug(...)
Definition: util-debug.h:298
LiveGetOffload
int LiveGetOffload(void)
Definition: util-device.c:79
ConfGetNode
ConfNode * ConfGetNode(const char *name)
Get a ConfNode by name.
Definition: conf.c:175
SC_ATOMIC_ADD
#define SC_ATOMIC_ADD(name, val)
add a value to our atomic variable
Definition: util-atomic.h:304
RunModeInitialize
void RunModeInitialize(void)
Definition: runmodes.c:904
util-runmodes.h
thread_name_autofp
const char * thread_name_autofp
Definition: runmodes.c:61
NETMAP_COPY_MODE_IPS
@ NETMAP_COPY_MODE_IPS
Definition: source-netmap.h:34
NetmapIfaceConfig_::out
NetmapIfaceSettings out
Definition: source-netmap.h:66
ConfNodeLookupKeyValue
ConfNode * ConfNodeLookupKeyValue(const ConfNode *base, const char *key, const char *value)
Lookup for a key value under a specific node.
Definition: conf.c:859
CHECKSUM_VALIDATION_DISABLE
@ CHECKSUM_VALIDATION_DISABLE
Definition: decode.h:42
NetmapIfaceSettings_::iface
char iface[NETMAP_IFACE_NAME_LENGTH]
Definition: source-netmap.h:42
thread_name_single
const char * thread_name_single
Definition: runmodes.c:62
NetmapIfaceSettings_::ips
bool ips
Definition: source-netmap.h:48
RUNMODE_NETMAP
@ RUNMODE_NETMAP
Definition: runmodes.h:38
ConfValIsTrue
int ConfValIsTrue(const char *val)
Check if a value is true.
Definition: conf.c:565
RunModeIdsNetmapWorkers
int RunModeIdsNetmapWorkers(void)
Workers version of the netmap processing.
Definition: runmode-netmap.c:473
strlcpy
size_t strlcpy(char *dst, const char *src, size_t siz)
Definition: util-strlcpyu.c:43
RunModeSetLiveCaptureAutoFp
int RunModeSetLiveCaptureAutoFp(ConfigIfaceParserFunc ConfigParser, ConfigIfaceThreadsCountFunc ModThreadsCount, const char *recv_mod_name, const char *decode_mod_name, const char *thread_name, const char *live_dev)
Definition: util-runmodes.c:89
NetmapGetRSSCount
int NetmapGetRSSCount(const char *ifname)
CHECKSUM_VALIDATION_ENABLE
@ CHECKSUM_VALIDATION_ENABLE
Definition: decode.h:43
ConfGet
int ConfGet(const char *name, const char **vptr)
Retrieve the value of a configuration node.
Definition: conf.c:330
CHECKSUM_VALIDATION_AUTO
@ CHECKSUM_VALIDATION_AUTO
Definition: decode.h:44
util-device.h
util-debug.h
NetmapIfaceConfig_::DerefFunc
void(* DerefFunc)(void *)
Definition: source-netmap.h:69
NetmapIfaceSettings_::real
bool real
Definition: source-netmap.h:47
util-cpu.h
NetmapIfaceSettings_::sw_ring
bool sw_ring
Definition: source-netmap.h:45
LiveGetDevice
LiveDevice * LiveGetDevice(const char *name)
Get a pointer to the device at idx.
Definition: util-device.c:278
ConfFindDeviceConfig
ConfNode * ConfFindDeviceConfig(ConfNode *node, const char *iface)
Find the configuration node for a specific device.
Definition: util-conf.c:129
SCEnter
#define SCEnter(...)
Definition: util-debug.h:300
detect-engine-mpm.h
util-affinity.h
ConfGetChildValueWithDefault
int ConfGetChildValueWithDefault(const ConfNode *base, const ConfNode *dflt, const char *name, const char **vptr)
Definition: conf.c:415
util-time.h
SC_ERR_INVALID_ARGUMENT
@ SC_ERR_INVALID_ARGUMENT
Definition: util-error.h:43
NetmapIfaceSettings_
Definition: source-netmap.h:40
runmode-netmap.h
NetmapIfaceSettings_::threads
uint16_t threads
Definition: source-netmap.h:51
NETMAP_COPY_MODE_NONE
@ NETMAP_COPY_MODE_NONE
Definition: source-netmap.h:32
SC_ATOMIC_SUB
#define SC_ATOMIC_SUB(name, val)
sub a value from our atomic variable
Definition: util-atomic.h:313
conf.h
source-netmap.h
NetmapIfaceSettings_::promisc
bool promisc
Definition: source-netmap.h:46
GetIfaceOffloading
int GetIfaceOffloading(const char *dev, int csum, int other)
output offloading status of the link
Definition: util-ioctl.c:694
DisableIfaceOffloading
int DisableIfaceOffloading(LiveDevice *dev, int csum, int other)
Definition: util-ioctl.c:707
NetmapIfaceSettings_::threads_auto
bool threads_auto
Definition: source-netmap.h:49
runmodes.h
SCLogInfo
#define SCLogInfo(...)
Macro used to log INFORMATIONAL messages.
Definition: util-debug.h:217
alert-prelude.h
TimeModeSetLive
void TimeModeSetLive(void)
Definition: util-time.c:97
alert-fastlog.h
max_pending_packets
int max_pending_packets
Definition: suricata.c:211
NetmapIfaceSettings_::bpf_filter
const char * bpf_filter
Definition: source-netmap.h:54
NetmapIfaceConfig_
Definition: source-netmap.h:58
suricata-common.h
RunModeRegisterNewRunMode
void RunModeRegisterNewRunMode(enum RunModes runmode, const char *name, const char *description, int(*RunModeFunc)(void))
Registers a new runmode.
Definition: runmodes.c:416
LiveGetDeviceName
const char * LiveGetDeviceName(int number)
Get a pointer to the device name at idx.
Definition: util-device.c:176
SCLogPerf
#define SCLogPerf(...)
Definition: util-debug.h:224
SCLogError
#define SCLogError(err_code,...)
Macro used to log ERROR messages.
Definition: util-debug.h:257
FatalError
#define FatalError(x,...)
Definition: util-debug.h:532
log-httplog.h
SC_ATOMIC_RESET
#define SC_ATOMIC_RESET(name)
wrapper for reinitializing an atomic variable.
Definition: util-atomic.h:295
SCMalloc
#define SCMalloc(sz)
Definition: util-mem.h:47
RunModeNetmapGetDefaultMode
const char * RunModeNetmapGetDefaultMode(void)
Definition: runmode-netmap.c:60
SCLogWarning
#define SCLogWarning(err_code,...)
Macro used to log WARNING messages.
Definition: util-debug.h:244
SCFree
#define SCFree(p)
Definition: util-mem.h:61
RunModeIdsNetmapRegister
void RunModeIdsNetmapRegister(void)
Definition: runmode-netmap.c:65
NetmapIfaceConfig_::iface_name
char iface_name[NETMAP_IFACE_NAME_LENGTH]
Definition: source-netmap.h:60
ConfNode_
Definition: conf.h:32
NetmapIfaceSettings_::copy_mode
int copy_mode
Definition: source-netmap.h:52
SC_ERR_FATAL
@ SC_ERR_FATAL
Definition: util-error.h:203
util-ioctl.h
ConfValIsFalse
int ConfValIsFalse(const char *val)
Check if a value is false.
Definition: conf.c:590
RunModeSetLiveCaptureSingle
int RunModeSetLiveCaptureSingle(ConfigIfaceParserFunc ConfigParser, ConfigIfaceThreadsCountFunc ModThreadsCount, const char *recv_mod_name, const char *decode_mod_name, const char *thread_name, const char *live_dev)
Definition: util-runmodes.c:375
SC_WARN_OPTION_OBSOLETE
@ SC_WARN_OPTION_OBSOLETE
Definition: util-error.h:265
NetmapIfaceConfig_::in
NetmapIfaceSettings in
Definition: source-netmap.h:63
NETMAP_COPY_MODE_TAP
@ NETMAP_COPY_MODE_TAP
Definition: source-netmap.h:33
RunModeIdsNetmapAutoFp
int RunModeIdsNetmapAutoFp(void)
Definition: runmode-netmap.c:403
LiveGetDeviceCount
int LiveGetDeviceCount(void)
Get the number of registered devices.
Definition: util-device.c:156
SCReturnInt
#define SCReturnInt(x)
Definition: util-debug.h:304
NetmapRunModeIsIPS
int NetmapRunModeIsIPS(void)
output.h