Go to the documentation of this file.
35 #define MAX_INTERFACES 16
37 static int worker_id = 1;
42 static int g_interface_count = 0;
69 static void ReleasePacket(
Packet *p)
84 static void *SimpleWorker(
void *arg)
88 int exit_code = EXIT_SUCCESS;
92 pthread_exit((
void *)(intptr_t)EXIT_FAILURE);
96 char errbuf[PCAP_ERRBUF_SIZE];
97 pcap_t *fp = pcap_open_live(args->
interface, 65535, 1, 1000, errbuf);
99 SCLogError(
"Failed to open interface: %s", errbuf);
100 exit_code = EXIT_FAILURE;
105 assert(device != NULL);
107 int datalink = pcap_datalink(fp);
108 struct pcap_pkthdr *pkthdr;
109 const u_char *packet;
118 pcap_rc = pcap_next_ex(fp, &pkthdr, &packet);
122 }
else if (pcap_rc == -1) {
125 exit_code = EXIT_FAILURE;
127 }
else if (pcap_rc == -2) {
130 exit_code = EXIT_FAILURE;
182 pthread_exit((
void *)(intptr_t)exit_code);
185 static uint8_t RateFilterCallback(
const Packet *p,
const uint32_t sid,
const uint32_t gid,
186 const uint32_t rev, uint8_t original_action, uint8_t new_action,
void *arg)
197 static int AppRunModeSetup(
void)
199 for (
int i = 0; i < g_interface_count; i++) {
201 if (!g_worker_tvs[i]) {
202 SCLogError(
"Failed to create ThreadVars for interface %s", g_interfaces[i]);
210 int main(
int argc,
char **argv)
215 while ((opt = getopt(argc, argv,
"i:")) != -1) {
219 fprintf(stderr,
"ERROR: Maximum %d interfaces supported\n",
MAX_INTERFACES);
222 g_interfaces[g_interface_count++] = optarg;
225 fprintf(stderr,
"Usage: %s -i interface [-i interface2 ...] [suricata_options]\n",
227 fprintf(stderr,
" -i interface Network interface to capture from (can be "
228 "specified multiple times)\n");
233 if (g_interface_count == 0) {
234 fprintf(stderr,
"ERROR: At least one interface (-i) is required\n");
235 fprintf(stderr,
"Usage: %s -i interface [-i interface2 ...] [suricata_options]\n", argv[0]);
242 char *suricata_argv[argc - optind + 2];
243 int suricata_argc = 0;
244 suricata_argv[suricata_argc++] = argv[0];
245 while (optind < argc) {
246 suricata_argv[suricata_argc++] = argv[optind++];
248 suricata_argv[suricata_argc] = NULL;
252 if (suricata_argc > 1) {
253 fprintf(stderr,
"Passing command line arguments to Suricata:");
254 for (
int i = 1; i < suricata_argc; i++) {
255 fprintf(stderr,
" %s", suricata_argv[i]);
257 fprintf(stderr,
"\n");
288 RUNMODE_LIB,
"live",
"Live capture application run mode", AppRunModeSetup, NULL);
298 for (
int i = 0; i < g_interface_count; i++) {
300 FatalError(
"LiveRegisterDevice failed for %s", g_interfaces[i]);
302 SCLogNotice(
"Registered device %s", g_interfaces[i]);
315 for (
int i = 0; i < g_interface_count; i++) {
316 worker_args[i].
tv = g_worker_tvs[i];
317 worker_args[i].
interface = g_interfaces[i];
320 if (pthread_create(&workers[i], NULL, SimpleWorker, &worker_args[i]) != 0) {
321 FatalError(
"Failed to create worker thread for interface %s", g_interfaces[i]);
324 SCLogNotice(
"Started worker thread for interface %s", g_interfaces[i]);
343 int exit_status = EXIT_SUCCESS;
344 for (
int i = 0; i < g_interface_count; i++) {
346 pthread_join(workers[i], &worker_status);
347 if ((intptr_t)worker_status != EXIT_SUCCESS) {
348 exit_status = EXIT_FAILURE;
bool PacketCheckAction(const Packet *p, const uint8_t a)
bool SCTmThreadsSlotPacketLoopFinish(ThreadVars *tv)
void SuricataMainLoop(void)
int LiveRegisterDevice(const char *dev)
Add a pcap device for monitoring and create structure.
void SCEnableDefaultSignalHandlers(void)
Enable default signal handlers.
void PacketFreeOrRelease(Packet *p)
Return a packet to where it was allocated.
void SCPacketSetLiveDevice(Packet *p, LiveDevice *device)
Set a packets live device.
void SuricataPostInit(void)
TmEcode SCParseCommandLine(int argc, char **argv)
void SuricataShutdown(void)
void TmqhOutputPacketpool(ThreadVars *t, Packet *p)
void SCPacketSetSource(Packet *p, enum PktSrcEnum source)
Set packet source.
void SCRunmodeSet(SCRunMode run_mode)
Set the current run mode.
int main(int argc, char **argv)
struct TmSlot_ * tm_slots
LiveDevice * LiveGetDevice(const char *name)
Get a pointer to the device at idx.
Per thread variable structure.
#define SCTIME_FROM_TIMEVAL(tv)
int SCRunModeLibSpawnWorker(void *td)
start the "fake" worker.
void SCDetectEngineRegisterRateFilterCallback(SCDetectRateFilterFunc fn, void *arg)
Register a callback when a rate_filter has been applied to an alert.
void RunModeRegisterNewRunMode(enum SCRunModes runmode, const char *name, const char *description, int(*RunModeFunc)(void), int(*RunModeIsIPSEnabled)(void))
Registers a new runmode.
void SCPacketSetTime(Packet *p, SCTime_t ts)
Set the timestamp for a packet.
int SCConfSetFromString(const char *input, int final)
Set a configuration parameter from a string.
void SCPacketSetReleasePacket(Packet *p, void(*ReleasePacket)(Packet *p))
Set a packet release function.
void EngineStop(void)
make sure threads can stop the engine by calling this function. Purpose: pcap file mode needs to be a...
TmEcode SCLoadYamlConfig(void)
#define SCLogError(...)
Macro used to log ERROR messages.
ThreadVars * SCRunModeLibCreateThreadVars(int worker_id)
Create ThreadVars for use by a user provided thread.
int PacketSetData(Packet *p, const uint8_t *pktdata, uint32_t pktlen)
Set data for Packet and set length when zero copy is used.
void SCPacketSetDatalink(Packet *p, int datalink)
Set a packets data link type.
#define SCLogNotice(...)
Macro used to log NOTICE messages.
void SuricataPreInit(const char *progname)
Packet * PacketGetFromQueueOrAlloc(void)
Get a packet. We try to get a packet from the packetpool first, but if that is empty we alloc a packe...
int SCFinalizeRunMode(void)
void GlobalsDestroy(void)
volatile uint8_t suricata_ctl_flags
void LiveDevicePktsIncr(LiveDevice *dev)