J'ai tout appliqué avec nftables. Le hook netdev egress aide beaucoup, mais ça dépend effectivement encore du driver/NSS/offload path.
On peut sûrement faire mieux : plus robuste (ajouter des gardes-fou), élégant (mieux nommer : c'est un peu terne) voire modulaire ou
homogène (autre façon d'incorporer dans OpenWrt).
Remarque : ma config. commence à dater. Je ne sais pas si elle est toujours opérationnelle même si en principe elle est valable.
wan_iface=$(jsonfilter -i /etc/board.json -e '$.network.wan.ports[0]')
cat >/etc/custom-netdev-table.nft <<EOF
table netdev filter
flush table netdev filter
table netdev filter {
chain set_isp_vlan_832 {
udp dport 547 vlan pcp set 6 ip6 dscp set cs6 counter comment "Set QoS for DHCPv6 packets"
udp dport 67 vlan pcp set 6 ip dscp set cs6 counter comment "Set QoS for DHCPv4 packets"
icmpv6 type { 133, 135, 136 } vlan pcp set 6 ip6 dscp set cs6 counter comment "Set QoS for ICMPv6 packets"
}
chain set_isp_vlan_840 {
ip protocol igmp vlan pcp set 5 ip dscp set cs4 counter comment "Set QoS for IGMP packets"
}
chain lan_iptv {
ip protocol igmp ip dscp set cs4 counter comment "Set DSCP for IGMP packets"
}
chain egress {
type filter hook egress device $wan_iface priority filter; policy accept;
vlan type arp vlan pcp set 6 counter comment "Set QoS for ARP packets"
vlan id 832 jump set_isp_vlan_832
vlan id 840 jump set_isp_vlan_840
jump lan_iptv
}
}
EOF
Dans tous les cas, il faut tester, essayer de comprendre, et pas appliquer aveuglément.