Linux의 무선 LAN 소프트웨어 구성

9291 단어 Linuxwireless802.11

무선 랜 소프트웨어의 전체 그림


Linux의 무선 LAN 기능은 다음과 같은 요소에 의해 실현된다.
  • wpa_STA로 동작합니다.802.1X/WPA 인증, 연결 처리
  • hostapd:SoftAP(접속점)의 조작
  • iw: 드라이브 설정, 상태 설정
  • 구현
  • libnl: 사용자 공간 및 커널 공간의 I/F
  • cfg802.11: 채널 등의 설정 담당
  • mac802.11: 스캔, 연결 등 핵심 처리 담당
  • WLAN 드라이브: 제어 버스 드라이브(SDIO, PCIe 등)
  • 버스 드라이브: SDIO, PCIe 등 I/F 제어 장치를 통해
  • 사용자 공간에서 wpasuppliant,hostapd,iw가 실행되고 내부 공간 cfg802.11,mac802.11, 드라이버가 실행됩니다.libnl은 wpa입니다.supplicant 등 사용자 공간 동작의 소프트웨어와 cfg802.11의 인터페이스입니다.소켓을 통해 사용자 공간과 내부 핵 공간 사이에서 정보를 교환하다.

    사용하는 장치에 따라 mac802.11을 사용하지 않을 수도 있고 wpa를 사용하지 않을 수도 있습니다supplicant도 드라이버 발행 동작 l (libnul을 사용하지 않음) 을 직접 제어하는 경우가 있습니다.
    다음은 각 소프트웨어와 각자의 인터페이스가 어떻게 실현되었는지 설명한다.

    wpa_supplicant 정보


    WPA/WPA 2/802.1X 인증, 802.11의 Authentication, Asssociation 등의 처리가 시행 중이다.또한 WiFi Proted Setup, WiFi Direct 등 WiFi Alliance 관련 기준도 준수합니다.
    안드로이드를 포함하는 삽입식 리눅스에서 센터를 실현하는 데 대부분은 wpa이다supplicant를 사용하여 구현합니다.
    상세한 설명과 소스 코드는 본가의 아래 사이트에 있습니다.
    https://w1.fi/wpa_supplicant/
    wpa_supplicant는 수호 프로세스로 실행되는 소프트웨어로 wpacli、wpa_gui 등의 도구로 제어할 수 있습니다.자체 제작 소프트웨어를 사용하여 제어할 때 다음과 같은 내용을 참고할 수 있다.
    https://w1.fi/wpa_supplicant/devel/ctrl_iface_page.html
    wpa_cli에서 사용할 수 있는 명령은 README를 보거나 다음 명령을 참고하여 지울 수 있습니다.소스를 보고 알 수 있는 명령 옵션도 있다.
    wpa_supplicant/ctrl_iface.c
    char * wpa_supplicant_ctrl_iface_process(struct wpa_supplicant *wpa_s,
                                             char *buf, size_t *resp_len)
    {
     〜省略〜
        } else if (os_strcmp(buf, "P2P_FIND") == 0) {
            if (p2p_ctrl_find(wpa_s, ""))
                reply_len = -1;
        } else if (os_strcmp(buf, "P2P_STOP_FIND") == 0) {
            wpas_p2p_stop_find(wpa_s);
     〜省略〜
    }
    
    wpa_supplicant와 하위 (libnul 또는 드라이브) 의 접점은 src/driver에 있습니다.
    예를 들어 기본적으로Libnl인 경우 다음과 같이 함수 포인터를 설정하여 포인터를 공급기 내부 처리에서 호출합니다.
    src/drivers/driver_nl80211.c
    const struct wpa_driver_ops wpa_driver_nl80211_ops = {
        .name = "nl80211",
        .desc = "Linux nl80211/cfg80211",
        .get_bssid = wpa_driver_nl80211_get_bssid,
     〜省略〜
        .get_pref_freq_list = nl80211_get_pref_freq_list,
        .set_prob_oper_freq = nl80211_set_prob_oper_freq,
    };
    
    함수 포인터의 실체는 같은 원본에서 정의됩니다.다음은 예이다.
    src/drivers/driver_nl80211.c
    static int nl80211_set_channel(struct i802_bss *bss,
                       struct hostapd_freq_params *freq, int set_chan)
    {
    〜省略〜
        msg = nl80211_drv_msg(drv, 0, set_chan ? NL80211_CMD_SET_CHANNEL :
                      NL80211_CMD_SET_WIPHY);
    〜省略〜
        ret = send_and_recv_msgs(drv, msg, NULL, NULL);
    〜省略〜
    }
    
    NL80211_CMD_XXX는 Linux 커널의 무선 LAN 스택에 대한 명령입니다.
    정의는 다음과 같습니다.
    src/drivers/nl80211_copy.h
    enum nl80211_commands {
    /* don't change the order or add anything between, this is ABI! */
        NL80211_CMD_UNSPEC,
    〜省略〜
        NL80211_CMD_SET_CHANNEL,
    〜省略〜
    };
    
    이 enum 은 Linux 커널의 소스로도 정의되므로 NL802.11CMD_XXX의 순서는 변경할 수 없습니다.ABI는 Application Binary Interface의 약칭으로, 앱과 커널 사이의 I/F다.
    원래는includeLinux 핵에 정의된 헤더를 직접 만들어야 하지만, 엔음의 정의 순서를 바꾸지 않는 전제에서 응용 분야에서 이 엔음이 포함된 헤더를 제작할 수 있습니다.
    상기 nl802.11set_채널 ()에서 sendand_recv_mss()의 매개 변수에 ABI가 설정되어 있습니다.더 자세히 보면 다음과 같은 몇 가지를 발견할 수 있다.xxx()라는 libnl API가 사용되었음을 알 수 있습니다.
    src/drivers/driver_nl80211.c
    static int send_and_recv(struct nl80211_global *global,
                 struct nl_handle *nl_handle, struct nl_msg *msg,
                 int (*valid_handler)(struct nl_msg *, void *),
                 void *valid_data)
    {
    〜省略〜
        err = nl_send_auto_complete(nl_handle, msg);
    〜省略〜
        while (err > 0) {
            int res = nl_recvmsgs(nl_handle, cb);
    〜省略〜
    }
    
    요약하면 응용층과 내핵층 사이의 교량 구조는libnl로 이루어졌으며, 이 메커니즘을 이용하여 응용층과 내핵층 사이에서 무선 LAN 스택과 드라이버를 제어하는 명령(NL802.11 CMD XXX가 정의한 ABI)을 교환한다.

    좋은 웹페이지 즐겨찾기