레이블이 Android-AOSP-WIFI인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Android-AOSP-WIFI인 게시물을 표시합니다. 모든 게시물 표시

8/24/2014

IPTIME n150ua Android WIFI HAL 기본설정

나의 장난감 ODROID위에 IPTIME n150ua의 기본 Linux Driver를  Porting 한 후 에기본적인 TEST가 진행된 후에 이일을 진행해야한다.

아래와 같이 Android의 HAL Interface의 설정을 수정해주면 Android에서도 문제없이 WIFI를 사용 할 수 있다. 
현재 이 부분은 기본적인 TEST를 마친 상황이다.

Odroid에서 IPTIME n150ua Porting 
  https://ahyuo79.blogspot.com/2014/08/android.html
Odroid  WIFI 관련 설정 및 테스트
  https://ahyuo79.blogspot.com/2014/03/dlna-upnp.html

  • vi device/hardkernel/odroidx2/BoardConfig.mk
새로 WIFI_DRIVER_MODULE를 추가하여 아래와 같이 넣어 모듈형태로 넣음 
BOARD_WIFI_VENDOR       := realtek
BOARD_WLAN_DEVICE       := rtl819xxu

WPA_SUPPLICANT_VERSION              := VER_0_8_X
BOARD_WPA_SUPPLICANT_DRIVER         := WEXT
BOARD_WPA_SUPPLICANT_PRIVATE_LIB    := lib_driver_cmd_rtl
WIFI_DRIVER_MODULE_NAME                 := "rtl8191su"
WIFI_DRIVER_MODULE_PATH             := "/system/lib/modules/rtl8191su.ko"
WIFI_DRIVER_MODULE_NAME2                := "rtl8192cu"
WIFI_DRIVER_MODULE_PATH2            := "/system/lib/modules/rtl8192cu.ko"
WIFI_DRIVER_MODULE_NAME3                    := "rt5370sta"
WIFI_DRIVER_MODULE_PATH3            := "/system/lib/modules/rt5370sta.ko"
WIFI_DRIVER_MODULE_NAME4                := "rt3070sta"
WIFI_DRIVER_MODULE_PATH4            := "/system/lib/modules/rt3070sta.ko" 

  • vi hardware/libhardware_legacy/wifi/wifi.c  
