iw 连接open AP失败的问题分析

来源:互联网 发布:linux 打包tar.gz文件 编辑:程序博客网 时间:2024/06/16 08:23

iw 连接open AP失败的问题分析


iw 连接open AP 问题

adb shell iw dev wlan0 connect -w “ssid” “frequece” “bssid”
返回结果:
wlan0 (phy #0): failed to connect to “ssid” status: 1: Unspecified failure

iw connect 连接流程


  • 首先分析并扩展一下Connect.c中的宏定义

TOPLEVEL(connect, “[-w] [] [] [key 0:abcde d:1:6162636465]”, 0, 0, CIB_NETDEV, iw_connect, “dddd.”);    ====>
struct cmd \
__section_connect \
__attribute__((used)) __attribute__((section(“__cmd”))) = { \
.name = (“connect”), \
.args = (“[-w] [] [] [key 0:abcde d:1:6162636465]”), \
.cmd = (0), \
.nl_msg_flags = (0), \
.idby = (CIB_NETDEV), \
.handler = (iw_connect), \
.help = (“dddd”), \
}


HIDDEN(connect, establish, “”, NL80211_CMD_CONNECT, 0, CIB_NETDEV, iw_conn); ====>
static struct cmd \
__cmd_establish_iw_conn_NL80211_CMD_CONNECT_CIB_NETDEV_1\
__attribute__((used)) __attribute__((section(“__cmd”))) = { \
.name = (“establish”), \
.args = (“”), \
.cmd = (NL80211_CMD_CONNECT), \
.nl_msg_flags = (0), \
.hidden = (1), \
.idby = (CIB_NETDEV), \
.handler = (iw_conn), \
.help = (NULL), \
.parent = __section_connect, \
.selector = (NULL), \
}

  • connect命令在iw中的流程


    这里写图片描述

  • connect open AP在iw中的关键步骤

    msg = nlmsg_alloc();
    genlmsg_put(msg, 0, 0, state->nl80211_id, 0, cmd->nl_msg_flags, cmd->cmd, 0);
    //establish 的cmd是:NL80211_CMD_CONNECT
    NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, devidx);
    NLA_PUT(msg, NL80211_ATTR_SSID, strlen(argv[0]), argv[0]);
    NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, freq);
    NLA_PUT(msg, NL80211_ATTR_MAC, 6, bssid);
    从代码逻辑看一切正常,没有问题呀!?,为什么连接不上呢?

    正常连接logde关键步骤:

    在external/wpa_supplicant_8/src/drivers/driver_nl80211.c中查看wpa_driver_nl80211_connect源码,对应log:
    1. 设置cmd, ifindex:
    wpa_supplicant: nl80211: Connect (ifindex=24)
    2. 设置bssid, bssid_hint
    wpa_supplicant: * bssid=a0:8d:16:a7:fb:4d
    wpa_supplicant: * bssid_hint=a0:8d:16:a7:fb:4d
    3. 设置freq, freq_hint
    wpa_supplicant: * freq=2412
    wpa_supplicant: * freq_hint=2412
    4. 设置IEs
    wpa_supplicant: * IEs - hexdump(len=8): 7f 06 00 00 0a 82 01 40
    5. 设置Auth Type
    wpa_supplicant: * Auth Type 0

    结合iw中连接步骤,继续分析

    大部分都一样,但少了一步Auth Type的设置!
    试着加上这一步看看!
    竟然成功连接上了:
    wlan0 (phy #0): connected to a0:8d:16:a7:fb:4d, 搞定收工!

    原创粉丝点击