
EasyMesh 核心模塊深挖筆記(模塊 9-17:接入安全與 R2/R3/R6 擴展類)學習目標:通過 EasyMesh R6 認證。本篇覆蓋 9 個"接入安全 + R2/R3/R6 擴展類"模塊。方法:協議原理為主線,prplMesh 源碼作佐證(代碼只用來印證"協議字段長這樣、怎么處理")。代碼路徑:prplMesh/agent/src/beerocks/slave/tasks/、prplMesh/controller/src/beerocks/master/、prplMesh/framework/tlvf/風格沿用notes/EASYMESH-02-ieee1905-1-協議詳解.md:每模塊五段式 = 協議原理 → 關鍵 TLV/消息 → 抓包驗證 → 實現要點(代碼佐證) → 認證 Test Case(??待核對)模塊 9 Onboarding(PBC + DPP/EasyConnect)9.1 協議原理Onboarding 是"新設備入網"流程,EasyMesh 提供兩條路徑:PBC(Push Button Configuration):EasyMesh R1 即支持,源自 WPS 思路。用戶在 Controller 與 Enrollee(待入網設備)上各按一次物理/虛擬按鍵,雙方通過 1905.1 多播PUSH_BUTTON_EVENT/JOIN互相通告,再走 WSC M1-M8 完成配置。R6 仍保留作為兼容路徑。DPP/EasyConnect(Wi-Fi Easy Connect):R2 引入,R4 標準化,R6 進一步強化(新增 DPP AKM)。用 QR 碼/URI 引導密鑰,做公鑰認證 + 加密配置下發,安全性遠高于 PBC。EasyMesh 在 DPP 中定義三個角色:Enrollee:待入網設備(帶 DPP URI,可顯示 QR 碼)Configurator:通常是 Controller,簽發 Connector、下發網絡配置Proxy Agent:通常是 Agent,把 Enrollee 的 DPP 幀通過 1905.1 隧道轉發給 Controller(Enrollee 不一定能直接夠到 Controller)DPP 幀本身是 802.11 公共動作幀/GAS 幀,EasyMesh 用ENCAP_DPP把它封裝進 1905.1 CMDU,讓 DPP 能跨多跳網絡跑。9.2 關鍵 TLV / 消息值消息/TLV用途0x000bPUSH_BUTTON_EVENT_NOTIFICATIONEnrollee 按鍵后多播,宣告"我要入網"0x000cPUSH_BUTTON_JOIN_NOTIFICATIONController 側按鍵后多播,回應"我來配你"0x801dDPP_CCE_INDICATIONConfigurator/Proxy 通告 CCE(Configurator/Controller/Enrollee)能力0x8029PROXIED_ENCAP_DPPProxy Agent 把 DPP 幀隧道轉發給 Controller0x802aDIRECT_ENCAP_DPP直連場景下 DPP 幀封裝(不經 Proxy)0x8031DPP_BOOTSTRAPPING_URI_NOTIFICATION把 Enrollee 的 DPP URI 上報給 Controller0xd2TLV_DPP_CCE_INDICATIONCCE 能力位(ENABLE/DISABLE)0xcdTLV_1905_ENCAP_DPP封裝 DPP 幀(含 frame_flags/dest_sta_mac/frame_type/encapsulated_frame)0xcfTLV_DPP_BOOTSTRAPPING_URI_NOTIFICATIONruid + bssid + backhaul_sta_addr + dpp_uri0xd3TLV_DPP_CHIRP_VALUEChirp 通知(Enrollee 發的 DPP 發現 chirp 幀)TLV_1905_ENCAP_DPP的frame_type區分兩類 DPP 幀:DPP_PUBLIC_ACTION_FRAME(0)、GAS_FRAME(1)。9.3 抓包驗證過濾:ieee1905 (msg.type == 0x801d || msg.type == 0x8029 || msg.type == 0x802a || msg.type == 0x8031),PBC 路徑另加msg.type == 0x000b/0x000c。時序要點:Enrollee 按鍵 → 多播PUSH_BUTTON_EVENT(0x000b)(帶 media_type 列表)Controller 按鍵 → 多播PUSH_BUTTON_JOIN(0x000c)DPP 路徑:Enrollee 發 chirp → Proxy Agent 用CHIRP_NOTIFICATION(0x802f)上報 → Controller 與 Enrollee 通過PROXIED_ENCAP_DPP(0x8029)交換 DPP Auth/Config 幀Enrollee 把自己的 DPP URI 通過DPP_BOOTSTRAPPING_URI_NOTIFICATION(0x8031)上報(含 ruid/bssid/backhaul_sta_addr/dpp_uri)9.4 實現要點(代碼佐證)prplMesh 在 Agent 側用proxy_agent_dpp_task處理 DPP 三類入站消息,體現 Proxy Agent 的"轉發器"角色:代碼佐證:prplMesh/agent/src/beerocks/slave/tasks/proxy_agent_dpp_task.cppswitch(cmdu_rx.getMessageType()){caseieee1905_1::eMessageType::DPP_CCE_INDICATION_MESSAGE:handle_dpp_cce_indication(cmdu_rx);returntrue;caseieee1905_1::eMessageType::CHIRP_NOTIFICATION_MESSAGE:handle_chirp_notification(cmdu_rx);returntrue;caseieee1905_1::eMessageType::PROXIED_ENCAP_DPP_MESSAGE:handle_proxied_encap_dpp(fd,src_mac,cmdu_rx);returntrue;}handle_proxied_encap_dpp按src_mac判向:來自 Controller 的轉發給 ap_manager,來自 ap_manager 的轉發給 Controller,并按frame_type區分 DPP Auth Request(0) 與 GAS(1):代碼佐證:同文件if(src_mac==db-controller_info.bridge_mac){if(encap_1905_dpp_tlv-frame_type()==0){// DPP authentication request → 轉給所有 radio 的 ap_managerfor(autoradio:db-get_radios_list()){...forward_cmdu_to_uds(ap_manager_fd,cmdu_rx);}}...}elseif(src_mac==net::network_utils::ZERO_MAC){// 來自 ap_manager(無線側 chirp 上來),保存 fd 并轉發給 Controllerif(encap_1905_dpp_tlv-frame_type()==1)active_onboarding_ap_manager_fd=fd;m_btl_ctx.forward_cmdu_to_controller(cmdu_rx);}DPP URI 上報 TLV 的字段定義(YAML 即協議線格式):代碼佐證:prplMesh/framework/tlvf/yaml/tlvf/wfa_map/tlvDppBootstrappingUriNotification.yamltlvDppBootstrappingUriNotification:ruid:sMacAddrbssid:sMacAddr# 收到 URI 的本地接口(= BSSID)backhaul_sta_address:sMacAddr# 收到 URI 的 backhaul STA 地址dpp_uri:char# DPP URI(格式見 Wi-Fi Easy Connect 5.2.1)PBC 的PUSH_BUTTON_EVENT_NOTIFICATIONTLV:代碼佐證:prplMesh/framework/tlvf/yaml/tlvf/ieee_1905_1/tlvPushButtonEventNotification.yamltlvPushButtonEventNotification:media_type_list_length:uint8_tmedia_type_list:sMediaType# 含 media_type + 802.11 specific info9.5 認證 Test Case(??待核對)MAP-5.x 系列(R5/R6 Onboarding):??待核對官方 Test Plan 中 PBC 與 DPP 的具體 case 編號重點:DPP Configurator/Proxy/Enrollee 三角色交互、URI 傳遞、CCE Indication 通告R6 新增 DPP AKM(0x0080)相關 case:??待核對模塊 10 Backhaul Management(回程鏈路管理)10.1 協議原理回程(Backhaul)是 Agent 上聯 Controller 的上行鏈路。EasyMesh 支持三類回程:Wired:以太網回程(最優先,無無線開銷)Wireless:Wi-Fi 回程(Agent 的 backhaul STA 關聯到上游 AP)1905.1 secure:跨 1905.1 匯聚層的加密回程(用于異構鏈路安全互通)回程管理包括:鏈路選擇(優先級 Wired Wireless)、回程切換(BACKHAUL_STEERING_REQUEST/RESPONSE)、回程能力查詢(BACKHAUL_STA_CAPABILITY_QUERY/REPORT)。R2 起回程安全強制 SAE(見模塊 11)。10.2 關鍵 TLV / 消息值消息用途0x8019BACKHAUL_STEERING_REQUESTController 要求 Agent 把 backhaul STA 引導到指定 BSSID0x801aBACKHAUL_STEERING_RESPONSEAgent 回應引導結果0x8027BACKHAUL_STA_CAPABILITY_QUERY查詢 backhaul STA 能力0x8028BACKHAUL_STA_CAPABILITY_REPORT上報 backhaul STA 能力0xcbTLV_BACKHAUL_STA_RADIO_CAPABILITIESbackhaul STA 無線能力0xd0TLV_BACKHAUL_BSS_CONFIGURATION回程 BSS 配置10.3 抓包驗證過濾:ieee1905 msg.type in {0x8019, 0x801a, 0x8027, 0x8028}關注:回程切換時 Agent 的 backhaul STA 是否完成"斷開舊 BSSID → 關聯新 BSSID → 1905.1 拓撲更新"全流程10.4 實現要點(代碼佐證)Agent 側backhaul_manager維護回程 FSM,回程引導有 10s 超時:代碼佐證:prplMesh/agent/src/beerocks/slave/backhaul_manager/backhaul_manager.cppconstexprautobackhaul_steering_timeout=std::chrono::milliseconds(10000);conststd::string dev_set_config_backhaul_param="backhaul";// 主 FSM:backhaul_fsm_main() 處理回程連接、切換、斷開if(!backhaul_fsm_main(continue_processing)){...}// 注冊 BACKHAUL_STEERING_REQUEST 處理ieee1905_1::eMessageType::BACKHAUL_STEERING_REQUEST_MESSAGE,10.5 認證 Test Case(??待核對)回程引導(Wired ? Wireless 切換):??待核對 MAP-3.x / MAP-4.x 編號R2 SAE 回程:見模塊 11模塊 11 Security(SAE / PMF)11.1 協議原理R2 起回程安全強制使用SAE(Simultaneous Authentication of Equals),即 WPA3-Personal 的密鑰協商協議。SAE 替代了 WPS/PSK 在回程中的角色,抗離線字典攻擊。PMF(Protected Management Frames,IEEE 802.11w):保護單播/組播管理幀(如 dea