wifi 认证请求包的行走路线
第一步骤:
用户空间发送请求认证的包
ret_fast_syscall -> SyS_sendmsg -> __sys_sendmsg -> ___sys_sendmsg ->
sock_sendmsg ->netlink_sendmsg ->netlink_unicast ->genl_rcv ->
netlink_rcv_skb -> genl_rcv_msg ->nl80211_authenticate -> cfg80211_mlme_auth ->
ieee80211_auth -> mac80211_mgd_auth ->
driver/net/wireless/xr829/umac/mlme.c
in nl80211_authenticate
[ 470.139253] <-- 00000000: 48 00 00 00 13 00 05 00 7c 0d 89 60 f5 0f 00 73 H.......|..`...s
[ 470.149262] <-- 00000010: 25 00 00 00 08 00 03 00 0b 00 00 00 0a 00 06 00 %...............
[ 470.158794] <-- 00000020: 74 05 a5 8a 83 d5 00 00 08 00 26 00 85 09 00 00 t.........&.....
[ 470.168370] <-- 00000030: 10 00 34 00 54 50 2d 4c 49 4e 4b 5f 38 33 44 35 ..4.TP-LINK_83D5
[ 470.177873] <-- 00000040: 08 00 35 00 00 00 00 00 ..5..
mac80211_mgd_auth()
{
mac80211_add_work(wk);
//把认证的任务放入 工作队列中
//由工作队列所在的线程来执行
}
第2步骤:
umac/work.c
ieee80211_work_work
#if 0
Workqueue: phy1 ieee80211_work_work [xradio_mac]
[ 382.324761] [<c0111188>] (unwind_backtrace) from [<c010cd3c>] (show_stack+0x20/0x24)
[ 382.333467] [<c010cd3c>] (show_stack) from [<c0483f50>] (dump_stack+0x78/0x94)
[ 382.341697] [<c0483f50>] (dump_stack) from [<bf0ed2e4>] (xradio_tx+0x74/0x1a7c [xradio_core])
[ 382.351500] [<bf0ed2e4>] (xradio_tx [xradio_core]) from [<bf0aa528>] (__ieee80211_tx+0x17c/0x19c [xradio_mac])
[ 382.362890] [<bf0aa528>] (__ieee80211_tx [xradio_mac]) from [<bf0abe10>] (ieee80211_tx+0x108/0x134 [xradio_mac])
[ 382.374519] [<bf0abe10>] (ieee80211_tx [xradio_mac]) from [<bf0ac708>] (mac80211_xmit+0x9c/0xa4 [xradio_mac])
[ 382.386207] [<bf0ac708>] (mac80211_xmit [xradio_mac]) from [<bf0ad380>] (ieee80211_tx_skb+0x5c/0x70 [xradio_mac])
[ 382.398328] [<bf0ad380>] (ieee80211_tx_skb [xradio_mac]) from [<bf0af9b8>] (mac80211_send_auth+0x158/0x168 [xradio_mac])
[ 382.411129] [<bf0af9b8>] (mac80211_send_auth [xradio_mac]) from [<bf09efd8>] (ieee80211_work_work+0x820/0x1110 [xradio_mac])
[ 382.424089] [<bf09efd8>] (ieee80211_work_work [xradio_mac]) from [<c0144c24>] (process_one_work+0x250/0x478)
[ 382.435228] [<c0144c24>] (process_one_work) from [<c0145b14>] (worker_thread+0x2e0/0x420)
[ 382.444499] [<c0145b14>] (worker_thread) from [<c014a934>] (kthread+0x10c/0x128)
[ 382.452889] [<c014a934>] (kthread) from [<c0107fd0>] (ret_from_fork+0x14/0x24)
#endif
第3步骤:
xradio_tx
数据包装成 sdio接口能接受的数据包
有包头 包尾,中间是要发送的数据包
然后放入一个队列中
准备好发送数据,唤醒 底半 bh 处理函数
bh.c
static int xradio_bh(void *arg)
{
...
tx:
底半函数中,取得先前放入队列中的待发送数据包
...
通过sdio接口 操作wifi芯片
把认证请求包 通过天线发送给ap
}
在上一步骤中,有可能数据包没有直接发送出去
为了等待某一条件,在条件满足后
会重新把此包数据重入一次队列,然后底半函数再取出,发送sdio接口。
if (xradio_queue_get(queue,
priv->if_id,
tx_allowed_mask,
&wsm, &tx_info, &txpriv)) {
wsm_printk(XRADIO_DBG_WARN, "%s, if_id=%d(enable=%d), tx_allowed_mask=%08x, " \
"queue_num=%d, queued_item=%d, pending_item=%d" \
"link_id_after_dtim=%d, link_id_uapsd=%d, tx_multicast=%d, " \
"pspoll_mask=%d, sta_asleep_mask=%d\n",
__func__, priv->if_id, atomic_read(&priv->enabled),
tx_allowed_mask, queue_num, queue->num_queued, queue->num_pending,
priv->link_id_after_dtim, priv->link_id_uapsd,
priv->tx_multicast, priv->pspoll_mask, priv->sta_asleep_mask);
spin_unlock(&priv->vif_lock);
if_pending = 0;
continue;
}
先从队列取出数据包
if( wsm_handle_tx_data(priv, wsm, tx_info, txpriv, queue) ){
spin_unlock(&priv->vif_lock);
if_pending = 0;
continue;
//Handled by WSM
}
wsm_handle_tx_data函数会处理数据包内容
如果此函数返回1,那么此包就不会通过sdio接口发送出去
if (ieee80211_is_auth(fctl)){
//wsm_printk(XRADIO_DBG_WARN, "p2p_if_vif1 = %x\n", p2p_if_vif);
action = doJoin;
}
认证阶段的第一个步骤,STA向ap发送请求认证包
当完成doJoin的操作后,通过工作队列,会重装入前面已经处理过的包,然后再入
wsm_handle_tx_data函数,此时返回0,接着把包内容通过sdio口发送出去。