summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFlorian Westphal <fw@strlen.de>2025-01-09 14:15:36 +0100
committerFlorian Westphal <fw@strlen.de>2025-02-07 13:13:30 +0100
commit7e416f3c6217687ab35f07e14bd268109d5be4c3 (patch)
tree6307ec5bea71a92be28ff472da39ff04627fb4c8
parenta722c6cf3baebd9ad216daf239fa9a7afc88821d (diff)
src: add support for CTA_TIMESTAMP_EVENTHEADmaster
Allow libnetfilter_conntrack to parse CTA_TIMESTAMP_EVENT attribute. This will be included for all ctnetlink events if the kernel has commit netfilter: conntrack: add conntrack event timestamp and net.netfilter.nf_conntrack_timestamp sysctl is set to 1. Signed-off-by: Florian Westphal <fw@strlen.de> Reviewed-by: Pablo Neira Ayuso <pablo@netfilter.org>
-rw-r--r--include/internal/object.h1
-rw-r--r--include/libnetfilter_conntrack/libnetfilter_conntrack.h1
-rw-r--r--include/libnetfilter_conntrack/linux_nfnetlink_conntrack.h1
-rw-r--r--src/conntrack/getter.c6
-rw-r--r--src/conntrack/parse_mnl.c10
5 files changed, 19 insertions, 0 deletions
diff --git a/include/internal/object.h b/include/internal/object.h
index 658e4d2..d72b31c 100644
--- a/include/internal/object.h
+++ b/include/internal/object.h
@@ -201,6 +201,7 @@ struct nf_conntrack {
struct nfct_bitmask *connlabels;
struct nfct_bitmask *connlabels_mask;
+ uint64_t timestamp_event;
};
/*
diff --git a/include/libnetfilter_conntrack/libnetfilter_conntrack.h b/include/libnetfilter_conntrack/libnetfilter_conntrack.h
index 27d972d..086c81a 100644
--- a/include/libnetfilter_conntrack/libnetfilter_conntrack.h
+++ b/include/libnetfilter_conntrack/libnetfilter_conntrack.h
@@ -144,6 +144,7 @@ enum nf_conntrack_attr {
ATTR_SYNPROXY_ISN = 72, /* u32 bits */
ATTR_SYNPROXY_ITS, /* u32 bits */
ATTR_SYNPROXY_TSOFF, /* u32 bits */
+ ATTR_TIMESTAMP_EVENT, /* u64 bits */
ATTR_MAX
};
diff --git a/include/libnetfilter_conntrack/linux_nfnetlink_conntrack.h b/include/libnetfilter_conntrack/linux_nfnetlink_conntrack.h
index b8ffe02..88c14c8 100644
--- a/include/libnetfilter_conntrack/linux_nfnetlink_conntrack.h
+++ b/include/libnetfilter_conntrack/linux_nfnetlink_conntrack.h
@@ -60,6 +60,7 @@ enum ctattr_type {
CTA_SYNPROXY,
CTA_FILTER,
CTA_STATUS_MASK,
+ CTA_TIMESTAMP_EVENT,
__CTA_MAX
};
#define CTA_MAX (__CTA_MAX - 1)
diff --git a/src/conntrack/getter.c b/src/conntrack/getter.c
index d1f9a5a..c9615d5 100644
--- a/src/conntrack/getter.c
+++ b/src/conntrack/getter.c
@@ -384,6 +384,11 @@ static const void *get_attr_synproxy_tsoff(const struct nf_conntrack *ct)
return &ct->synproxy.tsoff;
}
+static const void *get_attr_timestamp_event(const struct nf_conntrack *ct)
+{
+ return &ct->timestamp_event;
+}
+
const get_attr get_attr_array[ATTR_MAX] = {
[ATTR_ORIG_IPV4_SRC] = get_attr_orig_ipv4_src,
[ATTR_ORIG_IPV4_DST] = get_attr_orig_ipv4_dst,
@@ -460,4 +465,5 @@ const get_attr get_attr_array[ATTR_MAX] = {
[ATTR_SYNPROXY_ISN] = get_attr_synproxy_isn,
[ATTR_SYNPROXY_ITS] = get_attr_synproxy_its,
[ATTR_SYNPROXY_TSOFF] = get_attr_synproxy_tsoff,
+ [ATTR_TIMESTAMP_EVENT] = get_attr_timestamp_event,
};
diff --git a/src/conntrack/parse_mnl.c b/src/conntrack/parse_mnl.c
index 3cbfc6a..0f87f69 100644
--- a/src/conntrack/parse_mnl.c
+++ b/src/conntrack/parse_mnl.c
@@ -897,6 +897,10 @@ nfct_parse_conntrack_attr_cb(const struct nlattr *attr, void *data)
case CTA_NAT_DST:
/* deprecated */
break;
+ case CTA_TIMESTAMP_EVENT:
+ if (mnl_attr_validate(attr, MNL_TYPE_U64) < 0)
+ abi_breakage();
+ break;
}
tb[type] = attr;
return MNL_CB_OK;
@@ -1029,6 +1033,12 @@ nfct_payload_parse(const void *payload, size_t payload_len,
return -1;
}
+ if (tb[CTA_TIMESTAMP_EVENT]) {
+ set_bit(ATTR_TIMESTAMP_EVENT, ct->head.set);
+ ct->timestamp_event =
+ be64toh(mnl_attr_get_u64(tb[CTA_TIMESTAMP_EVENT]));
+ }
+
return 0;
}