cfg80211的kernel架构(基于Linux 3.08)之sta

5400阅读 0评论2014-02-21 雷鸣之
分类:LINUX

1, 大致框架




2, 几个主要流程

a) malloc & init(softmac)

内存分布

struct wiphy

struct ieee80211_local

Driver private class


结构体关系



初始化顺序

b) beacon frame

接收流程


对于管理帧,通常是ieee80211_rx_handlers调用ieee80211_rx_h_mgmt,然后用wq的方式调用ieee80211_iface_work进一步调用ieee80211_sta_rx_queued_mgmt去处理。

beacon响应流程



TIM IE:
E-id | length | DTIM count | DTIM period | Bitmap control | PVM(1-256byte)

remain to investigate:

how passive scan is implemented by beacon?

c) scan


d) auth and associate

wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME
  1. true): sme_authenticate->wpa_driver_nl80211_authenticate...->cfg80211_mlme_auth
  2. false):  wpa_drv_associate->wpa_driver_nl80211_connect...->cfg80211_mlme_auth

assoc成功之后会调用driver的set_key函数update key, 一般是放到wifi芯片某个管脚对应的缓存区域,从而实现硬件加密(与xmit skb缓存区进行与或,eg)。
具体函数栈流程如下:

点击(此处)折叠或打开

  1. nl80211_connect
  2.     cfg80211_connect(after scan and have bbs)
  3.         cfg80211_conn_do_work
  4.             __cfg80211_mlme_auth
  5.                 rdev->ops->auth(&rdev->wiphy, dev, &req);

  6. CallBack by rx irq
  7. ieee80211_rx_irqsafe
  8. ieee80211_tasklet_handler
  9.     ieee80211_rx
  10.         __ieee80211_rx_handle_packet
  11.             ieee80211_prepare_and_rx_handle
  12.                     ieee80211_invoke_rx_handlers
  13.                         ieee80211_rx_handlers
  14.                             ieee80211_rx_h_mgmt

  15. Queuework:
  16. ieee80211_iface_work(iface.c)
  17.     ieee80211_sta_rx_queued_mgmt
  18.         ieee80211_rx_mgmt_auth
  19.         cfg80211_send_rx_auth
  20.             nl80211_send_rx_auth(告诉用户空间)
  21.             cfg80211_sme_rx_auth
  22.                 schedule_work(&rdev->conn_work)

  23. Queuework:
  24. cfg80211_conn_work
  25.     __cfg80211_mlme_assoc
  26.         rdev->ops->assoc

  27. CallBack by rx irq
  28. ....
  29. ieee80211_sta_rx_queued_mgmt
  30.     ieee80211_rx_mgmt_assoc_resp
  31.         ieee80211_assoc_success
  32.             ieee80211_sta_rx_notify
  33.                 通过timer定时触发 ieee80211_mgd_probe_ap_send
  34.                 发送nullfunction或者probe_req
  35.     cfg80211_send_rx_assoc
  36.             nl80211_send_rx_assoc(告诉用户空间)
  37.             __cfg80211_connect_result
  38.                 nl80211_send_connect_result
  39.                 cfg80211_upload_connect_keys
  40.                     rdev->ops->add_key

e) rx/tx data

rx:



xmit:



e) csa

1)beacon 2)action帧
没连上,正在scan,不用管
手头有任务,先把手头任务做完,然后断开连接
手头没任务,调用driver的channel_switch(回调实现后面的改chan值)或者hw_config函数,然后把local的chan值改一下

f) missing

some details: off channel,

3, wifi driver部分之bcmdhd

a) init(施工ing)
b) fireware load(施工ing)
上一篇:SKB_BUFF说明
下一篇:madwifi无线网卡源代码阅读 一