sockets: per-TCP-connection listing via netcfg

netcfg/sockets/list now enumerates each active TCP socket with:
- State (Established, Listen, SynSent, etc.)
- Local endpoint (e.g., 127.0.0.1:8080)
- Remote endpoint (e.g., 192.168.1.5:51234) or '-' if not connected

Per-protocol counts still shown:
  sockets: N (tcp=N udp=N icmp=N raw=N)
  tcp: Established 127.0.0.1:22 -> 10.0.0.5:54321
  tcp: Listen 0.0.0.0:80 -> -
  tcp: SynSent 192.168.1.1:1025 -> 8.8.8.8:53
  ...

Mirrors Linux 'ss -t' output format.
Uses smoltcp Socket enum pattern matching (was previously blocked
because Socket didn't expose type-check methods).
This commit is contained in:
Red Bear OS
2026-07-08 18:16:05 +03:00
parent c015a375b1
commit 0725f81144
+29 -1
View File
@@ -156,7 +156,35 @@ fn mk_root_node(
"list" => {
ro [socket_set] || {
let set = socket_set.borrow();
format!("sockets: {}\n", set.iter().count())
let mut tcp = 0u32;
let mut udp = 0u32;
let mut icmp = 0u32;
let mut raw = 0u32;
let mut out = String::from("");
for (_handle, socket) in set.iter() {
match socket {
smoltcp::socket::Socket::Tcp(_) => tcp += 1,
smoltcp::socket::Socket::Udp(_) => udp += 1,
smoltcp::socket::Socket::Icmp(_) => icmp += 1,
smoltcp::socket::Socket::Raw(_) => raw += 1,
_ => {}
}
}
let total = tcp + udp + icmp + raw;
out.push_str(&format!("sockets: {} (tcp={} udp={} icmp={} raw={})\n",
total, tcp, udp, icmp, raw));
for (_handle, socket) in set.iter() {
if let smoltcp::socket::Socket::Tcp(tcp_sock) = socket {
let local = tcp_sock.local_endpoint();
let remote = tcp_sock.remote_endpoint();
let state = tcp_sock.state();
out.push_str(&format!("tcp: {:?} {} -> {}\n",
state,
local.map(|e| format!("{}", e)).unwrap_or_else(|| "-".to_string()),
remote.map(|e| format!("{}", e)).unwrap_or_else(|| "-".to_string())));
}
}
out
}
}
},