楽天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