stp: enforce blocking on unicast send + enhanced stats display
BridgeDevice STP hardening: - send(): check STP blocking before unicast forwarding (host-originated) - recv(): check STP blocking before unicast forwarding (switched frames) - Previously only flood() checked STP; unicast forwarding bypassed it. A blocked port must never forward any traffic — STP semantics now correct. netcfg stats enhancement: - Per-interface stats now include mtu= and link= fields alongside counters - Applies to both eth0 and loopback - Enables bandwidth monitoring tools to self-discover MTU/link state
This commit is contained in:
@@ -117,6 +117,9 @@ impl LinkDevice for BridgeDevice {
|
||||
if repr.dst_addr.is_broadcast() || repr.dst_addr.is_multicast() {
|
||||
self.flood(packet, now, None);
|
||||
} else if let Some(port_idx) = self.lookup(dst_mac) {
|
||||
if self.stp.borrow().as_ref().is_some_and(|s| s.is_blocked(port_idx)) {
|
||||
return;
|
||||
}
|
||||
if let Some(port) = self.ports.borrow_mut().get_mut(port_idx) {
|
||||
port.send(IpAddress::Ipv4(smoltcp::wire::Ipv4Address::UNSPECIFIED), packet, now);
|
||||
}
|
||||
@@ -179,7 +182,9 @@ impl LinkDevice for BridgeDevice {
|
||||
self.flood(&self.recv_buffer, now, Some(port_idx));
|
||||
return Some(&self.recv_buffer);
|
||||
} else if let Some(dst_port_idx) = self.lookup(dst_mac) {
|
||||
if dst_port_idx != port_idx {
|
||||
if dst_port_idx != port_idx
|
||||
&& !self.stp.borrow().as_ref().is_some_and(|s| s.is_blocked(dst_port_idx))
|
||||
{
|
||||
let mut ports = self.ports.borrow_mut();
|
||||
if let Some(target) = ports.get_mut(dst_port_idx) {
|
||||
target.send(IpAddress::Ipv4(smoltcp::wire::Ipv4Address::UNSPECIFIED), &packet, now);
|
||||
|
||||
Reference in New Issue
Block a user