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

5/08/2016

WIFI MAC Index 와 무선통신관련자료

1. WIFI 관련책 과 IEEE802.11 

  http://www.ieee802.org/11/
상위사이트에서 얻는 정보는 무료가 아니라고 하며 협회에 가입하고 돈을 내야 얻는다고 한다.
추후 집에 있는 WIFI 관련책과 지인인 WIFI 관련 전문가를 통해 얻은 SPEC(IEEE802.11)을 참조하여 관련부분 검토

  • MAC Layer 관련 Index 
IEEE802.11 MAC/PHY Spec 관련 Index  주로 MAC 중심으로 하며 보안과 다른 부분들은 생략 












2. 무선통신관련자료 

우연히 MAC 관련내용을 찾다가 발견한 사이트인데 감사하게도, 너무 쉽게 설명을 해주셔 감사하다. 


  • 무선통신의 db/dBm 관련내용 

  • 무선랜(WIFI)의 기본 과 IEEE 802.11 표준구성 

  • IEEE 802.11n 관련내용

  • WIFI Component,구성요소

9/02/2014

WIFI 설정 (추후 다시 정리 혹은 참조만)

WIFI 관련설정 및 관련자료 수집용으로 추후 만약 다시 시간되면, 한번 정리해야하며 관련내용들을 참조하도록하자.


wpa_cli command relate to P2P
  http://blog.naver.com/PostList.nhn?blogId=chunsj75&from=postList&categoryNo=41

$ sudo iwlist wlan0 scan | grep ESSID 

  • SDCard/SDIO Interface
