OpenWrt Tips

From misc notes
Jump to navigation Jump to search
  • blackhole_netdev_xmit(): Dropping skb.

ベンチマークをとっているときに SQM の稼働しているルーターで

blackhole_netdev_xmit(): Dropping skb.

のログが出た。SKBがらみで、いろいろ調査したところ、kernel config に以下を追加して解消した。

CONFIG_NET_TC_SKB_EXT=y
CONFIG_NET_ACT_CT=y
  • WDSで謎な速度低下

まだ原因は特定できていないが対処方法はうまくいっている。

WDSでブリッジしているSTAで(STA側からみて)RXが最低限の 6.0 Mbpsに落ちて、そのまま(負荷に応じて早くなるような)変動しない。 同様な現象はググったら出てくるが明確な対処方法は発見できない。チャンネル固定する事は推奨(必須と)される。固定したチャンネルを変更した場合に復帰する事もある。(しばらくしてから速度低下する場合もある)(もちろん DFS 等の要素は考慮済み)

いろいろ試しているうちに、速度が落ちたSTAでWi-Fiのscanを実効すれば復帰する事が分かった。これの理由を技術的に説明するために調査中。無線関連技術には無知すぎる...

現象としては、ath10k の WDS STA 側で DISCONNECT した後に再度 CONNECT した際に、radio デバイスのイニシャライズに失敗しているように思う。端的に言えばドライバーのバグであるのだが、情報が少なすぎる。"-ct"ドライバーをやめるという対処もあるらしいが、WDSがちゃんと動くのが甚だ疑問だったのでやっていない。とりあえず対処法はできたのでこれでしのぐ。

RX rate を監視して 6.0 になったらscanするスクリプトをcronに仕込んだw

#!/bin/ash

WKDATA=`iwinfo phy0-sta0 assoclist|fgrep RX`
RATE=`echo $WKDATA|awk '{print $2}'`
WIDTH=`echo $WKDATA|awk '{print $6}'|awk -F, '{print $1}'`
WKRATE=`echo $RATE|awk -F. '{print $1}'`

if [ $RATE == '6.0' ] && [ -z $WIDTH ]; then
	logger -p notice -t watch-rx.sh "RX $RATE Mbps, $WIDTH - STA Recovery start..."
	iwinfo phy0 scan
    exit 0
fi
if [ $WKRATE -lt 87 ] && [ $WIDTH == '20MHz' ]; then
	logger -p notice -t watch-rx.sh "TX $RATE Mbps, $WIDTH - wifi slow..."
	logger -p notice -t watch-rx.sh "TX $RATE Mbps, $WIDTH - Pinging to AP..."
	ping -q -A -s 1500 -c 3000 192.168.0.1  > /dev/null 2>&1
    exit 0
fi
if [ $WKRATE -lt 13 ] && [ $WIDTH != '80MHz' ]; then
	logger -p notice -t watch-rx.sh "RX $RATE Mbps, $WIDTH - AP Wireless stop start..."
    # restart AP side
fi
exit0

補足: DFSを嫌って W52 で 80MHz を使っているのが、どうもこの中で使える4つのチャンネルのうち 36ch と 44ch しか安定しないようだ。(無線分からんことだらけ...)

補足2: もっと謎な事に、48chを指定して COUNTRY 設定により 44chに勝手になる場合が一番安定する。(無線分からんことだらけ2...)

補足3: Luci の channel analysis を WDS の AP 側で実行すると、(何故か) STA がいったん DISCONNECT される。そのあとには必ず速度低下する。

補足4: 何故か帯域幅が20MHzに落ちたままになる。復帰方法をふくめて調査中。結局 AP 側の Wi-Fi interface を reload する必要があった。

補足5: 電波が弱い場合に、接続が不安定になり、この現象がおきるのが分かった。機器をできるだけ近づけたのと、電源もすこし弱かったので対策した。

補足6: 転送レートが極端に遅くなる前に、ロングパケットのpingをディレイ無しで1000発打つことにより、速度低下は回避される場合もある。

補足7:Linux OSSドライバーも試したが、同じ現象がおきるので今は ct に戻した。

mediatek が対応してくれた。openwrt の mt76 にもマージされた。完成に近づいたね。ath10k のドライバーの不具合はそのままだがw

[][MAC80211][Release][Update Filogic 830/820/630 firmware]

[Description]
Update Filogic 830/820/630 firmware to 20240823

Critical issue bugfix
1. Fix MAC80211 multicast-to-unicast issue
2. Fix WDS (4-addr) mode rate adaptation algorithm


  • 雑多なメモ

無線関連でよく使うコマンド

