net/sched: act_ct: Fix byte count on fragmented packets
authorPaul Blakey <paulb@nvidia.com>
Sun, 17 Oct 2021 11:58:51 +0000 (14:58 +0300)
committerDavid S. Miller <davem@davemloft.net>
Mon, 18 Oct 2021 12:31:58 +0000 (13:31 +0100)
First fragmented packets (frag offset = 0) byte len is zeroed
when stolen by ip_defrag(). And since act_ct update the stats
only afterwards (at end of execute), bytes aren't correctly
accounted for such packets.

To fix this, move stats update to start of action execute.

Fixes: b57dc7c13ea9 ("net/sched: Introduce action ct")
Signed-off-by: Paul Blakey <paulb@nvidia.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/sched/act_ct.c

index ad9df0c..90866ae 100644 (file)
@@ -960,6 +960,7 @@ static int tcf_ct_act(struct sk_buff *skb, const struct tc_action *a,
        tmpl = p->tmpl;
 
        tcf_lastuse_update(&c->tcf_tm);
+       tcf_action_update_bstats(&c->common, skb);
 
        if (clear) {
                qdisc_skb_cb(skb)->post_ct = false;
@@ -1049,7 +1050,6 @@ out_push:
 
        qdisc_skb_cb(skb)->post_ct = true;
 out_clear:
-       tcf_action_update_bstats(&c->common, skb);
        if (defrag)
                qdisc_skb_cb(skb)->pkt_len = skb->len;
        return retval;