Simulare reti nel sistema operativo Android Automotive (AAOS)

Questa pagina descrive come simulare diverse condizioni di rete sui dispositivi hardware Android Automotive in modo scalabile e con bassa manutenzione. Questa simulazione di rete indipendente dall'ambiente utilizza strumenti Linux comunemente disponibili che possono essere eseguiti su dispositivi hardware Android Automotive.

Le sezioni seguenti descrivono come configurare ed eseguire una simulazione di rete sui dispositivi hardware Android Automotive.

Requisito del kernel

Per abilitare la simulazione di rete su un dispositivo sotto test (DUT), i moduli Linux ifb e netem devono essere configurati nel file di configurazione del kernel, come mostrato di seguito:

# Network simulation config fragment start
CONFIG_NET_SCH_NETEM=y
CONFIG_IFB=y
CONFIG_NET_ACT_MIRRED=y
# Network simulation config fragment end

Imposta la simulazione

Tutte le simulazioni di rete o le simulazioni di limitazione devono essere condotte su un dispositivo sotto test (DUT). Questa simulazione utilizza le utilità Linux tc e NetEm per controllare il traffico di rete sul controller dell'interfaccia di rete (NIC) in base alla politica e alle regole di controllo.

Per impostare la simulazione, procedere come segue:

  1. Connetti il ​​DUT e il server host a Internet.
  2. Crea lo script NetworkSimulation.sh copiandolo dal codice fornito nella sezione dello script NetworkSimulation.sh e scaricalo sul server host.
  3. Connetti il ​​server host al DUT. Assicurati che il DUT appaia nell'elenco dei dispositivi connessi eseguendo adb devices -l .

Per un'illustrazione dell'architettura di configurazione, vedere la figura seguente:

nw-sim

Figura 1. Architettura di installazione

Script NetworkSimulation.sh

Il file di script NetworkSimulation.sh contiene comandi adb che eseguono la simulazione di rete. Copia quanto segue in un file denominato 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"

Esegui la simulazione

Per eseguire una simulazione di rete, i comandi adb nel file di script NetworkSimulation.sh utilizzano argomenti della riga di comando per impostare i valori desiderati.

Per specificare la latenza, la larghezza di banda e la perdita di pacchetti che desideri simulare, esegui lo script NetworkSimulation.sh con i seguenti argomenti della riga di comando:

  • Latenza, specificata in ms.
  • Larghezza di banda, specificata in kbit o mbit.
  • Perdita di pacchetti, in percentuale.

Ad esempio, per impostare una latenza di 300 ms, una larghezza di banda di 100 kbit e una perdita di pacchetti del 50%, eseguire:

bash NetworkSimulation.sh 300ms 100kbit 50%

Per impostare una latenza di 100 ms, una larghezza di banda di 1 Mbit e una perdita di pacchetti dello 0%, eseguire:

bash NetworkSimulation.sh 100ms 1mbit 0%

Verificare la simulazione

Dopo aver eseguito lo script NetworkSimulation.sh , verificare che la simulazione di rete sia configurata correttamente e venga eseguita come previsto utilizzando i comandi Linux ping e curl . Utilizza il comando ping per verificare la latenza e il comando curl per verificare la larghezza di banda.

Ad esempio, quello che segue è l'output previsto di ping per una simulazione eseguita con 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

Questo esempio mostra che ping riporta una perdita di pacchetti al 10% e una latenza media vicina a 108 ms, che è come previsto per il valore di 100 ms specificato nella simulazione. È normale che la latenza segnalata differisca leggermente dal valore specificato.

Per lo stesso esempio, quello che segue è l'output previsto dell'esecuzione del comando 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

Questo esempio mostra che curl riporta la velocità di download media a 49220 Bps, che è come previsto per i 500 kbit specificati nella simulazione. È normale che la larghezza di banda segnalata differisca leggermente dal valore specificato.