netfilter: flowtable: add nf_flowtable_time_stamp
authorPablo Neira Ayuso <pablo@netfilter.org>
Fri, 3 Jan 2020 17:10:04 +0000 (18:10 +0100)
committerPablo Neira Ayuso <pablo@netfilter.org>
Mon, 6 Jan 2020 09:30:46 +0000 (10:30 +0100)
This patch adds nf_flowtable_time_stamp and updates the existing code to
use it.

This patch is also implicitly fixing up hardware statistic fetching via
nf_flow_offload_stats() where casting to u32 is missing. Use
nf_flow_timeout_delta() to fix this.

Fixes: c29f74e0df7a ("netfilter: nf_flow_table: hardware offload support")
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Acked-by: wenxu <wenxu@ucloud.cn>
include/net/netfilter/nf_flow_table.h
net/netfilter/nf_flow_table_core.c
net/netfilter/nf_flow_table_ip.c
net/netfilter/nf_flow_table_offload.c

index f0897b3..415b8f4 100644 (file)
@@ -106,6 +106,12 @@ struct flow_offload {
 };
 
 #define NF_FLOW_TIMEOUT (30 * HZ)
+#define nf_flowtable_time_stamp        (u32)jiffies
+
+static inline __s32 nf_flow_timeout_delta(unsigned int timeout)
+{
+       return (__s32)(timeout - nf_flowtable_time_stamp);
+}
 
 struct nf_flow_route {
        struct {
index 9889d52..e33a73c 100644 (file)
@@ -134,11 +134,6 @@ static void flow_offload_fixup_tcp(struct ip_ct_tcp *tcp)
 #define NF_FLOWTABLE_TCP_PICKUP_TIMEOUT        (120 * HZ)
 #define NF_FLOWTABLE_UDP_PICKUP_TIMEOUT        (30 * HZ)
 
-static inline __s32 nf_flow_timeout_delta(unsigned int timeout)
-{
-       return (__s32)(timeout - (u32)jiffies);
-}
-
 static void flow_offload_fixup_ct_timeout(struct nf_conn *ct)
 {
        const struct nf_conntrack_l4proto *l4proto;
@@ -232,7 +227,7 @@ int flow_offload_add(struct nf_flowtable *flow_table, struct flow_offload *flow)
 {
        int err;
 
-       flow->timeout = (u32)jiffies + NF_FLOW_TIMEOUT;
+       flow->timeout = nf_flowtable_time_stamp + NF_FLOW_TIMEOUT;
 
        err = rhashtable_insert_fast(&flow_table->rhashtable,
                                     &flow->tuplehash[0].node,
index b9e7dd6..7ea2ddc 100644 (file)
@@ -280,7 +280,7 @@ nf_flow_offload_ip_hook(void *priv, struct sk_buff *skb,
        if (nf_flow_nat_ip(flow, skb, thoff, dir) < 0)
                return NF_DROP;
 
-       flow->timeout = (u32)jiffies + NF_FLOW_TIMEOUT;
+       flow->timeout = nf_flowtable_time_stamp + NF_FLOW_TIMEOUT;
        iph = ip_hdr(skb);
        ip_decrease_ttl(iph);
        skb->tstamp = 0;
@@ -509,7 +509,7 @@ nf_flow_offload_ipv6_hook(void *priv, struct sk_buff *skb,
        if (nf_flow_nat_ipv6(flow, skb, dir) < 0)
                return NF_DROP;
 
-       flow->timeout = (u32)jiffies + NF_FLOW_TIMEOUT;
+       flow->timeout = nf_flowtable_time_stamp + NF_FLOW_TIMEOUT;
        ip6h = ipv6_hdr(skb);
        ip6h->hop_limit--;
        skb->tstamp = 0;
index 6c162c9..d06969a 100644 (file)
@@ -781,9 +781,9 @@ void nf_flow_offload_stats(struct nf_flowtable *flowtable,
                           struct flow_offload *flow)
 {
        struct flow_offload_work *offload;
-       s64 delta;
+       __s32 delta;
 
-       delta = flow->timeout - jiffies;
+       delta = nf_flow_timeout_delta(flow->timeout);
        if ((delta >= (9 * NF_FLOW_TIMEOUT) / 10) ||
            flow->flags & FLOW_OFFLOAD_HW_DYING)
                return;