Кажется, я решил проблему, используя совпадение и подстроку:
'match($0, /REGEX/) {sub(/REGEX/, substr($0, RSTART, RLENGTH) ); print}'
Ссылка (на 0 )относится к сетевой части (уровня 3 ). Таким образом, чтобы получить EtherType, он находится прямо перед сетевым уровнем полезной нагрузки , в -2 (, если рассматривается u16, или в -4 с u32 и соответствующей маской ). Таким образом, для соответствия EtherType 0x9000 (называется Loopback):
tc filter add dev eth2 prio 100 protocol all parent 1: u32 match u16 0x9000 0xffff at -2 flowid 1:2
, что эквивалентно (и фактически переведено в):
tc filter add dev eth2 prio 100 protocol all parent 1: u32 match u32 0x00009000 0x0000ffff at -4 flowid 1:2
Но на самом деле это перебор. Параметр protocol
здесь уже является фильтром EtherType, так что этого достаточно:
tc filter add dev eth2 prio 100 protocol 0x9000 parent 1: matchall flowid 1:2
Если вы хотите удалить его напрямую без какой-либо другой обработки, замените flowid 1:2
на action drop
.