在 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 tcNetEm實用程序根據控制策略和規則控製網絡接口控制器 (NIC) 上的網絡流量。

要設置模擬,請執行以下操作:

  1. 將 DUT 和主機服務器連接到 Internet。
  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 為單位指定。
  • 數據包丟失,以百分比表示。

例如,要設置 300ms 延遲、100kbit 帶寬和 50% 丟包率,運行:

bash NetworkSimulation.sh 300ms 100kbit 50%

要設置 100ms 延遲、1mbit 帶寬和 0% 丟包率,請運行:

bash NetworkSimulation.sh 100ms 1mbit 0%

驗證模擬

執行NetworkSimulation.sh腳本後,使用 Linux pingcurl命令驗證網絡模擬是否配置正確並按預期運行。使用ping命令驗證延遲,使用curl命令驗證帶寬。

例如,以下是使用bash NetworkSimulation.sh 100ms 500kbit 10%執行的模擬的ping預期輸出:

seahawk:/ # 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命令的預期輸出。

seahawk:/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 的預期一致。報告的帶寬與指定值有少量差異是正常的。