Linuxカーネル4.1.25を搭載したZTEルーターがあり、snmpエージェント(mini-snmpd)をインストールしてトラフィックを制御しました。
私が得たデータが正確ではなかったので、いくつかの調査を行った結果、ifconfigと/proc/net/devの両方が間違ったデータを提供し、zteプログラム(cspd / httpd)は正しい値を提供していることがわかりました。
ifconfigがeth4に関する情報を返す場合、これは私が挿入したインターフェースです。
RX バイト: 177365531(161.1MiB) TX バイト: 12507777123(11.6Gib)
ルーターのWebページにはより大きな内容が表示され、このインターフェースの正しい値は次のとおりです。
受信/送信されたバイト数 100655800471/286284079917
私が作ったら速度テスト-cliマイコンピュータから送信されたデータspeedtest-cliレポート(2/3 GB入出力)によって、ネットワークカウンタが増加することがわかります。しかし、ifconfigがほとんど動かない場合は+300MB、時々+100MBまで増えます。
Speedtest by Ookla
Server: xxxxxx (id = 14979)
ISP: xxxxxx
Latency: 1.93 ms (0.12 ms jitter)
Download: 2339.50 Mbps (data used: 2.9 GB )
Upload: 2339.21 Mbps (data used: 2.1 GB )
Packet Loss: 0.0%
ZTEのプログラムは正確なデータを取得しますが、カーネルが正しいデータを取得できない理由はありますか?
編集する:
まあ、私は解決策ではなく原因を見つけたと信じています(解決策がある場合)。
調整可能なパラメータがあります。/proc/ZTE/sys/ffe
私がするなら: エコnpu 0 > /proc/zte/sys/ffe/cmd
良いネットワークグラフが見え始めましたが、着信トラフィックは約1.7 Gbpsに制限されているようです。 (以前は約2.35Gbpsを得ました。)
私がするなら: エコffe 0> /proc/zte/sys/ffe/cmd
ダウンロードとアップロード速度が約300mbpsに急激に低下しました。
npuとffeが何を意味するのか調べてみた結果、ハードウェアネットワークアクセラレータ(ネットワーク処理装置および早送りエンジン)のようです。
/proc/net/devがnpuを通過するトラフィック全体を認識しない理由はまだわかりません。ただし、ユーザー空間のプログラムは認識しており、この問題が何とか解決できるかどうかはわかりません。 net / devファイルを更新することを確認するために使用するno_delete、タイマー、flowctrlオプションがあります。
編集2:
さらに調査した後、cspdプロセスでstraceを使用し、ルータネットワークからeth統計を要求して、cspdプロセス関数CmEthGetPortBasicStats()転送の呼び出しのように見えるwrite()を見ることができました。 cspdバイナリを表示するためにghidraを使用して、/dev/switch_devファイルにfopen()があり、基本的な統計や速度の設定など、さまざまな操作を要求したときに値が0x38(56)のioctlがあることがわかりました。 、デュアル、インターフェイスのオン/オフ... switch_devからデータを取得するためにioctlプログラムを作成しようとしました。まだ成功していません。数バイトしか受信していません。
編集3:
いいですね。 cspd バイナリには 2 つの機能があります。
https://i.stack.imgur.com/4OltN.png
この関数は私が望むものを正確に実行し、すべてのインターフェイスの統計を一度に受け取ります。この関数は、ルータのWebページでeth統計を確認すると呼び出されます。
https://i.stack.imgur.com/gfl1x.png
この関数は同じことを行いますが、インターフェイスごとに実行され、コンソールでこのコマンドを実行すると呼び出されることを確認しました。 sendcmd 1 switch_mgr getPortStats [iface番号]
したがって、まだ/dev/switch_mgrと直接対話することはできませんが、mini-snmpdソースコードにパッチを適用してsendcmdコマンドのデータを追加した偽の/proc/net/devを生成しました。 snmpdは元の代わりにコマンドを解析し、ついに私が見つけたことを達成しました。
ioctl() 呼び出しを 5 popen("sendcmd 1 switch_mgr...") に変更したため、このソリューションは完璧ではないことがわかりますが、これは目に見えるオーバーヘッドが実際には見えず、mini-snmpd が正しい数値を提供します。 。偽の作成以来、ifconfigが変更されないようです。/proc/net/dev存在する/var/tmp/dev-fake、ifconfigは情報を取得しません。後で新しい静的ifconfigをコンパイルすることもできますが、それは私にとって優先順位ではありません。
私はこれで十分です。しかし、誰かが私を直接助けたいのなら/dev/スイッチ_dev