Commit a50082df authored by bol-van's avatar bol-van
Browse files

readme: hardware details

parent 0c33bbfb
Loading
Loading
Loading
Loading
+65 −0
Original line number Diff line number Diff line
@@ -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.

<details>
  <summary>shell код лечения</summary>

```
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
```
</details>

Этот код нужно вызывать после вставания интерфейса LAN, когда все bridge members уже занесены в bridge.
Можно использовать хук в `/etc/hotplug.d/iface`.


### ДУРЕНИЕ СО СТОРОНЫ СЕРВЕРА

Это тоже возможно.