Skip to content
  • Cong Wang's avatar
    net_sched: unset TCQ_F_CAN_BYPASS when adding filters · 3f05e688
    Cong Wang authored
    For qdisc's that support TC filters and set TCQ_F_CAN_BYPASS,
    notably fq_codel, it makes no sense to let packets bypass the TC
    filters we setup in any scenario, otherwise our packets steering
    policy could not be enforced.
    
    This can be reproduced easily with the following script:
    
     ip li add dev dummy0 type dummy
     ifconfig dummy0 up
     tc qd add dev dummy0 root fq_codel
     tc filter add dev dummy0 parent 8001: protocol arp basic action mirred egress redirect dev lo
     tc filter add dev dummy0 parent 8001: protocol ip basic action mirred egress redirect dev lo
     ping -I dummy0 192.168.112.1
    
    Without this patch, packets are sent directly to dummy0 without
    hitting any of the filters. With this patch, packets are redirected
    to loopback as expected.
    
    This fix is not perfect, it only unsets the flag but does not set it back
    because we have to save the information somewhere in the qdisc if we
    really want that. Note, both fq_codel and sfq clear this flag in their
    ->bind_tcf() but this is clearly not sufficient when we don't use any
    class ID.
    
    Fixes: 23624935
    
     ("net_sched: TCQ_F_CAN_BYPASS generalization")
    Cc: Eric Dumazet <edumazet@google.com>
    Signed-off-by: default avatarCong Wang <xiyou.wangcong@gmail.com>
    Reviewed-by: default avatarEric Dumazet <edumazet@google.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    3f05e688