From 0725f81144be50837aaf5ecb2422477f591dab9b Mon Sep 17 00:00:00 2001 From: Red Bear OS Date: Wed, 8 Jul 2026 18:16:05 +0300 Subject: [PATCH] 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). --- netstack/src/scheme/netcfg/mod.rs | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/netstack/src/scheme/netcfg/mod.rs b/netstack/src/scheme/netcfg/mod.rs index a464c43ed5..40e0ce6ae0 100644 --- a/netstack/src/scheme/netcfg/mod.rs +++ b/netstack/src/scheme/netcfg/mod.rs @@ -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 } } },