A ordem dos parâmetros é importante. Na página do manual:
tc [ OPTIONS ] filter [ add | change | replace | delete | get ] dev DEV
[ parent qdisc-id | root ] [ handle filter-id ] protocol protocol prio priority
filtertype [ filtertype specific parameters ] flowid flow-id
De acordo com isso, a especificação do identificador deve ser antes de protocol
.
Embora o próprio comando tc mostre o contrário:
$ tc filter help
Usage: tc filter [ add | del | change | replace | show ] [ dev STRING ]
[...]
[ pref PRIO ] protocol PROTO [ chain CHAIN_INDEX ]
[ estimator INTERVAL TIME_CONSTANT ]
[ root | ingress | egress | parent CLASSID ]
[ handle FILTERID ] [ [ FILTER_TYPE ] [ help | OPTIONS ] ]
^^^
Mas ainda é antes FILTER_TYPE, que é o critério de filtro real.
Em seu comando:
tc filter add dev em1 parent 1:0 prio 0 protocol ip basic match "meta(vlan mask 0xfff eq 0x07D1)" handle 20 fw flowid 1:20
... o identificador é após o filtro (correspondência básica ...) e, portanto, não é mais reconhecido. É claro que pode haver um filtro com seu próprio parâmetro handle
, mas acho que não é o caso aqui.
Por favor, note que eu não verifiquei se esse filtro faz algum sentido em contrário, mas o "o que é manipular?" o erro de análise deve ser causado apenas pela ordem dos parâmetros. Eu também não recebi este erro para os outros comandos que você mostrou.
Espero que isso ajude de qualquer maneira. ;)