iw reg get
iw list
iw phy1 list
iwinfo phy1-ap0 freqlist
iwinfo phy1-ap0 assoclist
wifi down radio0
wifi up radio0
iw dev phy1-ap0 station dump
hostapd_cli -i phy1-ap0 get_ibf
  • 雑多なメモ

ちょっと不審な挙動があったのでメモメモ

firmware をアップグレードしたところ、IPv6 が降ってこなくなった。調べてみると lan6 インターフェースのデバイスが勝手に br-lan6 に変わっていた。私は lan6 のデバイスは lan インターフェースのエイリアスで設定していたのがだが、勝手に変わってしまったようだ。ソースおっかけてるがまだ原因特定にはいたっていない。

原因っぽいのが分かった。以前の config でインターフェース lan6 の定義で "option type 'bridge'" が誤って記述されていた。(ミスですね)


  • Apple製クライアント

DTIM間隔を3にするのが要請されているらしい。

https://www.sniffwifi.com/2016/05/go-to-sleep-go-to-sleep-go-to-sleep.html
  • 802.11k
https://github.com/simonyiszk/openwrt-rrm-nr-distributor
https://forum.openwrt.org/t/802-11k-neighbor-report-daemon/102984

これが良い感じ。

確認方法

ubus call hostapd.phy1-ap0 rrm_nr_list
  • map-e IPv4 ICMP redirect の抑制

どうもやっている方がよささそうなので設定した。

該当 interface に設定

	option sendredirects '0'
  • config の定石

自宅での運用を始めて一月が経った。いろいろ定石を学習中...

マイクロソフト NCSI 対策

config dnsmasq
          |
	list rebind_domain 'dns.msftncsi.com'

lan内部のサブネットの静的ルートをdhcpでの配布

config dhcp 'lan'
          |
	list dhcp_option '42,192.168.0.1'
	list dhcp_option '121,0.0.0.0/0,192.168.0.1,192.168.2.0/24,192.168.0.3'
	list dhcp_option '249,0.0.0.0/0,192.168.0.1,192.168.2.0/24,192.168.0.3'


  • AppleTV 4K の Thread 問題

なぜか RA が AppleTV から来る。いろいろ調べたら HomeKit の Thread Matter が IPv6 router (Thread Border Router) の挙動をしているらしい。HomeKit hub としては使いたいのでいろいろ調査中...とりあえず IPv4 subnet をこしらえて隔離した。AirPlay もつつがなくうごくようにできた。IPv4 で構成しているのにもかかわらず mDNS は v6 の LLA でガンガンくる...

AirPlay やら remote app やらの機能を有効にするためには、けっこうなレンジのポートあける必要があった。今回の隔離は ICMPv6 RA を飛ばさなくすることなので、穴あきまくりもオッケーw

  • dumb AP の GL-MT6000 2台

WED + bridger を使用していると roaming する際に不具合があり、今は WEBとbridger は disable にしている。WEDが無くとも素晴らしく高速で満足w

  • SQM

効きますねw。GL-MT2500A (aarch64 2CPU)で十分なパフォーマンスです。

https://www.waveform.com/tools/bufferbloat

A+ もらいましたw

  • MAP-E フレッツ光 ひかり電話無し

以下のサイトの情報が役に立った。

https://github.com/fakemanhk/openwrt-jp-ipoe?utm_source=pocket_saves
https://forum.ficusonline.com/t/topic/498?utm_source=pocket_saves

これで IPv4 はつつがなく使えるようになった。

  • フレッツ光 ひかり電話無し lan側に GUA が来ない

私のルータ(GL-MT2500A)はイーサーネットがWAN側1ポート、LAN側1ポートなので、br-lan を使う必要が無いので、そのように設定すると、lan側のGUAが降ってこない。 lanポートにGUAが無くても差し支えはないが、あった方が便利なので、いろいろ試行錯誤した結果、lan インターフェースに option ip6assign '64' を設定する事により GUA が降ってきた。

  • フレッツ光 ひかり電話無し

IPv6 と本格的に関わった事が無かったので、いろいろ勉強中。 ひかり電話無しのパターンはルータはIPv6のL2装置として設定する(ルータじゃないよねw)。しかし境界の装置なので、パススルーは嫌なので proxy 的な挙動をしなくてはいけない。 OpenWrtでは IPv6 Relay というパターンの設定がある。(MAP-Eに関するいろいろは別のはなし) 単純な IPv6 only のネットワーク構築でもいろいろ不思議な挙動があり、以下を見つけるまでけっこう試行錯誤した。

このパターンはいろいろ落とし穴があるね。(IPv6 relay モード)

私もこのパターンでいろいろ迷った。

