Coverage Report

Created: 2026-02-14 06:42

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/suricata7/src/runmode-nflog.c
Line
Count
Source
1
/* Copyright (C) 2014-2022 Open Information Security Foundation
2
 *
3
 * You can copy, redistribute or modify this Program under the terms of
4
 * the GNU General Public License version 2 as published by the Free
5
 * Software Foundation.
6
 *
7
 * This program is distributed in the hope that it will be useful,
8
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10
 * GNU General Public License for more details.
11
 *
12
 * You should have received a copy of the GNU General Public License
13
 * version 2 along with this program; if not, write to the Free Software
14
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
15
 * 02110-1301, USA.
16
 */
17
18
/**
19
 * \file
20
 *
21
 * \author Giuseppe Longo <giuseppelng@gmail.com>
22
 */
23
#include "suricata-common.h"
24
#include "tm-threads.h"
25
#include "conf.h"
26
#include "runmodes.h"
27
#include "runmode-nflog.h"
28
29
#include "util-debug.h"
30
#include "util-device.h"
31
#include "util-runmodes.h"
32
#include "util-misc.h"
33
34
#include "source-nflog.h"
35
36
#ifdef HAVE_NFLOG
37
#include "util-time.h"
38
39
static void NflogDerefConfig(void *data)
40
{
41
    NflogGroupConfig *nflogconf = (NflogGroupConfig *)data;
42
    SCFree(nflogconf);
43
}
44
45
static void *ParseNflogConfig(const char *group)
46
{
47
    ConfNode *group_root;
48
    ConfNode *group_default = NULL;
49
    ConfNode *nflog_node;
50
    NflogGroupConfig *nflogconf = SCMalloc(sizeof(*nflogconf));
51
    intmax_t bufsize;
52
    intmax_t bufsize_max;
53
    intmax_t qthreshold;
54
    intmax_t qtimeout;
55
    int boolval;
56
57
    if (unlikely(nflogconf == NULL))
58
        return NULL;
59
60
    if (group == NULL) {
61
        SCFree(nflogconf);
62
        return NULL;
63
    }
64
65
    nflogconf->DerefFunc = NflogDerefConfig;
66
    nflog_node = ConfGetNode("nflog");
67
68
    if (nflog_node == NULL) {
69
        SCLogInfo("Unable to find nflog config using default value");
70
        return nflogconf;
71
    }
72
73
    group_root = ConfNodeLookupKeyValue(nflog_node, "group", group);
74
75
    group_default = ConfNodeLookupKeyValue(nflog_node, "group", "default");
76
77
    if (group_root == NULL && group_default == NULL) {
78
        SCLogInfo("Unable to find nflog config for "
79
                  "group \"%s\" or \"default\", using default value",
80
                  group);
81
        return nflogconf;
82
    }
83
84
    nflogconf->nful_overrun_warned = 0;
85
    strlcpy(nflogconf->numgroup, group, sizeof(nflogconf->numgroup));
86
87
    if (ParseSizeStringU16(group, &nflogconf->group) < 0) {
88
        FatalError("NFLOG's group number invalid.");
89
    }
90
91
    boolval = ConfGetChildValueIntWithDefault(group_root, group_default,
92
                                              "buffer-size", &bufsize);
93
94
    if (boolval)
95
        nflogconf->nlbufsiz = bufsize;
96
    else {
97
        SCLogError("Invalid buffer-size value");
98
        SCFree(nflogconf);
99
        return NULL;
100
    }
101
102
    boolval = ConfGetChildValueIntWithDefault(group_root, group_default,
103
                                              "max-size", &bufsize_max);
104
105
    if (boolval)
106
        nflogconf->nlbufsiz_max = bufsize_max;
107
    else {
108
        SCLogError("Invalid max-size value");
109
        SCFree(nflogconf);
110
        return NULL;
111
    }
112
113
    if (nflogconf->nlbufsiz > nflogconf->nlbufsiz_max) {
114
        SCLogWarning("buffer-size value larger "
115
                     "than max-size value, adjusting buffer-size");
116
        nflogconf->nlbufsiz = nflogconf->nlbufsiz_max;
117
    }
118
119
    boolval = ConfGetChildValueIntWithDefault(group_root, group_default,
120
                                              "qthreshold", &qthreshold);
121
122
    if (boolval)
123
        nflogconf->qthreshold = qthreshold;
124
    else {
125
        SCLogError("Invalid qthreshold value");
126
        SCFree(nflogconf);
127
        return NULL;
128
    }
129
130
    boolval = ConfGetChildValueIntWithDefault(group_root, group_default,
131
                                              "qtimeout", &qtimeout);
132
133
    if (boolval)
134
        nflogconf->qtimeout = qtimeout;
135
    else {
136
        SCLogError("Invalid qtimeout value");
137
        SCFree(nflogconf);
138
        return NULL;
139
    }
140
141
    return nflogconf;
142
}
143
144
static int NflogConfigGeThreadsCount(void *conf)
145
{
146
    /* for each nflog group there is no reason to use more than 1 thread */
147
    return 1;
148
}
149
#endif
150
151
static int RunModeIdsNflogAutoFp(void)
152
0
{
153
0
    SCEnter();
154
155
#ifdef HAVE_NFLOG
156
    TimeModeSetLive();
157
158
    int ret = RunModeSetLiveCaptureAutoFp(ParseNflogConfig, NflogConfigGeThreadsCount,
159
            "ReceiveNFLOG", "DecodeNFLOG", thread_name_autofp, NULL);
160
    if (ret != 0) {
161
        FatalError("Unable to start runmode");
162
    }
163
164
    SCLogInfo("RunModeIdsNflogAutoFp initialised");
165
#endif /* HAVE_NFLOG */
166
167
0
    SCReturnInt(0);
168
0
}
169
170
static int RunModeIdsNflogSingle(void)
171
0
{
172
0
    SCEnter();
173
174
#ifdef HAVE_NFLOG
175
    TimeModeSetLive();
176
177
    int ret = RunModeSetLiveCaptureSingle(ParseNflogConfig, NflogConfigGeThreadsCount,
178
            "ReceiveNFLOG", "DecodeNFLOG", thread_name_single, NULL);
179
    if (ret != 0) {
180
        FatalError("Unable to start runmode");
181
    }
182
183
    SCLogInfo("RunModeIdsNflogSingle initialised");
184
#endif /* HAVE_NFLOG */
185
186
0
    SCReturnInt(0);
187
0
}
188
189
static int RunModeIdsNflogWorkers(void)
190
0
{
191
0
    SCEnter();
192
193
#ifdef HAVE_NFLOG
194
    TimeModeSetLive();
195
196
    int ret = RunModeSetLiveCaptureWorkers(ParseNflogConfig, NflogConfigGeThreadsCount,
197
            "ReceiveNFLOG", "DecodeNFLOG", thread_name_workers, NULL);
198
    if (ret != 0) {
199
        FatalError("Unable to start runmode");
200
    }
201
202
    SCLogInfo("RunModeIdsNflogWorkers initialised");
203
#endif /* HAVE_NFLOG */
204
205
0
    SCReturnInt(0);
206
0
}
207
208
const char *RunModeIdsNflogGetDefaultMode(void)
209
0
{
210
0
    return "autofp";
211
0
}
212
213
void RunModeIdsNflogRegister(void)
214
37
{
215
37
    RunModeRegisterNewRunMode(
216
37
            RUNMODE_NFLOG, "autofp", "Multi threaded nflog mode", RunModeIdsNflogAutoFp, NULL);
217
37
    RunModeRegisterNewRunMode(
218
37
            RUNMODE_NFLOG, "single", "Single threaded nflog mode", RunModeIdsNflogSingle, NULL);
219
37
    RunModeRegisterNewRunMode(
220
            RUNMODE_NFLOG, "workers", "Workers nflog mode", RunModeIdsNflogWorkers, NULL);
221
37
    return;
222
37
}