Test unità di rete del kernel

A partire da Android 5.0, il corretto funzionamento dello stack di rete Android sui kernel Linux richiede una serie di commit che sono stati sottoposti a upstream relativamente di recente o che non sono ancora stati eseguiti a monte. Non è facile verificare manualmente la funzionalità richiesta del kernel o tenere traccia dei commit mancanti, quindi il team di Android sta condividendo i test utilizzati per garantire che il kernel si comporti come previsto.

Perché eseguire i test?

Questi test esistono per tre ragioni principali:

  1. La versione esatta del kernel Linux utilizzata su un dispositivo è in genere specifica del dispositivo ed è difficile sapere se un kernel funzionerà correttamente senza eseguire i test.
  2. Il forward porting e il back porting delle patch del kernel su diverse versioni del kernel o su diversi alberi di dispositivi può introdurre problemi sottili che possono essere impossibili da individuare senza eseguire i test.
  3. Le nuove funzionalità di rete potrebbero richiedere nuove funzionalità del kernel o correzioni di bug del kernel.

Se i test non vengono superati, lo stack di rete del dispositivo si comporterà in modo errato, causando bug di connettività visibili all'utente (come la caduta delle reti Wi-Fi). Probabilmente il dispositivo non supererà anche i test CTS (Android Compatibility Test Suite).

Utilizzando i test

I test utilizzano Linux in modalità utente per avviare il kernel come processo su una macchina host Linux. Vedere Definizione di un ambiente di compilazione per le versioni adatte del sistema operativo. Il framework di unit test avvia il kernel con un'immagine disco appropriata ed esegue i test dal file system host. I test sono scritti in Python e utilizzano le interfacce TAP per esercitare il comportamento del kernel e l'API socket.

Compilazione del kernel per ARCH=um

Affinché i test possano essere eseguiti, il kernel deve compilare per ARCH=um SUBARCH=x86_64 . Questa è un'architettura supportata sia a monte che negli alberi comuni del kernel Android (come android-4.4 ). Ma a volte i kernel dei dispositivi non vengono compilati in questa modalità perché gli alberi dei dispositivi contengono codice specifico del dispositivo o dell'hardware in file comuni (ad esempio sys/exit.c ).

In molti casi, è sufficiente garantire che il codice specifico dell'hardware sia dietro un #ifdef . In genere dovrebbe essere un #ifdef su un'opzione di configurazione che controlla la funzionalità specifica rilevante per il codice. Se non esiste tale opzione di configurazione, inserisci il codice specifico dell'hardware all'interno dei blocchi #ifndef CONFIG_UML .

In generale, la risoluzione di questo problema dovrebbe essere responsabilità del fornitore dell'albero del kernel (come il fornitore del chipset o del SoC). Stiamo collaborando con OEM e fornitori per garantire che i kernel attuali e futuri vengano compilati per ARCH=um SUBARCH=x86_64 senza richiedere alcuna modifica.

Esecuzione dei test

I test si trovano in kernel/tests/net/test . Si consiglia di eseguire i test da AOSP principale poiché sono i più aggiornati; in alcuni casi, le funzionalità del kernel necessarie per il corretto funzionamento in una determinata versione di Android non hanno ancora una copertura completa dei test in quella determinata versione. Per informazioni su come eseguire i test, consultare il file README del test di rete del kernel . Fondamentalmente, dalla parte superiore dell'albero del kernel, esegui:

ANDROID_TREE/kernel/tests/net/test/run_net_test.sh all_tests.sh

Superamento delle prove

I file sorgente Python per il test della rete del kernel contengono commenti che specificano i commit del kernel che sono noti per essere necessari per superare i test. I test dovrebbero superare gli alberi del kernel comuni - tutti i rami comuni del kernel android-4.4 e versioni successive - nel progetto kernel/common in AOSP. Pertanto, superare i test su un kernel è semplicemente una questione di fusione continua dal corrispondente ramo comune del kernel.

Contribuire

Segnalazione di problemi

Segnala eventuali problemi con i test di rete del kernel nel tracker dei problemi di Android con l'etichetta Component-Networking .

Documentare i commit e aggiungere test

Segnala i problemi come descritto sopra e, se possibile, carica una modifica per risolvere il problema, se:

  • I test non passano sugli alberi del kernel comuni
  • Trovi un commit necessario che non è menzionato nei commenti di origine,
  • Far sì che i test superino i kernel upstream richiede modifiche importanti
  • Ritieni che i test siano eccessivamente specificati o che il test fallisca sui kernel futuri
  • Desideri aggiungere più test o più copertura ai test esistenti.