• Marcelo Ricardo Leitner's avatar
    net/sched: act_ct: clear post_ct if doing ct_clear · 8ca1b090
    Marcelo Ricardo Leitner authored
    Invalid detection works with two distinct moments: act_ct tries to find
    a conntrack entry and set post_ct true, indicating that that was
    attempted. Then, when flow dissector tries to dissect CT info and no
    entry is there, it knows that it was tried and no entry was found, and
    synthesizes/sets
                      key->ct_state = TCA_FLOWER_KEY_CT_FLAGS_TRACKED |
                                      TCA_FLOWER_KEY_CT_FLAGS_INVALID;
    mimicing what OVS does.
    
    OVS has this a bit more streamlined, as it recomputes the key after
    trying to find a conntrack entry for it.
    
    Issue here is, when we have 'tc action ct clear', it didn't clear
    post_ct, causing a subsequent match on 'ct_state -trk' to fail, due to
    the above. The fix, thus, is to clear it.
    
    Reproducer rules:
    tc filter add dev enp130s0f0np0_0 ingress prio 1 chain 0 \
    	protocol ip flower ip_proto tcp ct_state -trk \
    	action ct zone 1 pipe \
    	action goto chain 2
    tc filter add dev enp130s0f0np0_0 ingress prio 1 chain 2 \
    	protocol ip flower \
    	action ct clear pipe \
    	action goto chain 4
    tc filter add dev enp130s0f0np0_0 ingress prio 1 chain 4 \
    	protocol ip flower ct_state -trk \
    	action mirred egress redirect dev enp130s0f1np1_0
    
    With the fix, the 3rd rule matches, like it does with OVS kernel
    datapath.
    
    Fixes: 7baf2429 ("net/sched: cls_flower add CT_FLAGS_INVALID flag support")
    Signed-off-by: default avatarMarcelo Ricardo Leitner <marcelo.leitner@gmail.com>
    Reviewed-by: default avatarwenxu <wenxu@ucloud.cn>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    8ca1b090
act_ct.c 38.1 KB