---
# System prepended metadata

title: 2025q1 Homework1 (ideas)
tags: [linux 核心設計]

---

# 2025q1 Homework1 (ideas)
contributed by < timsong1 >

## [Linux 核心專題: 虛擬無線網路裝置驅動程式](https://hackmd.io/@sysprog/rJ-LF4nNC) 
[vwifi](https://github.com/sysprog21/vwifi) 是個程式碼約~三千行，具體而微的 WiFi 裝置驅動程式，採用 cfg80211 框架。目前 vwifi 支援 scan, connect, disconnect 等 cfg80211 的介面操作，並得以正確處理 Tx/Rx 封包。

---
### FullMAC vs. SoftMAC

主要就是差在 [MLME](https://blog.csdn.net/lixiaofeng0/article/details/139775690) (MAC layer management entity) 是在硬體還是軟體上實現

![image](https://hackmd.io/_uploads/B1cebocsJg.png)

**FullMAC** : 
1. MLME 透過硬體實現，所有 WIFI 協議的部分都交由韌體處理
2. 執行快、不占用 CPU

**SoftMAC** :
1. MLME 透過軟體實現
2. 硬體成本低
3. 驅動如果要更新，可以直接透過更新軟體來實現


不管是 FullMAC SoftMAC 設備都需要透過 cfg80211 來讓 linux 核心知道他們的存在

---
### cfg80211, mac80211, nl80211

[cfg80211](https://docs.kernel.org/driver-api/80211/cfg80211.html) subsystem 提供了一個統一的 API，使得驅動可以對 WIFI 設備進行配置管理

- 不直接處理 WIFI 數據資料，而是負責設備配置與管理
- 通常會與 FullMAC, Mac80211, nl80211 一起工作，即便不使用 mac80211，仍可用於 FullMAC 設備驅動
- 提供與 user space 溝通的介面 (搭配 nl80211)

[mac80211]() subsystem 是專門寫 SoftMAC 驅動的框架，意思就是只適用於 SoftMAC 設備，負責處理 [IEEE 802.11](https://hackmd.io/@jychen0611/IEEE_802_11) 協議的部分

- 不會直接與 user space 溝通，而是透過 cfg80211 來處理來自 user space 的請求
簡單來說，cfg80211 負責解析 user space 請求，透過 [callback](https://learnlinuxconcepts.blogspot.com/2014/11/explain-callback-functions.html) 函數來呼叫 mac80211 來執行 WIFI 操作 (如掃描、連接等等)

[nl80211]() 是 linux 核心的 user space API for [IEEE 802.11](https://hackmd.io/@jychen0611/IEEE_802_11)，像是 `iw`、`wpa_supplicant` 來與 cfg80211 和 mac80211 subsystem 溝通

- cfg80211 是在 linux 核心裡對 WIFI 設備進行配置管理，而 nl80211 則是在 user space 對 WIFI 設備進行配置管理

![image](https://hackmd.io/_uploads/SySSFqcikg.png)

```
+------------------------+          +-------------------+
|  User-space tools      |          |  Kernel (vwifi)   |
|  (iw, hostapd, etc)    |          |                   |
+-----------+------------+          +----------+--------+
            |                                |
            | Netlink / cfg80211 call        |
            v                                |
   +------------------+                      |
   | cfg80211_ops     |                      |
   | (scan/connect/...)                     |
   +------------------+                      |
            |                                v
            |                        +-----------------+
            |                        | vwifi_vif       |
            |                        | (STA / AP / IBSS)
            |                        +--------+--------+
            |                                 |
            |                         Packet RX/TX logic
            |                                 |
            |<--------------------------------+
            |                                 |
            v                                 v
     驗證連線成功                      驗證封包是否可收
```

---
### ideas: 支援實體網卡

vwifi 是透過創建虛擬網卡(支援 station、access point、ibss 等模式)，透過實作 `cfg80211_ops` 、 Tx/Rx 來模擬整個網卡以及傳輸行為，但從頭到尾沒有與實體網卡交互。

因此我好奇能不能在原本的架構上擴充，支援特定型號的實體網卡
以下是需要探討的問題
1. 網卡要 FullMAC 還是 SoftMAC ?

vwifi 只有實作 `cfg80211`，而根據 [cfg80211 說明](https://wireless.docs.kernel.org/en/latest/en/developers/documentation/cfg80211.html)
>All new Linux wireless drivers should be written targeting either cfg80211 for fullmac devices or mac80211 for softmac devices.

對於 vwifi 來說，是屬於 FullMAC 驅動，如果要先擴充成支援 FullMAC 實體網卡的話，驅動也是透過 `cfg80211`

2. 要使用哪個品牌、型號的網卡?
3. 支援兩個實體網卡互相通訊，還是跟 vwifi 一樣自己模擬通訊 ?









