3/01/2014

Wifi STA 구조 on Android (Infra mode)

1. STA File 구조 (Android 4.2)  


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 통신 
WPA Supplicant의 l2_packet (link layer access)에서 Socket(AF/PF_PACKET)로 L2 Packet 세부제어
  1. Ethertype: 0x888E   EAP-over-LAN (EAPOL) 
  2. Ethertype: 0x88C7   RSN pre-authentication 

      https://w1.fi/wpa_supplicant/devel/dir_d56d9878b2a017779a94089d67c752bb.html
      https://w1.fi/wpa_supplicant/devel/index.html


    • WPA Supplicant의 Kernel Driver 제어 
    WPA Supplicant의 driver_nl80211x 로 Socket(AF/PF_NETLINK) 설정하여, nl80211->cfg80211-> Network 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  
    STA의 제어를 담당하며, WPA Supplicant (driver_nl80211)와 nl80211/cfg80211 Driver는 Netlink로 통신을 하며,
    BCM4330 Network Driver과 cfg80211_ops를 이용하여 통신한다.

      https://en.wikipedia.org/wiki/Netlink

    • BCM4330 Network Driver
    WLAN이라는 Network Device Driver를 제공하며, Network DATA 통신과 RFKILL에 의해 WIFI의 동작여부가 결정된다.
    실제 Network Data 통신은 User에서 Socket(AF/PF_INET,AF/PF_INET6) IPv4, IPv6를 WLAN을 이용하여 제어된다.
    1. netif_rx 
    2. netif_rx_ni (Network Interface RX Non Interrupt)
    3. 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 
    SoC는 BCM4330과 SDIO Interface로 연결이 되어 동작하므로 PMIC or PM으로 SDIO Connection을 작동 및 중지할 것이다.

    BCM4330 Full Mac 지원 및 관련사항
      https://wireless.wiki.kernel.org/en/users/Drivers/brcm80211