Go to the documentation of this file.
34 #ifdef HAVE_SYS_RESOURCE_H
36 #include <sys/resource.h>
141 #ifdef SYSTEMD_NOTIFY
166 #define DEFAULT_MAX_PENDING_PACKETS 1024
191 #ifndef AFLFUZZ_NO_RANDOM
281 #ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
282 static void SignalHandlerSigint(
int sig)
286 static void SignalHandlerSigterm(
int sig)
292 #define UNW_LOCAL_ONLY
293 #include <libunwind.h>
294 static void SignalHandlerUnexpected(
int sig_num, siginfo_t *info,
void *context)
299 signal(SIGABRT, SIG_DFL);
300 signal(SIGSEGV, SIG_DFL);
302 if ((r = unw_init_local(&cursor, (unw_context_t *)(context)) != 0)) {
303 SCLogError(
"unable to obtain stack trace: unw_init_local: %s", unw_strerror(r));
312 if (unw_is_signal_frame(&cursor) == 0) {
315 if (unw_get_proc_name(&cursor,
name,
sizeof(
name), &off) == UNW_ENOMEM) {
324 r = unw_step(&cursor);
334 kill(getpid(), sig_num);
336 #undef UNW_LOCAL_ONLY
346 static void SignalHandlerSigusr2(
int sig)
356 static void SignalHandlerSigHup(
int sig)
408 #ifdef HAVE_AF_PACKET
416 #ifdef BUILD_HYPERSCAN
437 static void OnNotifyRunning(
void)
439 #ifdef SYSTEMD_NOTIFY
465 static int SetBpfString(
int argc,
char *argv[])
467 char *bpf_filter = NULL;
468 uint32_t bpf_len = 0;
473 while(argv[tmpindex] != NULL) {
474 bpf_len+=strlen(argv[tmpindex]) + 1;
486 while(argv[tmpindex] != NULL) {
487 strlcat(bpf_filter, argv[tmpindex],bpf_len);
488 if(argv[tmpindex + 1] != NULL) {
489 strlcat(bpf_filter,
" ", bpf_len);
494 if(strlen(bpf_filter) > 0) {
506 static void SetBpfStringFromFile(
char *filename)
508 char *bpf_filter = NULL;
509 char *bpf_comment_tmp = NULL;
510 char *bpf_comment_start = NULL;
516 fp = fopen(filename,
"r");
518 SCLogError(
"Failed to open file %s", filename);
523 SCLogError(
"Failed to stat file %s", filename);
527 bpf_len = ((size_t)(st.st_size)) + 1;
531 SCLogError(
"Failed to allocate buffer for bpf filter in file %s", filename);
535 nm = fread(bpf_filter, 1, bpf_len - 1, fp);
536 if ((ferror(fp) != 0) || (nm != (bpf_len - 1))) {
537 SCLogError(
"Failed to read complete BPF file %s", filename);
543 bpf_filter[nm] =
'\0';
545 if(strlen(bpf_filter) > 0) {
547 bpf_comment_start = bpf_filter;
548 while((bpf_comment_tmp = strchr(bpf_comment_start,
'#')) != NULL) {
549 while((*bpf_comment_tmp !=
'\0') &&
550 (*bpf_comment_tmp !=
'\r') && (*bpf_comment_tmp !=
'\n'))
552 *bpf_comment_tmp++ =
' ';
554 bpf_comment_start = bpf_comment_tmp;
557 while((bpf_comment_tmp = strchr(bpf_filter,
'\r')) != NULL) {
558 *bpf_comment_tmp =
' ';
560 while((bpf_comment_tmp = strchr(bpf_filter,
'\n')) != NULL) {
561 *bpf_comment_tmp =
' ';
564 while (strlen(bpf_filter) > 0 &&
565 bpf_filter[strlen(bpf_filter)-1] ==
' ')
567 bpf_filter[strlen(bpf_filter)-1] =
'\0';
569 if (strlen(bpf_filter) > 0) {
579 static void PrintUsage(
const char *progname)
586 printf(
"USAGE: %s [OPTIONS] [BPF FILTER]\n\n", progname);
587 printf(
"\t-c <path> : path to configuration file\n");
588 printf(
"\t-T : test configuration file (use with -c)\n");
589 printf(
"\t-i <dev or ip> : run in pcap live mode\n");
590 printf(
"\t-F <bpf filter file> : bpf filter file\n");
591 printf(
"\t-r <path> : run in pcap file/offline mode\n");
593 printf(
"\t-q <qid[:qid]> : run in inline nfqueue mode (use colon to specify a range of queues)\n");
596 printf(
"\t-d <divert port> : run in inline ipfw divert mode\n");
598 printf(
"\t-s <path> : path to signature file loaded in addition to suricata.yaml settings (optional)\n");
599 printf(
"\t-S <path> : path to signature file loaded exclusively (optional)\n");
600 printf(
"\t-l <dir> : default log directory\n");
602 printf(
"\t-D : run as daemon\n");
604 printf(
"\t--service-install : install as service\n");
605 printf(
"\t--service-remove : remove service\n");
606 printf(
"\t--service-change-params : change service startup parameters\n");
608 printf(
"\t-k [all|none] : force checksum check (all) or disabled it (none)\n");
609 printf(
"\t-V : display Suricata version\n");
610 printf(
"\t-v : be more verbose (use multiple times to increase verbosity)\n");
612 printf(
"\t-u : run the unittests and exit\n");
613 printf(
"\t-U, --unittest-filter=REGEX : filter unittests with a regex\n");
614 printf(
"\t--list-unittests : list unit tests\n");
615 printf(
"\t--fatal-unittests : enable fatal failure on unittest error\n");
616 printf(
"\t--unittests-coverage : display unittest coverage report\n");
618 printf(
"\t--list-app-layer-protos : list supported app layer protocols\n");
619 printf(
"\t--list-keywords[=all|csv|<kword>] : list keywords implemented by the engine\n");
620 printf(
"\t--list-runmodes : list supported runmodes\n");
621 printf(
"\t--runmode <runmode_id> : specific runmode modification the engine should run. The argument\n"
622 "\t supplied should be the id for the runmode obtained by running\n"
623 "\t --list-runmodes\n");
624 printf(
"\t--engine-analysis : print reports on analysis of different sections in the engine and exit.\n"
625 "\t Please have a look at the conf parameter engine-analysis on what reports\n"
626 "\t can be printed\n");
627 printf(
"\t--pidfile <file> : write pid to this file\n");
628 printf(
"\t--init-errors-fatal : enable fatal failure on signature init error\n");
629 printf(
"\t--disable-detection : disable detection engine\n");
630 printf(
"\t--dump-config : show the running configuration\n");
631 printf(
"\t--dump-features : display provided features\n");
632 printf(
"\t--build-info : display build information\n");
633 printf(
"\t--pcap[=<dev>] : run in pcap mode, no value select interfaces from suricata.yaml\n");
634 printf(
"\t--pcap-file-continuous : when running in pcap mode with a directory, continue checking directory for pcaps until interrupted\n");
635 printf(
"\t--pcap-file-delete : when running in replay mode (-r with directory or file), will delete pcap files that have been processed when done\n");
636 printf(
"\t--pcap-file-recursive : will descend into subdirectories when running in replay mode (-r)\n");
637 printf(
"\t--pcap-file-buffer-size : set read buffer size (setvbuf)\n");
638 #ifdef HAVE_PCAP_SET_BUFF
639 printf(
"\t--pcap-buffer-size : size of the pcap buffer value from 0 - %i\n",INT_MAX);
642 printf(
"\t--dpdk : run in dpdk mode, uses interfaces from "
645 #ifdef HAVE_AF_PACKET
646 printf(
"\t--af-packet[=<dev>] : run in af-packet mode, no value select interfaces from suricata.yaml\n");
649 printf(
"\t--af-xdp[=<dev>] : run in af-xdp mode, no value select "
650 "interfaces from suricata.yaml\n");
653 printf(
"\t--netmap[=<dev>] : run in netmap mode, no value select interfaces from suricata.yaml\n");
656 printf(
"\t--pfring[=<dev>] : run in pfring mode, use interfaces from suricata.yaml\n");
657 printf(
"\t--pfring-int <dev> : run in pfring mode, use interface <dev>\n");
658 printf(
"\t--pfring-cluster-id <id> : pfring cluster id \n");
659 printf(
"\t--pfring-cluster-type <type> : pfring cluster type for PF_RING 4.1.2 and later cluster_round_robin|cluster_flow\n");
661 printf(
"\t--simulate-ips : force engine into IPS mode. Useful for QA\n");
662 #ifdef HAVE_LIBCAP_NG
663 printf(
"\t--user <user> : run suricata as this user after init\n");
664 printf(
"\t--group <group> : run suricata as this group after init\n");
666 printf(
"\t--erf-in <path> : process an ERF file\n");
668 printf(
"\t--dag <dagX:Y> : process ERF records from DAG interface X, stream Y\n");
670 #ifdef BUILD_UNIX_SOCKET
671 printf(
"\t--unix-socket[=<file>] : use unix socket to control suricata work\n");
674 printf(
"\t--windivert <filter> : run in inline WinDivert mode\n");
675 printf(
"\t--windivert-forward <filter> : run in inline WinDivert mode, as a gateway\n");
678 printf(
"\t--reject-dev <dev> : send reject packets from this interface\n");
680 printf(
"\t--include <path> : additional configuration file\n");
681 printf(
"\t--set name=value : set a configuration value\n");
683 printf(
"\nTo run the engine with default configuration on "
684 "interface eth0 with signature file \"signatures.rules\", run the "
685 "command as:\n\n%s -c suricata.yaml -s signatures.rules -i eth0 \n\n",
689 static void PrintBuildInfo(
void)
693 char features[2048] =
"";
698 strlcat(features,
"DEBUG ",
sizeof(features));
700 #ifdef DEBUG_VALIDATION
701 strlcat(features,
"DEBUG_VALIDATION ",
sizeof(features));
704 strlcat(features,
"UNITTESTS ",
sizeof(features));
707 strlcat(features,
"NFQ ",
sizeof(features));
710 strlcat(features,
"IPFW ",
sizeof(features));
712 #ifdef HAVE_PCAP_SET_BUFF
713 strlcat(features,
"PCAP_SET_BUFF ",
sizeof(features));
716 strlcat(features,
"PF_RING ",
sizeof(features));
719 strlcat(features,
"NAPATECH ",
sizeof(features));
721 #ifdef HAVE_AF_PACKET
722 strlcat(features,
"AF_PACKET ",
sizeof(features));
725 strlcat(features,
"NETMAP ",
sizeof(features));
727 #ifdef HAVE_PACKET_FANOUT
728 strlcat(features,
"HAVE_PACKET_FANOUT ",
sizeof(features));
731 strlcat(features,
"DAG ",
sizeof(features));
733 #ifdef HAVE_LIBCAP_NG
734 strlcat(features,
"LIBCAP_NG ",
sizeof(features));
737 strlcat(features,
"LIBNET1.1 ",
sizeof(features));
739 #ifdef HAVE_HTP_URI_NORMALIZE_HOOK
740 strlcat(features,
"HAVE_HTP_URI_NORMALIZE_HOOK ",
sizeof(features));
742 #ifdef PCRE2_HAVE_JIT
743 strlcat(features,
"PCRE_JIT ",
sizeof(features));
746 strlcat(features,
"HAVE_NSS ",
sizeof(features));
748 strlcat(features,
"HTTP2_DECOMPRESSION ",
sizeof(features));
750 strlcat(features,
"HAVE_LUA ",
sizeof(features));
752 strlcat(features,
"HAVE_JA3 ",
sizeof(features));
755 strlcat(features,
"HAVE_JA4 ",
sizeof(features));
757 strlcat(features,
"HAVE_LIBJANSSON ",
sizeof(features));
759 strlcat(features,
"PROFILING ",
sizeof(features));
761 #ifdef PROFILE_LOCKING
762 strlcat(features,
"PROFILE_LOCKING ",
sizeof(features));
764 #if defined(TLS_C11) || defined(TLS_GNU)
765 strlcat(features,
"TLS ",
sizeof(features));
768 strlcat(features,
"TLS_C11 ",
sizeof(features));
769 #elif defined(TLS_GNU)
770 strlcat(features,
"TLS_GNU ",
sizeof(features));
773 strlcat(features,
"MAGIC ",
sizeof(features));
775 strlcat(features,
"RUST ",
sizeof(features));
776 #if defined(SC_ADDRESS_SANITIZER)
777 strlcat(features,
"ASAN ",
sizeof(features));
779 #if defined(HAVE_POPCNT64)
780 strlcat(features,
"POPCNT64 ",
sizeof(features));
782 if (strlen(features) == 0) {
783 strlcat(features,
"none",
sizeof(features));
786 printf(
"Features: %s\n", features);
789 memset(features, 0x00,
sizeof(features));
790 #if defined(__SSE4_2__)
791 strlcat(features,
"SSE_4_2 ",
sizeof(features));
793 #if defined(__SSE4_1__)
794 strlcat(features,
"SSE_4_1 ",
sizeof(features));
796 #if defined(__SSE3__)
797 strlcat(features,
"SSE_3 ",
sizeof(features));
799 #if defined(__SSE2__)
800 strlcat(features,
"SSE_2 ",
sizeof(features));
802 if (strlen(features) == 0) {
803 strlcat(features,
"none",
sizeof(features));
805 printf(
"SIMD support: %s\n", features);
808 memset(features, 0x00,
sizeof(features));
809 #if defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1)
810 strlcat(features,
"1 ",
sizeof(features));
812 #if defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2)
813 strlcat(features,
"2 ",
sizeof(features));
815 #if defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4)
816 strlcat(features,
"4 ",
sizeof(features));
818 #if defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8)
819 strlcat(features,
"8 ",
sizeof(features));
821 #if defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16)
822 strlcat(features,
"16 ",
sizeof(features));
824 if (strlen(features) == 0) {
825 strlcat(features,
"none",
sizeof(features));
827 strlcat(features,
"byte(s)",
sizeof(features));
829 printf(
"Atomic intrinsics: %s\n", features);
833 #elif __WORDSIZE == 32
836 bits =
"<unknown>-bits";
839 #if __BYTE_ORDER == __BIG_ENDIAN
840 endian =
"Big-endian";
841 #elif __BYTE_ORDER == __LITTLE_ENDIAN
842 endian =
"Little-endian";
844 endian =
"<unknown>-endian";
847 printf(
"%s, %s architecture\n", bits, endian);
849 printf(
"GCC version %s, C version %"PRIiMAX
"\n", __VERSION__, (intmax_t)__STDC_VERSION__);
851 printf(
"C version %"PRIiMAX
"\n", (intmax_t)__STDC_VERSION__);
855 printf(
"compiled with -fstack-protector\n");
858 printf(
"compiled with -fstack-protector-all\n");
867 #if _FORTIFY_SOURCE == 2
868 printf(
"compiled with _FORTIFY_SOURCE=2\n");
869 #elif _FORTIFY_SOURCE == 1
870 printf(
"compiled with _FORTIFY_SOURCE=1\n");
871 #elif _FORTIFY_SOURCE == 0
872 printf(
"compiled with _FORTIFY_SOURCE=0\n");
875 printf(
"L1 cache line size (CLS)=%d\n",
CLS);
878 tls =
"_Thread_local";
879 #elif defined(TLS_GNU)
882 #error "Unsupported thread local"
884 printf(
"thread local storage method: %s\n", tls);
886 printf(
"compiled with %s, linked against %s\n",
887 HTP_VERSION_STRING_FULL, htp_get_version());
889 #include "build-info.h"
982 static TmEcode ParseInterfacesList(
const int runmode,
char *pcap_dev)
988 if (strlen(pcap_dev) == 0) {
991 SCLogError(
"No interface found in config for pcap");
998 if (strlen(pcap_dev)) {
999 if (
ConfSetFinal(
"pfring.live-interface", pcap_dev) != 1) {
1000 SCLogError(
"Failed to set pfring.live-interface");
1007 char iface_selector[] =
"dpdk.interfaces";
1010 SCLogError(
"No interface found in config for %s", iface_selector);
1014 #ifdef HAVE_AF_PACKET
1017 if (strlen(pcap_dev)) {
1018 if (
ConfSetFinal(
"af-packet.live-interface", pcap_dev) != 1) {
1019 SCLogError(
"Failed to set af-packet.live-interface");
1025 SCLogError(
"No interface found in config for af-packet");
1033 if (strlen(pcap_dev)) {
1034 if (
ConfSetFinal(
"af-xdp.live-interface", pcap_dev) != 1) {
1035 SCLogError(
"Failed to set af-xdp.live-interface");
1041 SCLogError(
"No interface found in config for af-xdp");
1049 if (strlen(pcap_dev)) {
1050 if (
ConfSetFinal(
"netmap.live-interface", pcap_dev) != 1) {
1051 SCLogError(
"Failed to set netmap.live-interface");
1057 SCLogError(
"No interface found in config for netmap");
1066 SCLogError(
"No group found in config for nflog");
1075 static void SCInstanceInit(
SCInstance *suri,
const char *progname)
1077 memset(suri, 0x00,
sizeof(*suri));
1104 #if HAVE_DETECT_DISABLED==1
1114 if (strstr(prog_ver,
"RELEASE") != NULL) {
1134 if (strstr(
PROG_VER,
"-dev") == NULL) {
1145 static TmEcode PrintVersion(
void)
1153 const char *mode = suri->
system ?
"SYSTEM" :
"USER";
1154 SCLogNotice(
"This is %s version %s running in %s mode",
1165 static void SCPrintElapsedTime(
struct timeval *start_time)
1167 if (start_time == NULL)
1169 struct timeval end_time;
1170 memset(&end_time, 0,
sizeof(end_time));
1171 gettimeofday(&end_time, NULL);
1172 uint64_t milliseconds = ((end_time.tv_sec - start_time->tv_sec) * 1000) +
1173 (((1000000 + end_time.tv_usec - start_time->tv_usec) / 1000) - 1000);
1174 SCLogInfo(
"time elapsed %.3fs", (
float)milliseconds/(
float)1000);
1177 static int ParseCommandLineAfpacket(
SCInstance *suri,
const char *in_arg)
1179 #ifdef HAVE_AF_PACKET
1191 SCLogInfo(
"Multiple af-packet option without interface on each is useless");
1195 "has been specified");
1201 SCLogError(
"AF_PACKET not enabled. On Linux "
1202 "host, make sure to pass --enable-af-packet to "
1203 "configure when building.");
1208 static int ParseCommandLineAfxdp(
SCInstance *suri,
const char *in_arg)
1222 SCLogInfo(
"Multiple af-xdp options without interface on each is useless");
1226 "has been specified");
1233 "host, make sure correct libraries are installed,"
1234 " see documentation for information.");
1239 static int ParseCommandLineDpdk(
SCInstance *suri,
const char *in_arg)
1245 SCLogInfo(
"Multiple dpdk options have no effect on Suricata");
1248 "has been specified");
1255 "host, make sure to pass --enable-dpdk to "
1256 "configure when building.");
1261 static int ParseCommandLinePcapLive(
SCInstance *suri,
const char *in_arg)
1263 #if defined(OS_WIN32) && !defined(HAVE_LIBWPCAP)
1265 FatalError(
"Live capture not available. To support live capture compile against Npcap.");
1269 if (in_arg != NULL) {
1272 if (strlen(in_arg) > 9 && strncmp(in_arg,
"DeviceNPF", 9) == 0) {
1273 snprintf(suri->
pcap_dev,
sizeof(suri->
pcap_dev),
"\\Device\\NPF%s", in_arg+9);
1279 if (strcmp(suri->
pcap_dev, in_arg) != 0) {
1281 }
else if (strlen(suri->
pcap_dev) > 0 && isdigit((
unsigned char)suri->
pcap_dev[0])) {
1282 SCLogError(
"failed to find a pcap device for IP %s", in_arg);
1296 "has been specified");
1306 static bool IsLogDirectoryWritable(
const char*
str)
1308 if (access(
str, W_OK) == 0)
1320 int dump_config = 0;
1321 int dump_features = 0;
1322 int list_app_layer_protocols = 0;
1323 int list_unittests = 0;
1324 int list_runmodes = 0;
1325 int list_keywords = 0;
1338 struct option long_opts[] = {
1339 {
"dump-config", 0, &dump_config, 1},
1340 {
"dump-features", 0, &dump_features, 1},
1341 {
"pfring", optional_argument, 0, 0},
1342 {
"pfring-int", required_argument, 0, 0},
1343 {
"pfring-cluster-id", required_argument, 0, 0},
1344 {
"pfring-cluster-type", required_argument, 0, 0},
1348 {
"af-packet", optional_argument, 0, 0},
1349 {
"af-xdp", optional_argument, 0, 0},
1350 {
"netmap", optional_argument, 0, 0},
1351 {
"pcap", optional_argument, 0, 0},
1352 {
"pcap-file-continuous", 0, 0, 0},
1353 {
"pcap-file-delete", 0, 0, 0},
1354 {
"pcap-file-recursive", 0, 0, 0},
1355 {
"pcap-file-buffer-size", required_argument, 0, 0},
1356 {
"simulate-ips", 0, 0 , 0},
1358 {
"strict-rule-keywords", optional_argument, 0, 0},
1360 {
"capture-plugin", required_argument, 0, 0},
1361 {
"capture-plugin-args", required_argument, 0, 0},
1363 #ifdef BUILD_UNIX_SOCKET
1364 {
"unix-socket", optional_argument, 0, 0},
1366 {
"pcap-buffer-size", required_argument, 0, 0},
1367 {
"unittest-filter", required_argument, 0,
'U'},
1368 {
"list-app-layer-protos", 0, &list_app_layer_protocols, 1},
1369 {
"list-unittests", 0, &list_unittests, 1},
1370 {
"list-runmodes", 0, &list_runmodes, 1},
1371 {
"list-keywords", optional_argument, &list_keywords, 1},
1372 {
"runmode", required_argument, NULL, 0},
1375 {
"service-install", 0, 0, 0},
1376 {
"service-remove", 0, 0, 0},
1377 {
"service-change-params", 0, 0, 0},
1379 {
"pidfile", required_argument, 0, 0},
1380 {
"init-errors-fatal", 0, 0, 0},
1381 {
"disable-detection", 0, 0, 0},
1382 {
"disable-hashing", 0, 0, 0},
1383 {
"fatal-unittests", 0, 0, 0},
1385 {
"user", required_argument, 0, 0},
1386 {
"group", required_argument, 0, 0},
1387 {
"erf-in", required_argument, 0, 0},
1388 {
"dag", required_argument, 0, 0},
1389 {
"build-info", 0, &build_info, 1},
1390 {
"data-dir", required_argument, 0, 0},
1392 {
"windivert", required_argument, 0, 0},
1393 {
"windivert-forward", required_argument, 0, 0},
1395 #ifdef HAVE_LIBNET11
1396 {
"reject-dev", required_argument, 0, 0},
1398 {
"set", required_argument, 0, 0},
1400 {
"nflog", optional_argument, 0, 0},
1402 {
"simulate-packet-flow-memcap", required_argument, 0, 0},
1403 {
"simulate-applayer-error-at-offset-ts", required_argument, 0, 0},
1404 {
"simulate-applayer-error-at-offset-tc", required_argument, 0, 0},
1405 {
"simulate-packet-loss", required_argument, 0, 0},
1406 {
"simulate-packet-tcp-reassembly-memcap", required_argument, 0, 0},
1407 {
"simulate-packet-tcp-ssn-memcap", required_argument, 0, 0},
1408 {
"simulate-packet-defrag-memcap", required_argument, 0, 0},
1409 {
"simulate-alert-queue-realloc-failure", 0, 0, 0},
1413 {
"include", required_argument, 0, 0},
1420 int option_index = 0;
1422 char short_opts[] =
"c:TDhi:l:q:d:r:us:S:U:VF:vk:";
1424 while ((opt = getopt_long(argc, argv, short_opts, long_opts, &option_index)) != -1) {
1427 if (strcmp((long_opts[option_index]).
name ,
"pfring") == 0 ||
1428 strcmp((long_opts[option_index]).
name ,
"pfring-int") == 0) {
1433 if (optarg != NULL) {
1436 ((strlen(optarg) <
sizeof(suri->
pcap_dev)) ?
1437 (strlen(optarg) + 1) :
sizeof(suri->
pcap_dev)));
1442 "to pass --enable-pfring to configure when building.");
1446 else if(strcmp((long_opts[option_index]).
name ,
"pfring-cluster-id") == 0){
1449 SCLogError(
"failed to set pfring.cluster-id");
1454 "to pass --enable-pfring to configure when building.");
1458 else if(strcmp((long_opts[option_index]).
name ,
"pfring-cluster-type") == 0){
1460 if (
ConfSetFinal(
"pfring.cluster-type", optarg) != 1) {
1461 SCLogError(
"failed to set pfring.cluster-type");
1466 "to pass --enable-pfring to configure when building.");
1470 else if (strcmp((long_opts[option_index]).
name ,
"capture-plugin") == 0){
1474 else if (strcmp((long_opts[option_index]).
name ,
"capture-plugin-args") == 0){
1476 }
else if (strcmp((long_opts[option_index]).
name,
"dpdk") == 0) {
1477 if (ParseCommandLineDpdk(suri, optarg) !=
TM_ECODE_OK) {
1480 }
else if (strcmp((long_opts[option_index]).
name,
"af-packet") == 0) {
1481 if (ParseCommandLineAfpacket(suri, optarg) !=
TM_ECODE_OK) {
1484 }
else if (strcmp((long_opts[option_index]).
name,
"af-xdp") == 0) {
1485 if (ParseCommandLineAfxdp(suri, optarg) !=
TM_ECODE_OK) {
1488 }
else if (strcmp((long_opts[option_index]).
name,
"netmap") == 0) {
1496 ((strlen(optarg) <
sizeof(suri->
pcap_dev)) ?
1497 (strlen(optarg) + 1) :
sizeof(suri->
pcap_dev)));
1503 SCLogInfo(
"Multiple netmap option without interface on each is useless");
1508 "has been specified");
1509 PrintUsage(argv[0]);
1516 }
else if (strcmp((long_opts[option_index]).
name,
"nflog") == 0) {
1526 }
else if (strcmp((long_opts[option_index]).
name,
"pcap") == 0) {
1527 if (ParseCommandLinePcapLive(suri, optarg) !=
TM_ECODE_OK) {
1530 }
else if (strcmp((long_opts[option_index]).
name,
"simulate-ips") == 0) {
1533 }
else if (strcmp((long_opts[option_index]).
name,
"init-errors-fatal") == 0) {
1534 if (
ConfSetFinal(
"engine.init-failure-fatal",
"1") != 1) {
1535 SCLogError(
"failed to set engine init-failure-fatal");
1538 #ifdef BUILD_UNIX_SOCKET
1539 }
else if (strcmp((long_opts[option_index]).
name ,
"unix-socket") == 0) {
1543 if (
ConfSetFinal(
"unix-command.filename", optarg) != 1) {
1544 SCLogError(
"failed to set unix-command.filename");
1551 "has been specified");
1552 PrintUsage(argv[0]);
1557 else if(strcmp((long_opts[option_index]).
name,
"list-app-layer-protocols") == 0) {
1560 else if(strcmp((long_opts[option_index]).
name,
"list-unittests") == 0) {
1564 SCLogError(
"unit tests not enabled. Make sure to pass --enable-unittests to "
1565 "configure when building");
1568 }
else if (strcmp((long_opts[option_index]).
name,
"list-runmodes") == 0) {
1571 }
else if (strcmp((long_opts[option_index]).
name,
"list-keywords") == 0) {
1573 if (strcmp(
"short", optarg) != 0) {
1577 }
else if (strcmp((long_opts[option_index]).
name,
"runmode") == 0) {
1579 }
else if(strcmp((long_opts[option_index]).
name,
"engine-analysis") == 0) {
1583 else if(strcmp((long_opts[option_index]).
name,
"service-install") == 0) {
1584 suri->
run_mode = RUNMODE_INSTALL_SERVICE;
1587 else if(strcmp((long_opts[option_index]).
name,
"service-remove") == 0) {
1588 suri->
run_mode = RUNMODE_REMOVE_SERVICE;
1591 else if(strcmp((long_opts[option_index]).
name,
"service-change-params") == 0) {
1592 suri->
run_mode = RUNMODE_CHANGE_SERVICE_PARAMS;
1596 else if(strcmp((long_opts[option_index]).
name,
"pidfile") == 0) {
1599 SCLogError(
"strdup failed: %s", strerror(errno));
1603 else if(strcmp((long_opts[option_index]).
name,
"disable-detection") == 0) {
1605 }
else if (strcmp((long_opts[option_index]).
name,
"disable-hashing") == 0) {
1609 }
else if (strcmp((long_opts[option_index]).
name,
"fatal-unittests") == 0) {
1613 SCLogError(
"unit tests not enabled. Make sure to pass --enable-unittests to "
1614 "configure when building");
1617 }
else if (strcmp((long_opts[option_index]).
name,
"user") == 0) {
1618 #ifndef HAVE_LIBCAP_NG
1620 " drop privileges, but it was not compiled into Suricata.");
1626 }
else if (strcmp((long_opts[option_index]).
name,
"group") == 0) {
1627 #ifndef HAVE_LIBCAP_NG
1629 " drop privileges, but it was not compiled into Suricata.");
1635 }
else if (strcmp((long_opts[option_index]).
name,
"erf-in") == 0) {
1641 }
else if (strcmp((long_opts[option_index]).
name,
"dag") == 0) {
1647 SCLogError(
"more than one run mode has been specified");
1648 PrintUsage(argv[0]);
1653 SCLogError(
"libdag and a DAG card are required"
1654 " to receive packets using --dag.");
1657 }
else if (strcmp((long_opts[option_index]).
name,
"napatech") == 0) {
1658 #ifdef HAVE_NAPATECH
1661 SCLogError(
"libntapi and a Napatech adapter are required"
1662 " to capture packets using --napatech.");
1665 }
else if (strcmp((long_opts[option_index]).
name,
"pcap-buffer-size") == 0) {
1666 #ifdef HAVE_PCAP_SET_BUFF
1668 SCLogError(
"failed to set pcap-buffer-size");
1673 " doesn't support setting buffer size.");
1675 }
else if (strcmp((long_opts[option_index]).
name,
"build-info") == 0) {
1678 }
else if (strcmp((long_opts[option_index]).
name,
"windivert-forward") == 0) {
1682 if (WinDivertRegisterQueue(
true, optarg) == -1) {
1686 if (WinDivertRegisterQueue(
true, optarg) == -1) {
1691 "has been specified");
1692 PrintUsage(argv[0]);
1696 else if(strcmp((long_opts[option_index]).
name,
"windivert") == 0) {
1699 if (WinDivertRegisterQueue(
false, optarg) == -1) {
1703 if (WinDivertRegisterQueue(
false, optarg) == -1) {
1708 "has been specified");
1709 PrintUsage(argv[0]);
1713 SCLogError(
"WinDivert not enabled. Make sure to pass --enable-windivert to "
1714 "configure when building.");
1717 }
else if(strcmp((long_opts[option_index]).
name,
"reject-dev") == 0) {
1718 #ifdef HAVE_LIBNET11
1720 extern char *g_reject_dev;
1721 extern uint16_t g_reject_dev_mtu;
1722 g_reject_dev = optarg;
1725 g_reject_dev_mtu = (uint16_t)mtu;
1728 SCLogError(
"Libnet 1.1 support not enabled. Compile Suricata with libnet support.");
1732 else if (strcmp((long_opts[option_index]).
name,
"set") == 0) {
1733 if (optarg != NULL) {
1735 char *val = strchr(optarg,
'=');
1737 FatalError(
"Invalid argument for --set, must be key=val.");
1740 FatalError(
"failed to set configuration value %s", optarg);
1744 else if (strcmp((long_opts[option_index]).
name,
"pcap-file-continuous") == 0) {
1745 if (
ConfSetFinal(
"pcap-file.continuous",
"true") != 1) {
1746 SCLogError(
"Failed to set pcap-file.continuous");
1750 else if (strcmp((long_opts[option_index]).
name,
"pcap-file-delete") == 0) {
1751 if (
ConfSetFinal(
"pcap-file.delete-when-done",
"true") != 1) {
1752 SCLogError(
"Failed to set pcap-file.delete-when-done");
1756 else if (strcmp((long_opts[option_index]).
name,
"pcap-file-recursive") == 0) {
1757 if (
ConfSetFinal(
"pcap-file.recursive",
"true") != 1) {
1758 SCLogError(
"failed to set pcap-file.recursive");
1761 }
else if (strcmp((long_opts[option_index]).
name,
"pcap-file-buffer-size") == 0) {
1762 if (
ConfSetFinal(
"pcap-file.buffer-size", optarg) != 1) {
1763 SCLogError(
"failed to set pcap-file.buffer-size");
1766 }
else if (strcmp((long_opts[option_index]).
name,
"data-dir") == 0) {
1767 if (optarg == NULL) {
1768 SCLogError(
"no option argument (optarg) for -d");
1778 " supplied at the command-line (-d %s) doesn't "
1779 "exist. Shutting down the engine.",
1784 }
else if (strcmp((long_opts[option_index]).
name,
"strict-rule-keywords") == 0) {
1785 if (optarg == NULL) {
1791 FatalError(
"failed to duplicate 'strict' string");
1793 }
else if (strcmp((long_opts[option_index]).
name,
"include") == 0) {
1798 "Failed to allocate memory for additional configuration files: %s",
1803 for (
int i = 0;; i++) {
1805 const char **additional_configs =
1807 if (additional_configs == NULL) {
1808 FatalError(
"Failed to allocate memory for additional configuration "
1822 (long_opts[option_index]).
name, optarg);
1832 if (
ConfSetFinal(
"engine.init-failure-fatal",
"1") != 1) {
1833 SCLogError(
"failed to set engine init-failure-fatal");
1846 if (optarg == NULL) {
1847 SCLogError(
"no option argument (optarg) for -i");
1850 #ifdef HAVE_AF_PACKET
1851 if (ParseCommandLineAfpacket(suri, optarg) !=
TM_ECODE_OK) {
1856 #if defined HAVE_NETMAP
1862 "option%s %s available:"
1864 " NETMAP (--netmap=%s)"
1866 ". Use --pcap=%s to suppress this warning",
1867 i == 1 ?
"" :
"s", i == 1 ?
"is" :
"are"
1875 if (ParseCommandLinePcapLive(suri, optarg) !=
TM_ECODE_OK) {
1881 if (optarg == NULL) {
1882 SCLogError(
"no option argument (optarg) for -l");
1892 " supplied at the command-line (-l %s) doesn't "
1893 "exist. Shutting down the engine.",
1897 if (!IsLogDirectoryWritable(optarg)) {
1899 " supplied at the command-line (-l %s) is not "
1900 "writable. Shutting down the engine.",
1919 "has been specified");
1920 PrintUsage(argv[0]);
1924 SCLogError(
"NFQUEUE not enabled. Make sure to pass --enable-nfqueue to configure when "
1941 "has been specified");
1942 PrintUsage(argv[0]);
1946 SCLogError(
"IPFW not enabled. Make sure to pass --enable-ipfw to configure when "
1957 "has been specified");
1958 PrintUsage(argv[0]);
1963 SCLogError(
"pcap file '%s': %s", optarg, strerror(errno));
1967 SCLogError(
"ERROR: Failed to set pcap-file.file\n");
1974 SCLogError(
"can't have multiple -s options or mix -s and -S.");
1981 SCLogError(
"can't have multiple -S options or mix -s and -S.");
1994 PrintUsage(argv[0]);
1998 SCLogError(
"unit tests not enabled. Make sure to pass --enable-unittests to configure "
2015 if (optarg == NULL) {
2016 SCLogError(
"no option argument (optarg) for -F");
2020 SetBpfStringFromFile(optarg);
2026 if (optarg == NULL) {
2027 SCLogError(
"no option argument (optarg) for -k");
2030 if (!strcmp(
"all", optarg))
2032 else if (!strcmp(
"none", optarg))
2035 SCLogError(
"option '%s' invalid for -k", optarg);
2040 PrintUsage(argv[0]);
2046 SCLogError(
"can't use -s/-S when detection is disabled");
2053 if (list_app_layer_protocols)
2071 ret = SetBpfString(optind, argv);
2079 int WindowsInitService(
int argc,
char **argv)
2081 if (SCRunningAsService()) {
2082 char path[MAX_PATH];
2084 strlcpy(path, argv[0], MAX_PATH);
2085 if ((p = strrchr(path,
'\\'))) {
2088 if (!SetCurrentDirectory(path)) {
2089 SCLogError(
"Can't set current directory to: %s", path);
2092 SCLogInfo(
"Current directory is set to: %s", path);
2093 SCServiceInit(argc, argv);
2098 if (0 != WSAStartup(MAKEWORD(2, 2), &wsaData)) {
2099 SCLogError(
"Can't initialize Windows sockets: %d", WSAGetLastError());
2110 const char *pid_filename;
2112 if (
ConfGet(
"pid-file", &pid_filename) == 1) {
2113 SCLogInfo(
"Use pid file %s from config file.", pid_filename);
2120 SCLogError(
"strdup failed: %s", strerror(errno));
2139 SCLogError(
"Unable to create PID file, concurrent run of"
2140 " Suricata can occur.");
2141 SCLogError(
"PID file creation WILL be mandatory for daemon mode"
2142 " in future version");
2157 if (
ConfGet(
"run-as.user", &
id) == 1) {
2161 if (
ConfGet(
"run-as.group", &
id) == 1) {
2179 static int InitSignalHandler(
SCInstance *suri)
2182 #ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
2187 if (
ConfGetBool(
"logging.stacktrace-on-signal", &enabled) == 0) {
2192 SCLogInfo(
"Preparing unexpected signal handling");
2193 struct sigaction stacktrace_action;
2194 memset(&stacktrace_action, 0,
sizeof(stacktrace_action));
2195 stacktrace_action.sa_sigaction = SignalHandlerUnexpected;
2196 stacktrace_action.sa_flags = SA_SIGINFO;
2197 sigaction(SIGSEGV, &stacktrace_action, NULL);
2198 sigaction(SIGABRT, &stacktrace_action, NULL);
2221 #ifdef PROFILE_RULES
2222 SCProfilingRulesGlobalInit();
2229 #ifdef PROFILE_RULES
2276 SCPrintElapsedTime(start_time);
2329 PrintUsage(argv[0]);
2339 case RUNMODE_INSTALL_SERVICE:
2340 if (SCServiceInstall(argc, argv)) {
2343 SCLogInfo(
"Suricata service has been successfully installed.");
2345 case RUNMODE_REMOVE_SERVICE:
2346 if (SCServiceRemove()) {
2349 SCLogInfo(
"Suricata service has been successfully removed.");
2351 case RUNMODE_CHANGE_SERVICE_PARAMS:
2352 if (SCServiceChangeParams(argc, argv)) {
2355 SCLogInfo(
"Suricata service startup parameters has been successfully changed.");
2383 static void SetupDelayedDetect(
SCInstance *suri)
2392 if (decnf != NULL) {
2394 if (strcmp(denode->
val,
"delayed-detect") == 0) {
2404 SCLogInfo(
"Packets will start being processed before signatures are active.");
2420 static int ConfigGetCaptureValue(
SCInstance *suri)
2424 intmax_t tmp_max_pending_packets;
2425 if (
ConfGetInt(
"max-pending-packets", &tmp_max_pending_packets) != 1)
2427 if (tmp_max_pending_packets < 1 || tmp_max_pending_packets > 2147483648) {
2428 SCLogError(
"Maximum max-pending-packets setting is 2147483648 and must be greater than 0. "
2429 "Please check %s for errors",
2440 const char *temp_default_packet_size;
2441 if ((
ConfGet(
"default-packet-size", &temp_default_packet_size)) != 1) {
2444 int strip_trailing_plus = 0;
2449 const int mtu = GetGlobalMTUWin32();
2463 strip_trailing_plus = 1;
2470 for (lthread = 0; lthread < nlive; lthread++) {
2473 (void)
strlcpy(dev, live_dev,
sizeof(dev));
2475 if (strip_trailing_plus) {
2476 size_t len = strlen(dev);
2478 (dev[
len-1] ==
'+' ||
2479 dev[
len-1] ==
'^' ||
2498 SCLogError(
"Error parsing max-pending-packets "
2499 "from conf file - %s. Killing engine",
2500 temp_default_packet_size);
2510 static void PostRunStartedDetectSetup(
const SCInstance *suri)
2524 SCLogNotice(
"Signature(s) loaded, Detect thread(s) activated.");
2536 SetupDelayedDetect(suri);
2538 (void)
ConfGetBool(
"multi-detect.enabled", &mt_enabled);
2539 int default_tenant = 0;
2541 (void)
ConfGetBool(
"multi-detect.default", &default_tenant);
2544 "detection engine contexts failed.");
2554 FatalError(
"initializing detection engine failed.");
2568 static void PostConfLoadedSetupHostMode(
void)
2570 const char *hostmode = NULL;
2572 if (
ConfGet(
"host-mode", &hostmode) == 1) {
2573 if (!strcmp(hostmode,
"router")) {
2575 }
else if (!strcmp(hostmode,
"sniffer-only")) {
2578 if (strcmp(hostmode,
"auto") != 0) {
2590 SCLogInfo(
"No 'host-mode': suricata is in IPS mode, using "
2591 "default setting 'router'");
2594 SCLogInfo(
"No 'host-mode': suricata is in IDS mode, using "
2595 "default setting 'sniffer-only'");
2607 FatalError(
"could not set USER mode logdir");
2613 FatalError(
"could not set USER mode datadir");
2629 int disable_offloading;
2630 if (
ConfGetBool(
"capture.disable-offloading", &disable_offloading) == 0)
2631 disable_offloading = 1;
2632 if (disable_offloading) {
2639 const char *cv = NULL;
2640 if (
ConfGet(
"capture.checksum-validation", &cv) == 1) {
2641 if (strcmp(cv,
"none") == 0) {
2643 }
else if (strcmp(cv,
"all") == 0) {
2650 ConfSet(
"stream.checksum-validation",
"0");
2653 ConfSet(
"stream.checksum-validation",
"1");
2662 #ifdef HAVE_PACKET_EBPF
2664 EBPFRegisterExtension();
2686 SCLogInfo(
"Setting engine mode to IDS mode by default");
2707 const char *custom_umask;
2708 if (
ConfGet(
"umask", &custom_umask) == 1) {
2710 if (
StringParseUint16(&mask, 8, (uint16_t)strlen(custom_umask), custom_umask) > 0) {
2711 umask((mode_t)mask);
2729 SCLogInfo(
"== Carrying out Engine Analysis ==");
2730 const char *temp = NULL;
2731 if (
ConfGet(
"engine-analysis", &temp) == 0) {
2732 SCLogInfo(
"no engine-analysis parameter(s) defined in conf file. "
2733 "Please define/enable them in the conf to use this "
2752 "basic address vars test failed. Please check %s for errors", suri->
conf_filename);
2779 "supplied by %s (default-log-dir) doesn't exist. "
2780 "Shutting down the engine",
2784 if (!IsLogDirectoryWritable(suri->
log_dir)) {
2786 "supplied by %s (default-log-dir) is not writable. "
2787 "Shutting down the engine",
2805 PostConfLoadedSetupHostMode();
2874 return EXIT_FAILURE;
2894 SCInstanceInit(&
suricata, progname);
2912 if (
ConfGetBool(
"vlan.use-for-tracking", &tracking) == 1 && !tracking) {
2916 SCLogDebug(
"vlan tracking is %s", tracking == 1 ?
"enabled" :
"disabled");
2917 if (
ConfGetBool(
"livedev.use-for-tracking", &tracking) == 1 && !tracking) {
2921 if (
ConfGetBool(
"decoder.recursion-level.use-for-tracking", &tracking) == 1 && !tracking) {
2937 SCLogInfo(
"Running suricata under test mode");
2964 SCLogNotice(
"Configuration provided was successfully loaded. Exiting.");
3007 int limit_nproc = 0;
3008 if (
ConfGetBool(
"security.limit-noproc", &limit_nproc) == 0) {
3012 #if defined(SC_ADDRESS_SANITIZER)
3015 "\"security.limit-noproc\" (setrlimit()) not set when using address sanitizer");
3021 #if defined(HAVE_SYS_RESOURCE_H)
3024 SCLogWarning(
"setrlimit has no effet when running as root.");
3027 struct rlimit r = { 0, 0 };
3028 if (setrlimit(RLIMIT_NPROC, &r) != 0) {
3029 SCLogWarning(
"setrlimit failed to prevent process creation.");
3051 PostRunStartedDetectSetup(&
suricata);
int ConfGetInt(const char *name, intmax_t *val)
Retrieve a configuration value as an integer.
void TmModuleUnixManagerRegister(void)
void StatsReleaseResources(void)
Releases the resources allotted by the Stats API.
void TmModuleReceiveIPFWRegister(void)
Registration Function for RecieveIPFW.
void SuricataMainLoop(void)
int ExceptionSimulationCommandLineParser(const char *name, const char *arg)
void AppLayerHtpNeedFileInspection(void)
Sets a flag that informs the HTP app layer that some module in the engine needs the http request file...
int SCRunmodeGet(void)
Get the current run mode.
int ConfNodeChildValueIsTrue(const ConfNode *node, const char *key)
Test if a configuration node has a true value.
void IPPairInitConfig(bool quiet)
initialize the configuration
void SCLogInitLogModule(SCLogInitData *sc_lid)
Initializes the logging module.
int LiveDeviceListClean(void)
void DetectEngineDeReference(DetectEngineCtx **de_ctx)
struct timeval start_time
#define SC_ATOMIC_INIT(name)
wrapper for initializing an atomic variable.
SystemHugepageSnapshot * prerun_snap
void TmThreadContinueThreads(void)
Unpauses all threads present in tv_root.
int ConfGetBool(const char *name, int *val)
Retrieve a configuration value as a boolean.
enum DetectEngineType type
int SigLoadSignatures(DetectEngineCtx *de_ctx, char *sig_file, bool sig_file_exclusive)
Load signatures.
#define SC_ATOMIC_SET(name, val)
Set the value for the atomic variable.
@ RUNMODE_PRINT_BUILDINFO
DetectEngineCtx * DetectEngineCtxInitStubForDD(void)
void LiveDevRegisterExtension(void)
void OutputTxShutdown(void)
void AppLayerHtpPrintStats(void)
void StatsSetupPostConfigPreOutput(void)
char * runmode_custom_mode
struct HtpBodyChunk_ * next
void TmModuleReceiveNFQRegister(void)
int LiveBuildDeviceList(const char *runmode)
void RunModeShutDown(void)
void SCProtoNameInit(void)
void SuricataPostInit(void)
void RunModeDispatch(int runmode, const char *custom_mode, const char *capture_plugin_name, const char *capture_plugin_args)
ConfNode * ConfGetNode(const char *name)
Get a ConfNode by name.
volatile sig_atomic_t sigint_count
SC_ATOMIC_DECLARE(unsigned int, engine_stage)
void TmModuleRunDeInit(void)
void TmThreadsUnsealThreads(void)
void RegisterFlowBypassInfo(void)
#define SCSetThreadName(n)
void SCRunmodeSet(int run_mode)
Set the current run mode.
void SCLogDeInitLogModule(void)
De-Initializes the logging module.
void TmModuleDecodeErfFileRegister(void)
Register the ERF file decoder module.
main detection engine ctx
int StringParseUint16(uint16_t *res, int base, size_t len, const char *str)
void DetectEngineReloadSetIdle(void)
DetectEngineCtx * DetectEngineGetCurrent(void)
int EngineModeIsUnknown(void)
void VarNameStoreInit(void)
void TmModuleFlowRecyclerRegister(void)
void Daemonize(void)
Daemonize the process.
void UtilSignalHandlerSetup(int sig, void(*handler)(int))
#define TAILQ_FOREACH(var, head, field)
void TmModuleDecodeAFPRegister(void)
Registration Function for DecodeAFP.
void TmModuleDecodeWinDivertRegister(void)
int DetectEngineAddToMaster(DetectEngineCtx *de_ctx)
void TmModuleStatsLoggerRegister(void)
int ConfYamlHandleInclude(ConfNode *parent, const char *filename)
Include a file in the configuration.
void RegisterAllModules(void)
int DetectEngineMultiTenantSetup(const bool unix_socket)
setup multi-detect / multi-tenancy
void SupportFastPatternForSigMatchTypes(void)
Registers the keywords(SMs) that should be given fp support.
void ConfDump(void)
Dump configuration to stdout.
const SuricataContext suricata_context
TmEcode SCParseCommandLine(int argc, char **argv)
int CheckValidDaemonModes(int daemon, int mode)
Check for a valid combination daemon/mode.
void SCGetGroupID(const char *group_name, uint32_t *gid)
Function to get the group ID from the specified group name.
int ConfSetFinal(const char *name, const char *val)
Set a final configuration value.
void TmThreadDisableReceiveThreads(void)
Disable all threads having the specified TMs.
void StatsInit(void)
Initializes the perf counter api. Things are hard coded currently. More work to be done when we imple...
void PreRunInit(const int runmode)
void MacSetRegisterFlowStorage(void)
void SuricataShutdown(void)
const char * conf_filename
int GetIfaceMTU(const char *dev)
output the link MTU
void GlobalsInitPreConfig(void)
void TmModuleReceiveNetmapRegister(void)
void PacketPoolPostRunmodes(void)
Set the max_pending_return_packets value.
void NFQInitConfig(bool quiet)
To initialize the NFQ global configuration data.
void TmModuleReceiveWinDivertRegister(void)
void SCProfilingDestroy(void)
Free resources used by profiling.
bool IsRunModeOffline(enum RunModes run_mode_to_check)
void AFPPeersListClean(void)
Clean the global peers list.
void RunModeInitializeOutputs(void)
int DetectPortTestConfVars(void)
void SCThresholdConfGlobalInit(void)
void DecodeUnregisterCounters(void)
const char * capture_plugin_name
void HostBitInitCtx(void)
const char * capture_plugin_args
void TmModuleLoggerRegister(void)
void TmThreadDisablePacketThreads(void)
Disable all packet threads.
void PacketPoolInit(void)
int AppLayerDeSetup(void)
De initializes the app layer.
size_t strlcpy(char *dst, const char *src, size_t siz)
void PcapTranslateIPToDevice(char *pcap_dev, size_t len)
void FlowDisableFlowRecyclerThread(void)
Used to disable flow recycler thread(s).
void TmModuleDecodePcapFileRegister(void)
void TmModuleBypassedFlowManagerRegister(void)
void IPPairShutdown(void)
shutdown the flow engine
void DetectParseFreeRegexes(void)
void TmModuleDecodeNFLOGRegister(void)
int ConfGet(const char *name, const char **vptr)
Retrieve the value of a configuration node.
int NFQParseAndRegisterQueues(const char *queues)
Parses and adds Netfilter queue(s).
ConfNode * ConfGetRootNode(void)
Get the root configuration node.
void FlowInitConfig(bool quiet)
initialize the configuration
int AppLayerSetup(void)
Setup the app layer.
void FeatureTrackingRegister(void)
void TmModuleReceiveDPDKRegister(void)
void UnixManagerThreadSpawnNonRunmode(const bool unix_socket_enabled)
void RunModeInitializeThreadSettings(void)
void StreamTcpInitConfig(bool)
To initialize the stream global configuration data.
bool IsRunModeSystem(enum RunModes run_mode_to_check)
int GetIfaceMaxPacketSize(LiveDevice *ld)
output max packet size for a link
void TmModuleDecodeNetmapRegister(void)
Registration Function for DecodeNetmap.
void PreRunPostPrivsDropInit(const int runmode)
void SigTableCleanup(void)
int DetectEngineMoveToFreeList(DetectEngineCtx *de_ctx)
volatile sig_atomic_t sigterm_count
TmEcode TmThreadWaitOnThreadInit(void)
Used to check if all threads have finished their initialization. On finding an un-initialized thread,...
void TmModuleVerdictNFQRegister(void)
int ConfYamlLoadFile(const char *filename)
Load configuration from a YAML file.
void AppLayerRegisterGlobalCounters(void)
HACK to work around our broken unix manager (re)init loop.
void RunModeListRunmodes(void)
Lists all registered runmodes.
size_t strlcat(char *, const char *src, size_t siz)
@ RUNMODE_LIST_APP_LAYERS
void LiveSetOffloadDisable(void)
void StatsSetupPostConfigPostOutput(void)
void EngineModeSetIDS(void)
void TmModuleReceiveAFPRegister(void)
Registration Function for RecieveAFP.
int LiveBuildDeviceListCustom(const char *runmode, const char *itemname)
LiveDevice * LiveGetDevice(const char *name)
Get a pointer to the device at idx.
void UnixSocketKillSocketThread(void)
void TmModuleVerdictIPFWRegister(void)
Registration Function for VerdictIPFW.
bool g_stats_eps_per_app_proto_errors
void HttpRangeContainersInit(void)
struct timeval last_reload
void TmModuleVerdictWinDivertRegister(void)
void HostCleanup(void)
Cleanup the host engine.
void FlowDisableFlowManagerThread(void)
Used to disable flow manager thread(s).
int UtilSignalUnblock(int signum)
int DetectEngineEnabled(void)
Check if detection is enabled.
void TmThreadClearThreadsFamily(int family)
void TmModuleRunInit(void)
void EngineModeSetIPS(void)
void HTPAtExitPrintStats(void)
Print the stats of the HTTP requests.
int UtilSignalBlock(int signum)
void SCProfilingPrefilterGlobalInit(void)
void ThresholdDestroy(void)
#define SCLogWarning(...)
Macro used to log WARNING messages.
int PostConfLoadedSetup(SCInstance *suri)
const char * GetProgramVersion(void)
get string with program version
void TmModuleReceivePcapFileRegister(void)
int32_t CoredumpLoadConfig(void)
Configures the core dump size.
int IPFWRegisterQueue(char *queue)
Add an IPFW divert.
int ListAppLayerProtocols(const char *conf_filename)
void DatasetsDestroy(void)
void UtilCpuPrintSummary(void)
Print a summary of CPUs detected (configured and online)
int profiling_packets_enabled
int SystemDNotifyReady(void)
void TmThreadKillThreads(void)
void OutputDeregisterAll(void)
Deregister all modules. Useful for a memory clean exit.
void PostConfLoadedDetectSetup(SCInstance *suri)
int EngineModeIsIDS(void)
TmModule tmm_modules[TMM_SIZE]
void OutputNotifyFileRotation(void)
Notifies all registered file rotation notification flags.
int StorageFinalize(void)
void VarNameStoreDestroy(void)
void TmModuleFlowWorkerRegister(void)
enum RunModes aux_run_mode
uint32_t max_pending_packets
const char ** additional_configs
#define DEFAULT_PID_FILENAME
volatile sig_atomic_t sighup_count
TmEcode ConfigSetDataDirectory(char *name)
void TmModuleDecodeErfDagRegister(void)
Register the ERF file decoder module.
#define SCDropMainThreadCaps(...)
void TmModuleDebugList(void)
void TmModuleDecodeNFQRegister(void)
void SCProtoNameRelease(void)
int RunmodeIsUnittests(void)
void SCPluginsLoad(const char *capture_plugin_name, const char *capture_plugin_args)
#define SCLogInfo(...)
Macro used to log INFORMATIONAL messages.
void TmModuleReceiveNFLOGRegister(void)
#define DEFAULT_PACKET_SIZE
#define WarnInvalidConfEntry(param_name, format, value)
Generic API that can be used by all to log an invalid conf entry.
void TmModuleReceiveErfFileRegister(void)
Register the ERF file receiver (reader) module.
#define SCRealloc(ptr, sz)
void TmModuleDecodeAFXDPRegister(void)
Registration Function for DecodeAFXDP.
uint32_t default_packet_size
void SigTableApplyStrictCommandLineOption(const char *str)
@ DETECT_ENGINE_TYPE_NORMAL
void TmThreadKillThreadsFamily(int family)
void FeatureTrackingRelease(void)
void TmqhCleanup(void)
Clean up registration time allocs.
void StreamTcpFreeConfig(bool quiet)
void DecodeGlobalConfig(void)
char * strict_rule_parsing_string
DetectEngineCtx * DetectEngineCtxInitStubForMT(void)
const char * LiveGetDeviceName(int number)
Get a pointer to the device name at idx.
void FlowShutdown(void)
shutdown the flow engine
void SCHInfoLoadFromConfig(void)
Load the host os policy information from the configuration.
void DetectEngineBumpVersion(void)
void TmModuleFlowManagerRegister(void)
int SCStartInternalRunMode(int argc, char **argv)
int SCPidfileTestRunning(const char *pid_filename)
Check the Suricata pid file (used at the startup)
void HostShutdown(void)
shutdown the flow engine
#define SCFstatFn(fd, statbuf)
void LiveSetOffloadWarn(void)
void ParseSizeDeinit(void)
void RunModeRegisterRunModes(void)
Register all runmodes in the engine.
int ConfGetChildValueBool(const ConfNode *base, const char *name, int *val)
void SCProfilingDump(void)
void TmModuleReceiveAFXDPRegister(void)
void EngineStop(void)
make sure threads can stop the engine by calling this function. Purpose: pcap file mode needs to be a...
int ParseSizeStringU32(const char *size, uint32_t *res)
void TmModuleReceiveErfDagRegister(void)
Register the ERF file receiver (reader) module.
void IPPairBitInitCtx(void)
TmEcode ConfigSetLogDirectory(const char *name)
void TmModuleDecodeIPFWRegister(void)
Registration Function for DecodeIPFW.
int ConfUnixSocketIsEnable(void)
int ConfSetFromString(const char *input, int final)
Set a configuration parameter from a string.
struct SCLogConfig_ SCLogConfig
Holds the config state used by the logging api.
void ConfInit(void)
Initialize the configuration system.
const char * ConfigGetLogDirectory(void)
volatile sig_atomic_t sigusr2_count
void SystemHugepageSnapshotDestroy(SystemHugepageSnapshot *s)
@ RUNMODE_ENGINE_ANALYSIS
void TmModuleDecodePcapRegister(void)
Registration Function for DecodePcap.
TmEcode SCLoadYamlConfig(void)
TmEcode ConfigCheckDataDirectory(const char *data_dir)
#define SCLogError(...)
Macro used to log ERROR messages.
int DetectEngineReloadStart(void)
#define DEFAULT_CONF_FILE
#define SC_LOG_MAX_LOG_MSG_LEN
void AppLayerParserPostStreamSetup(void)
void TmModuleReceivePcapRegister(void)
Registration Function for ReceivePcap.
void SCGetUserID(const char *user_name, const char *group_name, uint32_t *uid, uint32_t *gid)
Function to get the user and group ID from the specified user name.
void TmModuleRespondRejectRegister(void)
void CoredumpEnable(void)
Enable coredumps on systems where coredumps can and need to be enabled.
void RunUnittests(int list_unittests, const char *regex_arg)
TmEcode ConfigCheckLogDirectoryExists(const char *log_dir)
void PacketAlertTagInit(void)
int RunModeEngineIsIPS(int capture_mode, const char *runmode, const char *capture_plugin_name)
DetectEngineCtx * DetectEngineCtxInit(void)
int EngineModeIsIPS(void)
void SCProfilingKeywordsGlobalInit(void)
void EngineDone(void)
Used to indicate that the current task is done.
const char * GetDocURL(void)
void PostRunDeinit(const int runmode, struct timeval *start_time)
clean up / shutdown code for packet modes
void HostInitConfig(bool quiet)
initialize the configuration
TmEcode TmThreadWaitOnThreadRunning(void)
Waits for all threads to be in a running state.
void ConfDeInit(void)
De-initializes the configuration system.
void HttpRangeContainersDestroy(void)
int ConfSet(const char *name, const char *val)
Set a configuration value.
void SCLogLoadConfig(int daemon, int verbose, uint32_t userid, uint32_t groupid)
int DetectEngineReload(const SCInstance *suri)
Reload the detection engine.
#define DEFAULT_MAX_PENDING_PACKETS
void DetectEngineClearMaster(void)
void SetMasterExceptionPolicy(void)
void TmThreadCheckThreadState(void)
Used to check the thread for certain conditions of failure.
void OutputFilestoreRegisterGlobalCounters(void)
int InitGlobal(void)
Global initialization common to all runmodes.
int LiveGetDeviceCount(void)
Get the number of registered devices.
SystemHugepageSnapshot * SystemHugepageSnapshotCreate(void)
The function creates a snapshot of the system's hugepage usage per NUMA node and per hugepage size....
void SCProfilingSghsGlobalInit(void)
int SCPidfileCreate(const char *pidfile)
Write a pid file (used at the startup) This commonly needed by the init scripts.
int LiveRegisterDeviceName(const char *dev)
Add a device for monitoring.
#define SCStatFn(pathname, statbuf)
void LiveDeviceFinalize(void)
void TmModuleDecodeDPDKRegister(void)
Registration Function for DecodeDPDK.
void PacketPoolDestroy(void)
void HTPFreeConfig(void)
Clears the HTTP server configuration memory used by HTP library.
void LandlockSandboxing(SCInstance *suri)
int ListKeywords(const char *keyword_info)
#define SCLogNotice(...)
Macro used to log NOTICE messages.
void SuricataPreInit(const char *progname)
void DPDKCleanupEAL(void)
void SCPidfileRemove(const char *pid_filename)
Remove the pid file (used at the startup)
@ SURI_HOST_IS_SNIFFER_ONLY
void NFQContextsClean(void)
Clean global contexts. Must be called on exit.
void SystemHugepageEvaluateHugepages(SystemHugepageSnapshot *pre_s, SystemHugepageSnapshot *post_s)
The function compares two hugepage snapshots and prints out recommendations for hugepage configuratio...
#define DEBUG_VALIDATE_BUG_ON(exp)
int SCFinalizeRunMode(void)
void SCProfilingInit(void)
Initialize profiling.
void GlobalsDestroy(void)
int DetectEngineReloadIsStart(void)
volatile uint8_t suricata_ctl_flags
void TagDestroyCtx(void)
Destroy tag context hash tables.
int DetectAddressTestConfVars(void)
void FlowWorkToDoCleanup(void)
Clean up all the flows that have unprocessed segments and have some work to do in the detection engin...
void MpmHSGlobalCleanup(void)
void TmqResetQueues(void)