오래전에 SDCard 와 SDIO Driver를 직접 다 만들어 보았지만, 정리를 하지 않아 관련부분을 링크
예전에는 SDIO를 이용하여 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


      7/23/2014

      WIFI Tool(WE/WEXT)을 이용한 환경설정

      1. WIFI TEST(WE/WEXT) Tool 설명  

      Linux에서 WIFI를 Control 하기위해서 사용되는 Tool은 사용되는 iwconfig,iwlist, iwpriv등 존재한다. 
      이는 Wireless-Extension (WE or WEXT)를 위한 wpa_supplicant test tool 일 뿐아니라, WIFI Device의 관련정보들을 가지고 있다. 
      WE or Wext의 기본 interface는 ioctl이기에 이 test tool도 동일하게 구성이 되어있으며,

      향후 cfg80211/nl80211 interface를 사용할 경우 다른 tool를 사용해야 한다고 한다.

      WE/WEXT 주요기능설명
      1. iwconfig  : wlan를 설정하는 tool로 client 접속과 설정을 담당한다.
      2. iwlist       : ap 검색 및 등
      3. iwpriv      : Driver 환경값 설정.
      dhcp 관련 Tool
          dhclient/dhcpcd :  dhcp client tool  

      Ref.
        http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Tools.html
        http://wireless.kernel.org/en/developers/Documentation/Wireless-Extensions
        http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Linux.Wireless.pdf
               
      • Download Wireless-tools For wext
      Android에서 사용할수 있는 Wireless tool source, 이며, 사용법은, externel 안에 넣고 compile하면된다.

      Download site
        https://github.com/nvamelichev/wireless-tools-android
        https://github.com/CyanogenMod/android_external_wireless-tools

      • 설치 및 Build Wiress-Tool 
       위 사이트에서 Download 한 후, externel에 압축풀기 
      # cd android          // Android Main 위치변경.
      
      WIFI TOOL 만 빌드 (부분 빌드, 위치 Android Main ) 
      # source build/envsetup.sh 
      # export TARGET_PRODUCT=odroidx2
      # mmm /external/wireless-tools 
      

      • WINDOW or LINUX 에서 ADB로 IWMULTICALL 로 FILE만 전송 (Embeded 용 Util )
      adb push iwmulticall /system/xbin 

      • Serial or ADB Shell 에서 Embedded 용 WIFI Tool 설정
      # cd /system/xbin
      
      # chmod 755 iwmulticall
      
      # ln -s /system/xbin/iwmulticall iwconfig
      # ln -s /system/xbin/iwmulticall iwlist
      # ln -s /system/xbin/iwmulticall iwspy
      # ln -s /system/xbin/iwmulticall iwpriv
      # ln -s /system/xbin/iwmulticall iwgetid

      2. WIFI Tool을 이용하여  Client에서 AP접속 방법

      iwconfig, iwlist 는 wext 로 연결된 interface것 만 가능하다.


      2.1 AP에  직접접속할 경우 (인증이 필요없는 경우)  

      1.   # iwconfig                 //기본 무선랜 장치확인 

      wlan0     unassociated  Nickname:"rtl_wifi"
                 Mode:Auto  Access Point: Not-Associated   Sensitivity:0/0
                 Retry:off   RTS thr:off   Fragment thr:off
                Encryption key:off
                Power Management:off
                Link Quality:0  Signal level:0  Noise level:0
                Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
                Tx excessive retries:0  Invalid misc:0   Missed beacon:0
      
      lo        no wireless extensions.
      
      eth0      no wireless extensions.

      2.  # ifconfig wlan0 up         //   wlan0 활성화 시킨다. 
      3.  # iwlist scanning            //   각 AP를 검색을 한다.

                Cell 04 - Address: 00:01:3F:20:A1:DC
                          ESSID:"CWPW"
                          Protocol:IEEE 802.11bg
                          Mode:Master
                          Frequency:2.472 GHz (Channel 13)
                          Encryption key:off
                          Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 9 Mb/s
                                    18 Mb/s; 36 Mb/s; 54 Mb/s; 6 Mb/s; 12 Mb/s
                                    24 Mb/s; 48 Mb/s
                          Signal level=100/100
      

      4.  # iwconfig wlan0 essid "CWPW"  // * 원하는 AP로 바로 접속 및 연결설정 
      5.  # iwconfig                                // 접속된 것을 확인, 아래의 ESSID 부분확인.

      wlan0     IEEE 802.11bg  ESSID:"CWPW"  Nickname:"rtl_wifi"
                Mode:Managed  Frequency:2.472 GHz  Access Point: 00:01:3F:20:A1:DC
                Bit Rate:54 Mb/s   Sensitivity:0/0
                Retry:off   RTS thr:off   Fragment thr:off
                Encryption key:off
                Power Management:off
                Link Quality=96/100  Signal level=100/100  Noise level=0/100
                Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
                Tx excessive retries:0  Invalid misc:0   Missed beacon:0
      

      6.  # dhclient wlan0        // dhcp client 로 IP주소를 받아온다.  
      or  # dhcpcd wlan0  &        ( dhcpd -n  , 문제가 일을 경우 renew )


      2. 인증을 통한 AP 접속 

      iwpriv를 통해서, wpa_supplicant 도움 없이도 인증을 통해 AP를 접속 가능한 Driver들이 존재 
      이는 각 Driver의 Manual 참조 


      2.2 AP에 WEP 인증하여 사용 접속할때  (WEP만 지원)
             
                # iwconfig wlan0 key restricted XXXX-XXXX-XX


      2.3 AP WPA-PSK 인증 필요 할 경우   ,

      //TEST 다 진행 못함.
      wpa_supplicant가 tool이 필요하며, wpa_supplicant.conf 설정을 해야한다.

      #wpa_passphrase GK_1234  // 입력과 동시에 password를 입력하라고 나온다 
      #reading passphrase from stdin  
      12345678      
      network={
       ssid="GK_1234"
       #psk="12345678"
       psk=133da4b2310ed9fe920dfb61c03c271f7f583656cc2b185b118a93bea788b703
      }        

               기존의 값을 유지하고 싶으면  wpa_supplicant.conf에 추가해준다.
               아니면 아래와 같이 다시한번 실행해서 wpa_supplicant.conf 초기화한다.
         
      # wpa_passphrase ssid_name > /etc/wpa_supplicant/wpa_supplicant.conf
      # cat /etc/wpa_supplicant/wpa_supplicant.conf        
            
      # iwconfig wlan0 essid "GK_1234"
      # wpa_supplicant -iwlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf
      rfkill: Cannot open RFKILL control device
      wlan0: Failed to initialize driver interface
      

      # wpa_supplicant -Dwext -iwlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf
      위와 같은 에러 발생, rfkill 문제와 wlan 문제발생
          
      3. Network 설정예제

      //타사이트 설정  TEST못해봤음 , 자동으로 설정해주는 것 같음.
      #  vi /etc/network/interfaces
      auto wlan0
      iface wlan0 inet dhcp
      wireless-essid 사용할ssid
      wpa-driver wext
      wpa-conf /etc/wpa_supplicant.conf1
      

      //안드로이드 설정
      #  vi /etc/wifi/wpa_supplicant.conf
      update_config=1
      ctrl_interface=wlan0
      eapol_version=1
      ap_scan=1
      fast_reauth=1
      

      4. 기타사항 

      Tool 사용시 숙지내용
      • set WPA IE for AssocReq with private ioctl
      • set SSID with SIOCSIWESSID
      • set channel/frequency with SIOCSIWFREQ
      • set BSSID with SIOCSIWAP (this last ioctl will trigger the driver to request association)

        http://lxr.free-electrons.com/source/include/uapi/linux/wireless.h#L282

      5. 이외 유용한 WIFI Tool 및 관련 TEST  


      iw (cfg80211/dl80211 위한 Test tool)
      iw list /event 등 다양한 정보및 쉽게 테스트 가능 
        http://wireless.kernel.org/en/users/Documentation/iw

      Test wifi shell program by using iw
      상위 iw를 이용하여 wifi test 하는 것으로 추후 테스트 시 이용 
        http://wireless.kernel.org/en/developers/Testing/wifi-test#Wifi_test_1.0
       
      EAP peer 와 RADIUS client test
        http://w1.fi/wpa_supplicant/devel/testing_tools.html

      6. Wireless 관련자료

      - Wireless tool 기본구성
        http://en.wikipedia.org/wiki/Wireless_tools_for_Linux

      - WIFI 설정 쉡 스크립트
        http://rhdxmr.tistory.com/158

      - 각종 파일 설정 예시 및 (wpa_supplicant.conf 설정)
        http://www.gentoo.org/doc/en/handbook/handbook-x86.xml?part=4&chap=4#doc_chap2

      - WEP KEY 보안 접속 예제
        http://mandrivausers.org/index.php?/topic/21736-iwconfig-wlan0-essid-doesnt-work-solved/

      - Test ICS WIFI Configuration
         https://wiki.linaro.org/Resources/HowTo/SamsungWlanInOrigenAndroid

      - iwconfig 설정 설명
        http://jake9999.tistory.com/47

      - 기본용어설명
        http://www.cwnp.com/forums/forum-posts.php?postNum=288446

      - WPA-PSK 보안 접속 예제1
        http://pracon.tistory.com/48

      - WPA-PSK 보안 접속 예제2
        http://webnautes.tistory.com/141

      -iwconfig 문제이슈 해결
        https://kldp.org/node/122317

      - RFKILL 관한설명
        https://access.redhat.com/documentation/ko-KR/Red_Hat_Enterprise_Linux/6/html/Power_Management_Guide/RFKill.html

      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/04/2014

      hostapd/wpa_supplicant 와 Networkl Driver 연결구조

      1. hostapd/wpa_supplicant 기본 구조 및 역할 

      상위 WIFI AP/STA Application 프로그램구조를 보면 거의 인증은 필수로 관련되어 동작이 되어지는 것을 알수 있다.
      그리고, 더불어 Network Device Driver의 제어하는 부분이지 실제로 통신을 담당하는 것이 아니다.

      P2P도 구조를 보면 STA기반인 wpa supplicant에서 인증을 하고 DHCP Server/Client를 동작하는 것은 
      마치 AP/STA 동작하는 것과 비슷하다.다만 차이점을 보면 hostapd가 사용을 하지 않을 뿐이다.

      WIFI 기본용어설명
        https://ahyuo79.blogspot.com/2014/03/android-wifi_3.html

      • Hostpad 와 wpa supplicant 관련 자료 및 용어 
      wpa supplicant(Device)  와 hostapd (AP) 관련 그림확인 
        http://w1.fi/wpa_supplicant/devel/

      상위 Application과 상관 없이 사실 Linux기반의 Network 입장에서는 Network Device Driver, 즉 WLAN이 잡히고 초기화되면 기본통신은 가능하다.


      1.1 802.3 기반의 Layer2 통신 

      상위 Application 및 DATA 통신을 IEEE 802.11x를 일반 유선랜처럼 사용하고 있으며, 다만 인증을 위해서 L2의 설정을 바꾸어 통신을 지원한다. 
      Socket(AF/PF_PACKET)을 직접 L2의 EtherType을 변경하여 보낸다.

      IEEE 802.11 -> 802.3 변경 

      • 관련리눅스소스 

      • Ethertype (인증을 위한 L2 설정)
      1. Ethertype 0x888E   EAPOL (EAP over LAN)
      2. Ethertype 0x88C7   Pre-Authentication
      3. Ethertype: 0x890D  Fast Roaming Remote Request  802.11 management protocol

      EtherType
      WIFI를 사용하여도, ETher Type이 중요하므로 각 Ether Type의 종류를 알아두도록하자 

      nping의 ether typ 설정부분 

      wpa_supplicatn/hostapd 의 Porting 및 설정 
        http://w1.fi/wpa_supplicant//devel/porting.html

      인증 후는 WLAN Network Device Driver로 802.3 기반의 통신진행가능하며 아래와 같이 사용

      • Ethertype (IP기반 일반통신)
      1. Ethertype 0x0800  IPv4
      2. Ethertype 0x86DD IPv6
      WLAN의 정보를 Socket(AF/PF_INET,AF/PF_INET6)을 이용하여 ioctl로 다음과 같은 정보를 얻어보자.

      • netdevice의 IOCTL 관련설정 
      1. SIOCGIFHWADDR : MAC Address 얻기
      2. SIOCGIFINDEX : Interface index 얻기
      3. SIOCGIFADDR : IP Addr 얻기

      netdevice 관련설명 (상위설정세부설명)
        https://linux.die.net/man/7/netdevice

      물론 상위설정들과 통신은 wlan이 잡힌 경우이며, 만약 문제가 있다면 ifconfig 확인후 netdevice를 다시 잡도록하자. 

      $ ifconfig wlan0 up 

      1.2 hostpad/wpa_supplicant의 Driver 제어 API 

      brctl
      유선과 무선을 Bridge 역할

      존재하는 Linux Driver이며, 각 특성과 AP지원여부를 확인하도록하자. 
        https://wireless.wiki.kernel.org/en/users/Drivers
      Linux Driver가 AP가 지원이 된다면 hostapd를 이용하여 이를 AP로 사용
        http://nenunena.tistory.com/87


      • 802.11 to 802.3 conversion
      IEEE 802.11 Frame 과 IEEE 802.3 Frame 호환성 확인 
        
      • IEEE 802.11 Packet 구조
      IEEE 802.11 Layer2의 간단한 자료이며, 이 세부내역을 별도로 알아야한다. 
        https://en.wikipedia.org/wiki/IEEE_802.11#Layer_2_.E2.80.93_Datagrams

      Ethernet Adaptation Layer (LLC/SNAP header)
        https://en.wikipedia.org/wiki/Subnetwork_Access_Protocol
        https://stackoverflow.com/questions/32233879/is-there-an-ethertype-field-in-802-11-header




      • IETF에서 제공하는 draft자료 
      IPv6기반으로 IEEE802.11 Network 사용방법인데, 현재 사용하는지는 모르겠음 
      802.11ocb 와 각 Ethernet 호환이라고 하는데, 추후에 확인하자. 
        https://tools.ietf.org/id/draft-ietf-ipwave-ipv6-over-80211ocb-20.html
        https://tools.ietf.org/id/draft-ietf-ipwave-ipv6-over-80211ocb-20.html#epd



      Roaming 구조
        https://www.cs.auckland.ac.nz/courses/compsci314s1t/lectures/314s1-17-19-ether-4up.pdf

      mac80211에서 802.11->802.3 변환  (RX)
        http://lists.shmoo.com/pipermail/hostap/2011-November/024595.html
        https://stackoverflow.com/questions/31717697/how-to-real-time-convert-ethernet-packet-to-wireless-packet

      ieee80211_data_to_8023_exthdr
        https://elixir.bootlin.com/linux/latest/source/net/wireless/util.c#L412
        https://elixir.bootlin.com/linux/latest/source/net/mac80211/rx.c#L2407
        https://elixir.bootlin.com/linux/latest/source/net/mac80211/rx.c#L2609

      mac80211에서 802.11->802.3 변환
        https://www.ietf.org/rfc/rfc1042.txt
        https://elixir.bootlin.com/linux/latest/source/net/mac80211/tx.c#L2400
        ieee80211_build_hdr

      • Full MAC / Soft MAC
        SNAP 기능 지원
        https://wiki.linuxfoundation.org/networking/wireless/txformat
        http://80211notes.blogspot.com/2014/


      2. WPA Supplicant Driver APIs

      WPA Supplicant 와 Device driver 사이의 interface 및 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    
      이외 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
        https://www.kernel.org/doc/html/v4.9/80211/mac80211.html
         

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

      Linux Install Driver 및 관련용어 
        https://www.aircrack-ng.org/doku.php?id=install_drivers
        https://wireless.wiki.kernel.org/en/developers/documentation/mac80211
        https://www.kernel.org/doc/html/latest/driver-api/80211/



        cfg80211
      cfg80211은 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



        https://stackoverflow.com/questions/21456235/how-nl80211-library-cfg80211-work


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


      5. 숙지용어

      STA:  Station의 약자.
      WNIC:  Wiress Network Interface Controller
      MLME: (MAC) Sublayer Managemt Entity 의 약자로, PHY MAC의 존재를 알려주고,MAC의 기본기능을 수행한다.
      FullMAC:   MLME 스택이 hardware로 관리되며 mac80211의 관리가 필요없다.
      SoftMAC:  MLME 스택이 소프트웨어로 관리되는 WNIC의 한 종류







      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

          2/23/2014

          WLAN 의 WIFI 기본 개념 설명

          1. WLAN(Wireless Local Area Network) 기본설명 

          일단 WLAN(Wireless Local Area Network)는 WI-FI 라는 브랜드명 아래 IEEE 802.11 기술기준으로 무선랜(WLAN)을 이용하여 통신하는 장치를 말한다.
          그리고 IEEE802.11의 기술은 현재 지속적으로 버전업이 되므로, 이에 관련된 부분은 이 관련문서를 참고하는 것이 좋을 것 같다.

            https://en.wikipedia.org/wiki/Wi-Fi
            https://en.wikipedia.org/wiki/List_of_WLAN_channels

          1.1 IEEE 802.11의 기본정보 

          IEEE 802.11x의 변화된 세부내용을 보고 싶다면 아래사이트를 참고하자.

          • IEEE 802.11x 표준의 변화 및 역사 세부사항 
            http://en.wikipedia.org/wiki/IEEE_802.11 
            http://ko.wikipedia.org/wiki/IEEE_802.11 
            http://doc.opensuse.org/products/draft/SLES/SLES-admin_sd_draft/cha.wireless.wlan.html


          • WIFI Spec 관련자료 얻기 (IEEE 802.11)
          참고해서 봐야할 문서가 아래의 문서인데, 무료가 아니라고 해서 지인을 통해서 얻었지만, 내용이 방대하다. 

            Part 11: Wireless LAN Medium Access Control (MAC) and Physical Layer (PHY) 
            http://standards.ieee.org/about/get/802/802.11.html

          • The Wi-Fi CERTIFIED™ Product Finder (Wifi Alliance)
            관련회사들을 한번 보자.
            http://www.wi-fi.org/certified-products-results?capabilities%5B50%5D=50

          • WPA_SUPPLICANT 개발자료 
            http://w1.fi/wpa_supplicant/wpa_supplicant-devel.pdf



          1.2 WLAN에서 사용되는 용어 및 관련자료


          • STA(Station)
          무선통신을 하는 최종 단말기라고 생각하면되겠다.

          • AP(Access Point) or Router 
          무선통신을 하는 단말기가 아니, 허브의 역할로 AP를 통하여 인증하고, 다른 STA들과 통신하도록 한다.

          • BSS(basic service set)
          모든 STA들이 PHY layer에서 통신할 경우 가지고 있어야 정보라고 생각하면 되겠다.
          BSS는 ID를 가지고 있는데, 이를 BSSID라고 하며 이 BSSID는 AP와 접속할 경우 MAC Address로 사용되어진다.

          그리고, BSS의 경우 두 가지 종류의 BSS가 존재하는데, IBSS(Infrastructure BSS)와 IBSS(Independent BSS)로 나누어진다고 한다.

          • IBSS(Independent BSS)
          ad hoc (peer-to-peer) mode에서 설정이 되는 STA의 정보

          • ESS(Extended Service Set)
          연결된 BSS들의 한 종류이며,  ESS안에 AP는 DS(distribution system)로 연결된다.
          그리고, 각 ESS는 ID를 가지고 있는데, 이를 SSID라고 하며, 최대 32byte의 문자로 Network의 이름을 나타낸다.

          • DS(distribution system)
          distribution system은 ESS 안에 AP와 연결이 되며, 이 DS 개념은 Network의 영역을 넓히는 것으로 볼수 있다.

          • SSID 와 BSSID
          AP에서 SSID는 네트워크의 이름을 설명하며, BSSID는 MAC 주소라고 보면될 것 같다.
          상위에도 간단히 설명했지만,
          전부 Service Set이기 때문에 내부에 다양한 기능이 제공할거라고 생각이 든다.
          만약 이외 좀 더 알아야 한다면 추후 수정하겠다.

          • WNIC(Wireless Network Interface Controller)
          WIFI에서 OSI 2 계층에 해당하는 부분을 말함 

          • MLME(MAC Sublayer Management Entity)
          MLME의 경우 NIC의 hardware or firmware 구현되거나 host-base software로 구현되어진다.

          • FullMAC/HardMAC WNIC
          WNIC는 MLME(MAC Sublayer Management Entity) Function들로 구현하는데, hardware or Firmware로 구현되어지면, 이를 FullMAC이라고 한다.
          주로 모바일 Device에서 많이 사용되어진다. 

          • SoftMAC WNIC
          WNIC이 host software에서 구현되어지면, 이를 SoftMAC이라고 한다. 
          Linux Kernel의 mac80211 framework에 SoftMAC 지원하며, mesh network 등 다양하게 지원

          • BSS/ESS 관련자료 
            https://en.wikipedia.org/wiki/Service_set_%28802.11_network%29

          • WLAN 관련자료 
            https://en.wikipedia.org/wiki/Wireless_network
            https://en.wikipedia.org/wiki/Wireless_LAN


          • IEEE 802.11 전반적인 자료 
            https://en.wikipedia.org/wiki/IEEE_802.11


          • IEEE 802.11 Layer 2 구조 
            https://en.wikipedia.org/wiki/IEEE_802.11#Layer_2_.E2.80.93_Datagrams


          2. WLAN의 인증(Authentication)

          STA이 AP에접속을 한다고 하면 가장 먼저 접하는 것이 인증일 것이며, 그에 관련된 자료를 인증자료를 간단하게 정리해본다.
          관련세부사항은 아래의 사이트를 보고 알아가보자.

          • WEP(Wired Equivalent Privacy)
          초기에 802.11에서 사용되어지는 기본인증이며, 보안에 취약하다고 하며, 사실 요즘은 거의 사용되지 않지만, 그래도 기본적으로 제공되어진다.
          여기서 더 발전되어 나온 것이 아래의 WPA/WPA2 인증방식이다. 
            https://en.wikipedia.org/wiki/Wired_Equivalent_Privacy

          • WPA(Wi-Fi Protected Access)/WPA2 인증
          802.11의 표준 인증방식으로 WPA/WPA2 (Wi-Fi Protected Access 1st version/ 2nd Version)을 말한다.
          Wi-Fi Alliance에 의해 개발되어진 인증 시스템이며 현재 사용되어지고 있는 인증시스템이다.
          내부를 좀 자세히 보면, WPA/WPA2는 분류를 하면 두가지로 분류되며 각각은 아래설명 
          1. WPA-Personal 
          2. WPA-Enterprise
            https://en.wikipedia.org/wiki/Wi-Fi_Protected_Access
            https://ko.wikipedia.org/wiki/%EC%99%80%EC%9D%B4%ED%8C%8C%EC%9D%B4_%EB%B3%B4%ED%98%B8_%EC%A0%91%EC%86%8D

          • WPS(Wi-Fi Protected Setup, originally, Wi-Fi Simple Config)
          상위 이름에서 알수 있듯이 AP와 STA사이에서 간단하게 설정하는 모드이며, 보통 버튼 형태로 되어있다. 
          Network의 보안기능이지만, 다른것과 다르게 AP와 STA에 WPS 버튼이 있어 서로 눌렀을 경우 쉽게 인증되고 설정되는 구조이다.
          WPS도 상위 WPA/WPA2를 사용하고 있으며, 이부분을 쉽게 연결해주는 형태라고 생각하면 될꺼 같다. 
            https://en.wikipedia.org/wiki/Wi-Fi_Protected_Setup


          2.1 WPA/WPA2-Personal
          WPA/WPA2-Personal은 WPA-PSK(pre-shared key) 이라고 하며, 집이나 작은 office에서 사용 용도로 만들어졌다고 한다.
          세부적인 동작을 알려며, KEY 알고리즘과 관련된 부분을 알아야 할 것 같아, 좀 Link만 연결한다.

          WPA-PSK의 이해
            http://www.juniper.net/techpubs/en_US/junos-space-apps12.3/network-director/topics/concept/wireless-wpa-psk-authentication.html


          2.2 WPA/WPA2 Enterprise 

          WPA/WPA2 Enterprise는 기업용으로 좀 더 복잡한 인증요구를 하며, AP이외의 RADIUS Server를 통하여 인증까지 지원한다.
          그래서 WPA/WPA2 Enterprise는 아래와 같은 추가적인 인증 프로토콜을 지원(TLS) 
          1. EAP(Extensible Authentication Protocol)
          2. PEAP(Protected_Extensible_Authentication_Protocol)
          WPA/WPA2 Enterprise 기반하에 사용되는 인증하는 Protocol 통신이라고 생각하면 되겠다.
          구조를 보면, SSL과 TLS를 이해한다면 대충은 이해가 가능하다. 
          EAP를 보면 각각 역할이 있으며, TLS처럼 키교환, 인증, 암호화 각각 나뉘어져 있으므로, 세부적으로 알고자 하면, EAP Method를 자세히 알아야 한다. 

          • 관련용어 세부사항 
          EAP/PEAP/TLS 및 관련하여 Wiki를 참고해서 보자.
            https://en.wikipedia.org/wiki/Extensible_Authentication_Protocol
            https://ko.wikipedia.org/wiki/%ED%99%95%EC%9E%A5_%EA%B0%80%EB%8A%A5_%EC%9D%B8%EC%A6%9D_%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C
            https://en.wikipedia.org/wiki/Protected_Extensible_Authentication_Protocol
            https://en.wikipedia.org/wiki/Transport_Layer_Security


          우선 아래의 인증을 이해하기위해서는 기본적인 TLS에 대해서 이해를 해야한다. 

          • 다양한 EAP-x 관련 내용 
          다양한 EAP 관련기능들을 소개하고 있으므로, 한번 보자.
          1. EAP-TLS
          2. EAP-PEAP/MSCHAPv2 (both PEAPv0 and PEAPv1)
          3. EAP-PEAP/TLS (both PEAPv0 and PEAPv1)
          4. EAP-PEAP/GTC (both PEAPv0 and PEAPv1)
          5. EAP-PEAP/OTP (both PEAPv0 and PEAPv1)
          6. EAP-PEAP/MD5-Challenge (both PEAPv0 and PEAPv1)
          7. EAP-TTLS/EAP-MD5-Challenge
          8. EAP-TTLS/EAP-GTC
          9. EAP-TTLS/EAP-OTP
          10. EAP-TTLS/EAP-MSCHAPv2  
          11. 기타 등등 
            http://w1.fi/wpa_supplicant/


          2.3 WLAN의 인증 및 세부사항 

          아래의 내용을 참고하면될 것 같다.

            http://etutorials.org/Networking/802.11+security.+wi-fi+protected+access+and+802.11i/Part+II+The+Design+of+Wi-Fi+Security/
            http://etutorials.org/Networking/Wireless+lan+security/Chapter+8.+WLAN+Encryption+and+Data+Integrity+Protocols/Encryption+Protocols/
            http://etutorials.org/Networking/Wireless+lan+security/Chapter+8.+WLAN+Encryption+and+Data+Integrity+Protocols/Key+Management/
            http://etutorials.org/Networking/Wireless+lan+security/Chapter+7.+EAP+Authentication+Protocols+for+WLANs/


          3. WLAN의 AP와 STA의 기본동작구조  

          • AP와 STA의 기본구조 
          1. ctrl i/f: GUI or wpa_cli/hostapd_cli 로 부터 control event를 받아제어   
          2. l2_packet: socket으로 L2와 연결하여, Network 상태를 읽거나 , Ether type를 변경한다. 
          3. Driver API:  APP에서 kernel driver를 연결하는 통로이며 wext 나 nl80211 혹은 개별 vendor driver로 연결하여 실제 chip 제어 (ndiswrapper : window)


          • STA(Station,wpa_supplicant)
          STA의 경우, EAP기반의 TLS와 암호화 기능을 제공하고 있다. 





          • AP(hostapd)
          AP의 경우, 상위에서 언급했듯이 WPA/WPA2 Enterprise를 제공하기 위해서 RADIUS Client를 제공을 한다. 





          관련출처
            http://w1.fi/wpa_supplicant/devel/


          3. WLAN의 동작 Mode 

          WLAN은 동작모드는 두가지이며, infrastructure mode 와 ad hoc mode 존재한다.

          • infrastructure mode 
          현재 사용하는 AP(Access Point)와 STA(Station)을 두고 통신하는 구조로 STA끼리 통신하고자 한다면,
          반드시 AP를 걸쳐 통신하도록 구현이 되어있는 구조이다.

          • ad hoc mode
          상위모드와 달리 P2P(peer to peer)방식으로 STA(Station)끼리 직접 통신을 할때 사용되는 mode이다.
          이와 유사한것이 Wifi Direct 이지만, Wifi Direct는 infrastructure mode에서 동작한다.


          3.1 infrastructure mode


             • STA (Station) infrastructure mode

          STA은 Client 즉 단말이고, default 모드이라고 한다 , 상위에서도 설명했지만, 2개의 STA들이 통신을 할수 없고, AP를 걸쳐야하는 구조이기때문에,
          먼저 STA이 AP에 접속을 해야한다. 이때 필요한 것이 AP와STA간의 인증이 존재하는데, 다양하게 존재한다.

          이 모드를 WEXT tools (iwconfig) 안에서는 Managed Mode라고도 부른다.


              • AP(Access Point, Hotspot) infrastructure mode

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

          STA와 AP를 사용을 동시에 동작 가능하도록도 하는 것도 가능한데, 핸드폰의 Hotspot 역시 AP 기능으로서 사용하는 것이다.

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


          • WiFi Direct 
          AP없이 P2P로  연결되는 것이 기본개념은 ad hoc mode와 동일하지만, 구조가 다르다고 한다.
          처음 P2P로 연결할때, 누가 AP/STA 동작할 것인지에 대해 결정하고 동작한다고 한다.
          WiFi Direct는 Single hop Network 이며, ad hoc는 multi-hop 이라고 한다.
          WiFi Direct와 ad hoc의 중요한 차이점은 WiFi Direct는 WPA2에 의해 보호되고 있으며, 전형적인 WiFi speed와 range를 가지고 있다고 한다.

          아직 직접 사용해본적이 없어 관련자료만 수집한다.


          WPA Supplicant 의 P2P(WIFI Direct)
            http://w1.fi/wpa_supplicant/devel/p2p.html

          Raspberry Pi WIFI Direct 설정 
            https://tomaketech.tistory.com/21
          3.2 ad-hoc mode

              • Ad-hoc (IBSS) Mode     

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

            https://en.wikipedia.org/wiki/Wireless_ad_hoc_network
            https://en.wikipedia.org/wiki/Ad_hoc_network
            https://en.wikipedia.org/wiki/Mobile_ad_hoc_network


          3.3 WIFI 그 외 다른 모드

          아래 부분 Mode들은 각각의 소스들이 존재하지만, 각각의 정확한 역할과 사용용도를 모르기에, 관련된 부분을 언급한다.

          1. Wireless Distribution System (WDS) mode
          2. Monitor (MON) mode
          3. Mesh Mode 
            http://linuxwireless.sipsolutions.net/en/users/Documentation/modes/


          • WDS(Wireless Distribution System) mode
          AP가 다양한 AP들 사용하여 네트워크를 확장하는 개념인 것 같다. 기본적으로 네트워크를 분배하는 시스템

            https://en.wikipedia.org/wiki/Wireless_distribution_system
            http://linuxwireless.sipsolutions.net/en/users/Documentation/iw/#Setting_up_a_WDS_peer
            http://linuxwireless.sipsolutions.net/en/users/Documentation/iw/#Using_4-address_for_AP_and_client_mode


          • MON(Monitor) Mode
          passive-only mode, 즉, 어떤 frame도 전송을 할 수 없으며, Monitor 하는 기능으로 모든 들어온 Packet 을 Host Computer에게 전달해주는 역할
          한마디로 Packet Sniffer 역할로, 보통 현재 동작 중인 WIFI Packet를 쉽게 잡아 분석할 수 있다.
          이는 각 WIFI Driver 혹은 Chip 제조사에서 지원을 해줘야 가능하며, 이 기능이 제공되면 Packet Sniffering 가능하다.    

          • Mesh Mode 
          그물망(Mesh) 일반적인 LAN에서도 Router를 통해 구성될 수 있는 Network 망이다. 
          WIFI에서는 상위 Infra의 AP/STA가 단일 버스 구조가 아닌 Mesh로  구성하여, 사용하려는 것 같은데, 아직 WIFI에서 직접 구성을 본 적 없다.
          다만, Mesh로 구성할 경우, 항상 Routing 알고리즘도 필요할 것으로 생각되어진다. 
            https://en.wikipedia.org/wiki/Mesh_networking
            https://en.wikipedia.org/wiki/Wireless_mesh_network


          4. 출처 및 관련사항 

          WLAN 관련내용
            https://en.wikipedia.org/wiki/Wireless_LAN
            http://wireless.kernel.org/en/users/Documentation/modes
            http://www.haifux.org/lectures/206/wirelessLec.pdf