2/10/2014

추후 삭제할 것 (3개로 분리 후 삭제) Android WIFI 기본구조


1. Android Wifi 기본 모드설명


   • Station mode (STA)  infrastructure mode

어느 wireless driver로 이 모드로 동작가능하며, 이모드 default 모드이며, 2개의 STA가 서로 직접 연결이 될 수는 없고,
반드시 AP를 통해 접속을 해야합니다. 그리고, 다양한 인증을 제공하고 있습니다.
이 모드를 WEXT tools (iwconfig) 안에서는 Managed Mode라고도 부릅니다.


    • Access Point (AP)  infrastructure mode

managed 된 network에서 AP로 Master Mode로 동작하며,이는 network를 관리하고 유지를 해줍니다.
주목적은 STA를 관리 및 제어 등 여러가지 설정을 하게 됩니다.
Linux에서 이를 사용하기 위해서, hostapd가 사용되어집니다..


    • Ad-hoc (IBSS) Mode     

Ad-hoc모드는 IBBS(Independent Basic Service Set) 모드로 알려져있으며, Peer to Peer mode,
IBBS에 있는 각 장비가 각각 조절을 자신스스로 조절을 하며, 일 대 일  혹  그 이상이 AP의 도움 없이 통신이 가능하도록  되어있습니다.
장점은 일 대 일 , 그 이상이 되고, 인증을 거치지 않고
AP 없이 직접 통신하고 전송속도 및 전송범위 또한 개선됩니다.


이 밖에, 아래의 모드가 더 존재 합니다.
  • Wireless Distribution System (WDS) mode
  • Monitor (MON) mode
  • Mesh


Ref.  http://wireless.kernel.org/en/users/Documentation/modes
        http://www.haifux.org/lectures/206/wirelessLec.pdf


2. STA infrastructure mode 구조. (Android 4.2)


2.1 User space source  


  • WIFI Setting     
                        addr: packages/apps/Settings/src/com/android/settings/wifi/


  • WIFI SDK          
                        * files-1: WifiConfiguration.java , ScanResult.java , WifiInfo.java ,
                                 SupplicantState.java ,  WifiManager.java ,WpsInfo.java


                        * files-2: WifiStateMachine.java , WifiMonitor.java , WifiNative.java


                        * addr: frameworks/base/wifi/java/android/net/wifi/

                        * link: 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)

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

            
                        addr: external/wpa_supplicant_8/        
    