https://github.com/openwrt/openwrt/issues/9881

今は、ルータが起動したあと、WAN6 の GUA に すべての AP から ping6 を打つようにスクリプトを仕込んで対処している。

あと気になるところで、どうもルーティングテーブルが30分ほどで消えるっぽい(まだ調べて無い)ので、cron で wan側のGUAにpingして様子見中。

ブリッジデバイスの設定でなんとかなるかもしれず。静的ルーティングをuplinkのport指定で書くとか...

結局 AppleTV のアホな挙動を隔離したら、ちゃんと規則正しくRAが降ってきて route は更新されるようになった。 と思ったら、経路はあるが、WAN6 の GUA に通らないパターンが再現。もう少し試行錯誤する...

  • MacOS DHCPv6 & ULA

どうも OpenWrt の DHCPv6 relay の実装と相性が悪いらしい。ULA prefix (ula_prefix) を削除すること。

https://forum.openwrt.org/t/how-to-send-icmp6-neighbor-solicitation-with-a-link-local-source-address/53220
  • GL-MT6000 mediatek firmware
https://github.com/rany2/openwrt

ここを参考に MTK GPL ソースをいろいろホゲって、すこし安定したようだ。

OpenWrt main snapshot:

[   14.210931] platform 15010000.wed: MTK WED WO Firmware Version: DEV_000000, Build Time: 20221012175005
[   14.220308] platform 15010000.wed: MTK WED WO Chip ID 00 Region 3
[   16.831897] mt798x-wmac 18000000.wifi: HW/SW Version: 0x8a108a10, Build Time: 20221012174648a
[   16.831897] 
[   16.934523] mt798x-wmac 18000000.wifi: WM Firmware Version: ____000000, Build Time: 20221012174725
[   17.018891] mt798x-wmac 18000000.wifi: WA Firmware Version: DEV_000000, Build Time: 20221012174937

MTK GPL:

[   13.247287] platform 15010000.wed: MTK WED WO Firmware Version: DEV_000000, Build Time: 20231024160448
[   13.256586] platform 15010000.wed: MTK WED WO Chip ID 00 Region 3
[   15.828346] mt798x-wmac 18000000.wifi: HW/SW Version: 0x8a108a10, Build Time: 20231024160251a
[   15.828346] 
[   15.864094] mt798x-wmac 18000000.wifi: WM Firmware Version: ____000000, Build Time: 20231024160309
[   15.906781] mt798x-wmac 18000000.wifi: WA Firmware Version: DEV_000000, Build Time: 20231024160432
  • WDS

昔は、Wi-Fi ブリッジ(リピーター、エクステンダー)を構成する場合は、relayd を使ってたのだが、今は WDS という機能をつかうのが普通らしい。(WDSはレイヤー2レベルでブリッジを構成する)

最初はなじみのある relayd を使ってみたのだが、IPv6 関連で微妙な振る舞いがあって、ではということで WDS 使ってみたがむちゃくちゃサックリとブリッジが構成できた。IPv6 関連もなじみの設定であっさりと設定。かつ通信も安定している。

もうすこし遊んだら 802.11s 構成にもチャレンジしてみよう。

  • 802.11r不具合

MacBookAirでつながんないと悩んでいたが、そうだったのか

Alright... So I've now verified that having 802.11k, 802.11v and 802.11w enabled does not influence the situation. Having them enabled, I've confirmed that a combination of wireless.default_radio0.encryption='sae-mixed' + wireless.default_radio0.ieee80211r='1' causes problems. Changing any of them makes everything work.
https://forum.openwrt.org/t/wpa2-wpa3-mixed-mode-connectivity-issues-with-ios-15-2/117110/7

APをmix-modeからWPA3-SAE固定に変更したばあい、Appleのクライアントはそのままつながらない。再度明示的に接続しに行くと、モードが変更された旨の警告が出る。もっと分かるようにさっさと警告を出せよw

  • GL-MT6000メモ

openwrt main snapshot kernel 6.1 と bridger(+追加パッチ) で超安定して動いている。WED も完璧。2.5GbE のハブ買うか、もう一台 GL-MT6000 買うかw

(もう一台買ったw 802.11r.k.v で遊び中w)(あとは SQM 専用機のエッジルータもそろえたw)

  • OOM系

とりあえず安全のための設定をするスクリプト

#!/bin/sh
  
PROGS='procd ubusd askfirst urngd logd rpcd netifd dropbear'     
  
for prog in $PROGS; do
        PIDS=`pgrep $prog`
        for pid in $PIDS; do
                # oom_adj is deprecated, use oom_score_adj instead.          
                echo -17 > /proc/$pid/oom_adj
                echo -1000 > /proc/$pid/oom_score_adj
        done
