在 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预期输出:

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 的预期一致。报告的带宽与指定值有少量差异是正常的。