本文将介绍如何以可扩容且易于维护的方式在 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
脚本部分提供的代码复制该脚本),并将其下载到主机服务器上。 - 将主机服务器连接到 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
脚本:
- 延迟时间,以毫秒为单位进行指定。
- 带宽,以千比特或兆比特为单位进行指定。
- 丢包率,以百分比进行指定。
例如,如需设置 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%,平均延迟时间接近 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
报告的平均下载速度为 49,220 字节/秒。由于模拟中指定的带宽为 500 千比特,此结果符合预期。报告的带宽与指定的值存在少许差异是正常情况。