Files
Core/examples/net.rs
2026-03-15 11:18:38 +05:30

66 lines
2.5 KiB
Rust

#![no_std]
#![no_main]
extern crate alloc;
use alloc::format;
use kos::{
dll::Console,
network::{self, DeviceType},
threads::exit,
};
#[no_mangle]
pub fn kol_main() {
let con_lib = Console::import(None).expect("Failed to load /sys/lib/console.obj");
con_lib.init(u32::MAX, u32::MAX, u32::MAX, u32::MAX, c"Network Diagnostics");
let count = network::device_count();
con_lib.write_string("Network Subsystem Diagnostics\n");
con_lib.write_string("=============================\n");
con_lib.write_string(&format!("Discovered Devices: {}\n\n", count));
for i in 0..(count as u8) {
if let Ok(name) = network::device_name(i) {
con_lib.write_string(&format!("INTERFACE [{}]\n", i));
con_lib.write_string(&format!(" Name: {}\n", name));
if let Ok(info) = network::device_info(i) {
let dev_type = match info.device_type {
DeviceType::Ethernet => "Ethernet",
DeviceType::Loopback => "Loopback",
DeviceType::Unknown(_id) => "Unknown Hardware",
};
con_lib.write_string(&format!(" Type: {}\n", dev_type));
let up = if info.link.is_up() { "UP" } else { "DOWN" };
let mbps = info.link.speed_mbps().unwrap_or(0);
let duplex = if info.link.is_full_duplex() { "Full" } else { "Half" };
con_lib.write_string(&format!(" State: {} (Speed: {} Mbps, {} Duplex)\n", up, mbps, duplex));
}
if let Ok(stats) = network::device_stats(i) {
con_lib.write_string(&format!(" Stats: RX {} bytes | TX {} bytes\n", stats.rx_bytes, stats.tx_bytes));
con_lib.write_string(&format!(" RX {} pkts | TX {} pkts\n", stats.rx_packets, stats.tx_packets));
if stats.rx_errors > 0 || stats.tx_errors > 0 || stats.tx_dropped > 0 {
con_lib.write_string(&format!(" [!] Errors detected: RX={} TX={} Drops={}\n",
stats.rx_errors, stats.tx_errors, stats.tx_dropped));
}
}
con_lib.write_string("\n");
} else {
con_lib.write_string(&format!("INTERFACE [{}]\n [!] Failed to pull hardware state.\n\n", i));
}
}
con_lib.write_string("Diagnostics complete.");
con_lib.exit(false);
exit();
}