hostapd upstream - 軟體架構設計很重要

收錄在 AIoT Ameba 2020 - Just for Fun

--

之前因為 Android VTS 需要, 上了兩個 patch 到 hostapd.
有一個 patch 提交之後, 被拆成了 9 個 patches 提交了,  一直沒有好好來看.

剛好最近 rtw88-usb 告一段落, ulli-kroll 也改成從我這邊 fork 出去來玩看看,
https://github.com/ulli-kroll/rtw88-usb

rtw88-usb 開始有些雛型了. 順便廣告一下 rtw88-usb :

rtw88-usb 支援 Realtek 8822BU, 這其實就是 Edimax 的 AC1200 EW7822-ULC
 https://www.edimax.com/edimax/merchandise/merchandise_detail/data/edimax/global/wireless_adapters_ac1200_dual-band/ew-7822ulc/
https://blog.skywebster.com/80211ac-controller-realtek-8822bu-on-linux-412-or-later/
)
可以用這個 8822bu wifi dongle 插在像 Raspberry Pi 這類的平台 就可以來玩. WiFi.
或像最近有人對 rtw88-usb 提交 issue, 是為了能在 openwrt 下使用
  https://github.com/ulli-kroll/rtw88-usb/issues/6


藉這時機點, 來把 hostapd 之前 Jouni Malinen 的思路好好分析一下.
做個總結,

PS: Jouni Malinen 人很好很專業, 每天都會回應好幾個 patch, 值得好好和他學習.

====



Hostapd 是甚麼, 如何 upstream 可以參考先前寫的這篇
http://njiot.blogspot.com/2019/09/hostapd-upstream.html

在 去年 9/19 上了這個 git
https://w1.fi/cgit/hostap/commit/?id=d9286d099797186eb30870323da529c0284197bd

而在同時間, 因為 ACS offload 問題 ( 問題可以參考這篇描述:
http://njiot.blogspot.com/2019/12/acs-automatic-channel-selection.html )
開始提交 patch

1. https://patchwork.ozlabs.org/patch/1164498/
一開始是想直接多一個 hw mode - AG 簡單地來解決這個問題
但的確外國人不喜歡太有彈性的簡單取巧作法,
會從 hw mode 的設計定義來看,  認為增加一個 hw mode -AG是不正確的.

2. https://patchwork.ozlabs.org/patch/1217027/
於是我從 hw_mode=any 的設計開始討論. 
Jouni Malinen  是 Qualcomm Atheros 的工程師, 有自己加了些 QCA 的 wiphy command,
給 hw_mode=any, 並在 conf 註解裡寫這是給 HW 有支援  ACS offload 的.
但當我提出 hw_mode=any 就是 HW 要支援 ACS offload 時,
Jouni Malinen 卻說這兩個是不同的. 想想的確也是,
hw_mode=any 當初的設計並不是針對 HW 要支援 ACS offload.
這也突顯了的確正常設計應該要先 "正名", 也就是定義清楚..
但我們可能習慣了直接看結果, 會動就好..

3. https://patchwork.ozlabs.org/patch/1219504/
所以接下來目標是讓 hw_mode=any 也能支援 非 ACS offload 的 HW.
但那時還是想著有沒有簡便的方式可以達到這個目的, 而仍去修改
wpa_driver_nl80211_postprocess_modes(), 本質仍和 1 的多一個 mode 的方式差不多...
立刻被抓出來說, 不應該去修改 src/drivers/driver_*.c
因為這並不是 IC 支援那些 HW mode 的問題, 它和 b mode 本質上是不同的.

4. https://patchwork.ozlabs.org/patch/1222011/
於是, 再提交了另一個, 這次深入 hostapd framework,
對每個有可能因為 mode=any 的地方去做判斷處理.
雖然知道有些重複的動作, 但不知道抽取出來的 function 要放在哪.

Jouni Malinen 不虧是最了解 hostapd 的原創者,
做了 hostapd_determine_mode(), hostapd_get_mode_chan() 和 hostapd_hw_skip_mode()
並將 hostapd_hw_skip_mode() 放到 hw_features.c/.h
ACS: Extend hostapd_get_mode_channel() to find from any mode

而每個需要修改到的地方, 都用一個新的 git 來描述
ACS: Clear all modes in acs_cleanup()
ACS: Extend acs_surveys_are_sufficient() for all modes
ACS: Extend acs_find_chan() for all modes
ACS: Extend interference factor calculation for all modes
ACS: Extend acs_request_scan() to support multiple modes
ACS: Extend acs_find_ideal_chan() to support multiple modes
ACS: Allow hw_mode=any to be used with internal ACS algorithm


的確這樣清楚多了, 要走得長遠, 軟體規劃設計還是蠻重要的, 
佩服!









留言

熱門文章