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

메모리 누수 탐지 (추후보강)

1. Memory Leak Problem 

  • 메모리관련부분 책 
  1. Memory Dump 분석과 활용 
  2. Linux 문제분석 과 해결 (개인적으로 이게 더 좋음)
     http://www.hanbit.co.kr/network/view.html?bi_id=1313

  • Application의 Memory Leak 
Application에서 Memory Leak을 쉬운방법으로 감지할수 있는 프로그램이 valgrind이며,
이를 이용하여 정확한 위치와 관련부분을 알수가 있다.

valgrind의 설치 방법과 사용법을 설명.
  http://forum.falinux.com/zbxe/index.php?document_srl=528619&mid=lecture_tip

valrind로 직접 User Manaul을 참조 
  https://valgrind.org/     


  • Linux Kernel Memory Leak 
관련내용: Documentation/kmemleak.txt

CONFIG_DEBUG_KMEMLEAK
Kernel 설정이 필요하다고 하며, 아직 나도 시도를 완벽히 못했으며, 추후 시도로를 다시하면,아래의 사이트를 이용하여 다시 진행 해볼 계획.
  http://blog.dasomoli.org/516


  • Memory 단편화 (내부,외부)
당연하겠지만, io_remap (보통 HW Address remap) 은 추적하지 못하지는 못한다.
그리고, Memory에서 단편화 외부/내부, 특히 Embbeded Linux서 문제가 많이 될지는 사실 의문이다.
이 부분은 좀 더 추후 더 자세히 알아보도록 


2. Linux Memory Management 

Linux의 경우, 기본적으로 Kernel 과 User application으로 Memory 사용하는 방법이 분리되어져 있다

  • Kmalloc과 vmalloc 사용법 및 차이
근본적으로 User malloc은 MMU를 통하여 Virtual Address 로 Page Swapping 가능하므로 관리가 다르며, 
Kernel의 경우는 DRAM기반으로 관리되어진다. 
 


Linux Kernel의 Memory Allocator 및 관련관리 부분 자료 
  https://www.linux.co.kr/home/lecture/index.php?cateNo=&secNo=&theNo=&leccode=11128


Linux Kernel Free 호출 (Page 기반)  

  • kmalloc API
연속되어진 Memory 요구 할 경우,  일반적으로 사용하는 경우로, 옵션도 다양.
  https://www.kernel.org/doc/htmldocs/kernel-api/API-kmalloc.html

  • vmalloc API 
불연속된 Memory를 요구할 경우, 이며, 이는  별도의 Page 관리를 요구되어지기에,
속도역시 느리다. ( vmalloc 도 내부적으로 kmalloc을 사용한다고 한다)

  • (buddy)버디 시스템
Memory를 관리하는 시스템   
  • Linux Kernel & Kernel Device Driver Programming 
  Allocating Memory, Memory
Linux 가상메모리 구조 및 관련설명 
  http://idkwim.tistory.com/54
  http://idkwim.tistory.com/55
  http://hayeol.tistory.com/entry/4%EC%9E%A5-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B4%80%EB%A6%AC-1


3. OOM(Out Of Memory)이란

  • OOM (Out of Memory) 발생 원인
Linux Kernel 은 Virtual memory를 이용하여 메모리 할당을 하므로 실제 가용한 physical 메모리 보다 큰 프로그램 size의 메모리를 할당 할 수 있다.
즉 프로그램에서 당장 사용하지 않는 메모리는 나중에 메모리를 할당하기 때문에 실제 사용 가능한 메모리를 넘는 process도 load될 수 있다.(이것을 overcommit 이라 한다.)
만약 overcommit된 메모리에 실제 뭔가 쓰여지기 시작하면 메모리가 모자라므로 Out of memory가 발생한다.
  http://shadowxx.egloos.com/viewer/10781292
  http://sd0720.blogspot.kr/2012/05/outofmemoryerror.html
  http://www.kmshack.kr/405


  • 실습 환경 셋팅 및 Memory 관찰 도구 기본 실습
 Adb 연결 : Android에서 쉽게 테스트 
  • cat /proc/meminfo
  • top,
  • procrank, 
  • dumpsys meminfo pid
  http://ecogeo.tistory.com/255


4. Memory 누수탐지 및 도구

JAVA Memory
    -Java VM memory
    -Java GC (gabage collection)
    -Android GC (gabage collection)

Android Memory Management
   -dalvik 안드로이드 VM    -LMK(low memory killer)
코드레벨 메모리 누수
    -JAVA 메모리 누수는 가능한 가 ? -JAVA 메모리 부족 및 누수 패턴 사례
Memory 관찰 도구 기본 실습
    eclips 기반 - MAT


Memory 누수 사례 분석

안드로이드 기반 메모리 누수 탐지 사례 분석
    -메모리 누수 방지 프로그래밍 기법 정리

Memory 관찰 도구 심화 실습
    -예제를 통한 메모리 누수 실 사례 분석
    -누수 탐지 실습

코드레벨 메모리 누수
    -C 메모리 누수 패턴 사례   -C++ 메모리 누수 패턴 사례

Memory 관찰 도구 기본 실습
    - Linux 기반 : Valgrind
  http://bbingju.wordpress.com/2013/08/08/android-memory-leak/
  http://www.androidpub.com/1993866
  http://jetblog.tistory.com/19
  http://forum.falinux.com/zbxe/index.php?document_srl=528619&mid=lecture_tip

Android
  https://play.google.com/store/apps/details?id=com.gihasil.lab.meminfochart

