3/02/2014

WIFI AP(Access Point)구조 on Android (Infra mode)

1. AP File 구조 (Android 4.2)


WIFI Setting

  file: packages/apps/Settings/src/com/android/settings/TetherSettings.java
  file: packages/apps/Settings/src/com/android/settings/wifi/WifiApEnabler.java

WIFI SDK

  file:frameworks/base/core/java/android/net/ConnectivityManager.java
  file:frameworks/base/wifi/java/android/net/wifi/WifiManager.java
  file:frameworks/base/wifi/java/android/net/wifi/WifiConfiguration.java

WIFI Service

ㆍaddr: frameworks/base/services/java/com/android/server/

  files-1: WifiService.java,ConnectivityService.java
  files-2: NetworkManagementService.java , NativeDaemonConnector.java

WIFI JNI

Linux 에서 사용하는 hostapd/ppp/iptable/dnsmasq 등 여러 bin 제어 
ㆍaddr: system/netd/

  files: CommandListener.cpp,   // 아래 모든 것들을 제어
         TetherController.cpp,   // /system/bin/dnsmasq 설정
         NatController.cpp,       // iptable 로 NAT 설정 
         SoftapController.cpp  // /system/hostapd
         ... // 이외 ppp 및 pan 등 

WIFI HAL

  file: hardware/libhardware_legacy/wifi/wifi.c  (driver load & control)

Hostapd 
HAL 연결되는 부분 
ㆍaddr: external/wpa_supplicant_8/

- 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
  ......


2. WIFI AP Android의 전체구조도




그림출처
  http://blog.chinaunix.net/uid-22415790-id-3651045.html


2.1 AP의 구조이해

상위그림의 좌측아래의 Flow 와 각 모듈의 설명있으므로, 이를 토대로 동작방식을 보자.

1. AP는 STA이가 접속할 경우 이를 응답하여 인증하는 접속을 허가한다.

2. STA가 접속했다면, AP는 DHCP Server(Dnsmasq)를 이용하여 IP를 할당해주고 STA와 통신을 한다.

Dnsmasq 와 DHCP 정보
  https://en.wikipedia.org/wiki/Dnsmasq
  https://en.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol
  http://revolutionwifi.blogspot.com/2011/03/explaining-dhcp-server-1111.html

2.2 Hostapd의 동작 

Hostapd는 AP에서 동작하는 SoftAP Application으로 Kernel Driver를 제어하고 인증을 하는 프로그램이며, wpa supplicant와 기능을 공유한다.

AP로 동작시에는 별도의 외부 Network통신과 통신해야하므로 이부분 역시 중요하다.


hostapd의 File 구성
  https://w1.fi/wpa_supplicant/devel/files.html
 
  • Netd
Socket(AF/PF_LOCAL)로 연결이 되어 동작이 되며, Dnsmasq와 Hostapd를 동작을 하게만들어 주고, wifi.c를 이용하여 sys filesystem을 이용하여 network driver를 제어한다.


  • Hostapd의 Network Layer 2 통신 
l2_packet_linux.c 와 driver_nl80211.c 분할되어 Socket(AF/PF_PACKET)로 L2 Packet 제어하여 인증을 하도록 한다.
  1. Ethertype: 0x888E   EAP-over-LAN (EAPOL) 
  2. Ethertype: 0x890D  Fast Roaming Remote Request  802.11 management protocol

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


    • Hostapd의 Kernel Driver 제어 
    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/

    • SDIO Interface 
    SoC는 BCM4330과 SDIO Interface로 연결이 되어 동작하므로 PMIC or PM으로 SDIO Connection을 작동 및 중지할 것이다.

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