WIFI Setting
ㆍaddr: packages/apps/Settings/src/com/android/settings/wifi/
WIFI SDK
ㆍaddr: frameworks/base/wifi/java/android/net/wifi/ files-1: WifiConfiguration.java , ScanResult.java , WifiInfo.java , SupplicantState.java , WifiManager.java ,WpsInfo.java files-2: WifiStateMachine.java , WifiMonitor.java , WifiNative.java
참고사항
http://developer.android.com/reference/android/net/wifi/package-summary.html
WIFI Service
file: frameworks/base/services/java/com/android/server/wifi/WifiService.java or file: frameworks/base/services/java/com/android/server/WifiService.java
WIFI JNI
file: frameworks/base/core/jni/android_net_wifi_Wifi.cpp or file: frameworks/base/core/jni/android_net_wifi_WifiNative.cpp
WIFI HAL
file: hardware/libhardware_legacy/wifi/wifi.c (driver load & control)
WPA_Supplicant Controller
file: external/wpa_supplicant_8/src/common/wpa_ctrl.c
WPA_Supplicant (wpa_supplicant)
ㆍaddr: external/wpa_supplicant_8/ - Socket control (wlan0) file: wpa_supplicant/ctrl_iface_unix.c - Network Driver control file: src/l2_packet/l2_packet_linux.c - Driver wrapper by using socket file: src/drivers/driver_nl80211.c file: src/drivers/driver_wext.c ......
1.1. WIFI HAL (wifi.c) 와 wpa_supplicant
HAL은 Android 를 Porting 할 때 주요 Interface로 kernel driver load 부터 supplicant control , 각종 상태 설정 및 FW관리를
HAL에서 wpa_supplicant를 control 하기위해서 wpa_ctrl를 함수를 이용한다.
아래와 같이 직접 실행시 ctrl_interface socket 설정은 wpa_ctrl socket이며, wpa_supplicant가 실행이 제대로 된다면
, /data/misc/wifi/sockets 안에 wlan0 socket 생성
(board마다 설정 및 실행 다를수 있으며, 현재 사용중인 board: odroidx2)
on Serial or Adb shell # su # cd /data/misc/wifi/sockets # ls wlan0 // socket made by wpa_supplicant wpa_ctrl_1777-1 //sockets made by Android wifi layer wpa_ctrl_1777-2 // sockets made by Android wifi layer # wpa_supplicant -Dwext -iwlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf
# vi /data/misc/wifi/wpa_supplicant.conf ctrl_interface=/data/misc/wifi/sockets update_config=1 device_name=odroidx2 manufacturer=HARDKERNEL Co., Ltd. model_name=ODROID-X2 model_number=ODROID-X2 serial_number= device_type=10-0050F204-5 config_methods=physical_display virtual_push_button
2. WIFI STA Android의 전체구조도
그림출처
http://blog.chinaunix.net/uid-22415790-id-3651042.html
2.1 STA의 구조이해
상위그림의 좌측아래의 Flow 와 각 모듈의 설명있으므로, 이를 토대로 동작방식을 보자.
1. STA에서 AP의 Scanning 과 접속일 것이며, 접속할 경우 WPA Supplicant 의해 인증하는 부분 일 것이다.
2. STA에서 인증이 되어 접속한다면, IP주소를 얻어야 할 것이며, DHCP Client 이용하여 IP주소를 얻는다.
3. WLAN에 AP로 부터 IP주소를 얻고 이제 AP를 통하여 네트워크 통신한다.
2.2 WPA Supplicant의 동작
WPA Supplicant는 STA에서 사용되어지며, Kernel이 아닌 Application으로 Kernel Driver를 제어하고 인증을 하는 프로그램이다.
- wifi.c wpa_ctrl.c
상위 소스를 보면 알겠지만, wifi.c는 WPA Supplicant를 구동하고 제어하며, wpa_ctrl.c는 Socket(AF/PF_LOCAL)을 이용하여 Unix Socket 통신하며 제어한다.
- WPA Supplicant의 Network Layer 2 통신
- Ethertype: 0x888E EAP-over-LAN (EAPOL)
- Ethertype: 0x88C7 RSN pre-authentication
https://w1.fi/wpa_supplicant/devel/dir_d56d9878b2a017779a94089d67c752bb.html
https://w1.fi/wpa_supplicant/devel/index.html
https://w1.fi/wpa_supplicant/devel/driver__nl80211_8c.html
http://blog.naver.com/PostView.nhn?blogId=l18400&logNo=60109296392
https://w1.fi/wpa_supplicant/devel/index.html
- WPA Supplicant의 Kernel Driver 제어
https://w1.fi/wpa_supplicant/devel/driver__nl80211_8c.html
- Socket 설정 관련사항
http://blog.naver.com/PostView.nhn?blogId=l18400&logNo=60109296392
2.3 Linux Kernel 관련사항
- nl80211/cfg80211 Driver
BCM4330 Network Driver과 cfg80211_ops를 이용하여 통신한다.
https://en.wikipedia.org/wiki/Netlink
- BCM4330 Network Driver
실제 Network Data 통신은 User에서 Socket(AF/PF_INET,AF/PF_INET6) IPv4, IPv6를 WLAN을 이용하여 제어된다.
- netif_rx
- netif_rx_ni (Network Interface RX Non Interrupt)
- net_device_ops ( Network Device TX 및 관리)
Kernel Network Driver 관련사항
https://lwn.net/Articles/30107/https://docs.oracle.com/cd/E37670_01/E52461/html/ch06s07.html
https://lwn.net/Kernel/LDD3/
- Broadcom SDIO/PCIe/USB Interface
BCM4330 Full Mac 지원 및 관련사항
https://wireless.wiki.kernel.org/en/users/Drivers/brcm80211