Ref.
  http://mdsacademy.co.kr/academy/programs/lecture.html?uid=14387&special=N&PHPSESSID=944f2a34096b86801e2d89263e3a47b4

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

Android SDK Tool 개발환경 설치

1. Download SDK Tool 및 설치  


아래의 사이트에서 좌측 Download의 VIEW ALL DOWNLOADS AND SIZES에 보면
ADT (Android Developer Tools) 와 SDK Tools이 있으며 각각 선택이 가능하다
Linux용 Window용 각각 종류별로 다 있다.
SDKTool 받던 ,ADT를 받던 선택을 하자.

  http://developer.android.com/sdk/index.html
  https://developer.android.com/studio/releases/sdk-tools

  • adt-bundle-windows-x86_64-20131030.zip
  • android-sdk_r23.0.2-windows.zip

기본구성        
  • SDK Manager.exe : SDK를 관리하는 Manager program으로 항상 최신으로 update가능하다. 
  •  sdk       :  개발툴이 존재하며, platform-tools 안에 
                       adbfastboot,  usb_driver 도 존재한다.
  •  eclipse  : eclipse  존재하며 이곳에서 개발가능 

     usb driver : sdk\extras\google\usb_driver


설치방법 ( 아래의 사이트에 설치방법, 자세히 나와있음)
  http://www.teamandroid.com/2012/07/30/how-to-set-up-adb-fastboot-with-android-sdk/



  http://dottech.org/21534/how-to-install-adb-and-fastboot-on-your-windows-computer-for-use-with-your-android-phone/

PATH 설정
  http://visu4l.tistory.com/391


2.  Android USB Driver  설정 및 확인


   설정 -> 개발자 옵션-> USB 디버깅  체크


1.1  Linux Server에서 USB Driver 설정 

  • USB 설정
$ sudo vi /etc/udev/rules.d/51-android.rules
    SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE="0666"

$ sudo chmod a+rx /etc/udev/rules.d/51-android.rules
$ sudo service udev restart   

  • Fastboot Driver 설정 (만약 위에 것이 안될 경우, 해보자)
$lsusb
    Bus 002 Device 059: ID 18d1:4e42 Google Inc. // Google 확인해야 한다고 한다.
$ sudo vi /etc/udev/rules.d/99-android.rules
    SUBSYSTEM=="usb", SYSFS{idVendor}=="18d1", MODE="0666", OWNER="jhlee" 

  //OWNER PC username을 사용
$ sudo service udev restart   
$ sudo fastboot devices // 확인 
 
  
자세한 내용은 아래의 사이트를 참조하자
  http://developer.android.com/tools/device.html
  https://github.com/red-root/PortingARMLinux/wiki/Fastboot-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EC%82%AC%EC%9A%A9%EB%B2%95


1.2. Window  USB Driver 설정 

1.2.1   USB Driver 가 없을 경우.

  • Google USB Driver 
android_winusb.inf 포함 

OEM USB Driver 

  • OEM USB Driver 관련내용 
android_winusb.inf 수정대신에 직접 OEM USB Driver 설치 


  • 장치관리자 확인 

         장치관리자에서 잡힌 Android Device 등록정보->자세히->속성: 하드웨어ID   확인
             USB\VID_18D1&PID_0201&REV_9999&MI_01
             USB\VID_18D1&PID_0201&M1_01

  • SDK 의 android_winusb.inf 파일수정 

     SDK에서 제공하는 android_winusb.inf 파일을 이용하여 아래와 같이 수정해서
     USB Driver를 만들어 간단히 설치함 (장치관리자 재설치 가능)

     필요파일:

              sdk\extras\google\usb_driver 의 android_winusb.inf 파일

     아래부분은

     수정위치 :
 [Google.NTamd64]
; my
%SingleAdbInterface%        = USB_Install, USB\VID_18D1&PID_0201&MI_01
%CompositeAdbInterface%     = USB_Install, USB\VID_18D1&PID_0201&REV_9999&MI_01
%SingleBootLoaderInterface% = USB_Install, USB\VID_0BB4&PID_0FFF


      [Goolgle.NTx86]   : 32 bit  Window
      [Google.NTamd64] : 64bit Window

      SingleAdbInterface             : ADB Driver
      SingleBootLoaderInterface : Fastboot Driver

  http://acomyong.egloos.com/viewer/2966118

 
1.2.3   USB Driver가 발견이 안될 경우
         
  •      장치관리자 확인 
         장치관리자에서 잡힌 Android Device 등록정보->자세히  확인
             USB\VID_18D1&PID_0201&REV_9999&MI_01
             USB\VID_18D1&PID_0201&M1_01

  • adb_usb.ini 파일 수정 

      파일위치:
      C:\Users\username\.android\adb_usb.ini
       아래와 같이 Vendor ID만 넣어 주면 됩니다.

0x18D1


  • ADB restart
adb kill-server
adb devices


logcat -b all

4.   설치방법

ADB Driver 설정
  http://www.teamandroid.com/2012/07/30/how-to-set-up-adb-fastboot-with-android-sdk/2/



Fastboot Driver 설정
  http://www.teamandroid.com/2012/07/30/how-to-set-up-adb-fastboot-with-android-sdk/3/


  http://blog.naver.com/PostView.nhn?blogId=ncs10066&logNo=80182428314&categoryNo=58&parentCategoryNo=0&viewDate=&currentPage=1&postListTopCurrentPage=&userTopListO

  http://stackoverflow.com/questions/19830407/i-cannt-find-adb-usb-ini-file-in-android-folder

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