このページでは、スケーラブルでメンテナンスの少ない方法で、Android Automotive ハードウェア デバイス上のさまざまなネットワーク状態をシミュレートする方法について説明します。この環境に依存しないネットワーク シミュレーションは、Android Automotive ハードウェア デバイス上で実行できる一般的に入手可能な Linux ツールを使用します。
次のセクションでは、Android Automotive ハードウェア デバイスでネットワーク シミュレーションをセットアップして実行する方法について説明します。
カーネル要件
テスト対象デバイス (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
セクションで提供されるコードからコピーして 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 kbit、パケット損失を 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% のパケット損失と 108 ミリ秒に近い平均遅延を報告していることを示しています。これは、シミュレーションで指定された 100 ミリ秒の値で予想される値です。報告される遅延が指定された値とわずかに異なるのは正常です。
同じ例で、 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 で予想される値です。報告された帯域幅が指定された値とわずかに異なるのは正常です。