diff --git a/docs/readme.md b/docs/readme.md index d8859509..5c01924c 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -43,6 +43,7 @@ zapret является свободным и open source. - [IPTABLES ДЛЯ NFQWS](#iptables-для-nfqws) - [NFTABLES ДЛЯ NFQWS](#nftables-для-nfqws) - [FLOW OFFLOADING](#flow-offloading) + - [ОСОБЕННОСТИ ЖЕЛЕЗОК](#особенности-железок) - [ДУРЕНИЕ СО СТОРОНЫ СЕРВЕРА](#дурение-со-стороны-сервера) - [tpws](#tpws) - [TCP СЕГМЕНТАЦИЯ В TPWS](#tcp-сегментация-в-tpws) @@ -934,6 +935,70 @@ iptables target `FLOWOFFLOAD` - это проприетарное изобрет Управление offload в nftables реализовано в базовом ядре linux без патчей. nftables - единственный способ включения offload на классическом Linux. +### ОСОБЕННОСТИ ЖЕЛЕЗОК + +На устройствах mediatek замечены 2 проблемы. + +Драйвер mediatek ethernet отбрасывает tcp и udp пакеты с неверной чексуммой на аппаратном уровне, это не отключается. +Как следствие не будет работать fooling badsum через роутер, но будет с него. + +Другая проблема mediatek, затрагивающая как ethernet, так и wireless, проявляется на udp, когда включен offload rx-gro-list. +Пока отсутствует nfqueue, все хорошо. Как только nfqueue появляется, часть пакетов выпадает. +Особенно заметно это проявляется на дурении QUIC с kyber. + +
+ shell код лечения + +``` +append_separator_list() +{ + # $1 - var name to receive result + # $2 - separator + # $3 - quoter + # $4,$5,... - elements + local _var="$1" sep="$2" quo="$3" i + + eval i="\$$_var" + shift; shift; shift + while [ -n "$1" ]; do + if [ -n "$i" ] ; then + i="$i$sep$quo$1$quo" + else + i="$quo$1$quo" + fi + shift + done + eval $_var="\$i" +} +resolve_lower_devices() +{ + # $1 - bridge interface name + [ -d "/sys/class/net/$1" ] && { + find "/sys/class/net/$1" -follow -maxdepth 1 -name "lower_*" | + { + local l lower lowers + while read lower; do + lower="$(basename "$lower")" + l="${lower#lower_*}" + [ "$l" != "$lower" ] && append_separator_list lowers ' ' '' "$l" + done + printf "$lowers" + } + } +} + +# it breaks nfqueue +lans=$(resolve_lower_devices br-lan) +for int in $lans; do + ethtool -K $int rx-gro-list off +done +``` +
+ +Этот код нужно вызывать после вставания интерфейса LAN, когда все bridge members уже занесены в bridge. +Можно использовать хук в `/etc/hotplug.d/iface`. + + ### ДУРЕНИЕ СО СТОРОНЫ СЕРВЕРА Это тоже возможно.