66 lines
2.5 KiB
Rust
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();
|
|
}
|