Symulowanie sieci w systemie operacyjnym Android Automotive (AAOS)

Z tego artykułu dowiesz się, jak symulować różne warunki sieci na Androidzie Urządzenia samochodowe, które można skalować i nie wymagają wielu konserwacji. Ten symulacja sieci niezależnej od środowiska wykorzystuje powszechnie dostępne narzędzia dla systemu Linux, mogą działać na urządzeniach z Androidem Automotive.

W poniższych sekcjach opisano, jak skonfigurować i uruchomić symulację sieci na Urządzenia z Androidem Automotive.

Wymaganie jądra systemu

Aby włączyć symulację sieci na testowanym urządzeniu, należy ifb oraz netem moduły muszą być skonfigurowane w pliku konfiguracji jądra w następujący sposób:

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

Skonfiguruj symulację

Wszystkie symulacje sieci lub ograniczania muszą być prowadzone urządzenia w trakcie testów (DUT). Ta symulacja używa systemu Linux tc i NetEm narzędzia do kontrolowania ruchu sieciowego w kontrolerze interfejsu sieciowego (NIC) w oparciu o zasadę kontroli i reguły.

Aby skonfigurować symulację:

  1. Połącz urządzenie DUT i serwer hosta z internetem.
  2. Utwórz skrypt NetworkSimulation.sh, kopiując go z podanego kodu w sekcji NetworkSimulation.sh skrypt i pobierz go na serwerze hosta.
  3. Połącz serwer hosta z urządzeniem DUT. Sprawdź, czy na liście jest widoczna usługa DUT połączonych urządzeń po uruchomieniu adb devices -l.

Architektura konfiguracji znajdziesz na tej ilustracji:

NW SIM

Rysunek 1. Architektura konfiguracji.

Skrypt NetworkSimulation.sh

Plik skryptu NetworkSimulation.sh zawiera adb polecenia, które uruchamiają i symulację sieci. Skopiuj kod podany poniżej do pliku o nazwie 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"

Wykonaj symulację

Aby wykonać symulację sieci, polecenia adb w NetworkSimulation.sh plik skryptu do ustawienia – użyj argumentów wiersza poleceń .

Aby określić czas oczekiwania, przepustowość i utratę pakietów do symulowania, uruchom NetworkSimulation.sh skrypt z tymi argumentami wiersza poleceń:

  • Czas oczekiwania określony w ms.
  • Przepustowość określona w kb lub mbitach.
  • Utracone pakiety (jako wartość procentowa).

Aby na przykład ustawić opóźnienie na poziomie 300 ms, przepustowość 100 kb/s i utratę pakietów na poziomie 50%, uruchom polecenie:

bash NetworkSimulation.sh 300ms 100kbit 50%

Aby ustawić opóźnienie na 100 ms, przepustowość 1 mbit i utratę pakietów 0%, uruchom polecenie:

bash NetworkSimulation.sh 100ms 1mbit 0%

Zweryfikuj symulację

Po wykonaniu skryptu NetworkSimulation.sh sprawdź, czy sieć symulacja jest prawidłowo skonfigurowana i działa zgodnie z oczekiwaniami przy użyciu Linux ping oraz curl poleceń. Za pomocą polecenia ping sprawdź opóźnienie, a polecenia curl – sprawdzić przepustowość.

Oto oczekiwane dane wyjściowe funkcji ping w symulacji: wykonane przy użyciu 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

Ten przykład pokazuje, że interfejs ping zgłasza utratę pakietów na poziomie 10% i średni czas oczekiwania prawie 108 ms, co jest zgodne z oczekiwaniami przy wartości 100 ms określonej w symulację. To normalne, że raportowany czas oczekiwania różni się od podanego o niewielką wartość.

W tym samym przykładzie poniżej przedstawiamy oczekiwane dane wyjściowe uruchomionego polecenia 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

W tym przykładzie widać, że curl podaje średnią prędkość pobierania wynoszącą 49 220 B/s, co odpowiada 500 kbitom określonym w symulacji. To normalne aby raportowana przepustowość odbiegała od określonej wartości o niewielkim odchyleniu.