10. Arquitetura
•cfg80211 – API de configuração para o padrão 802.11
•mac80211 – Implementação da camada MAC (Medium Access Control)
para SoftMAC
•Wireless Module Driver .ko
•Wireless Module Firmware
•Wireless Module configuration
Interfaces de I/O
•PCIe (Média / Alta Capacidade)
•SDIO – Secure Digital I/O (Baixa / Média Capacidade)
•USB (Baixa / Média Capacidade)
•Serial (Baixa Capacidade)
11. Linux Wi-Fi - SoftMAC
•Processamento do MAC em software (CPU)
•Fácil atualização
•Chips mais baratos
•Maior consumo de energia na CPU
•Menor desempenho
User Space
cfg80211
mac80211
Driver
Hardware
12. Linux Wi-Fi - FullMAC
•Processamento do MAC é realizado na Interface
•Atualização depende muito mais do fabricante
•Chips mais caros
•Menor consumo de CPU
•Maior Desempenho
User Space
cfg80211
Driver
Hardware
13. Linux Wi-Fi – Arquitetura
WEXT
Wireless Extension – Desenvolvido em 1997, foi a primeira
implementação de Wireless para Linux, algumas versões do
Utilizada em versões do Android anteriores a 4.2
O acesso ao driver é através de ioctl()
nl80211
Atual implementação para dispositivos Wireless no Linux
(cfg80211 / mac80211)
Realiza o acesso aos drivers através do protocolo netlink.
Possui retrocompatibilidade com WEXT.
17. Arquitetura de Rede do Android
•Kernel Drivers (Ethernet, Wi-Fi, Bluetooth, WiMax...)
•Kernel TCP/IP Layer , POSIX user-space API support
•Android Hardware Abstraction Layer (HAL)
•Android Bionic C library
•Android libnetutils (Network Utilities)
•Android Netd (Network Daemon)
•Android ConnectivityManager e ConnectivityService
•Android Java Apps
18. Bionic C
O Android não implementa as configurações básicas de
interfaces de rede como conhecemos no Linux.
•/etc/network/interfaces
•/etc/resolv.conf
•Etc...
Todas essas informações estão disponíveis apenas através
dos comandos getprop / setprop
20. Netd / Libnetutils
Netd
•Responsável pelo gerenciamento das interfaces
•O Daemon é acessado através de Unix Socket.
• Pode ser controlado por apps ou através do comando ndc
Libnetutils
•Disponibiliza acesso baixo nível ao controle das interfaces
•Disponibiliza acesso a API para ifconfig / netcfg / route /
dhcpcd / dhcpc
•É utilizado pelo HAL e System Framework para controlar
as interfaces
21. Netd – Network Daemon
•Operação , Gerenciamento e Armazenamento de
informações das interfaces de rede
•Estatística de tráfego
•Controle de Banda (Quota)
•Gerenciamento das Tabelas de Roteamento
•Firewall
•NAT – Network Translation Address
•PAN – Personal Area Network
•Links PPP – Point to Point Protocol
•SoftAP (Hotspot)
•Tethering
•….
35. Arquitetura Wi-Fi Android – Framework Java
•WifiManager
Responsável por disponibilizar a API para outras
aplicações (Connectivity Manager) para que seja
possível gerenciar todos parâmetros de
conectividade da interface Wi-Fi.
lRealizar comunicação com o WifiServices através
do Binder.
lPath:
l/frameworks/base/wifi/java/android/net/wifi/WifiManager.java
36. Arquitetura Wi-Fi Android - Framework Java
•WifiService
Responsável por reportar os eventos da Interface
Wi-Fi e realizar a integração com o Binder (IPC).
Path:
/frameworks/base/services/java/com/android/server/WifiService.java
37. Arquitetura Wi-Fi Android - Framework Java
WifiStateMachine
Responsável realizar o gerenciamento do “ciclo de
do funcionamento” da interface Wi-Fi.
Três tipos de estados:
Enter(): executado quando entra no estado
Exit(): executando quando saí do estado atual
ProcessMessage(): executando quando é
recebido uma mensagem
Path:
/frameworks/base/wifi/java/android/net/wifi/WifiStateMachine.java
39. Arquitetura Wi-Fi Android - Framework Java
WifiMonitor
•Responsável receber eventos e informações do
wpa_supplicant / hostapd / p2p
•Comunicação através de Sockets
WifiNative
•Responsável por enviar os comandos para a HAL
•Comunicação através do JNI
Path:
/frameworks/base/wifi/java/android/net/wifi/WifiMonitor.java
/frameworks/base/wifi/java/android/net/wifi/WifiNative.java
41. Arquitetura Wi-Fi Android - HAL
HAL
•Camada de abstração
•Funcionalidades para carregar firmware
•Inicializar/Finalizar driver e serviços (dhcp,
wpa_supplicant,hostapd, dhcpc, dhcpd..)
•Preparar interface de controle dos serviços
•Criar arquivo de entropia
•Carregar arquivos de configuração dos serviços
A implementação desta camada é responsabilidade do
fabricante do driver do módulo Wifi
Path:
/hardware/libhardware_legacy/wifi/wifi.c
/hardware/broadcom/wlan/bcmdhd/*
42. WPA_SUPPLICANT / HOSTAPD
•Os serviços hostapd e wpa_supplicant possuem
interfaces de controle via socket.
•Após inicializados é possível controlar os serviços via
console/adb utilizando as ferramentas wpa_cli e
hostapd_cli.
•As ferramentas possuem help com a relação dos
comandos que podem ser utilizados
•Alguns comandos dependem da implementação do driver
Para saber mais sobre os comandos que o Android envia ao
HAL consulte o arquivo WifiNative.java
43. WifiNative – comandos
/**
* Format of results:
* =================
* id=1
* bssid=68:7f:74:d7:1b:6e
* freq=2412
* level=-43
* tsf=1344621975160944
* age=2623
* flags=[WPA2-PSK-CCMP][WPS][ESS]
* ssid=zubyb
* ====
*
* RANGE=ALL gets all scan results
* RANGE=ID- gets results from ID
* MASK=<N> see wpa_supplicant/src/common/wpa_ctrl.h for details
*/
public String scanResults(int sid) {
return doStringCommand("BSS RANGE=" + sid + "- MASK=0x21987");
}
public boolean startDriver() {
return doBooleanCommand("DRIVER START");
}
public boolean stopDriver() {
return doBooleanCommand("DRIVER STOP");
}
45. Connectivity Manager
•Monitorar conexões (Wi-Fi , GPRS, UMTS, etc)
•Informar alteração do status de rede (Intent Broadcast)
•“Fail Over” entre interfaces de rede
•Fornecer API para aplicações verificarem status e
disponibilidade da rede
•Disponibilizar API para permitir ao aplicativo selecionar
qual interface de rede será utilizada para envio/recebimento
de informações
48. Android Bluetooth
BlueZ
•Utilizado até a versão Android 4.1 (2012)
•Licença GPL
•O port do BlueZ para Android é mantido fora da AOSP
•https://01.org/bluez-android
Bluedroid
•Foi integrado na AOSP a partir da versão 4.2
•Toda Stack é executada em User Space
•Desenvolvida inicialmente pela Broadcom
•Necessidade de adequar ao licenciamento do Android
•Foi considerado estável apenas na versão Android 6.0
•Em sua versão inicial suporta apenas dispositivos com
interface serial
49. Bluetooth - Bluedroid
Distribuição do código fonte:
Application
/packages/apps/Settings/src/com/android/settings/bluetooth
Java Framework
/frameworks/base/core/java/android/bluetooth
JNI
/packages/apps/Bluetooth/jni/com_android_bluetooth_{profile}.cpp
HAL- (BTIF – Bluetooth Interface)
/hardware/libhardware/include/hardware/bt_*.h
Bluetooth App (BTA – Bluetooth Application)
/packages/apps/Bluetooth/src/com/android/bluetooth
BlueDroid
/external/bluetooth/bluedroid
/system/bluetooth (adaptation code)
51. Profiles Suportados pelo BlueDroid no Android 4.3
•HFP – Hands Free Profile
•A2DP – Advance Audio Distribution
•HDP – Health Device Profile
•SPP – Serial Port Profile
•HID – Human Interface Device Profile
•PAN – Personal Area Network
•SDAP – Service Discovery Application Protocol
•HFP – Hands Free Profile
•MAP – Message Access Profile
•OPP - Object Push Profile
•PABP – Phone Book Access Profile
•AVRCP – Audio/Video Remote Control Profile
•GATT – Generic Attribute Profile
https://developer.bluetooth.org/TechnologyOverview/Pages/Profiles.aspx
52. Os profiles são implementados na HAL, BlueDroid e
possuem conectores JNI.
/hardware/libhardware/include/hardware/bluetooth.h (HAL)
/hardware/libhardware/include/hardware/bt_{profile}.h
/packages/apps/Bluetooth/jni/com_android_bluetooth_{profile}.cpp
Bluetooth - Profiles