* [PATCH conntrack-tools v2 0/2] conntrack: introduce --labelmap option to specify connlabel.conf path
@ 2025-06-17 10:48 Christoph Heiss
2025-06-17 10:48 ` [PATCH conntrack-tools v2 1/2] conntrack: move label parsing after argument parsing Christoph Heiss
` (2 more replies)
0 siblings, 3 replies; 5+ messages in thread
From: Christoph Heiss @ 2025-06-17 10:48 UTC (permalink / raw)
To: netfilter-devel
Enables specifying a path to a connlabel.conf to load instead of the
default one at /etc/xtables/connlabel.conf.
nfct_labelmap_new() already allows supplying a custom path to load
labels from, so it just needs to be passed in there.
First patch is preparatory only; to make --labelmap
position-independent.
v1: https://lore.kernel.org/netfilter-devel/20250613102742.409820-1-c.heiss@proxmox.com/
Changes v1 -> v2:
* introduced preparatory patch moving label merging after arg parsing
* removed redundant `if` around free() call
* abort if --labelmap is specified multiple times
Christoph Heiss (2):
conntrack: move label parsing to after argument parsing
conntrack: introduce --labelmap option to specify connlabel.conf path
conntrack.8 | 5 ++
include/conntrack.h | 2 +-
src/conntrack.c | 124 +++++++++++++++++++++++++++++---------------
3 files changed, 88 insertions(+), 43 deletions(-)
--
2.49.0
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH conntrack-tools v2 1/2] conntrack: move label parsing after argument parsing
2025-06-17 10:48 [PATCH conntrack-tools v2 0/2] conntrack: introduce --labelmap option to specify connlabel.conf path Christoph Heiss
@ 2025-06-17 10:48 ` Christoph Heiss
2025-06-19 22:15 ` Pablo Neira Ayuso
2025-06-17 10:48 ` [PATCH conntrack-tools v2 2/2] conntrack: introduce --labelmap option to specify connlabel.conf path Christoph Heiss
2025-06-18 22:16 ` [PATCH conntrack-tools v2 0/2] " Florian Westphal
2 siblings, 1 reply; 5+ messages in thread
From: Christoph Heiss @ 2025-06-17 10:48 UTC (permalink / raw)
To: netfilter-devel
Instead of parsing directly inline while parsing, put them into a list
and do it afterwards.
Preparation for introduction a new `--labelmap` option to specify the
path to the label mapping file.
Signed-off-by: Christoph Heiss <c.heiss@proxmox.com>
---
src/conntrack.c | 60 ++++++++++++++++++++++++++++++++++---------------
1 file changed, 42 insertions(+), 18 deletions(-)
diff --git a/src/conntrack.c b/src/conntrack.c
index 2d4e864..b9afd2f 100644
--- a/src/conntrack.c
+++ b/src/conntrack.c
@@ -122,6 +122,12 @@ struct ct_cmd {
struct ct_tmpl tmpl;
};
+struct ct_label {
+ struct list_head list;
+ char *name;
+ bool is_modify;
+};
+
static int alloc_tmpl_objects(struct ct_tmpl *tmpl)
{
tmpl->ct = nfct_new();
@@ -2963,6 +2969,30 @@ static int print_stats(const struct ct_cmd *cmd)
return 0;
}
+static void parse_and_merge_labels(struct list_head *labels, struct ct_tmpl *tmpl)
+{
+ struct ct_label *l, *next;
+ list_for_each_entry_safe(l, next, labels, list) {
+ unsigned int max = parse_label_get_max(l->name);
+ struct nfct_bitmask *b = nfct_bitmask_new(max);
+ if (!b)
+ exit_error(OTHER_PROBLEM, "out of memory");
+
+ parse_label(b, l->name);
+
+ /* join "-l foo -l bar" into single bitmask object */
+ if (l->is_modify) {
+ merge_bitmasks(&tmpl->label_modify, b);
+ } else {
+ merge_bitmasks(&tmpl->label, b);
+ }
+
+ list_del(&l->list);
+ free(l->name);
+ free(l);
+ }
+}
+
static void do_parse(struct ct_cmd *ct_cmd, int argc, char *argv[])
{
unsigned int type = 0, event_mask = 0, l4flags = 0, status = 0;
@@ -2973,6 +3003,7 @@ static void do_parse(struct ct_cmd *ct_cmd, int argc, char *argv[])
struct ct_tmpl *tmpl;
int res = 0, partial;
union ct_address ad;
+ LIST_HEAD(labels);
uint32_t value;
int c, cmd;
@@ -3088,8 +3119,6 @@ static void do_parse(struct ct_cmd *ct_cmd, int argc, char *argv[])
case 'o':
options |= CT_OPT_OUTPUT;
parse_parameter(optarg, &output_mask, PARSE_OUTPUT);
- if (output_mask & _O_CL)
- labelmap_init();
if ((output_mask & _O_SAVE) &&
(output_mask & (_O_EXT |_O_TMS |_O_ID | _O_KTMS | _O_CL | _O_XML)))
exit_error(OTHER_PROBLEM,
@@ -3162,8 +3191,6 @@ static void do_parse(struct ct_cmd *ct_cmd, int argc, char *argv[])
case '>':
options |= opt2type[c];
- labelmap_init();
-
if ((options & (CT_OPT_DEL_LABEL|CT_OPT_ADD_LABEL)) ==
(CT_OPT_DEL_LABEL|CT_OPT_ADD_LABEL))
exit_error(OTHER_PROBLEM, "cannot use --label-add and "
@@ -3176,22 +3203,13 @@ static void do_parse(struct ct_cmd *ct_cmd, int argc, char *argv[])
optarg = tmp;
}
- char *optarg2 = strdup(optarg);
- unsigned int max = parse_label_get_max(optarg);
- struct nfct_bitmask * b = nfct_bitmask_new(max);
- if (!b)
+ struct ct_label *l = calloc(1, sizeof(*l));
+ if (!l)
exit_error(OTHER_PROBLEM, "out of memory");
- parse_label(b, optarg2);
-
- /* join "-l foo -l bar" into single bitmask object */
- if (c == 'l') {
- merge_bitmasks(&tmpl->label, b);
- } else {
- merge_bitmasks(&tmpl->label_modify, b);
- }
-
- free(optarg2);
+ l->name = strdup(optarg);
+ l->is_modify = c == '<' || c == '>';
+ list_add_tail(&l->list, &labels);
break;
case 'a':
fprintf(stderr, "WARNING: ignoring -%c, "
@@ -3246,6 +3264,12 @@ static void do_parse(struct ct_cmd *ct_cmd, int argc, char *argv[])
}
}
+ /* any of these options (might) use labels */
+ if ((options & (CT_OPT_LABEL | CT_OPT_ADD_LABEL | CT_OPT_DEL_LABEL)) ||
+ ((options & CT_OPT_OUTPUT) && (output_mask & _O_CL))) {
+ labelmap_init();
+ parse_and_merge_labels(&labels, tmpl);
+ }
/* we cannot check this combination with generic_opt_check. */
if (options & CT_OPT_ANY_NAT &&
--
2.49.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH conntrack-tools v2 2/2] conntrack: introduce --labelmap option to specify connlabel.conf path
2025-06-17 10:48 [PATCH conntrack-tools v2 0/2] conntrack: introduce --labelmap option to specify connlabel.conf path Christoph Heiss
2025-06-17 10:48 ` [PATCH conntrack-tools v2 1/2] conntrack: move label parsing after argument parsing Christoph Heiss
@ 2025-06-17 10:48 ` Christoph Heiss
2025-06-18 22:16 ` [PATCH conntrack-tools v2 0/2] " Florian Westphal
2 siblings, 0 replies; 5+ messages in thread
From: Christoph Heiss @ 2025-06-17 10:48 UTC (permalink / raw)
To: netfilter-devel
Enables specifying a path to a connlabel.conf to load instead of the
default one at /etc/xtables/connlabel.conf.
nfct_labelmap_new() already allows supplying a custom path to load
labels from, so it just needs to be passed in there.
Signed-off-by: Christoph Heiss <c.heiss@proxmox.com>
---
conntrack.8 | 5 ++++
include/conntrack.h | 2 +-
src/conntrack.c | 64 ++++++++++++++++++++++++++++-----------------
3 files changed, 46 insertions(+), 25 deletions(-)
diff --git a/conntrack.8 b/conntrack.8
index 3b6a15b..2bfd80e 100644
--- a/conntrack.8
+++ b/conntrack.8
@@ -189,6 +189,11 @@ This option is only available in conjunction with "\-L, \-\-dump",
Match entries whose labels include those specified as arguments.
Use multiple \-l options to specify multiple labels that need to be set.
.TP
+.BI "--labelmap " "PATH"
+Specify the path to a connlabel.conf file to load instead of the default one.
+This option is only available in conjunction with "\-L, \-\-dump", "\-E,
+\-\-event", "\-U \-\-update" or "\-D \-\-delete".
+.TP
.BI "--label-add " "LABEL"
Specify the conntrack label to add to the selected conntracks.
This option is only available in conjunction with "\-I, \-\-create",
diff --git a/include/conntrack.h b/include/conntrack.h
index 6dad4a1..317cab6 100644
--- a/include/conntrack.h
+++ b/include/conntrack.h
@@ -78,7 +78,7 @@ enum ct_command {
};
#define NUMBER_OF_CMD _CT_BIT_MAX
-#define NUMBER_OF_OPT 29
+#define NUMBER_OF_OPT 30
struct nf_conntrack;
diff --git a/src/conntrack.c b/src/conntrack.c
index b9afd2f..0622b9e 100644
--- a/src/conntrack.c
+++ b/src/conntrack.c
@@ -255,6 +255,9 @@ enum ct_options {
CT_OPT_REPL_ZONE_BIT = 28,
CT_OPT_REPL_ZONE = (1 << CT_OPT_REPL_ZONE_BIT),
+
+ CT_OPT_LABELMAP_BIT = 29,
+ CT_OPT_LABELMAP = (1 << CT_OPT_LABELMAP_BIT),
};
/* If you add a new option, you have to update NUMBER_OF_OPT in conntrack.h */
@@ -294,6 +297,7 @@ static const char *optflags[NUMBER_OF_OPT] = {
[CT_OPT_DEL_LABEL_BIT] = "label-del",
[CT_OPT_ORIG_ZONE_BIT] = "orig-zone",
[CT_OPT_REPL_ZONE_BIT] = "reply-zone",
+ [CT_OPT_LABELMAP_BIT] = "labelmap",
};
static struct option original_opts[] = {
@@ -336,6 +340,7 @@ static struct option original_opts[] = {
{"any-nat", 2, 0, 'j'},
{"zone", 1, 0, 'w'},
{"label", 1, 0, 'l'},
+ {"labelmap", 1, 0, 'M'},
{"label-add", 1, 0, '<'},
{"label-del", 2, 0, '>'},
{"orig-zone", 1, 0, '('},
@@ -345,7 +350,7 @@ static struct option original_opts[] = {
static const char *getopt_str = ":LIUDGEFAhVs:d:r:q:"
"p:t:u:e:a:z[:]:{:}:m:i:f:o:n::"
- "g::c:b:C::Sj::w:l:<:>::(:):";
+ "g::c:b:C::Sj::w:l:<:>::(:):M:";
/* Table of legal combinations of commands and options. If any of the
* given commands make an option legal, that option is legal (applies to
@@ -360,27 +365,27 @@ static const char *getopt_str = ":LIUDGEFAhVs:d:r:q:"
static char commands_v_options[NUMBER_OF_CMD][NUMBER_OF_OPT] =
/* Well, it's better than "Re: Linux vs FreeBSD" */
{
- /* s d r q p t u z e [ ] { } a m i f n g o c b j w l < > ( ) */
- [CT_LIST_BIT] = {2,2,2,2,2,0,2,2,0,0,0,2,2,0,2,0,2,2,2,2,2,0,2,2,2,0,0,2,2},
- [CT_CREATE_BIT] = {3,3,3,3,1,1,2,0,0,0,0,0,0,2,2,0,0,2,2,0,0,0,0,2,0,2,0,2,2},
- [CT_UPDATE_BIT] = {2,2,2,2,2,2,2,0,0,0,0,2,2,0,2,2,2,2,2,2,0,0,0,0,2,2,2,0,0},
- [CT_DELETE_BIT] = {2,2,2,2,2,2,2,0,0,0,0,2,2,0,2,2,2,2,2,2,0,0,0,2,2,0,0,2,2},
- [CT_GET_BIT] = {3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,2,0,0,0,0},
- [CT_FLUSH_BIT] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0},
- [CT_EVENT_BIT] = {2,2,2,2,2,0,0,0,2,0,0,2,2,0,2,0,2,2,2,2,2,2,2,2,2,0,0,2,2},
- [CT_VERSION_BIT]= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
- [CT_HELP_BIT] = {0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
- [EXP_LIST_BIT] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,0},
- [EXP_CREATE_BIT]= {1,1,2,2,1,1,2,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
- [EXP_DELETE_BIT]= {1,1,2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
- [EXP_GET_BIT] = {1,1,2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
- [EXP_FLUSH_BIT] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
- [EXP_EVENT_BIT] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0},
- [CT_COUNT_BIT] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
- [EXP_COUNT_BIT] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
- [CT_STATS_BIT] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
- [EXP_STATS_BIT] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
- [CT_ADD_BIT] = {3,3,3,3,1,1,2,0,0,0,0,0,0,2,2,0,0,2,2,0,0,0,0,2,0,2,0,2,2},
+ /* s d r q p t u z e [ ] { } a m i f n g o c b j w l < > ( ) M */
+ [CT_LIST_BIT] = {2,2,2,2,2,0,2,2,0,0,0,2,2,0,2,0,2,2,2,2,2,0,2,2,2,0,0,2,2,2},
+ [CT_CREATE_BIT] = {3,3,3,3,1,1,2,0,0,0,0,0,0,2,2,0,0,2,2,0,0,0,0,2,0,2,0,2,2,0},
+ [CT_UPDATE_BIT] = {2,2,2,2,2,2,2,0,0,0,0,2,2,0,2,2,2,2,2,2,0,0,0,0,2,2,2,0,0,2},
+ [CT_DELETE_BIT] = {2,2,2,2,2,2,2,0,0,0,0,2,2,0,2,2,2,2,2,2,0,0,0,2,2,0,0,2,2,2},
+ [CT_GET_BIT] = {3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,2,0,0,0,0,0},
+ [CT_FLUSH_BIT] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0},
+ [CT_EVENT_BIT] = {2,2,2,2,2,0,0,0,2,0,0,2,2,0,2,0,2,2,2,2,2,2,2,2,2,0,0,2,2,2},
+ [CT_VERSION_BIT]= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
+ [CT_HELP_BIT] = {0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
+ [EXP_LIST_BIT] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0},
+ [EXP_CREATE_BIT]= {1,1,2,2,1,1,2,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
+ [EXP_DELETE_BIT]= {1,1,2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
+ [EXP_GET_BIT] = {1,1,2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
+ [EXP_FLUSH_BIT] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
+ [EXP_EVENT_BIT] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0},
+ [CT_COUNT_BIT] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
+ [EXP_COUNT_BIT] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
+ [CT_STATS_BIT] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
+ [EXP_STATS_BIT] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
+ [CT_ADD_BIT] = {3,3,3,3,1,1,2,0,0,0,0,0,0,2,2,0,0,2,2,0,0,0,0,2,0,2,0,2,2,0},
};
static const int cmd2type[][2] = {
@@ -419,6 +424,7 @@ static const int opt2type[] = {
['>'] = CT_OPT_DEL_LABEL,
['('] = CT_OPT_ORIG_ZONE,
[')'] = CT_OPT_REPL_ZONE,
+ ['M'] = CT_OPT_LABELMAP,
};
static const int opt2maskopt[] = {
@@ -527,7 +533,8 @@ static const char usage_conntrack_parameters[] =
" -e, --event-mask eventmask\t\tEvent mask, eg. NEW,DESTROY\n"
" -z, --zero \t\t\t\tZero counters while listing\n"
" -o, --output type[,...]\t\tOutput format, eg. xml\n"
- " -l, --label label[,...]\t\tconntrack labels\n";
+ " -l, --label label[,...]\t\tconntrack labels\n"
+ " --labelmap path\t\t\tconnlabel file to use instead of default\n";
static const char usage_expectation_parameters[] =
"Expectation parameters and options:\n"
@@ -572,6 +579,7 @@ static unsigned int addr_valid_flags[ADDR_VALID_FLAGS_MAX] = {
static LIST_HEAD(proto_list);
+static char *labelmap_path;
static struct nfct_labelmap *labelmap;
static int filter_family;
@@ -2762,7 +2770,7 @@ static void labelmap_init(void)
{
if (labelmap)
return;
- labelmap = nfct_labelmap_new(NULL);
+ labelmap = nfct_labelmap_new(labelmap_path);
if (!labelmap)
perror("nfct_labelmap_new");
}
@@ -3230,6 +3238,13 @@ static void do_parse(struct ct_cmd *ct_cmd, int argc, char *argv[])
socketbuffersize = atol(optarg);
options |= CT_OPT_BUFFERSIZE;
break;
+ case 'M':
+ if (labelmap_path)
+ exit_error(PARAMETER_PROBLEM, "option `--labelmap' can only be specified once");
+
+ labelmap_path = strdup(optarg);
+ options |= CT_OPT_LABELMAP;
+ break;
case ':':
exit_error(PARAMETER_PROBLEM,
"option `%s' requires an "
@@ -3700,6 +3715,7 @@ try_proc:
free_tmpl_objects(&cmd->tmpl);
if (labelmap)
nfct_labelmap_destroy(labelmap);
+ free(labelmap_path);
return EXIT_SUCCESS;
}
--
2.49.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH conntrack-tools v2 0/2] conntrack: introduce --labelmap option to specify connlabel.conf path
2025-06-17 10:48 [PATCH conntrack-tools v2 0/2] conntrack: introduce --labelmap option to specify connlabel.conf path Christoph Heiss
2025-06-17 10:48 ` [PATCH conntrack-tools v2 1/2] conntrack: move label parsing after argument parsing Christoph Heiss
2025-06-17 10:48 ` [PATCH conntrack-tools v2 2/2] conntrack: introduce --labelmap option to specify connlabel.conf path Christoph Heiss
@ 2025-06-18 22:16 ` Florian Westphal
2 siblings, 0 replies; 5+ messages in thread
From: Florian Westphal @ 2025-06-18 22:16 UTC (permalink / raw)
To: Christoph Heiss; +Cc: netfilter-devel
Christoph Heiss <c.heiss@proxmox.com> wrote:
> Enables specifying a path to a connlabel.conf to load instead of the
> default one at /etc/xtables/connlabel.conf.
>
> nfct_labelmap_new() already allows supplying a custom path to load
> labels from, so it just needs to be passed in there.
>
> First patch is preparatory only; to make --labelmap
> position-independent.
>
> v1: https://lore.kernel.org/netfilter-devel/20250613102742.409820-1-c.heiss@proxmox.com/
>
> Changes v1 -> v2:
> * introduced preparatory patch moving label merging after arg parsing
> * removed redundant `if` around free() call
> * abort if --labelmap is specified multiple times
Changes look good to me, thanks.
I intend to apply this series in the next few days unless someone else
beats me to it (or has change requess).
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH conntrack-tools v2 1/2] conntrack: move label parsing after argument parsing
2025-06-17 10:48 ` [PATCH conntrack-tools v2 1/2] conntrack: move label parsing after argument parsing Christoph Heiss
@ 2025-06-19 22:15 ` Pablo Neira Ayuso
0 siblings, 0 replies; 5+ messages in thread
From: Pablo Neira Ayuso @ 2025-06-19 22:15 UTC (permalink / raw)
To: Christoph Heiss; +Cc: netfilter-devel, fw
Hi Christoph,
On Tue, Jun 17, 2025 at 12:48:33PM +0200, Christoph Heiss wrote:
> Instead of parsing directly inline while parsing, put them into a list
> and do it afterwards.
>
> Preparation for introduction a new `--labelmap` option to specify the
> path to the label mapping file.
Just a few cosmetic nitpicks on my side.
> Signed-off-by: Christoph Heiss <c.heiss@proxmox.com>
> ---
> src/conntrack.c | 60 ++++++++++++++++++++++++++++++++++---------------
> 1 file changed, 42 insertions(+), 18 deletions(-)
>
> diff --git a/src/conntrack.c b/src/conntrack.c
> index 2d4e864..b9afd2f 100644
> --- a/src/conntrack.c
> +++ b/src/conntrack.c
> @@ -122,6 +122,12 @@ struct ct_cmd {
> struct ct_tmpl tmpl;
> };
>
> +struct ct_label {
> + struct list_head list;
> + char *name;
> + bool is_modify;
> +};
> +
> static int alloc_tmpl_objects(struct ct_tmpl *tmpl)
> {
> tmpl->ct = nfct_new();
> @@ -2963,6 +2969,30 @@ static int print_stats(const struct ct_cmd *cmd)
> return 0;
> }
>
> +static void parse_and_merge_labels(struct list_head *labels, struct ct_tmpl *tmpl)
> +{
> + struct ct_label *l, *next;
struct nfct_bitmask *b;
unsigned int max;
reverse xmas tree in variable declaration
and line break here after variable declaration block.
I would suggest these variable names:
- label_list instead of labels.
- label instead of l.
the short variable name 'l' usually makes it harder to search for
variables in my editor.
> + list_for_each_entry_safe(l, next, labels, list) {
> + unsigned int max = parse_label_get_max(l->name);
> + struct nfct_bitmask *b = nfct_bitmask_new(max);
> + if (!b)
> + exit_error(OTHER_PROBLEM, "out of memory");
> +
> + parse_label(b, l->name);
> +
> + /* join "-l foo -l bar" into single bitmask object */
> + if (l->is_modify) {
> + merge_bitmasks(&tmpl->label_modify, b);
> + } else {
> + merge_bitmasks(&tmpl->label, b);
> + }
For single statement:
if (l->is_modify)
merge_bitmasks(&tmpl->label_modify, b);
else
merge_bitmasks(&tmpl->label, b);
Just cosmetic stuff, I hope not to bother you and Florian too much
with this.
> +
> + list_del(&l->list);
> + free(l->name);
> + free(l);
> + }
> +}
> +
> static void do_parse(struct ct_cmd *ct_cmd, int argc, char *argv[])
> {
> unsigned int type = 0, event_mask = 0, l4flags = 0, status = 0;
> @@ -2973,6 +3003,7 @@ static void do_parse(struct ct_cmd *ct_cmd, int argc, char *argv[])
> struct ct_tmpl *tmpl;
> int res = 0, partial;
> union ct_address ad;
> + LIST_HEAD(labels);
> uint32_t value;
> int c, cmd;
>
> @@ -3088,8 +3119,6 @@ static void do_parse(struct ct_cmd *ct_cmd, int argc, char *argv[])
> case 'o':
> options |= CT_OPT_OUTPUT;
> parse_parameter(optarg, &output_mask, PARSE_OUTPUT);
> - if (output_mask & _O_CL)
> - labelmap_init();
> if ((output_mask & _O_SAVE) &&
> (output_mask & (_O_EXT |_O_TMS |_O_ID | _O_KTMS | _O_CL | _O_XML)))
> exit_error(OTHER_PROBLEM,
> @@ -3162,8 +3191,6 @@ static void do_parse(struct ct_cmd *ct_cmd, int argc, char *argv[])
> case '>':
> options |= opt2type[c];
>
> - labelmap_init();
> -
> if ((options & (CT_OPT_DEL_LABEL|CT_OPT_ADD_LABEL)) ==
> (CT_OPT_DEL_LABEL|CT_OPT_ADD_LABEL))
> exit_error(OTHER_PROBLEM, "cannot use --label-add and "
> @@ -3176,22 +3203,13 @@ static void do_parse(struct ct_cmd *ct_cmd, int argc, char *argv[])
> optarg = tmp;
> }
>
> - char *optarg2 = strdup(optarg);
> - unsigned int max = parse_label_get_max(optarg);
> - struct nfct_bitmask * b = nfct_bitmask_new(max);
> - if (!b)
> + struct ct_label *l = calloc(1, sizeof(*l));
> + if (!l)
> exit_error(OTHER_PROBLEM, "out of memory");
>
> - parse_label(b, optarg2);
> -
> - /* join "-l foo -l bar" into single bitmask object */
> - if (c == 'l') {
> - merge_bitmasks(&tmpl->label, b);
> - } else {
> - merge_bitmasks(&tmpl->label_modify, b);
> - }
> -
> - free(optarg2);
> + l->name = strdup(optarg);
> + l->is_modify = c == '<' || c == '>';
> + list_add_tail(&l->list, &labels);
> break;
> case 'a':
> fprintf(stderr, "WARNING: ignoring -%c, "
> @@ -3246,6 +3264,12 @@ static void do_parse(struct ct_cmd *ct_cmd, int argc, char *argv[])
> }
> }
>
> + /* any of these options (might) use labels */
> + if ((options & (CT_OPT_LABEL | CT_OPT_ADD_LABEL | CT_OPT_DEL_LABEL)) ||
> + ((options & CT_OPT_OUTPUT) && (output_mask & _O_CL))) {
> + labelmap_init();
> + parse_and_merge_labels(&labels, tmpl);
> + }
>
> /* we cannot check this combination with generic_opt_check. */
> if (options & CT_OPT_ANY_NAT &&
> --
> 2.49.0
>
>
>
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2025-06-19 22:15 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-06-17 10:48 [PATCH conntrack-tools v2 0/2] conntrack: introduce --labelmap option to specify connlabel.conf path Christoph Heiss
2025-06-17 10:48 ` [PATCH conntrack-tools v2 1/2] conntrack: move label parsing after argument parsing Christoph Heiss
2025-06-19 22:15 ` Pablo Neira Ayuso
2025-06-17 10:48 ` [PATCH conntrack-tools v2 2/2] conntrack: introduce --labelmap option to specify connlabel.conf path Christoph Heiss
2025-06-18 22:16 ` [PATCH conntrack-tools v2 0/2] " Florian Westphal
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.