Go to the documentation of this file.
34 #ifdef HAVE_SYS_RESOURCE_H
36 #include <sys/resource.h>
144 #ifdef SYSTEMD_NOTIFY
169 #define DEFAULT_MAX_PENDING_PACKETS 1024
194 #ifndef AFLFUZZ_NO_RANDOM
296 #ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
297 static void SignalHandlerSigint(
int sig)
301 static void SignalHandlerSigterm(
int sig)
307 #define UNW_LOCAL_ONLY
308 #include <libunwind.h>
309 static void SignalHandlerUnexpected(
int sig_num, siginfo_t *info,
void *context)
314 signal(SIGABRT, SIG_DFL);
315 signal(SIGSEGV, SIG_DFL);
317 if ((r = unw_init_local(&cursor, (unw_context_t *)(context)) != 0)) {
318 SCLogError(
"unable to obtain stack trace: unw_init_local: %s", unw_strerror(r));
327 if (unw_is_signal_frame(&cursor) == 0) {
330 if (unw_get_proc_name(&cursor,
name,
sizeof(
name), &off) == UNW_ENOMEM) {
339 r = unw_step(&cursor);
349 kill(getpid(), sig_num);
351 #undef UNW_LOCAL_ONLY
361 static void SignalHandlerSigusr2(
int sig)
371 static void SignalHandlerSigHup(
int sig)
424 #ifdef HAVE_AF_PACKET
432 #ifdef BUILD_HYPERSCAN
453 static void OnNotifyRunning(
void)
455 #ifdef SYSTEMD_NOTIFY
481 static int SetBpfString(
int argc,
char *argv[])
483 char *bpf_filter = NULL;
484 uint32_t bpf_len = 0;
489 while(argv[tmpindex] != NULL) {
490 bpf_len+=strlen(argv[tmpindex]) + 1;
502 while(argv[tmpindex] != NULL) {
503 strlcat(bpf_filter, argv[tmpindex],bpf_len);
504 if(argv[tmpindex + 1] != NULL) {
505 strlcat(bpf_filter,
" ", bpf_len);
510 if(strlen(bpf_filter) > 0) {
522 static void SetBpfStringFromFile(
char *filename)
524 char *bpf_filter = NULL;
525 char *bpf_comment_tmp = NULL;
526 char *bpf_comment_start = NULL;
532 fp = fopen(filename,
"r");
534 SCLogError(
"Failed to open file %s", filename);
539 SCLogError(
"Failed to stat file %s", filename);
543 bpf_len = ((size_t)(st.st_size)) + 1;
547 SCLogError(
"Failed to allocate buffer for bpf filter in file %s", filename);
551 nm = fread(bpf_filter, 1, bpf_len - 1, fp);
552 if ((ferror(fp) != 0) || (nm != (bpf_len - 1))) {
553 SCLogError(
"Failed to read complete BPF file %s", filename);
559 bpf_filter[nm] =
'\0';
561 if(strlen(bpf_filter) > 0) {
563 bpf_comment_start = bpf_filter;
564 while((bpf_comment_tmp = strchr(bpf_comment_start,
'#')) != NULL) {
565 while((*bpf_comment_tmp !=
'\0') &&
566 (*bpf_comment_tmp !=
'\r') && (*bpf_comment_tmp !=
'\n'))
568 *bpf_comment_tmp++ =
' ';
570 bpf_comment_start = bpf_comment_tmp;
573 while((bpf_comment_tmp = strchr(bpf_filter,
'\r')) != NULL) {
574 *bpf_comment_tmp =
' ';
576 while((bpf_comment_tmp = strchr(bpf_filter,
'\n')) != NULL) {
577 *bpf_comment_tmp =
' ';
580 while (strlen(bpf_filter) > 0 &&
581 bpf_filter[strlen(bpf_filter)-1] ==
' ')
583 bpf_filter[strlen(bpf_filter)-1] =
'\0';
585 if (strlen(bpf_filter) > 0) {
595 static void PrintUsage(
const char *progname)
602 printf(
"USAGE: %s [OPTIONS] [BPF FILTER]\n\n", progname);
604 printf(
"\n General:\n");
605 printf(
"\t-v : be more verbose (use multiple times to "
606 "increase verbosity)\n");
607 printf(
"\t-c <path> : path to configuration file\n");
608 printf(
"\t-l <dir> : default log directory\n");
609 printf(
"\t--include <path> : additional configuration file\n");
610 printf(
"\t--set name=value : set a configuration value\n");
611 printf(
"\t--pidfile <file> : write pid to this file\n");
612 printf(
"\t-T : test configuration file (use with -c)\n");
613 printf(
"\t--init-errors-fatal : enable fatal failure on signature init "
616 printf(
"\t-D : run as daemon\n");
618 printf(
"\t--service-install : install as service\n");
619 printf(
"\t--service-remove : remove service\n");
620 printf(
"\t--service-change-params : change service startup parameters\n");
622 #ifdef HAVE_LIBCAP_NG
623 printf(
"\t--user <user> : run suricata as this user after init\n");
624 printf(
"\t--group <group> : run suricata as this group after init\n");
626 #ifdef BUILD_UNIX_SOCKET
627 printf(
"\t--unix-socket[=<file>] : use unix socket to control suricata work\n");
629 printf(
"\t--runmode <runmode_id> : specific runmode modification the engine should run. The argument\n"
630 "\t supplied should be the id for the runmode obtained by running\n"
631 "\t --list-runmodes\n");
633 printf(
"\n Capture and IPS:\n");
635 printf(
"\t-F <bpf filter file> : bpf filter file\n");
636 printf(
"\t-k [all|none] : force checksum check (all) or disabled it "
638 printf(
"\t-i <dev or ip> : run in pcap live mode\n");
639 printf(
"\t--pcap[=<dev>] : run in pcap mode, no value select interfaces "
640 "from suricata.yaml\n");
641 #ifdef HAVE_PCAP_SET_BUFF
642 printf(
"\t--pcap-buffer-size : size of the pcap buffer value from 0 - %i\n",INT_MAX);
645 printf(
"\t-q <qid[:qid]> : run in inline nfqueue mode (use colon to "
646 "specify a range of queues)\n");
649 printf(
"\t-d <divert port> : run in inline ipfw divert mode\n");
651 #ifdef HAVE_AF_PACKET
652 printf(
"\t--af-packet[=<dev>] : run in af-packet mode, no value select interfaces from suricata.yaml\n");
655 printf(
"\t--af-xdp[=<dev>] : run in af-xdp mode, no value select "
656 "interfaces from suricata.yaml\n");
659 printf(
"\t--netmap[=<dev>] : run in netmap mode, no value select interfaces from suricata.yaml\n");
662 printf(
"\t--pfring[=<dev>] : run in pfring mode, use interfaces from suricata.yaml\n");
663 printf(
"\t--pfring-int <dev> : run in pfring mode, use interface <dev>\n");
664 printf(
"\t--pfring-cluster-id <id> : pfring cluster id \n");
665 printf(
"\t--pfring-cluster-type <type> : pfring cluster type for PF_RING 4.1.2 and later cluster_round_robin|cluster_flow\n");
668 printf(
"\t--dpdk : run in dpdk mode, uses interfaces from "
672 printf(
"\t--dag <dagX:Y> : process ERF records from DAG interface X, stream Y\n");
675 printf(
"\t--windivert <filter> : run in inline WinDivert mode\n");
676 printf(
"\t--windivert-forward <filter> : run in inline WinDivert mode, as a gateway\n");
679 printf(
"\t--reject-dev <dev> : send reject packets from this interface\n");
682 printf(
"\n Capture Files:\n");
683 printf(
"\t-r <path> : run in pcap file/offline mode\n");
684 printf(
"\t--pcap-file-continuous : when running in pcap mode with a directory, "
685 "continue checking directory for pcaps until interrupted\n");
686 printf(
"\t--pcap-file-delete : when running in replay mode (-r with "
687 "directory or file), will delete pcap files that have been processed when done\n");
688 printf(
"\t--pcap-file-recursive : will descend into subdirectories when running "
689 "in replay mode (-r)\n");
690 printf(
"\t--pcap-file-buffer-size : set read buffer size (setvbuf)\n");
691 printf(
"\t--erf-in <path> : process an ERF file\n");
693 printf(
"\n Detection:\n");
694 printf(
"\t-s <path> : path to signature file loaded in addition to "
695 "suricata.yaml settings (optional)\n");
696 printf(
"\t-S <path> : path to signature file loaded exclusively "
698 printf(
"\t--disable-detection : disable detection engine\n");
699 printf(
"\t--engine-analysis : print reports on analysis of different "
700 "sections in the engine and exit.\n"
701 "\t Please have a look at the conf parameter "
702 "engine-analysis on what reports\n"
703 "\t can be printed\n");
705 printf(
"\n Firewall:\n");
706 printf(
"\t--firewall : enable firewall mode\n");
707 printf(
"\t--firewall-rules-exclusive=<path> : path to firewall rule file loaded "
710 printf(
"\n Info:\n");
711 printf(
"\t-V : display Suricata version\n");
712 printf(
"\t--list-keywords[=all|csv|<kword>] : list keywords implemented by the engine\n");
713 printf(
"\t--list-runmodes : list supported runmodes\n");
714 printf(
"\t--list-app-layer-protos : list supported app layer protocols\n");
715 printf(
"\t--list-app-layer-hooks : list supported app layer hooks for use in "
717 printf(
"\t--dump-config : show the running configuration\n");
718 printf(
"\t--dump-features : display provided features\n");
719 printf(
"\t--build-info : display build information\n");
721 printf(
"\n Testing:\n");
722 printf(
"\t--simulate-ips : force engine into IPS mode. Useful for QA\n");
724 printf(
"\t-u : run the unittests and exit\n");
725 printf(
"\t-U=REGEX, --unittest-filter=REGEX : filter unittests with a pcre compatible "
727 printf(
"\t--list-unittests : list unit tests\n");
728 printf(
"\t--fatal-unittests : enable fatal failure on unittest error\n");
729 printf(
"\t--unittests-coverage : display unittest coverage report\n");
732 printf(
"\nTo run " PROG_NAME " with default configuration on "
733 "interface eth0 with signature file \"signatures.rules\", run the "
734 "command as:\n\n%s -c suricata.yaml -s signatures.rules -i eth0 \n\n",
738 static void PrintBuildInfo(
void)
742 char features[2048] =
"";
747 strlcat(features,
"DEBUG ",
sizeof(features));
749 #ifdef DEBUG_VALIDATION
750 strlcat(features,
"DEBUG_VALIDATION ",
sizeof(features));
753 strlcat(features,
"UNITTESTS ",
sizeof(features));
756 strlcat(features,
"NFQ ",
sizeof(features));
759 strlcat(features,
"IPFW ",
sizeof(features));
761 #ifdef HAVE_PCAP_SET_BUFF
762 strlcat(features,
"PCAP_SET_BUFF ",
sizeof(features));
765 strlcat(features,
"PF_RING ",
sizeof(features));
768 strlcat(features,
"NAPATECH ",
sizeof(features));
770 #ifdef HAVE_AF_PACKET
771 strlcat(features,
"AF_PACKET ",
sizeof(features));
774 strlcat(features,
"NETMAP ",
sizeof(features));
776 #ifdef HAVE_PACKET_FANOUT
777 strlcat(features,
"HAVE_PACKET_FANOUT ",
sizeof(features));
780 strlcat(features,
"DAG ",
sizeof(features));
782 #ifdef HAVE_LIBCAP_NG
783 strlcat(features,
"LIBCAP_NG ",
sizeof(features));
786 strlcat(features,
"LIBNET1.1 ",
sizeof(features));
788 strlcat(features,
"HAVE_HTP_URI_NORMALIZE_HOOK ",
sizeof(features));
789 #ifdef PCRE2_HAVE_JIT
790 strlcat(features,
"PCRE_JIT ",
sizeof(features));
793 strlcat(features,
"HAVE_NSS ",
sizeof(features));
795 strlcat(features,
"HTTP2_DECOMPRESSION ",
sizeof(features));
797 strlcat(features,
"HAVE_LUA ",
sizeof(features));
799 strlcat(features,
"HAVE_JA3 ",
sizeof(features));
802 strlcat(features,
"HAVE_JA4 ",
sizeof(features));
804 strlcat(features,
"HAVE_LIBJANSSON ",
sizeof(features));
806 strlcat(features,
"PROFILING ",
sizeof(features));
808 #ifdef PROFILE_LOCKING
809 strlcat(features,
"PROFILE_LOCKING ",
sizeof(features));
811 #if defined(TLS_C11) || defined(TLS_GNU)
812 strlcat(features,
"TLS ",
sizeof(features));
815 strlcat(features,
"TLS_C11 ",
sizeof(features));
816 #elif defined(TLS_GNU)
817 strlcat(features,
"TLS_GNU ",
sizeof(features));
820 strlcat(features,
"MAGIC ",
sizeof(features));
822 strlcat(features,
"RUST ",
sizeof(features));
823 #if defined(SC_ADDRESS_SANITIZER)
824 strlcat(features,
"ASAN ",
sizeof(features));
826 #if defined(HAVE_POPCNT64)
827 strlcat(features,
"POPCNT64 ",
sizeof(features));
829 if (strlen(features) == 0) {
830 strlcat(features,
"none",
sizeof(features));
833 printf(
"Features: %s\n", features);
836 memset(features, 0x00,
sizeof(features));
837 #if defined(__SSE4_2__)
838 strlcat(features,
"SSE_4_2 ",
sizeof(features));
840 #if defined(__SSE4_1__)
841 strlcat(features,
"SSE_4_1 ",
sizeof(features));
843 #if defined(__SSE3__)
844 strlcat(features,
"SSE_3 ",
sizeof(features));
846 #if defined(__SSE2__)
847 strlcat(features,
"SSE_2 ",
sizeof(features));
849 if (strlen(features) == 0) {
850 strlcat(features,
"none",
sizeof(features));
852 printf(
"SIMD support: %s\n", features);
855 memset(features, 0x00,
sizeof(features));
856 #if defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1)
857 strlcat(features,
"1 ",
sizeof(features));
859 #if defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2)
860 strlcat(features,
"2 ",
sizeof(features));
862 #if defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4)
863 strlcat(features,
"4 ",
sizeof(features));
865 #if defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8)
866 strlcat(features,
"8 ",
sizeof(features));
868 #if defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16)
869 strlcat(features,
"16 ",
sizeof(features));
871 if (strlen(features) == 0) {
872 strlcat(features,
"none",
sizeof(features));
874 strlcat(features,
"byte(s)",
sizeof(features));
876 printf(
"Atomic intrinsics: %s\n", features);
880 #elif __WORDSIZE == 32
883 bits =
"<unknown>-bits";
886 #if __BYTE_ORDER == __BIG_ENDIAN
887 endian =
"Big-endian";
888 #elif __BYTE_ORDER == __LITTLE_ENDIAN
889 endian =
"Little-endian";
891 endian =
"<unknown>-endian";
894 printf(
"%s, %s architecture\n", bits, endian);
896 printf(
"GCC version %s, C version %"PRIiMAX
"\n", __VERSION__, (intmax_t)__STDC_VERSION__);
898 printf(
"C version %"PRIiMAX
"\n", (intmax_t)__STDC_VERSION__);
902 printf(
"compiled with -fstack-protector\n");
905 printf(
"compiled with -fstack-protector-all\n");
914 #if _FORTIFY_SOURCE == 2
915 printf(
"compiled with _FORTIFY_SOURCE=2\n");
916 #elif _FORTIFY_SOURCE == 1
917 printf(
"compiled with _FORTIFY_SOURCE=1\n");
918 #elif _FORTIFY_SOURCE == 0
919 printf(
"compiled with _FORTIFY_SOURCE=0\n");
922 printf(
"L1 cache line size (CLS)=%d\n",
CLS);
925 tls =
"_Thread_local";
926 #elif defined(TLS_GNU)
929 #error "Unsupported thread local"
931 printf(
"thread local storage method: %s\n", tls);
933 printf(
"compiled with %s\n", htp_get_version());
935 #include "build-info.h"
1031 static TmEcode ParseInterfacesList(
const int runmode,
char *pcap_dev)
1037 if (strlen(pcap_dev) == 0) {
1040 SCLogError(
"No interface found in config for pcap");
1047 if (strlen(pcap_dev)) {
1049 SCLogError(
"Failed to set pfring.live-interface");
1056 char iface_selector[] =
"dpdk.interfaces";
1059 SCLogError(
"No interface found in config for %s", iface_selector);
1063 #ifdef HAVE_AF_PACKET
1066 if (strlen(pcap_dev)) {
1068 SCLogError(
"Failed to set af-packet.live-interface");
1074 SCLogError(
"No interface found in config for af-packet");
1082 if (strlen(pcap_dev)) {
1084 SCLogError(
"Failed to set af-xdp.live-interface");
1090 SCLogError(
"No interface found in config for af-xdp");
1098 if (strlen(pcap_dev)) {
1100 SCLogError(
"Failed to set netmap.live-interface");
1106 SCLogError(
"No interface found in config for netmap");
1115 SCLogError(
"No group found in config for nflog");
1124 static void SCInstanceInit(
SCInstance *suri,
const char *progname)
1126 memset(suri, 0x00,
sizeof(*suri));
1153 #if HAVE_DETECT_DISABLED==1
1163 if (strstr(prog_ver,
"RELEASE") != NULL) {
1183 if (strstr(
PROG_VER,
"-dev") == NULL) {
1194 static TmEcode PrintVersion(
void)
1202 const char *mode = suri->
system ?
"SYSTEM" :
"USER";
1203 SCLogNotice(
"This is %s version %s running in %s mode",
1214 static void SCPrintElapsedTime(
struct timeval *start_time)
1216 if (start_time == NULL)
1218 struct timeval end_time;
1219 memset(&end_time, 0,
sizeof(end_time));
1220 gettimeofday(&end_time, NULL);
1221 uint64_t milliseconds = ((end_time.tv_sec - start_time->tv_sec) * 1000) +
1222 (((1000000 + end_time.tv_usec - start_time->tv_usec) / 1000) - 1000);
1223 SCLogInfo(
"time elapsed %.3fs", (
float)milliseconds/(
float)1000);
1226 static int ParseCommandLineAfpacket(
SCInstance *suri,
const char *in_arg)
1228 #ifdef HAVE_AF_PACKET
1240 SCLogInfo(
"Multiple af-packet option without interface on each is useless");
1244 "has been specified");
1250 SCLogError(
"AF_PACKET not enabled. On Linux "
1251 "host, make sure to pass --enable-af-packet to "
1252 "configure when building.");
1257 static int ParseCommandLineAfxdp(
SCInstance *suri,
const char *in_arg)
1271 SCLogInfo(
"Multiple af-xdp options without interface on each is useless");
1275 "has been specified");
1282 "host, make sure correct libraries are installed,"
1283 " see documentation for information.");
1288 static int ParseCommandLineDpdk(
SCInstance *suri,
const char *in_arg)
1294 SCLogInfo(
"Multiple dpdk options have no effect on Suricata");
1297 "has been specified");
1304 "host, make sure to pass --enable-dpdk to "
1305 "configure when building.");
1310 static int ParseCommandLinePcapLive(
SCInstance *suri,
const char *in_arg)
1312 #if defined(OS_WIN32) && !defined(HAVE_LIBWPCAP)
1314 FatalError(
"Live capture not available. To support live capture compile against Npcap.");
1318 if (in_arg != NULL) {
1321 if (strlen(in_arg) > 9 && strncmp(in_arg,
"DeviceNPF", 9) == 0) {
1322 snprintf(suri->
pcap_dev,
sizeof(suri->
pcap_dev),
"\\Device\\NPF%s", in_arg+9);
1328 if (strcmp(suri->
pcap_dev, in_arg) != 0) {
1330 }
else if (strlen(suri->
pcap_dev) > 0 && isdigit((
unsigned char)suri->
pcap_dev[0])) {
1331 SCLogError(
"failed to find a pcap device for IP %s", in_arg);
1345 "has been specified");
1355 static bool IsLogDirectoryWritable(
const char*
str)
1357 if (access(
str, W_OK) == 0)
1369 int dump_config = 0;
1370 int dump_features = 0;
1371 int list_app_layer_protocols = 0;
1372 int list_app_layer_hooks = 0;
1373 int list_unittests = 0;
1374 int list_runmodes = 0;
1375 int list_keywords = 0;
1380 int is_firewall = 0;
1389 struct option long_opts[] = {
1391 {
"dump-config", 0, &dump_config, 1},
1392 {
"dump-features", 0, &dump_features, 1},
1393 {
"pfring", optional_argument, 0, 0},
1394 {
"pfring-int", required_argument, 0, 0},
1395 {
"pfring-cluster-id", required_argument, 0, 0},
1396 {
"pfring-cluster-type", required_argument, 0, 0},
1400 {
"af-packet", optional_argument, 0, 0},
1401 {
"af-xdp", optional_argument, 0, 0},
1402 {
"netmap", optional_argument, 0, 0},
1403 {
"pcap", optional_argument, 0, 0},
1404 {
"pcap-file-continuous", 0, 0, 0},
1405 {
"pcap-file-delete", 0, 0, 0},
1406 {
"pcap-file-recursive", 0, 0, 0},
1407 {
"pcap-file-buffer-size", required_argument, 0, 0},
1408 {
"simulate-ips", 0, 0 , 0},
1410 {
"strict-rule-keywords", optional_argument, 0, 0},
1412 {
"capture-plugin", required_argument, 0, 0},
1413 {
"capture-plugin-args", required_argument, 0, 0},
1415 #ifdef BUILD_UNIX_SOCKET
1416 {
"unix-socket", optional_argument, 0, 0},
1418 {
"pcap-buffer-size", required_argument, 0, 0},
1419 {
"unittest-filter", required_argument, 0,
'U'},
1420 {
"list-app-layer-protos", 0, &list_app_layer_protocols, 1},
1421 {
"list-app-layer-hooks", 0, &list_app_layer_hooks, 1},
1422 {
"list-unittests", 0, &list_unittests, 1},
1423 {
"list-runmodes", 0, &list_runmodes, 1},
1424 {
"list-keywords", optional_argument, &list_keywords, 1},
1425 {
"runmode", required_argument, NULL, 0},
1428 {
"service-install", 0, 0, 0},
1429 {
"service-remove", 0, 0, 0},
1430 {
"service-change-params", 0, 0, 0},
1432 {
"pidfile", required_argument, 0, 0},
1433 {
"init-errors-fatal", 0, 0, 0},
1434 {
"disable-detection", 0, 0, 0},
1435 {
"disable-hashing", 0, 0, 0},
1436 {
"fatal-unittests", 0, 0, 0},
1438 {
"user", required_argument, 0, 0},
1439 {
"group", required_argument, 0, 0},
1440 {
"erf-in", required_argument, 0, 0},
1441 {
"dag", required_argument, 0, 0},
1442 {
"build-info", 0, &build_info, 1},
1443 {
"data-dir", required_argument, 0, 0},
1445 {
"windivert", required_argument, 0, 0},
1446 {
"windivert-forward", required_argument, 0, 0},
1448 #ifdef HAVE_LIBNET11
1449 {
"reject-dev", required_argument, 0, 0},
1451 {
"set", required_argument, 0, 0},
1453 {
"nflog", optional_argument, 0, 0},
1455 {
"simulate-packet-flow-memcap", required_argument, 0, 0},
1456 {
"simulate-applayer-error-at-offset-ts", required_argument, 0, 0},
1457 {
"simulate-applayer-error-at-offset-tc", required_argument, 0, 0},
1458 {
"simulate-packet-loss", required_argument, 0, 0},
1459 {
"simulate-packet-tcp-reassembly-memcap", required_argument, 0, 0},
1460 {
"simulate-packet-tcp-ssn-memcap", required_argument, 0, 0},
1461 {
"simulate-packet-defrag-memcap", required_argument, 0, 0},
1462 {
"simulate-alert-queue-realloc-failure", 0, 0, 0},
1466 {
"firewall", 0, &is_firewall, 1 },
1467 {
"firewall-rules-exclusive", required_argument, 0, 0},
1469 {
"include", required_argument, 0, 0},
1476 int option_index = 0;
1478 char short_opts[] =
"c:TDhi:l:q:d:r:us:S:U:VF:vk:";
1480 while ((opt = getopt_long(argc, argv, short_opts, long_opts, &option_index)) != -1) {
1483 if (strcmp((long_opts[option_index]).
name,
"help") == 0) {
1486 }
else if (strcmp((long_opts[option_index]).
name,
"pfring") == 0 ||
1487 strcmp((long_opts[option_index]).
name,
"pfring-int") == 0) {
1492 if (optarg != NULL) {
1495 ((strlen(optarg) <
sizeof(suri->
pcap_dev)) ?
1496 (strlen(optarg) + 1) :
sizeof(suri->
pcap_dev)));
1501 "to pass --enable-pfring to configure when building.");
1504 }
else if (strcmp((long_opts[option_index]).
name,
"pfring-cluster-id") == 0) {
1507 SCLogError(
"failed to set pfring.cluster-id");
1512 "to pass --enable-pfring to configure when building.");
1515 }
else if (strcmp((long_opts[option_index]).
name,
"pfring-cluster-type") == 0) {
1518 SCLogError(
"failed to set pfring.cluster-type");
1523 "to pass --enable-pfring to configure when building.");
1526 }
else if (strcmp((long_opts[option_index]).
name,
"capture-plugin") == 0) {
1529 }
else if (strcmp((long_opts[option_index]).
name,
"capture-plugin-args") == 0) {
1531 }
else if (strcmp((long_opts[option_index]).
name,
"dpdk") == 0) {
1532 if (ParseCommandLineDpdk(suri, optarg) !=
TM_ECODE_OK) {
1535 }
else if (strcmp((long_opts[option_index]).
name,
"af-packet") == 0) {
1536 if (ParseCommandLineAfpacket(suri, optarg) !=
TM_ECODE_OK) {
1539 }
else if (strcmp((long_opts[option_index]).
name,
"af-xdp") == 0) {
1540 if (ParseCommandLineAfxdp(suri, optarg) !=
TM_ECODE_OK) {
1543 }
else if (strcmp((long_opts[option_index]).
name,
"netmap") == 0) {
1551 ((strlen(optarg) <
sizeof(suri->
pcap_dev)) ?
1552 (strlen(optarg) + 1) :
sizeof(suri->
pcap_dev)));
1558 SCLogInfo(
"Multiple netmap option without interface on each is useless");
1563 "has been specified");
1564 PrintUsage(argv[0]);
1571 }
else if (strcmp((long_opts[option_index]).
name,
"nflog") == 0) {
1581 }
else if (strcmp((long_opts[option_index]).
name,
"pcap") == 0) {
1582 if (ParseCommandLinePcapLive(suri, optarg) !=
TM_ECODE_OK) {
1585 }
else if (strcmp((long_opts[option_index]).
name,
"simulate-ips") == 0) {
1588 }
else if (strcmp((long_opts[option_index]).
name,
"init-errors-fatal") == 0) {
1590 SCLogError(
"failed to set engine init-failure-fatal");
1593 #ifdef BUILD_UNIX_SOCKET
1594 }
else if (strcmp((long_opts[option_index]).
name ,
"unix-socket") == 0) {
1599 SCLogError(
"failed to set unix-command.filename");
1605 "has been specified");
1606 PrintUsage(argv[0]);
1611 else if(strcmp((long_opts[option_index]).
name,
"list-app-layer-protocols") == 0) {
1613 }
else if (strcmp((long_opts[option_index]).
name,
"list-app-layer-hooks") == 0) {
1615 }
else if (strcmp((long_opts[option_index]).
name,
"list-unittests") == 0) {
1619 SCLogError(
"unit tests not enabled. Make sure to pass --enable-unittests to "
1620 "configure when building");
1623 }
else if (strcmp((long_opts[option_index]).
name,
"list-runmodes") == 0) {
1626 }
else if (strcmp((long_opts[option_index]).
name,
"list-keywords") == 0) {
1628 if (strcmp(
"short", optarg) != 0) {
1632 }
else if (strcmp((long_opts[option_index]).
name,
"runmode") == 0) {
1634 }
else if (strcmp((long_opts[option_index]).
name,
"engine-analysis") == 0) {
1638 else if (strcmp((long_opts[option_index]).
name,
"service-install") == 0) {
1639 suri->
run_mode = RUNMODE_INSTALL_SERVICE;
1641 }
else if (strcmp((long_opts[option_index]).
name,
"service-remove") == 0) {
1642 suri->
run_mode = RUNMODE_REMOVE_SERVICE;
1644 }
else if (strcmp((long_opts[option_index]).
name,
"service-change-params") == 0) {
1645 suri->
run_mode = RUNMODE_CHANGE_SERVICE_PARAMS;
1649 else if (strcmp((long_opts[option_index]).
name,
"pidfile") == 0) {
1652 SCLogError(
"strdup failed: %s", strerror(errno));
1655 }
else if (strcmp((long_opts[option_index]).
name,
"disable-detection") == 0) {
1657 }
else if (strcmp((long_opts[option_index]).
name,
"disable-hashing") == 0) {
1661 }
else if (strcmp((long_opts[option_index]).
name,
"fatal-unittests") == 0) {
1665 SCLogError(
"unit tests not enabled. Make sure to pass --enable-unittests to "
1666 "configure when building");
1669 }
else if (strcmp((long_opts[option_index]).
name,
"user") == 0) {
1670 #ifndef HAVE_LIBCAP_NG
1672 " drop privileges, but it was not compiled into Suricata.");
1678 }
else if (strcmp((long_opts[option_index]).
name,
"group") == 0) {
1679 #ifndef HAVE_LIBCAP_NG
1681 " drop privileges, but it was not compiled into Suricata.");
1687 }
else if (strcmp((long_opts[option_index]).
name,
"erf-in") == 0) {
1693 }
else if (strcmp((long_opts[option_index]).
name,
"dag") == 0) {
1699 SCLogError(
"more than one run mode has been specified");
1700 PrintUsage(argv[0]);
1705 SCLogError(
"libdag and a DAG card are required"
1706 " to receive packets using --dag.");
1709 }
else if (strcmp((long_opts[option_index]).
name,
"napatech") == 0) {
1710 #ifdef HAVE_NAPATECH
1713 SCLogError(
"libntapi and a Napatech adapter are required"
1714 " to capture packets using --napatech.");
1717 }
else if (strcmp((long_opts[option_index]).
name,
"pcap-buffer-size") == 0) {
1718 #ifdef HAVE_PCAP_SET_BUFF
1720 SCLogError(
"failed to set pcap-buffer-size");
1725 " doesn't support setting buffer size.");
1727 }
else if (strcmp((long_opts[option_index]).
name,
"build-info") == 0) {
1730 }
else if (strcmp((long_opts[option_index]).
name,
"windivert-forward") == 0) {
1734 if (WinDivertRegisterQueue(
true, optarg) == -1) {
1738 if (WinDivertRegisterQueue(
true, optarg) == -1) {
1743 "has been specified");
1744 PrintUsage(argv[0]);
1748 else if(strcmp((long_opts[option_index]).
name,
"windivert") == 0) {
1751 if (WinDivertRegisterQueue(
false, optarg) == -1) {
1755 if (WinDivertRegisterQueue(
false, optarg) == -1) {
1760 "has been specified");
1761 PrintUsage(argv[0]);
1765 SCLogError(
"WinDivert not enabled. Make sure to pass --enable-windivert to "
1766 "configure when building.");
1769 }
else if(strcmp((long_opts[option_index]).
name,
"reject-dev") == 0) {
1770 #ifdef HAVE_LIBNET11
1772 extern char *g_reject_dev;
1773 extern uint16_t g_reject_dev_mtu;
1774 g_reject_dev = optarg;
1777 g_reject_dev_mtu = (uint16_t)mtu;
1780 SCLogError(
"Libnet 1.1 support not enabled. Compile Suricata with libnet support.");
1784 else if (strcmp((long_opts[option_index]).
name,
"set") == 0) {
1785 if (optarg != NULL) {
1787 char *val = strchr(optarg,
'=');
1789 FatalError(
"Invalid argument for --set, must be key=val.");
1792 FatalError(
"failed to set configuration value %s", optarg);
1796 else if (strcmp((long_opts[option_index]).
name,
"pcap-file-continuous") == 0) {
1798 SCLogError(
"Failed to set pcap-file.continuous");
1802 else if (strcmp((long_opts[option_index]).
name,
"pcap-file-delete") == 0) {
1804 SCLogError(
"Failed to set pcap-file.delete-when-done");
1808 else if (strcmp((long_opts[option_index]).
name,
"pcap-file-recursive") == 0) {
1810 SCLogError(
"failed to set pcap-file.recursive");
1813 }
else if (strcmp((long_opts[option_index]).
name,
"pcap-file-buffer-size") == 0) {
1815 SCLogError(
"failed to set pcap-file.buffer-size");
1818 }
else if (strcmp((long_opts[option_index]).
name,
"data-dir") == 0) {
1819 if (optarg == NULL) {
1820 SCLogError(
"no option argument (optarg) for -d");
1830 " supplied at the command-line (-d %s) doesn't "
1831 "exist. Shutting down the engine.",
1836 }
else if (strcmp((long_opts[option_index]).
name,
"strict-rule-keywords") == 0) {
1837 if (optarg == NULL) {
1843 FatalError(
"failed to duplicate 'strict' string");
1845 }
else if (strcmp((long_opts[option_index]).
name,
"include") == 0) {
1850 "Failed to allocate memory for additional configuration files: %s",
1855 for (
int i = 0;; i++) {
1857 const char **additional_configs =
1859 if (additional_configs == NULL) {
1860 FatalError(
"Failed to allocate memory for additional configuration "
1872 }
else if (strcmp((long_opts[option_index]).
name,
"firewall-rules-exclusive") == 0) {
1874 SCLogError(
"can't have multiple --firewall-rules-exclusive options");
1882 (long_opts[option_index]).
name, optarg);
1893 SCLogError(
"failed to set engine init-failure-fatal");
1906 if (optarg == NULL) {
1907 SCLogError(
"no option argument (optarg) for -i");
1910 #ifdef HAVE_AF_PACKET
1911 if (ParseCommandLineAfpacket(suri, optarg) !=
TM_ECODE_OK) {
1916 #if defined HAVE_NETMAP
1922 "option%s %s available:"
1924 " NETMAP (--netmap=%s)"
1926 ". Use --pcap=%s to suppress this warning",
1927 i == 1 ?
"" :
"s", i == 1 ?
"is" :
"are"
1935 if (ParseCommandLinePcapLive(suri, optarg) !=
TM_ECODE_OK) {
1941 if (optarg == NULL) {
1942 SCLogError(
"no option argument (optarg) for -l");
1952 " supplied at the command-line (-l %s) doesn't "
1953 "exist. Shutting down the engine.",
1957 if (!IsLogDirectoryWritable(optarg)) {
1959 " supplied at the command-line (-l %s) is not "
1960 "writable. Shutting down the engine.",
1979 "has been specified");
1980 PrintUsage(argv[0]);
1984 SCLogError(
"NFQUEUE not enabled. Make sure to pass --enable-nfqueue to configure when "
2001 "has been specified");
2002 PrintUsage(argv[0]);
2006 SCLogError(
"IPFW not enabled. Make sure to pass --enable-ipfw to configure when "
2017 "has been specified");
2018 PrintUsage(argv[0]);
2023 SCLogError(
"pcap file '%s': %s", optarg, strerror(errno));
2027 SCLogError(
"ERROR: Failed to set pcap-file.file\n");
2034 SCLogError(
"can't have multiple -s options or mix -s and -S.");
2041 SCLogError(
"can't have multiple -S options or mix -s and -S.");
2054 PrintUsage(argv[0]);
2058 SCLogError(
"unit tests not enabled. Make sure to pass --enable-unittests to configure "
2075 if (optarg == NULL) {
2076 SCLogError(
"no option argument (optarg) for -F");
2080 SetBpfStringFromFile(optarg);
2086 if (optarg == NULL) {
2087 SCLogError(
"no option argument (optarg) for -k");
2090 if (!strcmp(
"all", optarg))
2092 else if (!strcmp(
"none", optarg))
2095 SCLogError(
"option '%s' invalid for -k", optarg);
2100 PrintUsage(argv[0]);
2110 SCLogError(
"can't use -s/-S or --firewall-rules-exclusive when detection is disabled");
2117 if (list_app_layer_protocols)
2119 if (list_app_layer_hooks)
2137 ret = SetBpfString(optind, argv);
2145 int WindowsInitService(
int argc,
char **argv)
2147 if (SCRunningAsService()) {
2148 char path[MAX_PATH];
2150 strlcpy(path, argv[0], MAX_PATH);
2151 if ((p = strrchr(path,
'\\'))) {
2154 if (!SetCurrentDirectory(path)) {
2155 SCLogError(
"Can't set current directory to: %s", path);
2158 SCLogInfo(
"Current directory is set to: %s", path);
2159 SCServiceInit(argc, argv);
2164 if (0 != WSAStartup(MAKEWORD(2, 2), &wsaData)) {
2165 SCLogError(
"Can't initialize Windows sockets: %d", WSAGetLastError());
2176 const char *pid_filename;
2178 if (
SCConfGet(
"pid-file", &pid_filename) == 1) {
2179 SCLogInfo(
"Use pid file %s from config file.", pid_filename);
2186 SCLogError(
"strdup failed: %s", strerror(errno));
2205 SCLogError(
"Unable to create PID file, concurrent run of"
2206 " Suricata can occur.");
2207 SCLogError(
"PID file creation WILL be mandatory for daemon mode"
2208 " in future version");
2223 if (
SCConfGet(
"run-as.user", &
id) == 1) {
2227 if (
SCConfGet(
"run-as.group", &
id) == 1) {
2245 static int InitSignalHandler(
SCInstance *suri)
2248 #ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
2253 if (
SCConfGetBool(
"logging.stacktrace-on-signal", &enabled) == 0) {
2258 SCLogInfo(
"Preparing unexpected signal handling");
2259 struct sigaction stacktrace_action;
2260 memset(&stacktrace_action, 0,
sizeof(stacktrace_action));
2261 stacktrace_action.sa_sigaction = SignalHandlerUnexpected;
2262 stacktrace_action.sa_flags = SA_SIGINFO;
2263 sigaction(SIGSEGV, &stacktrace_action, NULL);
2264 sigaction(SIGABRT, &stacktrace_action, NULL);
2287 #ifdef PROFILE_RULES
2288 SCProfilingRulesGlobalInit();
2295 #ifdef PROFILE_RULES
2348 SCPrintElapsedTime(start_time);
2410 PrintUsage(argv[0]);
2420 case RUNMODE_INSTALL_SERVICE:
2421 if (SCServiceInstall(argc, argv)) {
2424 SCLogInfo(
"Suricata service has been successfully installed.");
2426 case RUNMODE_REMOVE_SERVICE:
2427 if (SCServiceRemove()) {
2430 SCLogInfo(
"Suricata service has been successfully removed.");
2432 case RUNMODE_CHANGE_SERVICE_PARAMS:
2433 if (SCServiceChangeParams(argc, argv)) {
2436 SCLogInfo(
"Suricata service startup parameters has been successfully changed.");
2464 static void SetupDelayedDetect(
SCInstance *suri)
2473 if (decnf != NULL) {
2475 if (strcmp(denode->
val,
"delayed-detect") == 0) {
2486 SCLogInfo(
"Packets will start being processed before signatures are active.");
2504 static int ConfigGetCaptureValue(
SCInstance *suri)
2508 intmax_t tmp_max_pending_packets;
2509 if (
SCConfGetInt(
"max-pending-packets", &tmp_max_pending_packets) != 1)
2511 if (tmp_max_pending_packets < 1 || tmp_max_pending_packets > 2147483648) {
2512 SCLogError(
"Maximum max-pending-packets setting is 2147483648 and must be greater than 0. "
2513 "Please check %s for errors",
2524 const char *temp_default_packet_size;
2525 if ((
SCConfGet(
"default-packet-size", &temp_default_packet_size)) != 1) {
2528 int strip_trailing_plus = 0;
2538 const int mtu = GetGlobalMTUWin32();
2552 strip_trailing_plus = 1;
2558 for (lthread = 0; lthread < nlive; lthread++) {
2561 (void)
strlcpy(dev, live_dev,
sizeof(dev));
2563 if (strip_trailing_plus) {
2564 size_t len = strlen(dev);
2566 (dev[
len-1] ==
'+' ||
2567 dev[
len-1] ==
'^' ||
2586 SCLogError(
"Error parsing max-pending-packets "
2587 "from conf file - %s. Killing engine",
2588 temp_default_packet_size);
2598 static void PostRunStartedDetectSetup(
const SCInstance *suri)
2612 SCLogNotice(
"Signature(s) loaded, Detect thread(s) activated.");
2624 SetupDelayedDetect(suri);
2627 int default_tenant = 0;
2629 (void)
SCConfGetBool(
"multi-detect.default", &default_tenant);
2632 "detection engine contexts failed.");
2642 FatalError(
"initializing detection engine failed.");
2656 static void PostConfLoadedSetupHostMode(
void)
2658 const char *hostmode = NULL;
2660 if (
SCConfGet(
"host-mode", &hostmode) == 1) {
2661 if (!strcmp(hostmode,
"router")) {
2663 }
else if (!strcmp(hostmode,
"sniffer-only")) {
2666 if (strcmp(hostmode,
"auto") != 0) {
2678 SCLogInfo(
"No 'host-mode': suricata is in IPS mode, using "
2679 "default setting 'router'");
2682 SCLogInfo(
"No 'host-mode': suricata is in IDS mode, using "
2683 "default setting 'sniffer-only'");
2695 FatalError(
"could not set USER mode logdir");
2701 FatalError(
"could not set USER mode datadir");
2713 int cnf_firewall_enabled = 0;
2714 if (
SCConfGetBool(
"firewall.enabled", &cnf_firewall_enabled) == 1) {
2715 if (cnf_firewall_enabled == 1) {
2719 FatalError(
"firewall mode enabled through commandline, but disabled in config");
2724 SCLogWarning(
"firewall mode is EXPERIMENTAL and subject to change");
2732 int disable_offloading;
2733 if (
SCConfGetBool(
"capture.disable-offloading", &disable_offloading) == 0)
2734 disable_offloading = 1;
2735 if (disable_offloading) {
2742 const char *cv = NULL;
2743 if (
SCConfGet(
"capture.checksum-validation", &cv) == 1) {
2744 if (strcmp(cv,
"none") == 0) {
2746 }
else if (strcmp(cv,
"all") == 0) {
2753 SCConfSet(
"stream.checksum-validation",
"0");
2756 SCConfSet(
"stream.checksum-validation",
"1");
2765 #ifdef HAVE_PACKET_EBPF
2767 EBPFRegisterExtension();
2790 SCLogInfo(
"Setting engine mode to IDS mode by default");
2811 const char *custom_umask;
2812 if (
SCConfGet(
"umask", &custom_umask) == 1) {
2814 if (
StringParseUint16(&mask, 8, (uint16_t)strlen(custom_umask), custom_umask) > 0) {
2815 umask((mode_t)mask);
2832 SCLogInfo(
"== Carrying out Engine Analysis ==");
2833 const char *temp = NULL;
2834 if (
SCConfGet(
"engine-analysis", &temp) == 0) {
2835 SCLogInfo(
"no engine-analysis parameter(s) defined in conf file. "
2836 "Please define/enable them in the conf to use this "
2855 "basic address vars test failed. Please check %s for errors", suri->
conf_filename);
2882 "supplied by %s (default-log-dir) doesn't exist. "
2883 "Shutting down the engine",
2887 if (!IsLogDirectoryWritable(suri->
log_dir)) {
2889 "supplied by %s (default-log-dir) is not writable. "
2890 "Shutting down the engine",
2908 PostConfLoadedSetupHostMode();
2977 return EXIT_FAILURE;
2998 SCInstanceInit(&
suricata, progname);
3016 if (
SCConfGetBool(
"vlan.use-for-tracking", &tracking) == 1 && !tracking) {
3020 SCLogDebug(
"vlan tracking is %s", tracking == 1 ?
"enabled" :
"disabled");
3021 if (
SCConfGetBool(
"livedev.use-for-tracking", &tracking) == 1 && !tracking) {
3025 if (
SCConfGetBool(
"decoder.recursion-level.use-for-tracking", &tracking) == 1 && !tracking) {
3041 SCLogInfo(
"Running suricata under test mode");
3070 SCLogNotice(
"Configuration provided was successfully loaded. Exiting.");
3113 int limit_nproc = 0;
3114 if (
SCConfGetBool(
"security.limit-noproc", &limit_nproc) == 0) {
3118 #if defined(SC_ADDRESS_SANITIZER)
3121 "\"security.limit-noproc\" (setrlimit()) not set when using address sanitizer");
3127 #if defined(HAVE_SYS_RESOURCE_H)
3130 SCLogWarning(
"setrlimit has no effect when running as root.");
3133 struct rlimit r = { 0, 0 };
3134 if (setrlimit(RLIMIT_NPROC, &r) != 0) {
3135 SCLogWarning(
"setrlimit failed to prevent process creation.");
3157 PostRunStartedDetectSetup(&
suricata);
@ RUNMODE_LIST_APP_LAYERS
enum SCRunModes SCRunMode
@ RUNMODE_ENGINE_ANALYSIS
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)
char * firewall_rule_file
void AppLayerHtpNeedFileInspection(void)
Sets a flag that informs the HTP app layer that some module in the engine needs the http request file...
void TmThreadDisablePacketThreads(const uint16_t set, const uint16_t check, const uint8_t module_flags)
Disable all packet threads.
enum SCRunModes aux_run_mode
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
bool IsRunModeOffline(enum SCRunModes run_mode_to_check)
#define SC_ATOMIC_INIT(name)
wrapper for initializing an atomic variable.
SystemHugepageSnapshot * prerun_snap
void TmThreadContinueThreads(void)
Unpauses all threads present in tv_root.
enum DetectEngineType type
int SigLoadSignatures(DetectEngineCtx *de_ctx, char *sig_file, bool sig_file_exclusive)
Load signatures.
const char * firewall_rule_file_exclusive
#define SC_ATOMIC_SET(name, val)
Set the value for the atomic variable.
SCConfNode * SCConfGetRootNode(void)
Get the root configuration node.
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)
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)
int SCConfYamlHandleInclude(SCConfNode *parent, const char *filename)
Include a file in the configuration.
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)
void DatalinkTableDeinit(void)
int SCConfGet(const char *name, const char **vptr)
Retrieve the value of a configuration node.
DetectEngineCtx * DetectEngineGetCurrent(void)
int EngineModeIsUnknown(void)
void VarNameStoreInit(void)
void TmModuleFlowRecyclerRegister(void)
int SCConfNodeChildValueIsTrue(const SCConfNode *node, const char *key)
Test if a configuration node has a true value.
void DatalinkTableInit(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)
int SCConfGetChildValueBool(const SCConfNode *base, const char *name, int *val)
void TmModuleStatsLoggerRegister(void)
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.
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 SCConfGetBool(const char *name, int *val)
Retrieve a configuration value as a boolean.
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 EngineModeSetFirewall(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)
bool EngineModeIsFirewall(void)
void SCProfilingDestroy(void)
Free resources used by profiling.
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
int SCConfYamlLoadFile(const char *filename)
Load configuration from a YAML file.
void HostBitInitCtx(void)
bool IsRunModeSystem(enum SCRunModes run_mode_to_check)
const char * capture_plugin_args
void TmModuleLoggerRegister(void)
void PacketPoolInit(void)
int AppLayerDeSetup(void)
De initializes the app layer.
@ RUNMODE_LIST_APP_LAYER_HOOKS
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 SCRunmodeSet(SCRunMode run_mode)
Set the current run mode.
void TmModuleDecodePcapFileRegister(void)
void TmModuleBypassedFlowManagerRegister(void)
void IPPairShutdown(void)
shutdown the flow engine
void SCConfInit(void)
Initialize the configuration system.
void DetectParseFreeRegexes(void)
void SCConfDump(void)
Dump configuration to stdout.
void TmModuleDecodeNFLOGRegister(void)
int NFQParseAndRegisterQueues(const char *queues)
Parses and adds Netfilter queue(s).
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.
int GetIfaceMaxPacketSize(LiveDevice *ld)
output max packet size for a link
SCRunMode SCRunmodeGet(void)
Get the current run mode.
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)
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)
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.
int SCConfGetInt(const char *name, intmax_t *val)
Retrieve a configuration value as an integer.
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)
#define THV_REQ_FLOW_LOOP
void FlowRateRegisterFlowStorage(void)
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 ListAppLayerHooks(const char *conf_filename)
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]
const char * SCConfigGetLogDirectory(void)
void OutputNotifyFileRotation(void)
Notifies all registered file rotation notification flags.
int StorageFinalize(void)
void VarNameStoreDestroy(void)
void TmModuleFlowWorkerRegister(void)
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.
#define TM_FLAG_RECEIVE_TM
void TmModuleReceiveErfFileRegister(void)
Register the ERF file receiver (reader) module.
int SCConfSetFromString(const char *input, int final)
Set a configuration parameter from a string.
int SCConfSetFinal(const char *name, const char *val)
Set a final configuration value.
#define SCRealloc(ptr, sz)
void TmModuleDecodeAFXDPRegister(void)
Registration Function for DecodeAFXDP.
uint32_t default_packet_size
void SigTableApplyStrictCommandLineOption(const char *str)
@ SURI_HOST_IS_SNIFFER_ONLY
@ 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 SCConfDeInit(void)
De-initializes the configuration system.
void RunModeRegisterRunModes(void)
Register all runmodes in the engine.
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)
#define TM_FLAG_PACKET_ALL
struct SCLogConfig_ SCLogConfig
Holds the config state used by the logging api.
volatile sig_atomic_t sigusr2_count
void SystemHugepageSnapshotDestroy(SystemHugepageSnapshot *s)
void TmModuleDecodePcapRegister(void)
Registration Function for DecodePcap.
TmEcode SCLoadYamlConfig(void)
TmEcode ConfigCheckDataDirectory(const char *data_dir)
SCConfNode * SCConfGetNode(const char *name)
Get a SCConfNode by name.
#define SCLogError(...)
Macro used to log ERROR messages.
int DetectEngineReloadStart(void)
void TopologyDestroy(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)
int SCConfSet(const char *name, const char *val)
Set a configuration value.
void PacketAlertTagInit(void)
int RunModeEngineIsIPS(int capture_mode, const char *runmode, const char *capture_plugin_name)
DetectEngineCtx * DetectEngineCtxInit(void)
void SCOnLoggingReady(void)
Invokes all registered logging ready callbacks.
void TmModuleDecodeLibRegister(void)
register a "Decode" module for suricata as a library.
int EngineModeIsIPS(void)
void SCProfilingKeywordsGlobalInit(void)
void EngineDone(void)
Used to indicate that the current task is done.
bool firewall_rule_file_exclusive
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 HttpRangeContainersDestroy(void)
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)
@ RUNMODE_PRINT_BUILDINFO
void SCPidfileRemove(const char *pid_filename)
Remove the pid file (used at the startup)
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
#define TM_FLAG_FLOWWORKER_TM
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)