楽天UN-LIMIT VI回線切れとの闘い ~ その2
マクさんです
さて、24時間で一方的に回線をブチ切るツレない仕様の楽天UN-LIMIT VI です
せっかく弄れる激安ルーターNCP-HG100を使ってるんだし、
というのと、楽天とは関係しませんが、NCP-HG100 自体の快適化としてemmcにちょいちょい書き込んでいるログをtmpfsに移動します
楽天ブチ切れ24時の何が困るのか
まずはお題その1の、楽天ブチ切れ
そもそも接続後24時間でブチ切られるとなにが困るのか? と、問われましても、
なので、これで困った記憶が無いんですよね
え?
じゃあ、無対策でいいじゃん!
となり話が終わってしまう
・・・
いやいや、
この記事の目的はそういうことじゃなかった
正直に言うと、単純に、思いついた対策を試してみたかっただけ、です!
加えて、嘘でもお困りごとがあるとモチベーションが上がるというものです
たとえばストリーミングメディア利用時にブチ切られるとどうなるんですかね?
流石に10秒間切れちゃうと一時停止でしょうね
悲しいですよね?
たとえば、ギガ単位のファイルをダウンロードしてるときにブチ切られてやり直しとなったら?
悲しいですよね?
・・・
といった具合に、ここはとにかく回線がブチ切られると困る、という課題があると信じよう。
ブチ切れ24時の対策内容
では早速、対策。
楽天の切断カウンタをリセットすることで、切断まで僅かな時間しか残っていない「魔の時間帯」を減らすことが狙いになります
具体的には接続して11時間以後、ネットが暇なら切断します
ここで最も重要なのは、ネットの暇判定条件と思われる
面倒なので、前回判定時からの受信パケット量の変化を見る、という簡単実装にしちゃってますけどね
試してみたらradikoを聞いてるときは切断を延期してくれたので、もうこれでいいかな?
とも思います
まぁ使いながらボチボチ改良してけば良いかと
効果が期待できるシーン
まず前提となる利用環境ですが、ずーっとデータ流しっぱなしの環境では効果が無いことは言うまでもない。
Webブラウズを基本として、動画やRadikoやファイルのダウンロードを適度にする
といった良識ある利用環境において、効果を発揮するものである
それで、
ダウンロード中にブチ切りを食らいたくなければ
-
ブチ切り時刻までの残り時間を確認し、余裕のある時間帯にダウンロードを始める
-
回線を切断/再接続してからダウンロードを始める
といった配慮が必要になります
ここに本対策を導入しますと、
ダウンロードが13時間以内に終わること、という条件は付くものの
楽天のブチ切り時刻を考慮する必要がなくなります!
※ネットの利用率が高いと(こちらからの切断処理が延期され続けるため)狙い通りの効果が出にくくなるが、最悪ケースでも楽天ブチ切れと同等になるだけである
ついでにログをtmpfsに移動する
こちらは楽天とは関係ない、NCP-HG100 に固有の内容になります
/ に吐いてるログ(下記)がありますが、それらは emmc への書き込みになる
正常動作時でも絶え間なくちょいちょい書き出すので、書換頻度が気になります。まぁemmcってそんなにヤワなもんじゃないということだし、未使用領域も結構あるしで、気にするよーなこっちゃない!と言われればそれまでだけど
なんとなく気になるので、 /tmp にリンク張って移動しちゃいました。要らないのは /dev/null へ。それだけだとログサイズの制限が効かなくなるので、サイズを監視して大きくなったらどける修正をした(パッチ参照)
modemproxy.log -> /tmp/modemproxy.log
network_manager.log -> /tmp/network_manager.log
thermal_policy.log -> /dev/null
当然、電源切るとログが消えますが、SONY様に本体を送って障害調査をお願いすることもないし・・・(ザ・保証外、ザ・自己責任)
対策パッチ
楽天ブチ切れ24時と、ログのtmp移動に付随する追加処理のパッチです
--- network_manager.sh.org 2021-05-05 10:58:07.619347621 +0900
+++ network_manager.sh 2021-05-25 09:38:13.681811428 +0900
@@ -688,6 +688,29 @@ EOF
fi
}
+wwan_rx_pks_prev=""
+function rakuten_reconnect_quirk()
+{
+ uptime_sec=$(exec 'ifstatus' wwan | grep 'uptime' | sed -e 's/[^0-9]//g')
+ if [ "$uptime_sec" -ge "39600" ]; then # after 11 hrs
+ have_ip=$(exec 'ifconfig' wwan0 | grep 'inet addr')
+ if [ "$have_ip" != "" ]; then
+ wwan_rx_pks=$(exec 'ifconfig' wwan0 | grep 'RX packets' | awk '{print $2}' | sed -e 's/[^0-9]//g')
+ if [ "$wwan_rx_pks" != "" ]; then
+ if [ "$wwan_rx_pks" == "$wwan_rx_pks_prev" ]; then
+ LOG "Rakuten reconnect at uptime: ($uptime_sec)"
+ modemproxy -m off
+ sleep 3
+ modemproxy -m on
+ wwan_rx_pks_prev=""
+ else
+ wwan_rx_pks_prev=$wwan_rx_pks
+ fi
+ fi
+ fi
+ fi
+}
+
function main()
{
firewall_rule_check=`grep "iptables -A FORWARD -p tcp -m state --state INVALID -j DROP" /etc/firewall.user`
@@ -750,12 +773,25 @@ function main()
elif [ "$current_state" == "LTE" ]; then # also use as idle state
LOG "state:$current_state"
lte
+ rakuten_reconnect_quirk
fi
sleep 3
- if [ -f "/network_manager.log" ]; then
- LOGSIZE=$(ls -n /network_manager.log | awk '{print $5}')
+
+ # relocated to /tmpfs by making a link
+ if [ -f "/tmp/network_manager.log" ]; then
+ LOGSIZE=$(ls -n /tmp/network_manager.log | awk '{print $5}')
if [ "$LOGSIZE" -gt "4000000" ]; then
- mv /network_manager.log /network_manager.log1
+ mv /tmp/network_manager.log /tmp/network_manager.log1
+ fi
+ fi
+
+ if [ -f "/tmp/modemproxy.log" ]; then
+ LOGSIZE=$(ls -n /tmp/modemproxy.log | awk '{print $5}')
+ # modemproxy.log is made by modemproxyd, and
+ # suspected its size is limitted to 4000000 internally.
+ # limitting less just in a case...
+ if [ "$LOGSIZE" -gt "3900000" ]; then
+ mv /tmp/modemproxy.log /tmp/modemproxy.log1
fi
fi
done