Linux의 무선 LAN 소프트웨어 구성
무선 랜 소프트웨어의 전체 그림
Linux의 무선 LAN 기능은 다음과 같은 요소에 의해 실현된다.
사용하는 장치에 따라 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.cchar * 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.cconst 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.cstatic 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.henum 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.cstatic 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)을 교환한다.
Reference
이 문제에 관하여(Linux의 무선 LAN 소프트웨어 구성), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Yoko303/items/8ee1f454c857d09db5bb
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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);
〜省略〜
}
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,
};
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);
〜省略〜
}
enum nl80211_commands {
/* don't change the order or add anything between, this is ABI! */
NL80211_CMD_UNSPEC,
〜省略〜
NL80211_CMD_SET_CHANNEL,
〜省略〜
};
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);
〜省略〜
}
Reference
이 문제에 관하여(Linux의 무선 LAN 소프트웨어 구성), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Yoko303/items/8ee1f454c857d09db5bb텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)