Filtro TC con marcado de paquetes BPF y NFTables

Filtro TC con marcado de paquetes BPF y NFTables

Hice un programa de ingreso TC BPF y quiero que procese paquetes específicos solo marcados por NFTables. Aquí está mi tabla NFTables que marca los paquetes específicos:

table ip compressor_tc {
        chain prerouting {
                type nat hook prerouting priority -99; policy accept;
                ip daddr 10.50.0.3 tcp dport != ssh mark set 0x00000007
                ip saddr 10.50.0.4 udp dport 1337 mark set 0x00000008
        }
}

Creé la qdiscvía:

tc qdisc add dev ens18 root handle 1: prio 

Ahora, estoy intentando adjuntar el programa TC BPF y aplicarlo solo a los paquetes marcados (en este caso, marcados como 7):

tc filter add dev ens18 parent 1:0 prio 1 handle 7 fw flowid 1:1 bpf obj testBPF_Prog.o section test

Sin embargo, recibo lo siguiente:

root@test02:/home/dev/CompressorV2_TC/src# tc filter add dev ens18 parent 1:0 prio 1 handle 7 fw flowid 1:1 bpf obj testBPF_Prog.o section test
What is "bpf"?
Usage: ... fw [ classid CLASSID ] [ indev DEV ] [ action ACTION_SPEC ]
       CLASSID := Push matching packets to the class identified by CLASSID with format X:Y
                  CLASSID is parsed as hexadecimal input.
       DEV := specify device for incoming device classification.
       ACTION_SPEC := Apply an action on matching packets.
       NOTE: handle is represented as HANDLE[/FWMASK].
             FWMASK is 0xffffffff by default.

Si lo hago:

tc filter add dev ens18 parent 1:0 bpf obj testBPF_Prog.o section test

El programa TC BPF se adjunta bien, pero escanea todos los paquetes. Si lo hago:

tc filter add dev ens18 parent 1:0 prio 1 handle 7 fw flowid 1:1

Esto no genera ningún error, pero el programa BPF no está adjunto.

Me parece que el programa TC no sabe cuándo fwfinaliza el parámetro. Por lo tanto, piensa que el bpfparámetro es parte del fwparámetro.

Me pregunto si es posible separar estas declaraciones y, de ser así, ¿logrará esto lo que estoy tratando de hacer? He estado buscando documentación en línea, pero no encontré ninguna manera de hacerlo.

Estoy haciendo esto en una máquina virtual Ubuntu 18.04 LTS con kernel 5.6.1-050601-generic.

Soy bastante nuevo en el filtro TC. Por lo tanto, pido disculpas si me falta algo obvio.

¡Cualquier ayuda es muy apreciada y gracias por su tiempo!

información relacionada