2.2  HAL (wifi.c) 와 wpa_supplicant 

        HAL은 Porting의 주요소스로, 주된 일은, 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.3  WPA Supplicant 와 WLAN Driver  관계 및 TEST

       둘 사이의 interface는  socket 과 driver 제어 이다,

      1. Socket interface   (l2_packet_linux.c)

            network driver와 연결되어, Data 통신을 한다.
            network driver가 안정되어 있다면, 크게 신경을 안쓰고 tool을 이용하여 TEST하면된다.
     
            Ethernet type 0x888E : EAP over LAN (IEEE 802.1X), IEEE Std 802.1X - Port-based network access control
            Ethernet type 0x88C7 : Pre-Authentication

            http://standards.ieee.org/develop/regauth/ethertype/eth.txt
            http://en.wikipedia.org/wiki/EtherType
            http://nmap.org/book/nping-man-ethernet-options.html

           SIOCGIFHWADDR : MAC Address 얻기
           SIOCGIFINDEX : Interface index 얻기
           SIOCGIFADDR : IP Addr 얻기

           ifconfig 로 test 가능 
          ( 만약 에러 발생시, ifconfig wlan0 up 문제 or network driver 문제이므로 tool로 test.)


           2. Driver APIs

                WPA Supplicant 와 Device driver 사이의 interfafce 및 device driver 구조를 말하며, 최신 interface는 nl80211/cfg80211과
                ext를 지원하지만 이전 것은 ext를 지원 한다.

             A.  Driver-Wrapper (WPA Supplicant 와 Driver Interface) 

                    •  WE/WEXT오래된 driver framework이며,보편적으로 많이 사용되었다.이 것을 버리는 이유는,
                     WE는 ioctl 기반으로 user와 kernel사이를 통신 하지만 몇가지 이유로, 앞으로 cfg80211/nl80211가
                    이를 대체가 될 것이다.      
         
                        http://w1.fi/wpa_supplicant//devel/driver__wext_8c.html

                      nl80211: nl80211는 새로운 netlink interface이며, cfg80211함께 WE를 대체한다.
                     nl80211이 사용되어지는 곳은  iw( iwconfig ) ,crda , hostapd,wpa_supplicant 
               
                        https://www.kernel.org/doc/htmldocs/80211/index.html

                    •  이외 ndiswrapper (window driver), madwifi (atheros)

                        http://en.wikipedia.org/wiki/NDISwrapper
                        http://wireless.kernel.org/en/users/Drivers/madwifi

                    ref. (driver-wrapper)
                        http://w1.fi/wpa_supplicant/devel/driver_wrapper.html


             B.  Driver (Kernel Driver )

                      mac80211 : SoftMAC을 위한 wireless driver API로 mac80211는 cfg80211에 의존적으로 설정 및 등록이 됩니다.
                     설정은 nl80211 혹은 we에 를 통해서 cfg80211으로  설정이 가능합니다.
                     STA는 Kernel안 에 MLME과 함게 구현이 되어있으며,AP는 Userspace에서 구현됨.
                    FullMac device은 이를 사용하지 않습니다.

                    auth/assoc/deauth diagram
                       http://wireless.kernel.org/en/developers/Documentation/mac80211/auth-assoc-deauth
           
                    HW scan diagram
                       http://wireless.kernel.org/en/developers/Documentation/mac80211/hw-scan


                      cfg80211cfg80211은 WE를 대체하는 configuration API로 , 구조는 nl80211가 kernel 제어를 하기위해서
                     cfg80211를 통해 제어한다.  WE는 현재 유지를 하고,기능추가를 하지 않을 것이며, 나중에는 cfg80211를 거쳐서
                      설정하게 될 것이다 (하위 호완성, CONFIG_CFG80211_WEXT),앞으로 WE의 필요가 없다면, 가능하다면
                     제거 할것이며, cfg80211는  wireless-regdb를 통한 full regulatory 과 CRDA의 사용을 제공 할 것이다.

                     앞으로 새로운 모든 driver는  FullMac은 cfg80211의해 제어되고, SoftMac은 mac80211를 걸쳐와야 한다. 
        

                    Ref.
                        http://wireless.kernel.org/en/developers/Documentation
                        http://loveyuna.egloos.com/2412200   (개념정리가 잘되어있다)


             C.  Driver API 구조도 

           


    (앞으로 Driver, 하위호환성 )



           Driver APIs 구조도
           http://wireless.kernel.org/en/developers/Documentation?action=AttachFile&do=get&target=overview.pdf

           Broadcom chip 설명
           http://wireless.kernel.org/en/users/Drivers/brcm80211#softmac_driver_specifics


           3.  WIFI Porting GUIDE


                   ref.

                     http://blog.linuxconsulting.ro/2010/04/porting-wifi-drivers-to-android.html   (기본 Porting Guide)
                     http://w1.fi/wpa_supplicant//devel/porting.html
                     http://sixthman23.tistory.com/entry/wireless-lan-%ED%8F%AC%ED%8C%85%ED%95%98%EA%B8%B0


          4. 숙지용어

               STA:  Station의 약자.

               WNIC :  Wiress Network Interface Controller

               SoftMAC:  MLME 스택이 소프트웨어로 관리되는 WNIC의 한 종류

               MLME: (MAC) Sublayer Managemt Entity 의 약자로, PHY MAC의 존재를 알려주고,MAC의 기본기능을 수행한다.

               FullMAC:  MLME 스택이 hardware로 관리되며 mac80211의 관리가 필요없다.

           Ref.
           http://wireless.kernel.org/en/developers/Documentation/Glossary

































    3. Hotspot mode (Access Point)  구조 (Android 4.2)



    3.1 User space source  

    • 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
                            * files-1: WifiService.java,ConnectivityService.java
                            * files-2: NetworkManagementService.java , NativeDaemonConnector.java

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


    • WIFI JNI
                            * files: CommandListener.cpp, TetherController.cpp, NatController.cpp, SoftapController.cpp
                              
                            * addr: system/netd/

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

    • WPA_Supplicant (hostapd)
                      
                      Network Driver control       
                            * file: src/l2_packet/l2_packet_linux.c

                          
                      Driver wrapper by using socket
                            * filesrc/drivers/driver_nl80211.c
                              file: src/drivers/driver_wext.c
                                       ......

                
                            * addr: external/wpa_supplicant_8/        
      


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

































































































    4. WIFI Direct (
    infrastructure mode) 기본구조.



    4.1 User space source  

    GO : Group Owner
    GC : Group Client 

    • WIFI Direct API Guide 
                            - link: http://developer.android.com/guide/topics/connectivity/wifip2p.html
    • WIFI SDK          
                            * files: WifiP2pConfig.java , WifiP2pDevice.java, WifiP2pDeviceList.java ,
                                       WifiP2pGroup.java ,  WifiP2pInfo.java ,WifiP2pManager.java,

                                       WifiP2pServiceInfo.java, WifiP2pServiceRequest.java
                                       
                            * addr: frameworks/base/wifi/java/android/net/wifi/p2p/

                            * files: WifiP2pDnsSdServiceInfo.java , WifiP2pDnsSdServiceRequest.java 
                                       WifiP2pUpnpServiceInfo.java,WifiP2pUpnpServiceRequest.java

                            * addr: frameworks/base/wifi/java/android/net/wifi/p2p/nsd/

                            - link: http://developer.android.com/reference/android/net/wifi/p2p/package-summary.html
                            - link: http://developer.android.com/reference/android/net/wifi/p2p/nsd/package-summary.html

    • WIFI Service           
                            file: frameworks/base/wifi/java/android/net/wifi/p2p/WifiP2pService.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)

                      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
                            * filesrc/drivers/driver_nl80211.c
                              file: src/drivers/driver_wext.c
                                       ......

                
                            * addr: external/wpa_supplicant_8/        
        












     



    4.2 Wifi Direct vs Ad-hoc 차이 

    Wifi는 기본적으로 infra mode에서 동작하며  각 AP 접속 하에 다른 Device들과 통신을 할수 가 있습니다.
    하지만 infra mode에서 AP의 간섭없이, 개인들과 서로 통신을 하기위해서 Wifi Direct와 같은 새로운 기술이 나오게 되었습니다.

    Ad-hoc mode 기본 통신은 전형적인 Wifi speed 와 range로 WPA2에 의해 제한이 되지만,
    Wifi Driect는 WPA2 제한이 없기에  Speed 와 Range가  향상이 되어 사용할 수가 있습니다.

                     * Wifi Direct : up to Speed: 250 Mbps , up to Range: 200 meter

     또한 Ad-hoc mode  1:1 통신이지만, Wifi Direct는 1:1 과 그룹간의 통신도 가능 합니다.


    Ref.
    http://www.edaboard.com/thread260400.html
    http://wifi-direct.blogspot.in/




    4.3 기본설명 

    Wifi Direct , 초기에는 WI-FI P2P라고 불리었으며, 현재 개인들 뿐만 아니라 여러장비들과 서로 통신을 제공을 하고 있습니다
    그리고, 여기에 확장 기능들이 들어가고 있습니다.

    Automated setup

    • Universal Plug and Play (UPnP), 
    • Devices Profile for Web Services (DPWS), 
    • Zero Configuration Networking (ZeroConf)


    http://www.wi-fi.org/news-events/newsroom/wi-fi-certified-wi-fi-direct-now-included-in-dlna-interoperability-guidelines

    New uses 
    위에서 설명했듯이, 개인들과 통신 뿐만아니라 여러장비를 제공을 위해서 새로운 App을 지속적으로 개발 중입니다.

    Ref
    http://en.wikipedia.org/wiki/Wi-Fi_Direct

    http://wireless.kernel.org/en/developers/p2p

    http://hackerj.tistory.com/33

    Other Ref. (Spec)
    http://www.wi-fi.org/discover-wi-fi/wi-fi-direct
     




    4.4 RealTek WIFI Direct 


    출처:http://dishingtech.blogspot.kr/2012/01/realtek-wi-fi-direct-programming-guide.html




    출처:http://dishingtech.blogspot.kr/2012/01/realtek-wi-fi-direct-programming-guide.html


    https://5ebe640fc109686c84adf909d706d596a18b3ce0.googledrive.com/host/0B6hvW6XtZ2CdZFlLcjZObjl2YXM/linux/document/RTK_P2P_WFD_Programming_guide.pdf


    아래와 같이 one to one or one to multiple 도 가능하다.



    출처: http://www.digikey.com/US/EN/techzone/wireless/resources/articles/Wi-Fi-Direct-adds-Peer-to-Peer-Capabilities.html