Android Automotive OS (AAOS) でネットワークをシミュレートする

このページでは、スケーラブルでメンテナンスの少ない方法で、Android Automotive ハードウェア デバイス上のさまざまなネットワーク状態をシミュレートする方法について説明します。この環境に依存しないネットワーク シミュレーションは、Android Automotive ハードウェア デバイス上で実行できる一般的に入手可能な Linux ツールを使用します。

次のセクションでは、Android Automotive ハードウェア デバイスでネットワーク シミュレーションをセットアップして実行する方法について説明します。

カーネル要件

テスト対象デバイス (DUT) でネットワーク シミュレーションを有効にするには、次に示すように、カーネル構成ファイルで Linux のifbnetemモジュールを構成する必要があります。

# 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) 上のネットワーク トラフィックを制御します。

シミュレーションを設定するには、次の手順を実行します。

  1. DUT とホストサーバーをインターネットに接続します。
  2. NetworkSimulation.sh NetworkSimulation.shセクションで提供されるコードからコピーして NetworkSimulation.sh スクリプトを作成し、ホスト サーバーにダウンロードします。
  3. ホストサーバーをDUTに接続します。 adb devices -lを実行して、接続されたデバイスのリストに DUT が表示されていることを確認します。

セットアップ アーキテクチャの図については、次の図を参照してください。

nw-sim

図 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 で予想される値です。報告された帯域幅が指定された値とわずかに異なるのは正常です。