• Daniel Borkmann's avatar
    netkit: Fix pkt_type override upon netkit pass verdict · 3998d184
    Daniel Borkmann authored
    When running Cilium connectivity test suite with netkit in L2 mode, we
    found that compared to tcx a few tests were failing which pushed traffic
    into an L7 proxy sitting in host namespace. The problem in particular is
    around the invocation of eth_type_trans() in netkit.
    
    In case of tcx, this is run before the tcx ingress is triggered inside
    host namespace and thus if the BPF program uses the bpf_skb_change_type()
    helper the newly set type is retained. However, in case of netkit, the
    late eth_type_trans() invocation overrides the earlier decision from the
    BPF program which eventually leads to the test failure.
    
    Instead of eth_type_trans(), split out the relevant parts, meaning, reset
    of mac header and call to eth_skb_pkt_type() before the BPF program is run
    in order to have the same behavior as with tcx, and refactor a small helper
    called eth_skb_pull_mac() which is run in case it's passed up the stack
    where the mac header must be pulled. With this all connectivity tests pass.
    
    Fixes: 35dfaad7 ("netkit, bpf: Add bpf programmable net device")
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Acked-by: default avatarNikolay Aleksandrov <razor@blackwall.org>
    Link: https://lore.kernel.org/r/20240524163619.26001-2-daniel@iogearbox.netSigned-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    3998d184
netkit.c 23 KB