kernel/devices/net/
mod.rs

1mod e1000;
2
3use core::fmt;
4
5use crate::net::{NetworkError, NetworkPacket};
6
7use super::pci::{self, PciDeviceConfig};
8
9#[derive(Clone, Copy, Default, PartialEq, Eq)]
10pub struct MacAddress([u8; 6]);
11
12impl MacAddress {
13    pub fn new(bytes: [u8; 6]) -> Self {
14        MacAddress(bytes)
15    }
16
17    pub fn bytes(&self) -> &[u8; 6] {
18        &self.0
19    }
20}
21
22impl fmt::Debug for MacAddress {
23    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
24        write!(
25            f,
26            "{:02X}:{:02X}:{:02X}:{:02X}:{:02X}:{:02X}",
27            self.0[0], self.0[1], self.0[2], self.0[3], self.0[4], self.0[5]
28        )
29    }
30}
31
32#[allow(dead_code)]
33pub trait NetworkDevice {
34    fn mac_address(&self) -> MacAddress;
35    fn send(&self, data: &NetworkPacket) -> Result<(), NetworkError>;
36    fn receive_into(&self, packet: &mut NetworkPacket) -> Result<bool, NetworkError>;
37}
38
39#[allow(dead_code)]
40pub fn get_device() -> Option<&'static dyn NetworkDevice> {
41    e1000::get_device()
42}
43
44pub fn try_register_net_device(pci_device: &PciDeviceConfig) -> bool {
45    let pci::PciDeviceType::NetworkController(0, 0, _) = pci_device.device_type else {
46        return false;
47    };
48    e1000::try_register(pci_device)
49}