추가된 WIFI 모듈을 Load하기 위해서 HAL를 수정 
int wifi_load_driver()
{
#ifdef WIFI_DRIVER_MODULE_PATH
    char driver_status[PROPERTY_VALUE_MAX];
    int count = 100; /* wait at most 20 seconds for completion */

        char node[50] = {'\0',};
    char buf[5] = {'\0',};
        DIR *dir = opendir("/sys/bus/usb/devices/");
        struct dirent *dent;
        if (dir != NULL) {
                while ((dent = readdir(dir)) != NULL) {
            memset(node, '\0', 50);
                        sprintf(node, "/sys/bus/usb/devices/%s/idVendor", dent->d_name);
                        int vid_fd = open(node, O_RDONLY);
            memset(buf, '\0', 5);
            .... 

                                                } else if (strcmp(buf, "3070") == 0) { 
                                                        ALOGE("rt3070 Wi-Fi Module 4");
                                                        //wifi module 4 rt3070
                                                        strcpy(DRIVER_MODULE_NAME, WIFI_DRIVER_MODULE_NAME4);
                                                        strcpy(DRIVER_MODULE_TAG, WIFI_DRIVER_MODULE_NAME4 " ");
                                                        strcpy(DRIVER_MODULE_PATH, WIFI_DRIVER_MODULE_PATH4);
                                                        close(pid_fd);
                                                        close(vid_fd);
                                                        break;
                                                 }

  • vi hardware/libhardware_legacy/wifi/Android.mk
Build할 경우 동일하게 설정 
ifdef WIFI_DRIVER_MODULE_PATH
LOCAL_CFLAGS += -DWIFI_DRIVER_MODULE_PATH=\"$(WIFI_DRIVER_MODULE_PATH)\"
LOCAL_CFLAGS += -DWIFI_DRIVER_MODULE_PATH2=\"$(WIFI_DRIVER_MODULE_PATH2)\"
LOCAL_CFLAGS += -DWIFI_DRIVER_MODULE_PATH3=\"$(WIFI_DRIVER_MODULE_PATH3)\"
LOCAL_CFLAGS += -DWIFI_DRIVER_MODULE_PATH4=\"$(WIFI_DRIVER_MODULE_PATH4)\"
endif
...
ifdef WIFI_DRIVER_MODULE_NAME
LOCAL_CFLAGS += -DWIFI_DRIVER_MODULE_NAME=\"$(WIFI_DRIVER_MODULE_NAME)\"
LOCAL_CFLAGS += -DWIFI_DRIVER_MODULE_NAME2=\"$(WIFI_DRIVER_MODULE_NAME2)\"
LOCAL_CFLAGS += -DWIFI_DRIVER_MODULE_NAME3=\"$(WIFI_DRIVER_MODULE_NAME3)\"
LOCAL_CFLAGS += -DWIFI_DRIVER_MODULE_NAME4=\"$(WIFI_DRIVER_MODULE_NAME4)\"
endif


  • vi ./device/hardkernel/odroidx2/conf/init.odroidx2.rc
HAL 공유 Library만 변경
                libhardware_legacy.so

out/target/product/odroidx2/obj/SHARED_LIBRARIES/libhardware_legacy_intermediates/wifi/wifi.o


./out/target/product/odroidx2/root/init.odroidx2.rc
./out/target/product/odroidx2/system/init.odroidx2.rc

cp rt3070sta.ko  to  device/hardkernel/odroidx2/drivers/

8/23/2014

IPTIMEn150ua on ODROID (기본동작확인)

1. IPTIME n150ua Porting


1.1 개요

ODROID X2 보드 위에 다른 USB LAN을 사용하기 위해서 남은 USB LAN을 집에서 찾기 시작했지만,
내집에서는 찾지를 못하고 때마침 대전 집에서 우연히 발견된 IPTIME n150ua을 가지고 이를 시작하게됨.

  • 모델명: IPTIME n150ua
  • USB device로 동작이되는 WLAN Card 

우선 IPTIME n150ua 사의 이 칩명이 알아야 할 것 같아  아래와 같이 IPTIME 사이트에서 질문을 했더니  정확한 칩명과 관련 Driver를 제공을 해주셨다.
집에서 심심해서 우연히 시작한일인데, 정보를 제공해주신 IPTIME에 감사할 뿐이다,


1.2  IPTIME n150ua 정보 및 관련 사이트 
  1. 모델명:  RT3070  
  2. Device Driver : 2011_0107_RT3070.tar

  • IPTIME 사용되는 CHIP이름알기 
IPTIME에 아래와 같이 직접 물어보았더니, 친절하게 답변을 해주셨다.
감사할 뿐이다. 그래서 위와 같이 Linux Driver를 구하고 이 일을 시작하게됨      

오랜만에 다시 링크하니, 내가 질문한 것이 없어져서, 다른 것으로 대체, 
  http://www.iptime.co.kr/~iptime/bbs/view.php?id=qna&no=292133


  • 기능설명, WPS란?
  http://iptime.co.kr/bbs/view.php?id=faq_setup&no=266

  • Download Linux Driver
  http://www.mediatek.com/en/downloads/


2. WLAN Linux Driver 구성 


2.1 기본숙지문서

  • README_STA_usb
  • iwpriv_usage.txt 

  Driver Build 방법 및 Test 하는 방법은 인터넷 및 책에  설명이 너무 잘 나와있다
  Linux Driver의 상위 두 문서를 제대로 읽는다면, 기본 Build 및 Test 진행에 어려움이 없다.

   1.  Build  사항 및  How to install
   2.  RT2870STA.dat 설정 파일 설명


2.2 Makefile 기본구성  


Makefile                               // Main 구성 (PLATFORM 설정 및 기본 TEST)
       ./os/linux/config.mk            // 각 설정
       ./os/linux/Makefile.4 or 6      // kernel version 에 따라 설정되며, 실제 빌드

  
3. WLAN Linux Driver 환경설정 및 빌드 

수정은 아래와 같이 순서대로 하고 빌드는 make를 하면 원하는 모듈을 얻을 수 있을 것이다.
  • rt3070sta.ko

3.1 Makefile 수정

아래의 변수 PLATFORMTARGET PLATFORM은 기존의 것을 가지고 수정하여 만들면된다.
어차피 Linux Kernel source path 문제로 인하여 아래와 같이 수정해야한다.
PLATFORM을 새로 만들어서 하면, 이상하게도 내 환경변수들이 제대로 설정이 안되어서,
기존 에 존재하던 것을 수정하여 Build를 시도.
  • PLATFORM : 5VT로 선정하여 수정
  • LINUX_SRCCROSS_COMPILE  환경설정 

ifeq ($(PLATFORM),5VT)
LINUX_SRC = /home/jhlee/mywork/kernel/linux
CROSS_COMPILE = arm-none-eabi-
endif

LINUX:                                         // TARGET LINUX에서  변수 TEST  
        echo ">>> PLATFORM  $(PLATFORM)"       // 각종 변수 TEST 
        echo ">>> TEST_INC  $(TEST_INC)"
        echo ">>> LINUX_SRC  $(LINUX_SRC)"
        ....  
        echo " TEST my plaform LINUX_SRC=$(LINUX_SRC) CROSS_COMPILE=$(CROSS_COMPILE) ARCH=$(ARCH)  "  // 변수 TEST , 처음에 제대로 안들어옴
        $(MAKE) -C $(LINUX_SRC) SUBDIRS=$(RT28xx_DIR)/os/linux modules


3.2 vi os/linux/config.mk  수정

    WPA_SUPPLICANT 기능 지원을 위해 아래와 같은 기능을 추가.
    (주의: HAS_WPA_SUPPLICANT=y 바로 옆에 주석을 달았더니, 환경변수가 미설정됨)

    # Support Wpa_Supplicant
    HAS_WPA_SUPPLICANT=y                              
    
    # Support Native WpaSupplicant for Network Maganger
    HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y  
    
    ifeq ($(PLATFORM),5VT)
    EXTRA_CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -I$(RT28xx_DIR)/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common   -DMODULE $(WFLAGS)
    endif


    3.3 vi os/linux/usb_main_dev.c 수정

      #include "rt_config.h"
      
      ......
      MODULE_AUTHOR("Paul Lin ");
      MODULE_DESCRIPTION("RT2870 Wireless Lan Linux Driver");
      MODULE_LICENSE("GPL");

      참조사항 
        http://www.linuxforums.org/forum/wireless-internet/161550-rt3070sta-module-license-unspecified-taints-kernel-solved.html

      참고사항  A. 
                    
                    CFLAG를 사용할 경우 에러,  CFLAGS -> EXTRA_CFLAGS 변경해줌

      scripts/Makefile.build:49: *** CFLAGS was changed in "/home/jhlee/mywork/2011_0107_RT3070_RT3370_Linux_STA_v2.5.0.1_DPO/os/linux/Makefile". Fix it to use EXTRA_CFLAGS.  Stop.
      

      참고사항 B.

                    WLAGS 값이 제대로 동작이 안되어 이를 Debugging.
      • vi os/linux/Makefile.6   (맨 아래에 추가, 각 변수확인 후 지움)

      %.o:
              echo "WLAGS=$(WLAGS)"
              echo "EXTRA_CFLAGS=$(EXTRA_CFLAGS)"

      참고사항 C.

                        아래와 같이  insmod시 에러시 MODULE_LICESE("GPL") 추가

      # insmod  /lib/modules/rt3070sta.ko                            
      [ 2152.229076] rt3070sta: Unknown symbol usb_alloc_urb (err 0)
      [ 2152.229239] rt3070sta: Unknown symbol usb_free_urb (err 0)
      [ 2152.234685] rt3070sta: Unknown symbol usb_alloc_coherent (err 0)
      [ 2152.240690] rt3070sta: Unknown symbol usb_register_driver (err 0)
      [ 2152.246849] rt3070sta: Unknown symbol usb_put_dev (err 0)
      [ 2152.252033] rt3070sta: Unknown symbol usb_get_dev (err 0)
      [ 2152.257417] rt3070sta: Unknown symbol usb_submit_urb (err 0)
      [ 2152.263094] rt3070sta: Unknown symbol usb_free_coherent (err 0)
      [ 2152.269011] rt3070sta: Unknown symbol usb_control_msg (err 0)
      [ 2152.274745] rt3070sta: Unknown symbol usb_deregister (err 0)
      [ 2152.280535] rt3070sta: Unknown symbol usb_kill_urb (err 0)


      3.4 Android 관련수정 

      Android 수정관련사항 
       http://ac100.wikispaces.com/Android+rt3070+or+rt2x00


      4. 기본 TEST on the ODROID

      RT3070이 기본이 STA로 설정이 되어있게 되어있어서, 기본 네트워크 동작을 확인을 했으며, AP는 설명했지만 Test를 하지 못했다.

      RT2870STA.dat 파일을 Loading 하는 시점은 ifconfig ra0 up 이다.그리고, 이와 관련된 설정은 iwpriv로 변경이 가능하다.
      WPS설정 iwpriv에서 command 형식으로 지원을 하는데, 이부분도 Test 못함.
      급히 다른 회사일 때문에 모든것을 마무리 했으며, 추후에 더 시간이 있다면 그때 하도록하자. 

      4.1 copy rt3070sta.ko to odroid

      on serial or adb shell
       # su
       # mount -o rw,remount -t ext4 /dev/block/mmcblk0p2 /system
       # mount -o rw,remount -t ext4 /dev/root / 

      Send the driver & data to the device on Window
      Y:\WORKS\LINUX\SHARED> adb push rt3070sta.ko     /system/lib/modules
      Y:\WORKS\LINUX\SHARED> adb push RT2870STA.dat /etc/Wireless/RT2870STA


      4.2  USB 연결확인 및 기본설정확인. 

      on serial or adb shell
      root@odroidx2:/etc/Wireless/RT3070STA # lsusb      // 연결확인                                 
      Bus 001 Device 001: ID 1d6b:0002
      Bus 002 Device 001: ID 1d6b:0001
      Bus 001 Device 002: ID 0424:3503
      Bus 001 Device 003: ID 0424:9514
      Bus 001 Device 004: ID 0424:ec00
      Bus 001 Device 006: ID 148f:3070
      
      # vi RT2870STA.dat 
      AuthMode OPEN ->WPA2
      
      # cat /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
      
      network={
              ssid="CWPW"
              key_mgmt=NONE
              priority=1
      }
      
      network={
              ssid="U+Net6AFB"
              psk="5000050330"
              key_mgmt=WPA-PSK
              priority=2
      }
      

      4.3  connect to AP with wpa_suppicant  

      on serial or adb shell
      # su
      # insmod  /lib/modules/rt3070sta.ko
      # ifconfig ra0 up
      
      # wpa_supplicant -Dwext -ira0 -c/data/misc/wifi/wpa_supplicant.conf -dd &
      # wpa_cli -p/data/misc/wifi/sockets   -ira0
      .....
      Interactive mode
      
      > scan
      OK
      > scan_result
      bssid / frequency / signal level / flags / ssid
      00:40:5a:9c:6a:f8 2422 -51 [WPA-PSK-TKIP][ESS] 
      00:40:5a:9c:6a:fa 2422 -55 [WPA2-EAP-CCMP][ESS] U+zone
      00:40:5a:9c:6a:f9 2422 -55 [WPA2-PSK-CCMP][ESS] U+Net6AFB
      00:26:66:a0:35:ba 2432 -73 [WPA-PSK-CCMP][WPA2-PSK-CCMP][WPS][ESS] iptime89
      6c:fd:b9:30:ba:82 2457 -69 [WEP][ESS] SAMSUNG
      00:24:a5:34:2f:b3 2462 -81 [WPS][ESS] 0024A5342FB3
      
      > list_network                     // wpa_supplicant.conf 의 list 
      network id / ssid / bssid / flags
      0 CWPW any 
      1 U+Net6AFB any [CURRENT]
      
      
      > select_network 1                //  list 중 선택 
      OK
      > add_network                        //  아래와 같이 WPA-PSK로 추가 가능 
      2
      > set_network 2 ssid "U+NetE3CD"  
      OK
      > set_network 2 key_mgmt WPA-PSK
      OK
      > set_network 2 psk "1122333353"     //
      OK
      > select_network 1                   // 추가했으나, 기존것으로 연결
      OK
      > status 
      bssid=00:40:5a:9c:6a:f9
      ssid=U+Net6AFB
      id=1
      mode=station
      pairwise_cipher=CCMP
      group_cipher=CCMP
      key_mgmt=WPA2-PSK
      wpa_state=COMPLETED
      address=00:26:66:41:26:12 

      관련사항
        http://sirlagz.net/2012/08/27/how-to-use-wpa_cli-to-connect-to-a-wireless-network/
        http://lists.shmoo.com/pipermail/hostap/2009-December/020817.html


      4.4 connect to AP without wpa_suppicant  

      # ifconfig ra0 up
      # iwconfig ra0 essid "U+NetE3CD"       //  iwpriv ra0 set SSID="U+NetE3CD" 동일
      # iwpriv ra0 set AuthMode=WPA2PSK  .
      # iwpriv ra0 set EncrypType=AES
      # iwpriv ra0 set WPAPSK="1000003353"
      
      # iwconfig ra0   // 확인
      ra0       Ralink STA  ESSID:"U+NetE3CD"  Nickname:"RT2870STA"
                Mode:Managed  Frequency=2.412 GHz  Access Point: 00:27:1C:CC:E3:CB 
                Bit Rate=135 Mb/s 
                RTS thr:off   Fragment thr:off
                Encryption key:533A-C4F7-1FC2-8647-DE03-0301-329D-606C [2]   Security mode:open
                Link Quality=100/100  Signal level:-29 dBm  Noise level:-32 dBm
                Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
                Tx excessive retries:0  Invalid misc:0   Missed beacon:
      
      # dhcpcd -n ra0
      dhcpcd[3816]: sending signal 14 to pid 3736
      dhcpcd[3816]: version 5.5.6 starting
      dhcpcd[3816]: ra0: sending IPv6 Router Solicitation
      dhcpcd[3816]: ra0: rebinding lease of 192.168.219.109
      dhcpcd[3816]: ra0: acknowledged 192.168.219.109 from 192.168.219.1
      dhcpcd[3816]: ra0: checking for 192.168.219.109
      dhcpcd[3816]: ra0: sending IPv6 Router Solicitation
      dhcpcd[3816]: ra0: leased 192.168.219.109 for 86400 seconds
      dhcpcd[3816]: forked to background, child pid 3850
      
      # ping 192.168.219.1
      64 bytes from 192.168.219.1: icmp_seq=1 ttl=64 time=8.91 ms
      64 bytes from 192.168.219.1: icmp_seq=2 ttl=64 time=1.93 ms
      64 bytes from 192.168.219.1: icmp_seq=3 ttl=64 time=1.92 ms
      


      4.5  관련 기타사항 기록  

      dhcpd Manual 
       http://www.daemon-systems.org/man/dhcpcd.8.html
       # iwpriv ra0 set EthConvertMode=clone
       # iwpriv ra0 set EthCloneMac="00:00:00:00:00:00"
       AuthMode=OPEN  -> WPA2

      Odroid 관련이슈 
       https://code.google.com/p/0xdroid/issues/detail?id=160

      # cat /proc/net/dev                                         
      Inter-|   Receive                                                |  Transmit
       face |bytes    packets errs drop fifo frame compressed multicast|bytes    packets errs drop fifo colls carrier compressed
          lo:       0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0
        sit0:       0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0
      ip6tnl0:       0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0
        eth0:       0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0
         ra0:       0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0
      
      
      
       # cat /proc/net/wireless                                     
      Inter-| sta-|   Quality        |   Discarded packets               | Missed | WE
       face | tus | link level noise |  nwid  crypt   frag  retry   misc | beacon | 22
         ra0: 0000   10.  -256   -256        0      0      0      0      0        0
      
      root@odroidx2:/ # netcfg
      lo       UP                                   127.0.0.1/8   0x00000049 00:00:00:00:00:00
      sit0     DOWN                                   0.0.0.0/0   0x00000080 00:00:00:00:00:00
      ip6tnl0  DOWN                                   0.0.0.0/0   0x00000080 00:00:00:00:00:00
      eth0     UP                                     0.0.0.0/0   0x00001003 1a:35:8f:c5:6e:b0
      ra0      UP                                     0.0.0.0/0   0x00001043 00:26:66:41:26:12
      
      
      
      255|root@odroidx2:/ # ifconfig ra0 up                                         
      [ 5851.355400] (Efuse for 3062/3562/3572) Size=0x2d [2d0-2fc]
      [ 5851.867774] -->RTUSBVenderReset
      [ 5851.868026] <--rtusbvenderreset p="">[ 5852.410959] RtmpOSFileOpen(): Error 2 opening /etc/Wireless/RT2870STA/RT2870STA.dat
      [ 5852.412997] Open file "/etc/Wireless/RT2870STA/RT2870STA.dat" failed!
      [ 5852.419480] 1. Phy Mode = 0
      [ 5852.422330] ERROR!!! RTMPReadParametersHook failed, Status[=0x00000001]
      [ 5852.486133] !!! rt28xx Initialized fail !!!
      error: SIOCSIFFLAGS (Operation not permitted)

      관련사항
        http://forum.samygo.tv/viewtopic.php?f=4&t=3979
        http://www.korenixembedded.com/images/support/faq/JetBox_UM_Sparklan%20WPER-150GN%20wifi_v0.0.1.pdf
        https://forums.gentoo.org/viewtopic-p-7290276.html
        http://rhdxmr.tistory.com/48


      3/19/2014

      WIFI Linux/Android Driver Porting 확인사항

      1. 개발환경확인 (Cross Compile)

      • vi .bash_profile or bashrc
      PATH="/home/jhlee/CodeSourcery/Sourcery_G++_Lite/bin:${PATH}"
      PATH=${HOME}/bin:${PATH}
      ## add tail 
      export PATH
      export ARCH=arm
      export CROSS_COMPILE=arm-none-eabi-


      2. Build 환경 및 HAL 확인 (Android)

      • vi BoardConfig.mk 확인 (Odroid 인 경우)
      PATH: build/target/board/device/hardkernel/odroidx2/BoardConfig.mk
      기본 WPA_SUPPLICANT의 빌드환경을 확인

      BOARD_WPA_SUPPLICANT_DRIVER := WEXT
      (이는 external/wpa_supplicant/Android.mk 에서 driver_wext.c 동작 )

      • WIFI_DRIVER 정보확인 
      1. WIFI_DRIVER_MODULE_NAME
      2. WIFI_DRIVER_MODULE_PATH        
      3. WIFI_DRIVER_MODULE_ARG   
      만약 다른 driver를 사용시 이름변경. (MADWIFI, PRISM )

      • vi Boardconfig.mk (WIFI Driver 설정 예)
      #
      # Wifi related defines
      #
      # ralink module = rt5370sta, realtek = rtl8191su
      #
      BOARD_WIFI_VENDOR       := realtek
      BOARD_WLAN_DEVICE       := rtl819xxu
      
      WPA_SUPPLICANT_VERSION              := VER_0_8_X
      BOARD_WPA_SUPPLICANT_DRIVER         := WEXT
      BOARD_WPA_SUPPLICANT_PRIVATE_LIB    := lib_driver_cmd_rtl
      WIFI_DRIVER_MODULE_NAME                 := "rtl8191su"
      WIFI_DRIVER_MODULE_PATH             := "/system/lib/modules/rtl8191su.ko"
      WIFI_DRIVER_MODULE_NAME2                := "rtl8192cu"
      WIFI_DRIVER_MODULE_PATH2            := "/system/lib/modules/rtl8192cu.ko"
      WIFI_DRIVER_MODULE_NAME3                    := "rt5370sta"
      WIFI_DRIVER_MODULE_PATH3            := "/system/lib/modules/rt5370sta.ko"
      
      # Realtek driver has FW embedded inside, and will automatically load FW
      # at NIC initialization process. So there is no need to set these 
      # 5 variables.
      WIFI_DRIVER_MODULE_ARG           := ""
      WIFI_FIRMWARE_LOADER             := ""
      WIFI_DRIVER_FW_PATH_STA          := ""
      WIFI_DRIVER_FW_PATH_AP           := ""
      WIFI_DRIVER_FW_PATH_P2P          := ""
      WIFI_DRIVER_FW_PATH_PARAM        := ""


      • Android의 HAL Layer 부분확인 
      hardware/libhardware_legacy/wifi/wifi.c 확인 
      위 내용을 확인 하였으면, HAL에서도 위 내용을 확인하고 각종 설정확인을 확인하자.
      아래는 다른 Android HAL 예제
       https://android.googlesource.com/platform/hardware/libhardware_legacy/+/64cca04dcbf4e21a51131224b9d0f0c596f876d4/wifi/wifi.c

      •  init.rc 확인  (init.odroidx2.rc)
      init.rc에서 service 각 기능확인  및 dhcpd 기능 확인
      Serial에서 service를 동작 가능하며, sta의 경우 wpa_suplicant를 쉽게 Control
      # start wpa_supplicant
      # stop wpa_suppilcant


      vi init.odroidx2.rc  (odroid 예제)
      service wpa_supplicant /system/bin/wpa_supplicant \
          -Dwext -iwlan0 -c/data/misc/wifi/wpa_supplicant.conf \
          -O/data/misc/wifi/sockets \
          -e/data/misc/wifi/entropy.bin -g@android:wpa_wlan0
          #   we will start as root and wpa_supplicant will switch to user wifi
          #   after setting up the capabilities required for WEXT
          #   user wifi
          #   group wifi inet keystore
          class main
          socket wpa_wlan0 dgram 660 wifi wifi
          disabled
          oneshot
      
      service dhcpcd_wlan0 /system/bin/dhcpcd -aABDKL
          class main
          disabled
          oneshot
      
      service iprenew_wlan0 /system/bin/dhcpcd -n
          class main
          disabled
          oneshot
      
      # eth0
      service dhcpcd_eth0 /system/bin/dhcpcd -ABDKL
          class main
          disabled
          oneshot
      
      # IP Renew
      # eth0
      service iprenew_eth0 /system/bin/dhcpcd -n
          class main
          disabled
          oneshot 

              
      init문법 관련내용(systemd의 경우는 다름)
        http://taehyo.egloos.com/4129642


      2.1 WIFI STA의 WPA Supplicant 의 설정 

      • vi wpa_supplicant.conf
      wpa_supplicant가 실행시 참조하는 configuration으로 설정 값을 확인하자.
      위에서 init.rc에 보면 사용하는 wpa_supplicant.conf는 /data/misc/wifi/wpa_supplicant.conf이다.

      PATH: 
      /data/misc/wifi/wpa_supplicant.conf 
      /etc/wifi/wpa_supplicant.conf

      확인사항: 
      ctrl_interfacepath 권한 및 소유를 확인하자. ( ls -ah)                      
      HAL과 Kernel 모듈도 권한 및 소유 확인.       
      /lib/libhardware_legacy.so
      /lib/modules/rtl8191su.ko

      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
      
      network={
              ssid="CWPW"
              key_mgmt=NONE
              priority=1
      }
      
      network={
              ssid="U+Net6AFB"
              psk="5000050330"
              key_mgmt=WPA-PSK
              priority=2
      } 

      Ref.  (Android WIFI Porting 시 참고사항)
        http://blog.linuxconsulting.ro/2010/04/porting-wifi-drivers-to-android.html  
        http://processors.wiki.ti.com/index.php/TI-Android-GingerBread-2.3.4-DevKit-2.1_PortingGuides#WLan
        http://pds22.egloos.com/pds/201205/17/14/Android_Device_Driver_Collage8.pdf

      3. WIFI TEST 및 동작확인 (Tool 사용)

      • wpa_supplicant test 및 module test 
      아래와 같이 test,  wpa_supplicant 의 -dd 옵션 debug
      각각 의 wlan의 status 확인하자 (init.rc , hal 하고 관련)

       # lsmod    //확인
       # insmod /lib/modules/rtl8191su.ko
      
       # getprop wifi.interface              // wlan0 ,  이 값은 driver에 따라 변경이 가능하다. eth0, usb0, 제조사이름
       # getprop wlan.interface              // wlan0
       # getprop wlan.driver.status          // ok 
       # getprop init.svc.wpa_supplicant     // wpa_supplicant의 상태를 나타낸다,   stopped or running 체크하자. 
      
       # setprop wlan.interface "wlan0"     // HAL에서도 설정이 존재한다. 
       # setprop wifi.interface "wlan0"     // HAL에서도 이 설정 존재하며, 중요하다.
       # setprop wlan.driver.status "ok"    // HAL 및 init.rc에 이 설정이 존재
      
      
       # ifconfig wlan0 up
       # start wpa_supplicant       // 위의 init.rc의 service를 실행할 수 있다. 
       # stop  wpa_supplicant       //   
       or 
      
       # wpa_supplicant -Dwext -iwlan0 -c/data/misc/wifi/wpa_supplicant.conf -dd & 
         

      • wpa_cli test 
      wpa_cli 이용하여, AP을 SCAN하고 설정하여 접속할 수 있다. 하지만
      손쉽게 wpa_supplicant.conf에서 직접 설정해서 해도 된다.

       # wpa_cli -p /data/misc/wifi/sockets -iwlan0   // data/misc/wifi/wpa_supplicant.conf,  ctrl_interface 참조
      
       > scan             // scan 시작한다.
      
      <3>WPS-AP-AVAILABLE 
      <3>CTRL-EVENT-SCAN-RESULTS 
      <3>WPS-AP-AVAILABLE 
      <3>CTRL-EVENT-SCAN-RESULTS 
      <3>CTRL-EVENT-SCAN-RESULTS 
      <3>CTRL-EVENT-SCAN-RESULTS 
      <3>CTRL-EVENT-SCAN-RESULT
         ......
      
       > scan_results    // scan 결과를 아래와 같이 보자 
      
      00:40:5a:9c:6a:fa 2422 -69 [WPA2-EAP-CCMP][ESS] U+zone
      00:40:5a:9c:6a:f9 2422 -70 [WPA2-PSK-CCMP][ESS] U+Net6AFB
      00:40:5a:9c:6a:f8 2422 -69 [WPA-PSK-TKIP][ESS] 
      00:26:66:a0:35:ba 2432 -88 [WPA-PSK-CCMP][WPA2-PSK-CCMP][WPS][ESS] iptime89
      6c:fd:b9:30:ba:82 2457 -76 [WEP][ESS] SAMSUNG
      00:90:a2:12:b5:b1 2457 -92 [WPA2-PSK-CCMP][ESS] U+NetB5B3
      00:27:1c:55:71:ed 2412 -91 [WPA2-PSK-CCMP][ESS] U+Net71EF
      00:27:1c:55:71:ee 2412 -90 [WPA2-EAP-CCMP][ESS] U+zone
      00:24:a5:34:2f:b3 2462 -92 [WPS][ESS] 0024A5342FB3
      
       > list_networks                          // 현재 나의 network를 점검, wpa_supplican.conf 기반으로 점검이 된다. 
         network id / ssid / bssid / flags
         0 CWPW any 
      
       > add_network                         // 현재 내가 접속하고자 하는 Network이 없기에 추가.
       1
      
       > set_network 1 ssid "U+Net6AFB"      // add_network 에서 받은 번호를 입력하고, SSID를 입력하자!, scan_result 참조. 
       OK
      
       > set_network 1 psk "5000050330"      // 암호를 입력하자. psk 형태이다. scan_result 참조. 
       OK
      
       > select_network 1                    // 설정된 1번 을 선택하자 , select_network를 이용하여 여러 접속가능.
       OK
      
       > status                              // 상태 확인 
      
      bssid=00:40:5a:9c:6a:f9
      ssid=U+Net6AFB
      id=1
      mode=station
      pairwise_cipher=CCMP
      group_cipher=CCMP
      key_mgmt=WPA2-PSK
      wpa_state=COMPLETED
      address=e8:4e:06:0a:96:14
       
       > disconnect                    // 현재 연결된 AP 종료     
       > reconnect                     // 현재 연결된 AP 재연결 
       > remove_network 1              // 1 번 network 제거
       > quit                          // wpa_cli 종료  
      


      • dhcpcd 설정
      아래와 같이 AP 접속 후, dhcpcd를 이용하여 IP를 받아온다.

      DHCP Success
      # dhcpcd wlan0  & // dhcpc service 성공. 
      [1] 2771
      dhcpcd[2771]: version 5.5.6 starting
      dhcpcd[2771]: wlan0: sending IPv6 Router Solicitation
      dhcpcd[2771]: wlan0: rebinding lease of 192.168.123.164
      dhcpcd[2771]: wlan0: acknowledged 192.168.123.164 from 192.168.123.254
      dhcpcd[2771]: wlan0: checking for 192.168.123.164
      dhcpcd[2771]: wlan0: sending IPv6 Router Solicitation
      dhcpcd[2771]: wlan0: leased 192.168.123.164 for 86400 seconds
      dhcpcd[2771]: forked to background, child pid 2806 
      DHCP Fail
      # dhcpcd wlan0   // dhcpc service 에러. 
      dhcpcd[2670]: version 5.5.6 starting
      dhcpcd[2670]: wlan0: sending IPv6 Router Solicitation
      dhcpcd[2670]: wlan0: checking for 169.254.155.41
      dhcpcd[2670]: wlan0: sending IPv6 Router Solicitation
      dhcpcd[2670]: wlan0: using IPv4LL address 169.254.155.41
      dhcpcd[2670]: forked to background, child pid 2695
              둘다 실행은 했지만 위에는 성공을 하고, 아래는 받지 못해, 169.254.155.41 IP설정된다.
              반드시 ack를 확인하고 해당 IP 확인하자
              test 시 ps 확인하고 kill로 해당 프로세스를 없애자.

              만약 지속적으로 dhcpcd 문제가 발생시 dhcpcd -n ( renew하고 다시 실행)

      • WIFI Module 점검 
           -  lsmod로 vendor driver 확인   
               ( kernel 포함가능성 확인 , make menuconfig 확인 )

           -  ifconfig wlan0   명령으로 연결확인
               (ifconfig wlan0 up 시도  및 다른 이름 찾기:wlan0 이 아닐 경우)
             
      SIOCGIFFLAGS  :  Link 에러로 Module 이상이나, 연결이 안되었을 가능성 있음. 기본문제
      wlan0: Cannot assign requested address : wpa_supplicant 문제

      • wpa_supplicant 점검
      아래와 같이 각종 interface를 점검을 하고, configuration도 점검하자.

      wpa_supplicant -Dnl80211 -iwlan0 -c/etc/wifi/wpa_supplicant.conf
      wpa_supplicant -Dwext -iwlan0 -c/etc/wifi/wpa_supplicant.conf

      3/03/2014

      WIFI P2P/ WIFI Direct 구조 on Android

      1. WIFI P2P File 구조 (Android 4.2) 

      GO : Group Owner
      GC : Group Client 


      WIFI Direct API Guide

        http://developer.android.com/guide/topics/connectivity/wifip2p.html

      WIFI SDK 

      ㆍaddr: frameworks/base/wifi/java/android/net/wifi/p2p/
      
        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/nsd/
      
        files: WifiP2pDnsSdServiceInfo.java , WifiP2pDnsSdServiceRequest.java 
               WifiP2pUpnpServiceInfo.java,WifiP2pUpnpServiceRequest.java
      
      

        http://developer.android.com/reference/android/net/wifi/p2p/package-summary.html
        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)

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


      2. WIFI P2P Android의 전체구조도




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



      3. Wifi Direct 기본설명 

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

      • Automated setup
      1. Universal Plug and Play (UPnP), 
      2. Devices Profile for Web Services (DPWS), 
      3. 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

      WIFI Direct Demo
        http://www.androidside.com/docs/resources/samples/WiFiDirectDemo/index.html
        http://hackerj.tistory.com/33

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


      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

      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

        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