diff --git a/embassy/demos/common/server.rs b/embassy/demos/common/server.rs index b1f561b31aa36ea4cb5afa28b0dd729ad1bdd853..c5912b140b3d5b3967cccd8cd31c701913d9a532 100644 --- a/embassy/demos/common/server.rs +++ b/embassy/demos/common/server.rs @@ -185,7 +185,8 @@ pub trait Shell : Default { /// asynchronously to a channel. #[derive(Default)] pub struct BufOutput { - s: heapless::String<1024>, + /// Sufficient to hold output produced from a single keystroke input. Further output will be discarded + s: heapless::String<300>, } impl BufOutput { @@ -205,12 +206,20 @@ impl BufOutput { impl core::fmt::Write for BufOutput { fn write_str(&mut self, s: &str) -> Result<(), core::fmt::Error> { - for c in s.chars() { - if c == '\n' { - self.s.push('\r').map_err(|_| core::fmt::Error)?; + let mut inner = || { + for c in s.chars() { + if c == '\n' { + self.s.push('\r').map_err(|_| core::fmt::Error)?; + } + self.s.push(c).map_err(|_| core::fmt::Error)?; } - self.s.push(c).map_err(|_| core::fmt::Error)?; + Ok::<_, core::fmt::Error>(()) + }; + + if inner().is_err() { + trace!("Buffer full in BufOutput"); } + Ok(()) } } diff --git a/embassy/demos/picow/src/main.rs b/embassy/demos/picow/src/main.rs index 7fb1bd3b63faf90a66c40907a40a854813decf8c..39eb0e24a4c998a700be893d1bff662718598c78 100644 --- a/embassy/demos/picow/src/main.rs +++ b/embassy/demos/picow/src/main.rs @@ -109,8 +109,8 @@ impl Shell for DemoShell { let b = &mut b[..lr]; for c in b.iter() { menu.input_byte(*c); + menu.context.flush(&mut stdio).await?; } - menu.context.flush(&mut stdio).await?; } Ok(()) }; diff --git a/embassy/src/server.rs b/embassy/src/server.rs index 2bdc685ffea1778a99d503f94f8d85843596f5f7..7954c5d7e76d6e1fb7f5dd3421438601d6273f10 100644 --- a/embassy/src/server.rs +++ b/embassy/src/server.rs @@ -3,7 +3,7 @@ use embassy_sync::blocking_mutex::raw::RawMutex; use embedded_io::asynch; use sunset::*; -use sunset::behaviour::{UnusedCli, UnusedServ}; +use sunset::behaviour::UnusedCli; use crate::*; use embassy_sunset::EmbassySunset; diff --git a/src/conn.rs b/src/conn.rs index e42c82fd77df41d98f12b41a9ed158815e3918d1..d203ed49c75a54e5ce40c66f96686485bf04c0ca 100644 --- a/src/conn.rs +++ b/src/conn.rs @@ -39,6 +39,8 @@ pub(crate) struct Conn<C: CliBehaviour, S: ServBehaviour> { parse_ctx: ParseContext, /// Remote version string. Kept for later kexinit rekeying + // TODO: could save space by hashing it into a KexHash and storing that instead. + // 256 bytes -> 112 bytes pub(crate) remote_version: ident::RemoteVersion, pub(crate) channels: Channels<C, S>, diff --git a/src/namelist.rs b/src/namelist.rs index 78b9a4011afc6d0274b479f0916c6231e84e3815..f871fac8053eec7e86149965ca30fd9e8a48b9bc 100644 --- a/src/namelist.rs +++ b/src/namelist.rs @@ -18,7 +18,10 @@ use heapless::Vec; // - key types // - signature types // - auth types -pub const MAX_LOCAL_NAMES: usize = 5; +/// Max count of LocalNames entries +/// +/// Current max is for kex, [curve25519, curve25519@libssh, ext-info, kexguess2] +pub const MAX_LOCAL_NAMES: usize = 4; static EMPTY_LOCALNAMES: LocalNames = LocalNames::new(); /// A comma separated string, can be decoded or encoded.