USBテザリングとiperfを使ってUSBケーブルのデータラインの質を測定する

USBケーブルの質を測りたいのですが、市販のUSBテスターにデータラインの質の計測可能なものが無いため、どうするか考えてiperfを使うことにしました。

なお、ここで使っているホスト端末はUbuntu 24.04、デバイス端末はRedmi Note 11 Pro 5G (MIUI 14) です。

まずはUSBケーブルを繋いだ後にデバイス側のUSBテザリングを有効にします。USBデザリングは自分の環境では「設定」→「接続と共有」→「ポータブルホットスポット」→「USBテザリング」をオンにすることで有効となりました。
![Screenshot_2025-04-03-20-52-33-331_com.android.settings.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109174/d435dd0d-bdbe-4740-bab9-6b949c69ea18.jpeg)


USB経由のネットワークインターフェースが有効になってるかはホスト側で以下を実行することで確認できます:
```sh
$ ifconfig `ifconfig | grep -o '^enx[^:]*'`
enx4e1fe26ad523: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        ether 4e:1f:e2:6a:d5:23  txqueuelen 1000  (イーサネット)
        RX packets 7  bytes 668 (668.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

```
この時点ではまだIPアドレスが割り当てられてないため、dhclientを使ってDHCP経由でIPアドレスを割り当てる必要があります。
```sh
$ sudo dhclient -v `ifconfig | grep -o '^enx[^:]*'`
Internet Systems Consortium DHCP Client 4.4.3-P1
Copyright 2004-2022 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/

Listening on LPF/enx4e1fe26ad523/4e:1f:e2:6a:d5:23
Sending on   LPF/enx4e1fe26ad523/4e:1f:e2:6a:d5:23
Sending on   Socket/fallback
xid: warning: no netdev with useable HWADDR found for seed's uniqueness enforcement
xid: rand init seed (0x6791701f) built using gethostid
DHCPDISCOVER on enx4e1fe26ad523 to 255.255.255.255 port 67 interval 3 (xid=0x57ffa917)
DHCPOFFER of 192.168.86.177 from 192.168.86.196
DHCPREQUEST for 192.168.86.177 on enx4e1fe26ad523 to 255.255.255.255 port 67 (xid=0x17a9ff57)
DHCPACK of 192.168.86.177 from 192.168.86.196 (xid=0x57ffa917)
Setting LLMNR support level "yes" for "8", but the global support level is "no".
bound to 192.168.86.177 -- renewal in 1491 seconds.
```
しかしながらdhclientはこの際に接続の上流である標準ゲートウェイまで追加してしまうようです。そのため、追加された標準ゲートウェイを削除して標準ゲートウェイを元のままとします。
```sh
$ sudo route
カーネルIP経路テーブル
受信先サイト    ゲートウェイ    ネットマスク   フラグ Metric Ref 使用数 インタフェース
default         _gateway        0.0.0.0         UG    0      0        0 enx4e1fe26ad523
default         _gateway        0.0.0.0         UG    100    0        0 eno1
192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 eno1
192.168.86.0    0.0.0.0         255.255.255.0   U     0      0        0 enx4e1fe26ad523
$ sudo route del default dev `ifconfig | grep -o '^enx[^:]*'`
$ sudo route
カーネルIP経路テーブル
受信先サイト    ゲートウェイ    ネットマスク   フラグ Metric Ref 使用数 インタフェース
default         _gateway        0.0.0.0         UG    100    0        0 eno1
192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 eno1
192.168.86.0    0.0.0.0         255.255.255.0   U     0      0        0 enx4e1fe26ad523
```
これでローカルのみの接続が完了しました。まずは確認のためにホスト側でpingを打ってみます。デバイス側のIPアドレスはdhclientの時に「from 」の後に表示されたものとなります。
```sh
$ sudo ping 192.168.86.196
PING 192.168.86.196 (192.168.86.196) 56(84) bytes of data.
64 bytes from 192.168.86.196: icmp_seq=1 ttl=64 time=3.75 ms
64 bytes from 192.168.86.196: icmp_seq=2 ttl=64 time=3.58 ms
64 bytes from 192.168.86.196: icmp_seq=3 ttl=64 time=3.65 ms
^C
--- 192.168.86.196 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 3.580/3.662/3.754/0.071 ms
```

次は速度の計測です。ホスト側にiperf3をインストールします。
```sh
sudo apt install iperf3
```
デバイス側からiperf3に接続できるようにファイアーウォールでiperf3に必要なポートを開けておきます。Ubuntuではファイアーウォールにufwが使われているため、ufwコマンドで以下のように設定します。
```sh
$ sudo ufw allow from 192.168.86.0/24 to any port 5201 proto tcp
ルールを追加しました
```

デバイス側には「PingTools Network Utilities」をインストールします: https://play.google.com/store/apps/details?id=ua.com.streamsoft.pingtools&hl=ja

最後は実際の計測を行います。ホスト側ではiperf3サーバーを起動します:
```sh
$ iperf3 -s
-----------------------------------------------------------
Server listening on 5201 (test #1)
-----------------------------------------------------------
```

デバイス側では「PingTools Network Utilities」を開き、左のサイドメニューからiPerfを選択し、テキストボックスにdhclientで取得したIPアドレスを入れてStartを押します。

![Screenshot_2025-04-03-20-48-22-218_ua.com.streamsoft.pingtools.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109174/9f116fad-9fe3-4a1e-923f-b4db838bab00.jpeg)

計測が完了しました！

# 追記
USBケーブルを繋いだら自動的にローカル接続されるようにしてみました！

ネットワークインタフェースをusb0に固定する:
```sh:/etc/udev/rules.d/99-usb-tethering.rules
ACTION=="add", SUBSYSTEM=="net", ENV{ID_USB_DRIVER}=="rndis_host", NAME="usb0"
```

udev設定をリロード:
```
sudo udevadm control --reload-rules
```

usb0を設定:
```:/etc/network/interfaces
(前略)

allow-hotplug usb0
iface usb0 inet dhcp
up route del default dev usb0
```

ネットワーク周りを再起動:
```
sudo systemctl restart networking
```