Merge pull request #3488 from kkrolczyk/small_net_fixes

embassy-net: disable multicast filtering
This commit is contained in:
Dario Nieuwenhuis 2024-11-02 11:22:40 +00:00 committed by GitHub
commit 54dd2af651
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 26 additions and 25 deletions

View File

@ -84,7 +84,7 @@ where
{ {
self.0.consume(|buf| { self.0.consume(|buf| {
#[cfg(feature = "packet-trace")] #[cfg(feature = "packet-trace")]
trace!("rx: {:?}", buf); trace!("embassy device rx: {:02x}", buf);
f(buf) f(buf)
}) })
} }
@ -105,7 +105,7 @@ where
self.0.consume(len, |buf| { self.0.consume(len, |buf| {
let r = f(buf); let r = f(buf);
#[cfg(feature = "packet-trace")] #[cfg(feature = "packet-trace")]
trace!("tx: {:?}", buf); trace!("embassy device tx: {:02x}", buf);
r r
}) })
} }

View File

@ -33,14 +33,14 @@ pub use embassy_net_driver as driver;
use embassy_net_driver::{Driver, LinkState}; use embassy_net_driver::{Driver, LinkState};
use embassy_sync::waitqueue::WakerRegistration; use embassy_sync::waitqueue::WakerRegistration;
use embassy_time::{Instant, Timer}; use embassy_time::{Instant, Timer};
#[allow(unused_imports)]
use heapless::Vec; use heapless::Vec;
#[cfg(feature = "dns")] #[cfg(feature = "dns")]
pub use smoltcp::config::DNS_MAX_SERVER_COUNT; pub use smoltcp::config::DNS_MAX_SERVER_COUNT;
#[cfg(feature = "multicast")] #[cfg(feature = "multicast")]
pub use smoltcp::iface::MulticastError; pub use smoltcp::iface::MulticastError;
#[allow(unused_imports)] #[cfg(any(feature = "dns", feature = "dhcpv4"))]
use smoltcp::iface::{Interface, SocketHandle, SocketSet, SocketStorage}; use smoltcp::iface::SocketHandle;
use smoltcp::iface::{Interface, SocketSet, SocketStorage};
use smoltcp::phy::Medium; use smoltcp::phy::Medium;
#[cfg(feature = "dhcpv4")] #[cfg(feature = "dhcpv4")]
use smoltcp::socket::dhcpv4::{self, RetryConfig}; use smoltcp::socket::dhcpv4::{self, RetryConfig};
@ -379,11 +379,11 @@ fn to_smoltcp_hardware_address(addr: driver::HardwareAddress) -> (HardwareAddres
impl<'d> Stack<'d> { impl<'d> Stack<'d> {
fn with<R>(&self, f: impl FnOnce(&Inner) -> R) -> R { fn with<R>(&self, f: impl FnOnce(&Inner) -> R) -> R {
f(&*self.inner.borrow()) f(&self.inner.borrow())
} }
fn with_mut<R>(&self, f: impl FnOnce(&mut Inner) -> R) -> R { fn with_mut<R>(&self, f: impl FnOnce(&mut Inner) -> R) -> R {
f(&mut *self.inner.borrow_mut()) f(&mut self.inner.borrow_mut())
} }
/// Get the hardware address of the network interface. /// Get the hardware address of the network interface.
@ -391,12 +391,12 @@ impl<'d> Stack<'d> {
self.with(|i| i.hardware_address) self.with(|i| i.hardware_address)
} }
/// Get whether the link is up. /// Check whether the link is up.
pub fn is_link_up(&self) -> bool { pub fn is_link_up(&self) -> bool {
self.with(|i| i.link_up) self.with(|i| i.link_up)
} }
/// Get whether the network stack has a valid IP configuration. /// Check whether the network stack has a valid IP configuration.
/// This is true if the network stack has a static IP configuration or if DHCP has completed /// This is true if the network stack has a static IP configuration or if DHCP has completed
pub fn is_config_up(&self) -> bool { pub fn is_config_up(&self) -> bool {
let v4_up; let v4_up;
@ -642,7 +642,7 @@ impl<'d> Stack<'d> {
} }
impl Inner { impl Inner {
#[allow(clippy::absurd_extreme_comparisons, dead_code)] #[allow(clippy::absurd_extreme_comparisons)]
pub fn get_local_port(&mut self) -> u16 { pub fn get_local_port(&mut self) -> u16 {
let res = self.next_local_port; let res = self.next_local_port;
self.next_local_port = if res >= LOCAL_PORT_MAX { LOCAL_PORT_MIN } else { res + 1 }; self.next_local_port = if res >= LOCAL_PORT_MAX { LOCAL_PORT_MIN } else { res + 1 };
@ -732,7 +732,7 @@ impl Inner {
debug!(" Default gateway: {:?}", config.gateway); debug!(" Default gateway: {:?}", config.gateway);
unwrap!(addrs.push(IpCidr::Ipv4(config.address)).ok()); unwrap!(addrs.push(IpCidr::Ipv4(config.address)).ok());
gateway_v4 = config.gateway.into(); gateway_v4 = config.gateway;
#[cfg(feature = "dns")] #[cfg(feature = "dns")]
for s in &config.dns_servers { for s in &config.dns_servers {
debug!(" DNS server: {:?}", s); debug!(" DNS server: {:?}", s);
@ -831,22 +831,19 @@ impl Inner {
self.state_waker.wake(); self.state_waker.wake();
} }
#[allow(unused_mut)]
let mut apply_config = false;
#[cfg(feature = "dhcpv4")] #[cfg(feature = "dhcpv4")]
if let Some(dhcp_handle) = self.dhcp_socket { if let Some(dhcp_handle) = self.dhcp_socket {
let socket = self.sockets.get_mut::<dhcpv4::Socket>(dhcp_handle); let socket = self.sockets.get_mut::<dhcpv4::Socket>(dhcp_handle);
if self.link_up { let configure = if self.link_up {
if old_link_up != self.link_up { if old_link_up != self.link_up {
socket.reset(); socket.reset();
} }
match socket.poll() { match socket.poll() {
None => {} None => false,
Some(dhcpv4::Event::Deconfigured) => { Some(dhcpv4::Event::Deconfigured) => {
self.static_v4 = None; self.static_v4 = None;
apply_config = true; true
} }
Some(dhcpv4::Event::Configured(config)) => { Some(dhcpv4::Event::Configured(config)) => {
self.static_v4 = Some(StaticConfigV4 { self.static_v4 = Some(StaticConfigV4 {
@ -854,20 +851,21 @@ impl Inner {
gateway: config.router, gateway: config.router,
dns_servers: config.dns_servers, dns_servers: config.dns_servers,
}); });
apply_config = true; true
} }
} }
} else if old_link_up { } else if old_link_up {
socket.reset(); socket.reset();
self.static_v4 = None; self.static_v4 = None;
apply_config = true; true
} else {
false
};
if configure {
self.apply_static_config()
} }
} }
if apply_config {
self.apply_static_config();
}
if let Some(poll_at) = self.iface.poll_at(timestamp, &mut self.sockets) { if let Some(poll_at) = self.iface.poll_at(timestamp, &mut self.sockets) {
let t = pin!(Timer::at(instant_from_smoltcp(poll_at))); let t = pin!(Timer::at(instant_from_smoltcp(poll_at)));
if t.poll(cx).is_ready() { if t.poll(cx).is_ready() {

View File

@ -186,7 +186,7 @@ impl<'a> TcpSocket<'a> {
}); });
Self { Self {
io: TcpIo { stack: stack, handle }, io: TcpIo { stack, handle },
} }
} }
@ -806,7 +806,7 @@ pub mod client {
}; };
let remote_endpoint = (addr, remote.port()); let remote_endpoint = (addr, remote.port());
let mut socket = TcpConnection::new(self.stack, self.state)?; let mut socket = TcpConnection::new(self.stack, self.state)?;
socket.socket.set_timeout(self.socket_timeout.clone()); socket.socket.set_timeout(self.socket_timeout);
socket socket
.socket .socket
.connect(remote_endpoint) .connect(remote_endpoint)

View File

@ -192,6 +192,9 @@ impl<'d, T: Instance, P: PHY> Ethernet<'d, T, P> {
// TODO: Carrier sense ? ECRSFD // TODO: Carrier sense ? ECRSFD
}); });
// Disable multicast filter
mac.macpfr().modify(|w| w.set_pm(true));
// Note: Writing to LR triggers synchronisation of both LR and HR into the MAC core, // Note: Writing to LR triggers synchronisation of both LR and HR into the MAC core,
// so the LR write must happen after the HR write. // so the LR write must happen after the HR write.
mac.maca0hr() mac.maca0hr()