11
Linux無線驅動程序mac80211中有這麼多結構。例如struct net_device
,struct ieee80211_hw
,struct ieee80211_vif
和struct ieee80211_local
等等。如此多的結構,我不明白它們包含的信息以及初始化的時間。如何學習Linux無線驅動程序(mac80211)的結構?
我該如何瞭解它們以及無線驅動程序的整個架構?
Linux無線驅動程序mac80211中有這麼多結構。例如struct net_device
,struct ieee80211_hw
,struct ieee80211_vif
和struct ieee80211_local
等等。如此多的結構,我不明白它們包含的信息以及初始化的時間。如何學習Linux無線驅動程序(mac80211)的結構?
我該如何瞭解它們以及無線驅動程序的整個架構?
你可能想看看約翰內斯貝格(mac80211維護者)滑到這裏: http://wireless.kernel.org/en/developers/Documentation/mac80211?action=AttachFile&do=get&target=mac80211.pdf
他們可能有些過時,但應該給你一個起點。
Linux的無線內核棧的高層描述:
netif_rx()
)。從那裏,網絡核心將通過TCP/IP協議棧代碼傳遞它,並將它放入用戶空間進程將讀取的相關套接字中。在Tx路徑上,數據包將使用ndo_start_xmit()
回調從netdev內核發送到無線驅動程序。驅動程序通過使用struct net_device_ops
註冊(像其他網絡設備,如以太網驅動程序)一組操作回調。nl80211
(參見include/uapi/linux/nl80211.h
)。你可以發送命令和得到響應的事件。nl80211
命令它被最初由cfg80211
內核模塊處理(它的代碼是net/wireless
下和處理程序是在net/wireless/nl80211.c
)。 cfg80211
通常會調用較低級別的驅動程序。如果是完整的MAC硬件特定的硬件驅動程序恰好在cfg80211下面。 cfg80211
以下的驅動程序使用cfg80211_ops struct
註冊了一組操作cfg80211
。例如,請參閱brcmfmac驅動程序(drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
)mac80211
這是實現802.11 MAC層的內核模塊。在這種情況下,cfg80211
將與mac80211
對話,後者將依次使用硬件特定的低級驅動程序。這方面的一個例子是iwlwifi(用於英特爾芯片)。mac80211
使用cfg80211_ops
(參見net/mac80211/cfg.c
)通過cfg80211
註冊自己。特定的硬件驅動程序通過使用ieee80211_ops struct
(例如drivers/net/wireless/iwlwifi/mvm/mac80211.c
)向mac80211
註冊。ieee80211_allow_hw()
。 ieee80211_alloc_hw()
獲取HW驅動程序使用的私有數據結構的大小。它依次調用cfg80211 wiphy_new()
,它爲wiphy結構,ieee80211_local struct
(由mac80211
使用)和HW驅動程序私有數據(分層在ieee80211_alloc_hw
代碼中可見)實際分配足夠的空間。 ieee80211_hw
是ieee80211_local
內的一個嵌入式結構,它對HW驅動程序是「可見的」。所有這些(wiphy
,ieee80211_local
,ieee80211_hw
)代表連接的單個物理設備。ifconfig
來控制。每個這樣的虛擬接口由ieee80211_vif
表示。該結構在最後還包含由硬件驅動程序訪問的私有結構。可以使用多個接口來運行wlan0上的工作站和wlan1上的AP(這可能取決於硬件功能)。
嗨,歡迎來到stackoverflow。好的問題通常比你在這裏提出的問題更狹窄和更具體,這個問題非常廣泛和開放。 – Flexo
從這個問題我可以真正建議最好的是閱讀源代碼(http://lxr.linux.no/#linux+v3.0.3/非常方便),潛伏在一些郵件列表(http:// linuxwireless .org/en/developers/MailingLists)並嘗試對自己進行一些更改。如果你能夠做到這一點,然後提出更具體的問題,我認爲你會得到更好的答案。 – Flexo