From 3681c782765408685d14d7c80c88d4d18dee783d Mon Sep 17 00:00:00 2001 From: Dario Nieuwenhuis Date: Wed, 29 Oct 2025 19:17:14 +0100 Subject: net-esp-hosted: update proto definitions to latest esp-hosted-fg. --- embassy-net-esp-hosted/src/control.rs | 33 ++-- embassy-net-esp-hosted/src/esp_hosted_config.proto | 205 ++++++++++++++++++++- embassy-net-esp-hosted/src/lib.rs | 4 + 3 files changed, 225 insertions(+), 17 deletions(-) (limited to 'embassy-net-esp-hosted') diff --git a/embassy-net-esp-hosted/src/control.rs b/embassy-net-esp-hosted/src/control.rs index a7f5168c2..38ec648b4 100644 --- a/embassy-net-esp-hosted/src/control.rs +++ b/embassy-net-esp-hosted/src/control.rs @@ -60,9 +60,11 @@ pub struct Status { macro_rules! ioctl { ($self:ident, $req_variant:ident, $resp_variant:ident, $req:ident, $resp:ident) => { let mut msg = proto::CtrlMsg { - r#msg_id: proto::CtrlMsgId::$req_variant, - r#msg_type: proto::CtrlMsgType::Req, - r#payload: Some(proto::CtrlMsg_::Payload::$req_variant($req)), + msg_id: proto::CtrlMsgId::$req_variant, + msg_type: proto::CtrlMsgType::Req, + payload: Some(proto::CtrlMsg_::Payload::$req_variant($req)), + req_resp_type: 0, + uid: 0, }; $self.ioctl(&mut msg).await?; #[allow(unused_mut)] @@ -117,15 +119,22 @@ impl<'a> Control<'a> { /// Connect to the network identified by ssid using the provided password. pub async fn connect(&mut self, ssid: &str, password: &str) -> Result<(), Error> { + const WIFI_BAND_MODE_AUTO: i32 = 3; // 2.4GHz + 5GHz + let req = proto::CtrlMsg_Req_ConnectAP { - r#ssid: unwrap!(String::try_from(ssid)), - r#pwd: unwrap!(String::try_from(password)), - r#bssid: String::new(), - r#listen_interval: 3, - r#is_wpa3_supported: true, + ssid: unwrap!(String::try_from(ssid)), + pwd: unwrap!(String::try_from(password)), + bssid: String::new(), + listen_interval: 3, + is_wpa3_supported: true, + band_mode: WIFI_BAND_MODE_AUTO, }; ioctl!(self, ReqConnectAp, RespConnectAp, req, resp); + + // TODO: in newer esp-hosted firmwares that added EventStationConnectedToAp + // the connect ioctl seems to be async, so we shouldn't immediately set LinkState::Up here. self.state_ch.set_link_state(LinkState::Up); + Ok(()) } @@ -140,8 +149,8 @@ impl<'a> Control<'a> { /// duration in seconds, clamped to [10, 3600] async fn set_heartbeat(&mut self, duration: u32) -> Result<(), Error> { let req = proto::CtrlMsg_Req_ConfigHeartbeat { - r#enable: true, - r#duration: duration as i32, + enable: true, + duration: duration as i32, }; ioctl!(self, ReqConfigHeartbeat, RespConfigHeartbeat, req, resp); Ok(()) @@ -149,7 +158,7 @@ impl<'a> Control<'a> { async fn get_mac_addr(&mut self) -> Result<[u8; 6], Error> { let req = proto::CtrlMsg_Req_GetMacAddress { - r#mode: WifiMode::Sta as _, + mode: WifiMode::Sta as _, }; ioctl!(self, ReqGetMacAddress, RespGetMacAddress, req, resp); let mac_str = core::str::from_utf8(&resp.mac).map_err(|_| Error::Internal)?; @@ -157,7 +166,7 @@ impl<'a> Control<'a> { } async fn set_wifi_mode(&mut self, mode: u32) -> Result<(), Error> { - let req = proto::CtrlMsg_Req_SetMode { r#mode: mode as i32 }; + let req = proto::CtrlMsg_Req_SetMode { mode: mode as i32 }; ioctl!(self, ReqSetWifiMode, RespSetWifiMode, req, resp); Ok(()) diff --git a/embassy-net-esp-hosted/src/esp_hosted_config.proto b/embassy-net-esp-hosted/src/esp_hosted_config.proto index aa1bfde64..7d626207e 100644 --- a/embassy-net-esp-hosted/src/esp_hosted_config.proto +++ b/embassy-net-esp-hosted/src/esp_hosted_config.proto @@ -1,3 +1,6 @@ +/* Copyright (C) 2015-2025 Espressif Systems (Shanghai) PTE LTD */ +/* SPDX-License-Identifier: GPL-2.0-only OR Apache-2.0 */ + syntax = "proto3"; /* Enums similar to ESP IDF */ @@ -28,9 +31,10 @@ enum Ctrl_WifiBw { } enum Ctrl_WifiPowerSave { - PS_Invalid = 0; + NO_PS = 0; MIN_MODEM = 1; MAX_MODEM = 2; + PS_Invalid = 3; } enum Ctrl_WifiSecProt { @@ -96,9 +100,16 @@ enum CtrlMsgId { Req_GetWifiCurrTxPower = 120; Req_ConfigHeartbeat = 121; + Req_EnableDisable = 122; + Req_GetFwVersion = 123; + Req_SetCountryCode = 124; + Req_GetCountryCode = 125; + Req_SetDhcpDnsStatus = 126; + Req_GetDhcpDnsStatus = 127; + Req_Custom_RPC_Unserialised_Msg = 128; /* Add new control path command response before Req_Max * and update Req_Max */ - Req_Max = 122; + Req_Max = 129; /** Response Msgs **/ Resp_Base = 200; @@ -130,9 +141,16 @@ enum CtrlMsgId { Resp_GetWifiCurrTxPower = 220; Resp_ConfigHeartbeat = 221; + Resp_EnableDisable = 222; + Resp_GetFwVersion = 223; + Resp_SetCountryCode = 224; + Resp_GetCountryCode = 225; + Resp_SetDhcpDnsStatus = 226; + Resp_GetDhcpDnsStatus = 227; + Resp_Custom_RPC_Unserialised_Msg = 228; /* Add new control path command response before Resp_Max * and update Resp_Max */ - Resp_Max = 222; + Resp_Max = 229; /** Event Msgs **/ Event_Base = 300; @@ -140,9 +158,22 @@ enum CtrlMsgId { Event_Heartbeat = 302; Event_StationDisconnectFromAP = 303; Event_StationDisconnectFromESPSoftAP = 304; + Event_StationConnectedToAP = 305; + Event_StationConnectedToESPSoftAP = 306; + Event_SetDhcpDnsStatus = 307; + Event_Custom_RPC_Unserialised_Msg = 308; /* Add new control path command notification before Event_Max * and update Event_Max */ - Event_Max = 305; + Event_Max = 309; +} + +enum HostedFeature { + Hosted_InvalidFeature = 0; + Hosted_Wifi = 1; + Hosted_Bluetooth = 2; + Hosted_Is_Network_Split_On = 3; + + /* Add your new features here and re-build prot using build_proto.sh */ } /* internal supporting structures for CtrlMsg */ @@ -213,6 +244,7 @@ message CtrlMsg_Resp_GetAPConfig { int32 chnl = 4; Ctrl_WifiSecProt sec_prot = 5; int32 resp = 6; + int32 band_mode = 7; } message CtrlMsg_Req_ConnectAP { @@ -221,11 +253,13 @@ message CtrlMsg_Req_ConnectAP { string bssid = 3; bool is_wpa3_supported = 4; int32 listen_interval = 5; + int32 band_mode = 6; } message CtrlMsg_Resp_ConnectAP { int32 resp = 1; bytes mac = 2; + int32 band_mode = 3; } message CtrlMsg_Req_GetSoftAPConfig { @@ -240,6 +274,7 @@ message CtrlMsg_Resp_GetSoftAPConfig { bool ssid_hidden = 6; int32 bw = 7; int32 resp = 8; + int32 band_mode = 9; } message CtrlMsg_Req_StartSoftAP { @@ -250,11 +285,13 @@ message CtrlMsg_Req_StartSoftAP { int32 max_conn = 5; bool ssid_hidden = 6; int32 bw = 7; + int32 band_mode = 8; } message CtrlMsg_Resp_StartSoftAP { int32 resp = 1; bytes mac = 2; + int32 band_mode = 3; } message CtrlMsg_Req_ScanResult { @@ -302,7 +339,7 @@ message CtrlMsg_Req_VendorIEData { int32 length = 2; bytes vendor_oui = 3; int32 vendor_oui_type = 4; - bytes payload = 5; + bytes payload = 5; } message CtrlMsg_Req_SetSoftAPVendorSpecificIE { @@ -341,6 +378,81 @@ message CtrlMsg_Resp_ConfigHeartbeat { int32 resp = 1; } +message CtrlMsg_Req_EnableDisable { + uint32 feature = 1; + bool enable = 2; +} + +message CtrlMsg_Resp_EnableDisable { + int32 resp = 1; +} + +message CtrlMsg_Req_GetFwVersion { +} + +message CtrlMsg_Resp_GetFwVersion { + int32 resp = 1; + string name = 2; + uint32 major1 = 3; + uint32 major2 = 4; + uint32 minor = 5; + uint32 rev_patch1 = 6; + uint32 rev_patch2 = 7; +} + +message CtrlMsg_Req_SetCountryCode { + bytes country = 1; + bool ieee80211d_enabled = 2; +} + +message CtrlMsg_Resp_SetCountryCode { + int32 resp = 1; +} + +message CtrlMsg_Req_GetCountryCode { +} + +message CtrlMsg_Resp_GetCountryCode { + int32 resp = 1; + bytes country = 2; +} + +message CtrlMsg_Req_SetDhcpDnsStatus { + int32 iface = 1; + int32 net_link_up = 2; + + int32 dhcp_up = 3; + bytes dhcp_ip = 4; + bytes dhcp_nm = 5; + bytes dhcp_gw = 6; + + int32 dns_up = 7; + bytes dns_ip = 8; + int32 dns_type = 9; +} + +message CtrlMsg_Resp_SetDhcpDnsStatus { + int32 resp = 1; +} + +message CtrlMsg_Req_GetDhcpDnsStatus { +} + +message CtrlMsg_Resp_GetDhcpDnsStatus { + int32 resp = 1; + int32 iface = 2; + int32 net_link_up = 3; + + int32 dhcp_up = 4; + bytes dhcp_ip = 5; + bytes dhcp_nm = 6; + bytes dhcp_gw = 7; + + int32 dns_up = 8; + bytes dns_ip = 9; + int32 dns_type = 10; +} + /** Event structure **/ message CtrlMsg_Event_ESPInit { bytes init_data = 1; @@ -352,11 +464,70 @@ message CtrlMsg_Event_Heartbeat { message CtrlMsg_Event_StationDisconnectFromAP { int32 resp = 1; + bytes ssid = 2; + uint32 ssid_len = 3; + bytes bssid = 4; + uint32 reason = 5; + int32 rssi = 6; } +message CtrlMsg_Event_StationConnectedToAP { + int32 resp = 1; + bytes ssid = 2; + uint32 ssid_len = 3; + bytes bssid = 4; + uint32 channel = 5; + int32 authmode = 6; + int32 aid = 7; +} + + message CtrlMsg_Event_StationDisconnectFromESPSoftAP { int32 resp = 1; bytes mac = 2; + uint32 aid = 3; + bool is_mesh_child = 4; + uint32 reason = 5; +} + +message CtrlMsg_Event_StationConnectedToESPSoftAP { + int32 resp = 1; + bytes mac = 2; + uint32 aid = 3; + bool is_mesh_child = 4; +} + +message CtrlMsg_Event_SetDhcpDnsStatus { + int32 iface = 1; + int32 net_link_up = 2; + + int32 dhcp_up = 3; + bytes dhcp_ip = 4; + bytes dhcp_nm = 5; + bytes dhcp_gw = 6; + + int32 dns_up = 7; + bytes dns_ip = 8; + int32 dns_type = 9; + int32 resp = 10; +} + +/* Add Custom RPC message structures after existing message structures to make it easily notice */ +message CtrlMsg_Req_CustomRpcUnserialisedMsg { + uint32 custom_msg_id = 1; + bytes data = 2; +} + +message CtrlMsg_Resp_CustomRpcUnserialisedMsg { + int32 resp = 1; + uint32 custom_msg_id = 2; + bytes data = 3; +} + +message CtrlMsg_Event_CustomRpcUnserialisedMsg { + int32 resp = 1; + uint32 custom_evt_id = 2; + bytes data = 3; } message CtrlMsg { @@ -366,6 +537,12 @@ message CtrlMsg { /* msg id */ CtrlMsgId msg_id = 2; + /* UID of message */ + int32 uid = 3; + + /* Request/response type: sync or async */ + uint32 req_resp_type = 4; + /* union of all msg ids */ oneof payload { /** Requests **/ @@ -395,6 +572,13 @@ message CtrlMsg { CtrlMsg_Req_SetWifiMaxTxPower req_set_wifi_max_tx_power = 119; CtrlMsg_Req_GetWifiCurrTxPower req_get_wifi_curr_tx_power = 120; CtrlMsg_Req_ConfigHeartbeat req_config_heartbeat = 121; + CtrlMsg_Req_EnableDisable req_enable_disable_feat = 122; + CtrlMsg_Req_GetFwVersion req_get_fw_version = 123; + CtrlMsg_Req_SetCountryCode req_set_country_code = 124; + CtrlMsg_Req_GetCountryCode req_get_country_code = 125; + CtrlMsg_Req_SetDhcpDnsStatus req_set_dhcp_dns_status = 126; + CtrlMsg_Req_GetDhcpDnsStatus req_get_dhcp_dns_status = 127; + CtrlMsg_Req_CustomRpcUnserialisedMsg req_custom_rpc_unserialised_msg = 128; /** Responses **/ CtrlMsg_Resp_GetMacAddress resp_get_mac_address = 201; @@ -422,11 +606,22 @@ message CtrlMsg { CtrlMsg_Resp_SetWifiMaxTxPower resp_set_wifi_max_tx_power = 219; CtrlMsg_Resp_GetWifiCurrTxPower resp_get_wifi_curr_tx_power = 220; CtrlMsg_Resp_ConfigHeartbeat resp_config_heartbeat = 221; + CtrlMsg_Resp_EnableDisable resp_enable_disable_feat = 222; + CtrlMsg_Resp_GetFwVersion resp_get_fw_version = 223; + CtrlMsg_Resp_SetCountryCode resp_set_country_code = 224; + CtrlMsg_Resp_GetCountryCode resp_get_country_code = 225; + CtrlMsg_Resp_SetDhcpDnsStatus resp_set_dhcp_dns_status = 226; + CtrlMsg_Resp_GetDhcpDnsStatus resp_get_dhcp_dns_status = 227; + CtrlMsg_Resp_CustomRpcUnserialisedMsg resp_custom_rpc_unserialised_msg = 228; /** Notifications **/ CtrlMsg_Event_ESPInit event_esp_init = 301; CtrlMsg_Event_Heartbeat event_heartbeat = 302; CtrlMsg_Event_StationDisconnectFromAP event_station_disconnect_from_AP = 303; CtrlMsg_Event_StationDisconnectFromESPSoftAP event_station_disconnect_from_ESP_SoftAP = 304; + CtrlMsg_Event_StationConnectedToAP event_station_connected_to_AP = 305; + CtrlMsg_Event_StationConnectedToESPSoftAP event_station_connected_to_ESP_SoftAP = 306; + CtrlMsg_Event_SetDhcpDnsStatus event_set_dhcp_dns_status = 307; + CtrlMsg_Event_CustomRpcUnserialisedMsg event_custom_rpc_unserialised_msg = 308; } } diff --git a/embassy-net-esp-hosted/src/lib.rs b/embassy-net-esp-hosted/src/lib.rs index 1fbed3e83..a6c806c46 100644 --- a/embassy-net-esp-hosted/src/lib.rs +++ b/embassy-net-esp-hosted/src/lib.rs @@ -340,6 +340,10 @@ where match payload { CtrlMsg_::Payload::EventEspInit(_) => self.shared.init_done(), CtrlMsg_::Payload::EventHeartbeat(_) => self.heartbeat_deadline = Instant::now() + HEARTBEAT_MAX_GAP, + CtrlMsg_::Payload::EventStationConnectedToAp(e) => { + info!("connected, code {}", e.resp); + self.state_ch.set_link_state(LinkState::Up); + } CtrlMsg_::Payload::EventStationDisconnectFromAp(e) => { info!("disconnected, code {}", e.resp); self.state_ch.set_link_state(LinkState::Down); -- cgit