done
  • GL-MT6000メモ

追加でinstallしたものメモ

opkg update
opkg install luci-i18n-base-ja
opkg install e2fsprogs dosfstools fdisk rsync badblocks tune2fs
opkg install unzip
opkg install screen
opkg install dropbearconvert
opkg install avahi-utils avahi-daemon-service-ssh
opkg install rsync
opkg install diffutils
opkg install mg
opkg install coreutils-ls coreutils-stty
opkg install procps-ng procps-ng-ps procps-ng-w procps-ng-vmstat procps-ng-watch
opkg install sysstat irqbalance lm-sensors
opkg install htop lsblk usbutils
  • パッケージが何故か更新されない問題

新しいバージョンがビルドされたのは確認しているが、ターゲットイメージ内の該当パッケージが更新されていない。いろいろ調査して、root.orig-ARCH が古いままであるのがわかった。 なぜ古いままなのか。./bin/package/ARCH にある opkg のパッケージに古いのが残っていた(バージョン違いが残っていた)。./bin/package/ARCH を消すと解消した。 毎回消すのも効率が悪いので、時々消すwことにした。

  • cmake で libbsd 勝手に使う問題
-DCMAKE_DISABLE_FIND_BSD=ON

諸注意

Note that CMAKE_DISABLE_FIND_XXXXX works for dependency packages that are discovered by CMake using find_package. But, libbsd searching is not done using find_package but find_library, so the -DCMAKE_DISABLE_FIND_BSD=ON is a no-op.
  • Build OpenWrt on FreeBSD

ports の準備

/usr/ports/shells/bash
/usr/ports/sysutils/coreutils
/usr/ports/devel/ncurses
/usr/ports/devel/subversion
/usr/ports/devel/git
/usr/ports/ftp/wget
/usr/ports/archivers/unzip 
/usr/ports/lang/gcc
/usr/ports/devel/gmake
/usr/ports/misc/getopt
/usr/ports/devel/patch
/usr/ports/archivers/gtar
/usr/ports/misc/findutils
/usr/ports/lang/gawk           (/usr/ports/japanese/gawk は違う)
/usr/ports/textproc/gsed

#/usr/ports/sysutils/e2fsprogs
#/usr/ports/sysutils/squashfs-tools
#/usr/ports/devel/elfutils

OpenWrt ビルドのステップでほかのパッケージも指摘されたらインストールする。

OpenWrtは root 権限ではない一般ユーザでビルドする事を要請されている。また PATH に ASCII 文字以外は使わない。

ln -s /usr/local/bin/bash /bin/bash
mkdir /usr/local/openwrt
cd /usr/local/openwrt
ln -s /usr/local/bin/gawk awk
ln -s /usr/local/bin/gfind find
ln -s /usr/local/bin/getopt getopt
ln -s /usr/local/bin/gmake make
ln -s /usr/local/bin/gpatch patch
ln -s /usr/local/bin/gnustat stat
ln -s /usr/local/bin/gtar tar
ln -s /usr/local/bin/gxargs xargs
ln -s /usr/local/bin/gsed sed

したり

OpenWrt をビルドする専用のユーザを作り、login shell を bash にして

export PATH="/usr/local/openwrt:/usr/local/sbin:/usr/local/bin:$PATH"

export CC=gcc
export CXX=g++
export HOSTCC=gcc
export HOSTCXX=g++

# /usr/local/openwrt を整備して PATH 変えたらこれは不要
alias awk='/usr/local/bin/gawk'
alias find='/usr/local/bin/gfind'
alias getopt='/usr/local/bin/getopt'
alias make='/usr/local/bin/gmake'
alias patch='/usr/local/bin/gpatch'
alias stat='/usr/local/bin/gnustat'
alias tar='/usr/local/bin/gtar'
alias xargs='/usr/local/bin/gxargs'
alias sed='/usr/local/bin/gsed'

tools のビルドで野良パッチを当てつつ頑張ってみた。e2fsprogs, mtd-utils, elfutils は tools/Makefile から除く

ports の pkgconfig は .pc ファイルを libdata に入れるのでそれの対応が必要な場合(util-linux)も有る。

  • usb上のデバイスを強制リセット
lsusb -t
echo -n '{Bus}-{Port}' > /sys/bus/usb/drivers/usb/unbind
echo -n '{Bus}-{Port}' > /sys/bus/usb/drivers/usb/bind
echo -n '1-1' > /sys/bus/usb/drivers/usb/unbind
echo -n '1-1' > /sys/bus/usb/drivers/usb/bind