このページでは、AndroidAutomotiveハードウェアデバイスのさまざまなネットワーク状態をスケーラブルでメンテナンスの少ない方法でシミュレートする方法について説明します。この環境にとらわれないネットワークシミュレーションでは、AndroidAutomotiveハードウェアデバイスで実行できる一般的に利用可能なLinuxツールを使用します。
次のセクションでは、AndroidAutomotiveハードウェアデバイスでネットワークシミュレーションを設定して実行する方法について説明します。
カーネル要件
テスト対象デバイス(DUT)でネットワークシミュレーションを有効にするには、以下に示すように、Linuxのifb
およびnetem
モジュールをカーネル構成ファイルで構成する必要があります。
# Network simulation config fragment start
CONFIG_NET_SCH_NETEM=y
CONFIG_IFB=y
CONFIG_NET_ACT_MIRRED=y
# Network simulation config fragment end
シミュレーションを設定する
すべてのネットワークシミュレーションまたはスロットリングシミュレーションは、テスト対象デバイス(DUT)で実行する必要があります。このシミュレーションでは、Linux tc
およびNetEm
ユーティリティを使用して、制御ポリシーとルールに基づいてネットワークインターフェイスコントローラー(NIC)のネットワークトラフィックを制御します。
シミュレーションを設定するには、次の手順を実行します。
- DUTとホストサーバーをインターネットに接続します。
-
NetworkSimulation.sh
スクリプトセクションで提供されているコードからコピーしてNetworkSimulation.sh
スクリプトを作成し、ホストサーバーにダウンロードします。 - ホストサーバーをDUTに接続します。
adb devices -l
を実行して、接続されているデバイスのリストにDUTが表示されることを確認します。
セットアップアーキテクチャの図については、次の図を参照してください。
図1.セットアップアーキテクチャ
NetworkSimulation.sh
スクリプト
NetworkSimulation.sh
スクリプトファイルには、ネットワークシミュレーションを実行するadb
コマンドが含まれています。以下をNetworkSimulation.sh
という名前のファイルにコピーします。
#!/bin/bash
latency=$1
bandwidth=$2
packetloss=$3
# root device and set it to permissive mode
adb root
adb shell setenforce 0
#Clear the current tc control
adb shell tc qdisc del dev ifb0 root
adb shell ip link set dev ifb0 down
adb shell tc qdisc del dev wlan0 ingress
adb shell tc qdisc del dev wlan0 root
# Create a virtual device for ingress
adb shell ip link set dev wlan0 up
adb shell ip link set dev ifb0 up
adb shell tc qdisc del dev wlan0 clsact
adb shell tc qdisc add dev wlan0 handle ffff: ingress
adb shell tc filter add dev wlan0 parent ffff: protocol all u32 match u32 0 0 action mirred egress redirect dev ifb0
# Throttle upload bandwidth / latency / packet loss
adb shell tc qdisc add dev wlan0 root handle 1: htb default 11
adb shell tc class add dev wlan0 parent 1: classid 1:1 htb rate "$bandwidth"
adb shell tc class add dev wlan0 parent 1:1 classid 1:11 htb rate "$bandwidth"
adb shell tc qdisc add dev wlan0 parent 1:11 handle 10: netem delay "$latency" loss "$packetloss"
# Throttle download bandwidth
adb shell tc qdisc add dev ifb0 root handle 1: htb default 10
adb shell tc class add dev ifb0 parent 1: classid 1:1 htb rate "$bandwidth"
adb shell tc class add dev ifb0 parent 1:1 classid 1:10 htb rate "$bandwidth"
シミュレーションを実行する
ネットワークシミュレーションを実行するには、 NetworkSimulation.sh
スクリプトファイルのadb
コマンドで、コマンドライン引数を使用して目的の値を設定します。
シミュレートする遅延、帯域幅、およびパケット損失を指定するには、次のコマンドライン引数を指定してNetworkSimulation.sh
スクリプトを実行します。
- レイテンシー。ミリ秒単位で指定されます。
- 帯域幅。kbitまたはmbitで指定されます。
- パーセンテージとしてのパケット損失。
たとえば、300ミリ秒の遅延、100キロビットの帯域幅、50%のパケット損失を設定するには、次のコマンドを実行します。
bash NetworkSimulation.sh 300ms 100kbit 50%
100ミリ秒の遅延、1メガビットの帯域幅、0%のパケット損失を設定するには、次のコマンドを実行します。
bash NetworkSimulation.sh 100ms 1mbit 0%
シミュレーションを検証する
NetworkSimulation.sh
スクリプトを実行した後、Linux ping
コマンドとcurl
コマンドを使用して、ネットワークシミュレーションが正しく構成され、期待どおりに実行されていることを確認します。 ping
コマンドを使用して遅延を確認し、 curl
コマンドを使用して帯域幅を確認します。
たとえば、 bash NetworkSimulation.sh 100ms 500kbit 10%
で実行されたシミュレーションで期待されるping
の出力は次のとおりです。
BUILD:/ # ping -c 20 www.google.com PING www.google.com (172.217.5.100) 56(84) bytes of data. 64 bytes from sfo03s07-in-f4.1e100.net (172.217.5.100): icmp_seq=1 ttl=119 time=103 ms 64 bytes from sfo03s07-in-f4.1e100.net (172.217.5.100): icmp_seq=2 ttl=119 time=105 ms 64 bytes from sfo03s07-in-f4.1e100.net (172.217.5.100): icmp_seq=3 ttl=119 time=103 ms 64 bytes from sfo03s07-in-f4.1e100.net (172.217.5.100): icmp_seq=5 ttl=119 time=103 ms 64 bytes from sfo03s07-in-f4.1e100.net (172.217.5.100): icmp_seq=6 ttl=119 time=103 ms 64 bytes from sfo03s07-in-f4.1e100.net (172.217.5.100): icmp_seq=7 ttl=119 time=103 ms 64 bytes from sfo03s07-in-f4.1e100.net (172.217.5.100): icmp_seq=9 ttl=119 time=103 ms 64 bytes from sfo03s07-in-f4.1e100.net (172.217.5.100): icmp_seq=10 ttl=119 time=103 ms 64 bytes from sfo03s07-in-f4.1e100.net (172.217.5.100): icmp_seq=11 ttl=119 time=185 ms 64 bytes from sfo03s07-in-f4.1e100.net (172.217.5.100): icmp_seq=12 ttl=119 time=103 ms 64 bytes from sfo03s07-in-f4.1e100.net (172.217.5.100): icmp_seq=13 ttl=119 time=103 ms 64 bytes from sfo03s07-in-f4.1e100.net (172.217.5.100): icmp_seq=14 ttl=119 time=103 ms 64 bytes from sfo03s07-in-f4.1e100.net (172.217.5.100): icmp_seq=15 ttl=119 time=103 ms 64 bytes from sfo03s07-in-f4.1e100.net (172.217.5.100): icmp_seq=16 ttl=119 time=103 ms 64 bytes from sfo03s07-in-f4.1e100.net (172.217.5.100): icmp_seq=17 ttl=119 time=103 ms 64 bytes from sfo03s07-in-f4.1e100.net (172.217.5.100): icmp_seq=18 ttl=119 time=103 ms 64 bytes from sfo03s07-in-f4.1e100.net (172.217.5.100): icmp_seq=19 ttl=119 time=103 ms 64 bytes from sfo03s07-in-f4.1e100.net (172.217.5.100): icmp_seq=20 ttl=119 time=103 ms --- www.google.com ping statistics --- 20 packets transmitted, 18 received, 10% packet loss, time 19040ms rtt min/avg/max/mdev = 103.394/108.307/185.756/18.791 ms
この例は、 ping
が10%でパケット損失を報告し、平均遅延が108msに近いことを示しています。これは、シミュレーションで指定された100msの値で予想されるとおりです。報告されたレイテンシーが指定された値とわずかに異なるのは正常です。
同じ例で、 curl
コマンドを実行した場合の予想される出力は次のとおりです。
BUILD:/sdcard/DCIM # curl https://images-assets.nasa.gov/image/PIA15416/PIA15416~orig.jpg -o foo.jpg % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 6598k 100 6598k 0 0 49220 0 0:02:17 0:02:17 --:--:-- 47574
この例は、 curl
が49220 Bpsでの平均ダウンロード速度を報告することを示しています。これは、シミュレーションで指定された500kbitで予想されるとおりです。報告された帯域幅が指定された値とわずかに異なるのは正常です。