本頁介紹如何以可擴展、低維護的方式在 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 和主機服務器連接到 Internet。
- 通過從
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
腳本:
- 延遲,以毫秒為單位。
- 帶寬,以 kbit 或 mbit 為單位指定。
- 數據包丟失,以百分比表示。
例如,要設置 300ms 延遲、100kbit 帶寬和 50% 丟包率,運行:
bash NetworkSimulation.sh 300ms 100kbit 50%
要設置 100ms 延遲、1mbit 帶寬和 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 的預期一致。報告的帶寬與指定值有少量差異是正常的。