L'offload del tethering consente ai dispositivi di risparmiare energia e migliorare le prestazioni scaricando il traffico di tethering (tramite USB, Wi-Fi) sull'hardware. Il traffico di tethering viene scaricato fornendo un percorso diretto tra il modem e le periferiche, bypassando il processore dell'app.
Specifiche
A partire da Android 8.1, i dispositivi possono utilizzare l'offload del tethering per eseguire l'offload dell'inoltro IPv4, IPv6 o IPv4+IPv6 all'hardware.
La funzione di offload non necessita di scaricare tutti i pacchetti. Il framework è in grado di gestire qualsiasi pacchetto nel software. I pacchetti di controllo vengono generalmente elaborati nel software. Poiché le porte IPv4 sono condivise tra il traffico tethered e il traffico del dispositivo, i pacchetti di installazione/smontaggio della sessione IPv4 (ad esempio, SYN/SYN+ACK, FIN) devono essere elaborati nel software in modo che il kernel possa costruire lo stato del flusso. Il framework fornisce il piano di controllo e le macchine a stati. Fornisce inoltre all'hardware informazioni su interfacce/prefissi upstream e downstream.
Per IPv4, l'hardware consente ai pacchetti di configurazione della sessione NAT (Network Address Translation) IPv4 di raggiungere la CPU. Il kernel crea voci NAT e l'implementazione HAL osserva le voci dai descrittori di file forniti dal framework e gestisce questi flussi nell'hardware. Ciò significa che l'implementazione dell'HAL non richiede CAP_NET_*
perché l'HAL ottiene socket NF_NETLINK_CONNTRACK
aperti dal framework. Periodicamente, l'hardware invia aggiornamenti dello stato NAT per i flussi attualmente attivi al framework, che aggiorna le voci corrispondenti sullo stato di tracciamento della connessione del kernel.
Per IPv6, il framework programma un elenco di prefissi di destinazione IPv6 su cui non deve essere scaricato il traffico. Tutti gli altri pacchetti vincolati possono essere scaricati.
Per la contabilità sull'utilizzo dei dati, i sondaggi sull'utilizzo dei dati NetworkStatsService
fanno sì che il framework richieda statistiche sul traffico dall'hardware. Il framework comunica inoltre i limiti di utilizzo dei dati all'hardware tramite l'HAL.
Requisiti hardware
Per implementare l'offload del tethering, l'hardware deve essere in grado di inoltrare pacchetti IP tra il modem e Wi-Fi/USB senza inviare il traffico attraverso il processore principale.
Implementazione
Per abilitare la funzione di tethering offload, è necessario implementare i due seguendo sia un HAL di configurazione ( IOffloadConfig
) che un HAL di controllo ( IOffloadControl
).
HAL di configurazione: IOffloadConfig
L'HAL IOffloadConfig
avvia l'implementazione dell'offload del tethering. Il framework fornisce all'implementazione HAL socket NF_NETLINK_CONNTRACK
preconnessi che l'implementazione può utilizzare per osservare i flussi IPv4. Solo i flussi inoltrati devono essere accelerati.
HAL di controllo: IOffloadControl
L'HAL IOffloadControl
controlla l'implementazione dell'offload. È necessario implementare i seguenti metodi:
- Avvia/arresta l'offload dell'hardware: utilizza
initOffload/stopOffload
ed esenta gli indirizzi IP locali o altre reti dall'offload consetLocalPrefixes
. - Imposta l'interfaccia upstream, l'indirizzo IPv4 e i gateway IPv6: utilizza
setUpstreamParameters
e configura gli intervalli di indirizzi IP downstream conaddDownstream/removeDownstream
. - Contabilità dell'utilizzo dei dati: utilizzare
getForwardedStats/setDataLimit
.
L'HAL del fornitore deve inoltre inviare callback tramite l'interfaccia ITetheringOffloadCallback
, che informa il framework di:
- Eventi asincroni come l'avvio e l'arresto dell'offload (OffloadCallbackEvent)
- Aggiornamenti del timeout NAT, che devono essere inviati periodicamente per indicare che uno specifico flusso IPv4 contiene traffico e non deve essere chiuso dal kernel
Validazione
Per convalidare l'implementazione dell'offload del tethering, utilizza test manuali o automatizzati per verificare che il tethering e l'hotspot Wi-Fi funzionino come previsto. La Vendor Test Suite (VTS) contiene test per gli HAL di offload del tethering.