Esta página descreve como simular diferentes condições de rede em dispositivos de hardware automotivo Android de maneira escalonável e com pouca manutenção. Essa simulação de rede independente do ambiente usa ferramentas Linux comumente disponíveis que podem ser executadas em dispositivos de hardware do Android Automotive.
As seções a seguir descrevem como configurar e executar uma simulação de rede em dispositivos de hardware do Android Automotive.
Requisito do kernel
Para ativar a simulação de rede em um dispositivo em teste (DUT), os módulos
ifb
e
netem
do Linux precisam ser configurados no arquivo de configuração do kernel, conforme mostrado abaixo:
# Network simulation config fragment start
CONFIG_NET_SCH_NETEM=y
CONFIG_IFB=y
CONFIG_NET_ACT_MIRRED=y
# Network simulation config fragment end
Configurar simulação
Todas as simulações de rede ou de limitação precisam ser realizadas em um
dispositivo em teste (DUT). Esta simulação usa os utilitários
tc
e
NetEm
do Linux para controlar o tráfego de rede no controlador de interface de rede
(NIC) com base na política e nas regras de controle.
Para configurar a simulação, faça o seguinte:
- Conecte o DUT e o servidor host à Internet.
- Crie o script
NetworkSimulation.sh
copiando-o do código fornecido na seção scriptNetworkSimulation.sh
e faça o download dele no servidor host. - Conecte o servidor host ao DUT. Execute
adb devices -l
para garantir que o DUT apareça na lista de dispositivos conectados.
Para uma ilustração da arquitetura de configuração, consulte a figura a seguir:
Figura 1. Arquitetura de configuração.
Script NetworkSimulation.sh
O arquivo de script NetworkSimulation.sh
contém comandos adb
que executam a
simulação de rede. Copie o seguinte para um arquivo chamado 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"
Executar simulação
Para executar uma simulação de rede, os comandos adb
no
arquivo de script NetworkSimulation.sh
usam argumentos de linha de comando para definir
valores.
Para especificar a latência, a largura de banda e a perda de pacotes que você quer simular, execute o
script NetworkSimulation.sh
com os seguintes argumentos de linha de comando:
- Latência, especificada em ms.
- Largura de banda, especificada em kbit ou mbit.
- Perda de pacotes, em porcentagem.
Por exemplo, para definir uma latência de 300 ms, uma largura de banda de 100kbit e uma perda de pacotes de 50%, execute:
bash NetworkSimulation.sh 300ms 100kbit 50%
Para definir uma latência de 100 ms, uma largura de banda de 1 Mb e uma perda de pacotes de 0%, execute:
bash NetworkSimulation.sh 100ms 1mbit 0%
Verificar simulação
Depois de executar o script NetworkSimulation.sh
, verifique se a simulação
de rede está configurada corretamente e em execução conforme o esperado usando os
comandos ping
e
curl
do Linux. Use o comando ping
para verificar a latência e o comando curl
para
verificar a largura de banda.
Por exemplo, confira a seguir a saída esperada de ping
para uma simulação
executada com bash NetworkSimulation.sh 100ms 500kbit 10%
:
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
Este exemplo mostra que ping
informa uma perda de pacotes de 10% e uma latência média
próxima de 108 ms, o que é esperado para o valor de 100 ms especificado na
simulação. É normal que a latência informada seja um pouco diferente do valor
especificado.
Para o mesmo exemplo, a saída esperada da execução do comando
curl
é a seguinte.
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
Este exemplo mostra que curl
informa a velocidade média de download em 49.220 Bps,
o que é esperado para os 500 kB especificados na simulação. É normal
que a largura de banda informada seja um pouco diferente do valor especificado.