wifi 认证请求包的行走路线

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口发送出去。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值