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

このページでは、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)のネットワークトラフィックを制御します。

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

  1. DUTとホストサーバーをインターネットに接続します。
  2. 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キロビットの帯域幅、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で予想されるとおりです。報告された帯域幅が指定された値とわずかに異なるのは正常です。