From: Pablo Neira Ayuso <pablo@netfilter.org>
To: "Maciej Żenczykowski" <zenczykowski@gmail.com>
Cc: "Maciej Żenczykowski" <maze@google.com>,
"Florian Westphal" <fw@strlen.de>,
"Linux Network Development Mailing List" <netdev@vger.kernel.org>,
"Netfilter Development Mailing List"
<netfilter-devel@vger.kernel.org>
Subject: Re: [PATCH netfilter] netfilter: conntrack: udp: generate event on switch to stream timeout
Date: Fri, 15 Oct 2021 11:30:00 +0200 [thread overview]
Message-ID: <YWlKGFpHa5o5jFgJ@salvia> (raw)
In-Reply-To: <20211015090934.2870662-1-zenczykowski@gmail.com>
On Fri, Oct 15, 2021 at 02:09:34AM -0700, Maciej Żenczykowski wrote:
> From: Maciej Żenczykowski <maze@google.com>
>
> Without this it's hard to offload udp due to lack of a conntrack event
> at the appropriate time (ie. once udp stream is established and stream
> timeout is in effect).
>
> Without this udp conntrack events 'update/assured/timeout=30'
> either need to be ignored, or polling loop needs to be <30 second
> instead of <120 second.
>
> With this change:
> [NEW] udp 17 30 src=10.246.11.13 dst=216.239.35.0 sport=37282 dport=123 [UNREPLIED] src=216.239.35.0 dst=10.246.11.13 sport=123 dport=37282
> [UPDATE] udp 17 30 src=10.246.11.13 dst=216.239.35.0 sport=37282 dport=123 src=216.239.35.0 dst=10.246.11.13 sport=123 dport=37282
> [UPDATE] udp 17 30 src=10.246.11.13 dst=216.239.35.0 sport=37282 dport=123 src=216.239.35.0 dst=10.246.11.13 sport=123 dport=37282 [ASSURED]
> [UPDATE] udp 17 120 src=10.246.11.13 dst=216.239.35.0 sport=37282 dport=123 src=216.239.35.0 dst=10.246.11.13 sport=123 dport=37282 [ASSURED]
> [DESTROY] udp 17 src=10.246.11.13 dst=216.239.35.0 sport=37282 dport=123 src=216.239.35.0 dst=10.246.11.13 sport=123 dport=37282 [ASSURED]
> (the 3rd update/assured/120 event is new)
Hm, I still don't understand why do you need this extra 3rd
update/assured event event. Could you explain your usecase?
Thanks.
> Cc: Florian Westphal <fw@strlen.de>
> Cc: Pablo Neira Ayuso <pablo@netfilter.org>
> Fixes: d535c8a69c19 'netfilter: conntrack: udp: only extend timeout to stream mode after 2s'
> Signed-off-by: Maciej Żenczykowski <maze@google.com>
> ---
> include/net/netfilter/nf_conntrack.h | 1 +
> .../uapi/linux/netfilter/nf_conntrack_common.h | 1 +
> net/netfilter/nf_conntrack_proto_udp.c | 16 ++++++++++++++--
> 3 files changed, 16 insertions(+), 2 deletions(-)
>
> diff --git a/include/net/netfilter/nf_conntrack.h b/include/net/netfilter/nf_conntrack.h
> index cc663c68ddc4..12029d616cfa 100644
> --- a/include/net/netfilter/nf_conntrack.h
> +++ b/include/net/netfilter/nf_conntrack.h
> @@ -26,6 +26,7 @@
>
> struct nf_ct_udp {
> unsigned long stream_ts;
> + bool notified;
> };
>
> /* per conntrack: protocol private data */
> diff --git a/include/uapi/linux/netfilter/nf_conntrack_common.h b/include/uapi/linux/netfilter/nf_conntrack_common.h
> index 4b3395082d15..a8e91b5821fa 100644
> --- a/include/uapi/linux/netfilter/nf_conntrack_common.h
> +++ b/include/uapi/linux/netfilter/nf_conntrack_common.h
> @@ -144,6 +144,7 @@ enum ip_conntrack_events {
> IPCT_SECMARK, /* new security mark has been set */
> IPCT_LABEL, /* new connlabel has been set */
> IPCT_SYNPROXY, /* synproxy has been set */
> + IPCT_UDPSTREAM, /* udp stream has been set */
> #ifdef __KERNEL__
> __IPCT_MAX
> #endif
> diff --git a/net/netfilter/nf_conntrack_proto_udp.c b/net/netfilter/nf_conntrack_proto_udp.c
> index 68911fcaa0f1..f0d9869aa30f 100644
> --- a/net/netfilter/nf_conntrack_proto_udp.c
> +++ b/net/netfilter/nf_conntrack_proto_udp.c
> @@ -97,18 +97,23 @@ int nf_conntrack_udp_packet(struct nf_conn *ct,
> if (!timeouts)
> timeouts = udp_get_timeouts(nf_ct_net(ct));
>
> - if (!nf_ct_is_confirmed(ct))
> + if (!nf_ct_is_confirmed(ct)) {
> ct->proto.udp.stream_ts = 2 * HZ + jiffies;
> + ct->proto.udp.notified = false;
> + }
>
> /* If we've seen traffic both ways, this is some kind of UDP
> * stream. Set Assured.
> */
> if (test_bit(IPS_SEEN_REPLY_BIT, &ct->status)) {
> unsigned long extra = timeouts[UDP_CT_UNREPLIED];
> + bool stream = false;
>
> /* Still active after two seconds? Extend timeout. */
> - if (time_after(jiffies, ct->proto.udp.stream_ts))
> + if (time_after(jiffies, ct->proto.udp.stream_ts)) {
> extra = timeouts[UDP_CT_REPLIED];
> + stream = true;
> + }
>
> nf_ct_refresh_acct(ct, ctinfo, skb, extra);
>
> @@ -116,9 +121,16 @@ int nf_conntrack_udp_packet(struct nf_conn *ct,
> if (unlikely((ct->status & IPS_NAT_CLASH)))
> return NF_ACCEPT;
>
> + if (stream) {
> + stream = !ct->proto.udp.notified;
> + ct->proto.udp.notified = true;
> + }
> +
> /* Also, more likely to be important, and not a probe */
> if (!test_and_set_bit(IPS_ASSURED_BIT, &ct->status))
> nf_conntrack_event_cache(IPCT_ASSURED, ct);
> + else if (stream)
> + nf_conntrack_event_cache(IPCT_UDPSTREAM, ct);
> } else {
> nf_ct_refresh_acct(ct, ctinfo, skb, timeouts[UDP_CT_UNREPLIED]);
> }
> --
> 2.33.0.1079.g6e70778dc9-goog
>
next prev parent reply other threads:[~2021-10-15 9:30 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-10-15 9:09 [PATCH netfilter] netfilter: conntrack: udp: generate event on switch to stream timeout Maciej Żenczykowski
2021-10-15 9:30 ` Pablo Neira Ayuso [this message]
2021-10-15 9:50 ` Maciej Żenczykowski
2021-10-15 9:57 ` Florian Westphal
2021-10-15 10:15 ` Maciej Żenczykowski
2021-10-15 10:50 ` Florian Westphal
2021-10-17 22:04 ` Pablo Neira Ayuso
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=YWlKGFpHa5o5jFgJ@salvia \
--to=pablo@netfilter.org \
--cc=fw@strlen.de \
--cc=maze@google.com \
--cc=netdev@vger.kernel.org \
--cc=netfilter-devel@vger.kernel.org \
--cc=zenczykowski@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.