• Non ci sono risultati.

Prima della procedura di compilazione ho apportato alcune modifiche al Kernel. Ovviamente, si può modificare il codice sorgente, ma essendo un kernel Linux, ho potuto eseguire make menuconfig per personalizzarlo, aggiungendo funzionalità e moduli del kernel (che non hanno nulla a che vedere con i moduli di Android). Vi sono due metodi per farlo, il primo è modificare manualmente il file .config, l’altro è usare make menuconfig per caricare una sorta di interfaccia grafica nel terminale, come in Figura 4.18.

Figura 4.18: Configurazione kernel Linux

Il menu di configurazione è costituito da diverse sezioni, sottosezioni e imposta- zioni da abilitare/disabilitare e campi di testo da completare. Premendo il tasto “h” sulla tastiera sull’elemento del menu, si ottiene una breve descrizione del funziona- mento e la lista di altre funzioni che saranno modificate automaticamente. In basso c’è anche il menu per scegliere il tipo di azione, cioè selezionare, uscire e mostrare l’aiuto. Con le frecce laterali si scorre, con barra spaziatrice si seleziona l’elemento e con invio si esplorano le voci del menu di configurazione. La voce selezione può essere usata più volte per modificare la modalità di inclusione, cioè [ ] è non incluso, [*] è incluso di default nel kernel e [M] è un modulo del kernel che deve essere ca- ricato manualmente tramite il comando insmod <Nome_Modulo.o> sul dispositivo e ad ogni riavvio sarà necessario rieseguirlo (a meno di soluzioni particolari per far caricare automaticamente il modulo all’avvio che però esulano da questo lavoro di tesi).

4.9. Configurare il kernel di Android abilitare il supporto alle interfacce virtuali di rete in Android, ma per ora mi voglio concentrare solo su due impostazioni:

• General Setup per scegliere il nome del kernel personalizzato in (-perf) Local version - append to kernel release.

• General Setup per abilitare Kernel .config support e la sua sottovoce Enable access to .config through /proc/config.gz, poiché permette di vedere la configu- razione del kernel direttamente sul dispositivo in cui è installato.

Terminata la configurazione, ho scelto Exit dal menu il basso e ho confermato con Yes per salvare la configurazione. Tutte le modifiche fatte in questo menu, modificano automaticamente il file .config. Quindi, usare il file manualmente o l’interfaccia grafica porta allo stesso risultato. A questo punto, ho compilato di nuovo il kernel per ottenere la zImage personalizzata.

Continuerò questa sezione nel Capitolo 5 per abilitare il supporto alle interfacce di rete virtuali, ma prima è necessario spiegare alcuni concetti che non ho ancora trattato.

Capitolo 5

Wpa_supplicant

In questo lavoro di tesi ho più volte accennato in modo superficiale il concetto di Virtual network InterFace (VIF), ma ora è necessario approfondire l’argomento, quindi ho deciso di mostrarne un’introduzione teorica basata su due progetti, il primo riguarda Windows e definisce il concetto stesso di “interfaccia virtuale di rete”, il secondo è un ottimo riferimento per Linux, a cui questo documento è più vicino. Poiché Android utilizza un kernel Linux modificato, è sempre valido il concetto di VIF, ma con importanti limitazioni che non riguardano in modo specifico Wi-Fi Direct, ma la gestione di qualunque tipo di VIF. Tale problema sarà spiegato nel dettaglio lungo questo capitolo, tramite wpa_supplicant e iw ed in modo ancora più approfondito nel successivo.

5.1 Interfacce di rete virtuali

Il concetto di “interfaccia di rete virtuale” o Virtual network InterFace (VIF) è stato presentato per la prima volta da Microsoft nel 2003 con il nome di MultiNet [8], con l’obiettivo di connettere un PC a più reti wireless contemporaneamente, questo perché avere più chip Wi-Fi sullo stesso dispositivo causa consumi di energia troppo elevati. L’idea è quella di virtualizzare una singola scheda di rete fisica, introducendo un livello intermedio al di sotto di quello IP (nello stack di rete) che alterna continuamente le connessioni tra le reti wireless. Il vantaggio principale è che i protocolli TCP/IP e le applicazioni non richiedono nessuna modifica. L’utilità delle VIF riguarda:

• la possibilità di connessione a più reti wireless;

• estensione della rete, cioè usare Access Point che estendono l’area di ricezione della rete;

• nodi Gateway, cioè un nodo connesso ad internet e contemporaneamente ad una rete ad-hoc;

5. Wpa_supplicant

• l’aumento delle capacità delle reti ad-hoc;

• l’utilizzo di macchine virtuali per connetterle a diverse reti fisiche.

Prima di questo progetto, una scheda di rete avrebbe potuto connettersi solo ad una rete fisica e soprattutto non avrebbe potuto interagire con altri dispositivi su fre- quenze diverse. Inoltre, un nodo di in una rete ad-hoc non avrebbe potuto interagire con altri, anche se sullo stesso canale. Questo perché IEEE 802.11 specifica diversi protocolli per la comunicazione tra IBSS e BSS e non si occupa della sincronizzazione. MultiNet definisce la virtualizzazione di una scheda di rete tramite l’astrazione di più schede che sono adattatori sempre attivi su una singola scheda di rete fisica. Questo lo si ottiene facendo multiplexing1 della scheda di rete attraverso più reti

wireless, cioè si alternano le varie interfacce usando uno slot temporale detto Active Period per ogni rete operante su un particolare canale. La somma degli Active Period di tutte le reti connesse è chiamato Switching Cycle. L’architettura di basa su MultiNet Protocol Driver che è un livello intermedio tra IP a MAC. Il driver espone adattatori di rete multipli sempre attivi (uno per ogni rete wireless) e permette che vi sia un IP diverso assegnato ad ogni rete. Idealmente, ogni adattatore di rete esposto dal driver dovrebbe avere anche un MAC address diverso.

Utilizzare MultiNet rispetto ad avere più schede Wi-Fi fa si che i consumi ener- getici siano inferiori. Infatti, anche quando i chip sono in stato di idle, consumano comunque di più (circa il doppio) di MultiNet. Usando la Power Save Mode (PSM) si riesce a ridurre il consumo della soluzione a due chip, diventando paragonabile a MultiNet, ma ciò riduce il throughput e quindi le performance diminuiscono.

Questo progetto è nato su Windows XP, ma poi ci sono state diverse soluzioni in Linux come per esempio Juggler per il kernel Linux 2.6. In Juggler [4] si alternano le reti wireless secondo un algoritmo Round Robin, aggiornando continuamente SSID, BSSID e la frequenza nella scheda di rete fisica. Juggler usa alcuni buffer per salvare i pacchetti di rete e il dispositivo virtuale, o pseudodevice, impersona un’interfaccia di rete cablata ethernet, con un IP privato statico e un MAC Address Ethernet, per distinguerlo da interfacce fisiche di rete. Se Juggler deve passare da una rete ad un’altra ed è su una frequenza diversa, deve essere cambiata nella scheda di rete fisica, insieme a SSID, MAC address e modalità di rete. Ho spiegato questo concetto perché Android è basato su kernel Linux, quindi supporta le interfacce di rete virtuali, anche se in modo molto limitato e perché da questo capitolo parlerò molte volte di tali argomenti.

1Multiplexing è la tecnica per cui più canali trasmissivi in ingresso condividono la stessa capacità

5.1. Interfacce di rete virtuali

Figura 5.1: Stack di rete modificato con Microsoft MultiNet

5. Wpa_supplicant