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의 한 종류