177799ccaSWu Mianzhi //这个文件的绝大部分内容是copy virtio_net.rs的,考虑到所有的驱动都要用操作系统提供的协议栈,我觉得可以把这些内容抽象出来
277799ccaSWu Mianzhi
377799ccaSWu Mianzhi use crate::{
4881ff6f9Syuyi2439 arch::rand::rand,
577799ccaSWu Mianzhi driver::{
677799ccaSWu Mianzhi base::{
7e32effb1SLoGin class::Class,
8*28fe4ad2S黄铭涛 device::{bus::Bus, driver::Driver, Device, DeviceCommonData, DeviceType, IdTable},
9*28fe4ad2S黄铭涛 kobject::{KObjType, KObject, KObjectCommonData, KObjectState, LockedKObjectState},
1077799ccaSWu Mianzhi },
11*28fe4ad2S黄铭涛 net::{register_netdevice, NetDeivceState, NetDevice, NetDeviceCommonData, Operstate},
1277799ccaSWu Mianzhi },
13*28fe4ad2S黄铭涛 libs::{
14*28fe4ad2S黄铭涛 rwlock::{RwLockReadGuard, RwLockWriteGuard},
15*28fe4ad2S黄铭涛 spinlock::{SpinLock, SpinLockGuard},
16*28fe4ad2S黄铭涛 },
17e32effb1SLoGin net::{generate_iface_id, NET_DEVICES},
1877799ccaSWu Mianzhi time::Instant,
1977799ccaSWu Mianzhi };
20c566df45SLoGin use alloc::{
21*28fe4ad2S黄铭涛 string::{String, ToString},
22c566df45SLoGin sync::{Arc, Weak},
23c566df45SLoGin };
2477799ccaSWu Mianzhi use core::{
2577799ccaSWu Mianzhi cell::UnsafeCell,
2677799ccaSWu Mianzhi fmt::Debug,
2777799ccaSWu Mianzhi ops::{Deref, DerefMut},
2877799ccaSWu Mianzhi };
292eab6dd7S曾俊 use log::info;
30881ff6f9Syuyi2439 use smoltcp::{
31881ff6f9Syuyi2439 phy,
32881ff6f9Syuyi2439 wire::{self, HardwareAddress},
33881ff6f9Syuyi2439 };
3491e9d4abSLoGin use system_error::SystemError;
3577799ccaSWu Mianzhi
3677799ccaSWu Mianzhi use super::e1000e::{E1000EBuffer, E1000EDevice};
3777799ccaSWu Mianzhi
38*28fe4ad2S黄铭涛 const DEVICE_NAME: &str = "e1000e";
39*28fe4ad2S黄铭涛
4077799ccaSWu Mianzhi pub struct E1000ERxToken(E1000EBuffer);
4177799ccaSWu Mianzhi pub struct E1000ETxToken {
4277799ccaSWu Mianzhi driver: E1000EDriver,
4377799ccaSWu Mianzhi }
4477799ccaSWu Mianzhi pub struct E1000EDriver {
4577799ccaSWu Mianzhi pub inner: Arc<SpinLock<E1000EDevice>>,
4677799ccaSWu Mianzhi }
47b5b571e0SLoGin unsafe impl Send for E1000EDriver {}
48b5b571e0SLoGin unsafe impl Sync for E1000EDriver {}
4977799ccaSWu Mianzhi
5077799ccaSWu Mianzhi /// @brief 网卡驱动的包裹器,这是为了获取网卡驱动的可变引用而设计的。
5177799ccaSWu Mianzhi /// 参阅virtio_net.rs
5277799ccaSWu Mianzhi struct E1000EDriverWrapper(UnsafeCell<E1000EDriver>);
5377799ccaSWu Mianzhi unsafe impl Send for E1000EDriverWrapper {}
5477799ccaSWu Mianzhi unsafe impl Sync for E1000EDriverWrapper {}
5577799ccaSWu Mianzhi
5677799ccaSWu Mianzhi impl Deref for E1000EDriverWrapper {
5777799ccaSWu Mianzhi type Target = E1000EDriver;
deref(&self) -> &Self::Target5877799ccaSWu Mianzhi fn deref(&self) -> &Self::Target {
5977799ccaSWu Mianzhi unsafe { &*self.0.get() }
6077799ccaSWu Mianzhi }
6177799ccaSWu Mianzhi }
6277799ccaSWu Mianzhi impl DerefMut for E1000EDriverWrapper {
deref_mut(&mut self) -> &mut Self::Target6377799ccaSWu Mianzhi fn deref_mut(&mut self) -> &mut Self::Target {
6477799ccaSWu Mianzhi unsafe { &mut *self.0.get() }
6577799ccaSWu Mianzhi }
6677799ccaSWu Mianzhi }
6777799ccaSWu Mianzhi
6877799ccaSWu Mianzhi impl E1000EDriverWrapper {
69b5b571e0SLoGin #[allow(clippy::mut_from_ref)]
force_get_mut(&self) -> &mut E1000EDriver7077799ccaSWu Mianzhi fn force_get_mut(&self) -> &mut E1000EDriver {
7177799ccaSWu Mianzhi unsafe { &mut *self.0.get() }
7277799ccaSWu Mianzhi }
7377799ccaSWu Mianzhi }
7477799ccaSWu Mianzhi
7577799ccaSWu Mianzhi impl Debug for E1000EDriverWrapper {
fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result7677799ccaSWu Mianzhi fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
7777799ccaSWu Mianzhi f.debug_struct("E1000ENICDriver").finish()
7877799ccaSWu Mianzhi }
7977799ccaSWu Mianzhi }
8077799ccaSWu Mianzhi
81*28fe4ad2S黄铭涛 #[cast_to([sync] NetDevice)]
82*28fe4ad2S黄铭涛 #[cast_to([sync] Device)]
8377799ccaSWu Mianzhi pub struct E1000EInterface {
8477799ccaSWu Mianzhi driver: E1000EDriverWrapper,
8577799ccaSWu Mianzhi iface_id: usize,
8677799ccaSWu Mianzhi iface: SpinLock<smoltcp::iface::Interface>,
8777799ccaSWu Mianzhi name: String,
88*28fe4ad2S黄铭涛 inner: SpinLock<InnerE1000EInterface>,
89*28fe4ad2S黄铭涛 locked_kobj_state: LockedKObjectState,
9077799ccaSWu Mianzhi }
91*28fe4ad2S黄铭涛
92*28fe4ad2S黄铭涛 #[derive(Debug)]
93*28fe4ad2S黄铭涛 pub struct InnerE1000EInterface {
94*28fe4ad2S黄铭涛 netdevice_common: NetDeviceCommonData,
95*28fe4ad2S黄铭涛 device_common: DeviceCommonData,
96*28fe4ad2S黄铭涛 kobj_common: KObjectCommonData,
97*28fe4ad2S黄铭涛 }
98*28fe4ad2S黄铭涛
9977799ccaSWu Mianzhi impl phy::RxToken for E1000ERxToken {
consume<R, F>(mut self, f: F) -> R where F: FnOnce(&mut [u8]) -> R,10077799ccaSWu Mianzhi fn consume<R, F>(mut self, f: F) -> R
10177799ccaSWu Mianzhi where
10277799ccaSWu Mianzhi F: FnOnce(&mut [u8]) -> R,
10377799ccaSWu Mianzhi {
104b5b571e0SLoGin let result = f(self.0.as_mut_slice());
10577799ccaSWu Mianzhi self.0.free_buffer();
10677799ccaSWu Mianzhi return result;
10777799ccaSWu Mianzhi }
10877799ccaSWu Mianzhi }
10977799ccaSWu Mianzhi
11077799ccaSWu Mianzhi impl phy::TxToken for E1000ETxToken {
consume<R, F>(self, _len: usize, f: F) -> R where F: FnOnce(&mut [u8]) -> R,111971462beSGnoCiYeH fn consume<R, F>(self, _len: usize, f: F) -> R
11277799ccaSWu Mianzhi where
11377799ccaSWu Mianzhi F: FnOnce(&mut [u8]) -> R,
11477799ccaSWu Mianzhi {
11577799ccaSWu Mianzhi let mut buffer = E1000EBuffer::new(4096);
11677799ccaSWu Mianzhi let result = f(buffer.as_mut_slice());
11777799ccaSWu Mianzhi let mut device = self.driver.inner.lock();
11877799ccaSWu Mianzhi device.e1000e_transmit(buffer);
1192f6f547aSGnoCiYeH buffer.free_buffer();
12077799ccaSWu Mianzhi return result;
12177799ccaSWu Mianzhi }
12277799ccaSWu Mianzhi }
12377799ccaSWu Mianzhi
12477799ccaSWu Mianzhi impl E1000EDriver {
125b5b571e0SLoGin #[allow(clippy::arc_with_non_send_sync)]
new(device: E1000EDevice) -> Self12677799ccaSWu Mianzhi pub fn new(device: E1000EDevice) -> Self {
127881ff6f9Syuyi2439 let mut iface_config = smoltcp::iface::Config::new(HardwareAddress::Ethernet(
12877799ccaSWu Mianzhi smoltcp::wire::EthernetAddress(device.mac_address()),
12977799ccaSWu Mianzhi ));
13077799ccaSWu Mianzhi
131881ff6f9Syuyi2439 iface_config.random_seed = rand() as u64;
132881ff6f9Syuyi2439
13377799ccaSWu Mianzhi let inner: Arc<SpinLock<E1000EDevice>> = Arc::new(SpinLock::new(device));
13477799ccaSWu Mianzhi let result = E1000EDriver { inner };
13577799ccaSWu Mianzhi return result;
13677799ccaSWu Mianzhi }
13777799ccaSWu Mianzhi }
13877799ccaSWu Mianzhi
13977799ccaSWu Mianzhi impl Clone for E1000EDriver {
clone(&self) -> Self14077799ccaSWu Mianzhi fn clone(&self) -> Self {
14177799ccaSWu Mianzhi return E1000EDriver {
14277799ccaSWu Mianzhi inner: self.inner.clone(),
14377799ccaSWu Mianzhi };
14477799ccaSWu Mianzhi }
14577799ccaSWu Mianzhi }
14677799ccaSWu Mianzhi
14777799ccaSWu Mianzhi impl phy::Device for E1000EDriver {
14877799ccaSWu Mianzhi type RxToken<'a> = E1000ERxToken;
14977799ccaSWu Mianzhi type TxToken<'a> = E1000ETxToken;
15077799ccaSWu Mianzhi
receive( &mut self, _timestamp: smoltcp::time::Instant, ) -> Option<(Self::RxToken<'_>, Self::TxToken<'_>)>15177799ccaSWu Mianzhi fn receive(
15277799ccaSWu Mianzhi &mut self,
15377799ccaSWu Mianzhi _timestamp: smoltcp::time::Instant,
15477799ccaSWu Mianzhi ) -> Option<(Self::RxToken<'_>, Self::TxToken<'_>)> {
15577799ccaSWu Mianzhi match self.inner.lock().e1000e_receive() {
15677799ccaSWu Mianzhi Some(buffer) => Some((
15777799ccaSWu Mianzhi E1000ERxToken(buffer),
15877799ccaSWu Mianzhi E1000ETxToken {
15977799ccaSWu Mianzhi driver: self.clone(),
16077799ccaSWu Mianzhi },
16177799ccaSWu Mianzhi )),
16277799ccaSWu Mianzhi None => {
16377799ccaSWu Mianzhi return None;
16477799ccaSWu Mianzhi }
16577799ccaSWu Mianzhi }
16677799ccaSWu Mianzhi }
16777799ccaSWu Mianzhi
transmit(&mut self, _timestamp: smoltcp::time::Instant) -> Option<Self::TxToken<'_>>16877799ccaSWu Mianzhi fn transmit(&mut self, _timestamp: smoltcp::time::Instant) -> Option<Self::TxToken<'_>> {
16977799ccaSWu Mianzhi match self.inner.lock().e1000e_can_transmit() {
17077799ccaSWu Mianzhi true => Some(E1000ETxToken {
17177799ccaSWu Mianzhi driver: self.clone(),
17277799ccaSWu Mianzhi }),
17377799ccaSWu Mianzhi false => None,
17477799ccaSWu Mianzhi }
17577799ccaSWu Mianzhi }
17677799ccaSWu Mianzhi
capabilities(&self) -> smoltcp::phy::DeviceCapabilities17777799ccaSWu Mianzhi fn capabilities(&self) -> smoltcp::phy::DeviceCapabilities {
17877799ccaSWu Mianzhi let mut caps = smoltcp::phy::DeviceCapabilities::default();
17977799ccaSWu Mianzhi // 网卡的最大传输单元. 请与IP层的MTU进行区分。这个值应当是网卡的最大传输单元,而不是IP层的MTU。
18077799ccaSWu Mianzhi // The maximum size of the received packet is limited by the 82574 hardware to 1536 bytes. Packets larger then 1536 bytes are silently discarded. Any packet smaller than 1536 bytes is processed by the 82574.
18177799ccaSWu Mianzhi // 82574l manual pp205
18277799ccaSWu Mianzhi caps.max_transmission_unit = 1536;
18377799ccaSWu Mianzhi /*
18477799ccaSWu Mianzhi Maximum burst size, in terms of MTU.
18577799ccaSWu Mianzhi The network device is unable to send or receive bursts large than the value returned by this function.
18677799ccaSWu Mianzhi If None, there is no fixed limit on burst size, e.g. if network buffers are dynamically allocated.
18777799ccaSWu Mianzhi */
18877799ccaSWu Mianzhi caps.max_burst_size = Some(1);
18977799ccaSWu Mianzhi return caps;
19077799ccaSWu Mianzhi }
19177799ccaSWu Mianzhi }
19277799ccaSWu Mianzhi
19377799ccaSWu Mianzhi impl E1000EInterface {
new(mut driver: E1000EDriver) -> Arc<Self>19477799ccaSWu Mianzhi pub fn new(mut driver: E1000EDriver) -> Arc<Self> {
19577799ccaSWu Mianzhi let iface_id = generate_iface_id();
196881ff6f9Syuyi2439 let mut iface_config = smoltcp::iface::Config::new(HardwareAddress::Ethernet(
19777799ccaSWu Mianzhi smoltcp::wire::EthernetAddress(driver.inner.lock().mac_address()),
19877799ccaSWu Mianzhi ));
199881ff6f9Syuyi2439 iface_config.random_seed = rand() as u64;
200881ff6f9Syuyi2439
201881ff6f9Syuyi2439 let iface =
202881ff6f9Syuyi2439 smoltcp::iface::Interface::new(iface_config, &mut driver, Instant::now().into());
20377799ccaSWu Mianzhi
20477799ccaSWu Mianzhi let driver: E1000EDriverWrapper = E1000EDriverWrapper(UnsafeCell::new(driver));
20577799ccaSWu Mianzhi let result = Arc::new(E1000EInterface {
20677799ccaSWu Mianzhi driver,
20777799ccaSWu Mianzhi iface_id,
20877799ccaSWu Mianzhi iface: SpinLock::new(iface),
20977799ccaSWu Mianzhi name: format!("eth{}", iface_id),
210*28fe4ad2S黄铭涛 inner: SpinLock::new(InnerE1000EInterface {
211*28fe4ad2S黄铭涛 netdevice_common: NetDeviceCommonData::default(),
212*28fe4ad2S黄铭涛 device_common: DeviceCommonData::default(),
213*28fe4ad2S黄铭涛 kobj_common: KObjectCommonData::default(),
214*28fe4ad2S黄铭涛 }),
215*28fe4ad2S黄铭涛 locked_kobj_state: LockedKObjectState::default(),
21677799ccaSWu Mianzhi });
21777799ccaSWu Mianzhi
21877799ccaSWu Mianzhi return result;
21977799ccaSWu Mianzhi }
220*28fe4ad2S黄铭涛
inner(&self) -> SpinLockGuard<InnerE1000EInterface>221*28fe4ad2S黄铭涛 pub fn inner(&self) -> SpinLockGuard<InnerE1000EInterface> {
222*28fe4ad2S黄铭涛 return self.inner.lock();
223*28fe4ad2S黄铭涛 }
22477799ccaSWu Mianzhi }
22577799ccaSWu Mianzhi
22677799ccaSWu Mianzhi impl Debug for E1000EInterface {
fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result22777799ccaSWu Mianzhi fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
22877799ccaSWu Mianzhi f.debug_struct("E1000EInterface")
22977799ccaSWu Mianzhi .field("iface_id", &self.iface_id)
23077799ccaSWu Mianzhi .field("iface", &"smoltcp::iface::Interface")
23177799ccaSWu Mianzhi .field("name", &self.name)
23277799ccaSWu Mianzhi .finish()
23377799ccaSWu Mianzhi }
23477799ccaSWu Mianzhi }
23577799ccaSWu Mianzhi
236e32effb1SLoGin impl Device for E1000EInterface {
dev_type(&self) -> DeviceType237e32effb1SLoGin fn dev_type(&self) -> DeviceType {
238*28fe4ad2S黄铭涛 DeviceType::Net
23977799ccaSWu Mianzhi }
24077799ccaSWu Mianzhi
id_table(&self) -> IdTable241e32effb1SLoGin fn id_table(&self) -> IdTable {
242*28fe4ad2S黄铭涛 IdTable::new(DEVICE_NAME.to_string(), None)
24377799ccaSWu Mianzhi }
24477799ccaSWu Mianzhi
bus(&self) -> Option<Weak<dyn Bus>>245*28fe4ad2S黄铭涛 fn bus(&self) -> Option<Weak<dyn Bus>> {
246*28fe4ad2S黄铭涛 self.inner().device_common.bus.clone()
24777799ccaSWu Mianzhi }
248e32effb1SLoGin
set_bus(&self, bus: Option<Weak<dyn Bus>>)249*28fe4ad2S黄铭涛 fn set_bus(&self, bus: Option<Weak<dyn Bus>>) {
250*28fe4ad2S黄铭涛 self.inner().device_common.bus = bus;
251*28fe4ad2S黄铭涛 }
252*28fe4ad2S黄铭涛
class(&self) -> Option<Arc<dyn Class>>253*28fe4ad2S黄铭涛 fn class(&self) -> Option<Arc<dyn Class>> {
254*28fe4ad2S黄铭涛 let mut guard = self.inner();
255*28fe4ad2S黄铭涛 let r = guard.device_common.class.clone()?.upgrade();
256*28fe4ad2S黄铭涛 if r.is_none() {
257*28fe4ad2S黄铭涛 guard.device_common.class = None;
258*28fe4ad2S黄铭涛 }
259*28fe4ad2S黄铭涛
260*28fe4ad2S黄铭涛 return r;
261*28fe4ad2S黄铭涛 }
262*28fe4ad2S黄铭涛
set_class(&self, class: Option<Weak<dyn Class>>)263*28fe4ad2S黄铭涛 fn set_class(&self, class: Option<Weak<dyn Class>>) {
264*28fe4ad2S黄铭涛 self.inner().device_common.class = class;
26577799ccaSWu Mianzhi }
26677799ccaSWu Mianzhi
driver(&self) -> Option<Arc<dyn Driver>>267e32effb1SLoGin fn driver(&self) -> Option<Arc<dyn Driver>> {
268*28fe4ad2S黄铭涛 let r = self.inner().device_common.driver.clone()?.upgrade();
269*28fe4ad2S黄铭涛 if r.is_none() {
270*28fe4ad2S黄铭涛 self.inner().device_common.driver = None;
271e32effb1SLoGin }
272e32effb1SLoGin
273*28fe4ad2S黄铭涛 return r;
274*28fe4ad2S黄铭涛 }
275*28fe4ad2S黄铭涛
set_driver(&self, driver: Option<Weak<dyn Driver>>)276*28fe4ad2S黄铭涛 fn set_driver(&self, driver: Option<Weak<dyn Driver>>) {
277*28fe4ad2S黄铭涛 self.inner().device_common.driver = driver;
278e32effb1SLoGin }
279e32effb1SLoGin
is_dead(&self) -> bool280e32effb1SLoGin fn is_dead(&self) -> bool {
281*28fe4ad2S黄铭涛 false
282e32effb1SLoGin }
283e32effb1SLoGin
can_match(&self) -> bool284e32effb1SLoGin fn can_match(&self) -> bool {
285*28fe4ad2S黄铭涛 self.inner().device_common.can_match
286e32effb1SLoGin }
287e32effb1SLoGin
set_can_match(&self, can_match: bool)288*28fe4ad2S黄铭涛 fn set_can_match(&self, can_match: bool) {
289*28fe4ad2S黄铭涛 self.inner().device_common.can_match = can_match;
290e32effb1SLoGin }
291e32effb1SLoGin
state_synced(&self) -> bool292e32effb1SLoGin fn state_synced(&self) -> bool {
293*28fe4ad2S黄铭涛 true
294*28fe4ad2S黄铭涛 }
295*28fe4ad2S黄铭涛
dev_parent(&self) -> Option<Weak<dyn Device>>296*28fe4ad2S黄铭涛 fn dev_parent(&self) -> Option<Weak<dyn Device>> {
297*28fe4ad2S黄铭涛 self.inner().device_common.get_parent_weak_or_clear()
298*28fe4ad2S黄铭涛 }
299*28fe4ad2S黄铭涛
set_dev_parent(&self, parent: Option<Weak<dyn Device>>)300*28fe4ad2S黄铭涛 fn set_dev_parent(&self, parent: Option<Weak<dyn Device>>) {
301*28fe4ad2S黄铭涛 self.inner().device_common.parent = parent;
302e32effb1SLoGin }
303e32effb1SLoGin }
304e32effb1SLoGin
305e32effb1SLoGin impl NetDevice for E1000EInterface {
mac(&self) -> smoltcp::wire::EthernetAddress30677799ccaSWu Mianzhi fn mac(&self) -> smoltcp::wire::EthernetAddress {
30777799ccaSWu Mianzhi let mac = self.driver.inner.lock().mac_address();
30877799ccaSWu Mianzhi return smoltcp::wire::EthernetAddress::from_bytes(&mac);
30977799ccaSWu Mianzhi }
31077799ccaSWu Mianzhi
31177799ccaSWu Mianzhi #[inline]
nic_id(&self) -> usize31277799ccaSWu Mianzhi fn nic_id(&self) -> usize {
31377799ccaSWu Mianzhi return self.iface_id;
31477799ccaSWu Mianzhi }
31577799ccaSWu Mianzhi
31677799ccaSWu Mianzhi #[inline]
iface_name(&self) -> String317*28fe4ad2S黄铭涛 fn iface_name(&self) -> String {
31877799ccaSWu Mianzhi return self.name.clone();
31977799ccaSWu Mianzhi }
32077799ccaSWu Mianzhi
update_ip_addrs(&self, ip_addrs: &[wire::IpCidr]) -> Result<(), SystemError>32177799ccaSWu Mianzhi fn update_ip_addrs(&self, ip_addrs: &[wire::IpCidr]) -> Result<(), SystemError> {
32277799ccaSWu Mianzhi if ip_addrs.len() != 1 {
32377799ccaSWu Mianzhi return Err(SystemError::EINVAL);
32477799ccaSWu Mianzhi }
32577799ccaSWu Mianzhi
32677799ccaSWu Mianzhi self.iface.lock().update_ip_addrs(|addrs| {
32777799ccaSWu Mianzhi let dest = addrs.iter_mut().next();
328b5b571e0SLoGin
329b5b571e0SLoGin if let Some(dest) = dest {
33077799ccaSWu Mianzhi *dest = ip_addrs[0];
331b5b571e0SLoGin } else {
332b5b571e0SLoGin addrs.push(ip_addrs[0]).expect("Push ipCidr failed: full");
33377799ccaSWu Mianzhi }
33477799ccaSWu Mianzhi });
33577799ccaSWu Mianzhi return Ok(());
33677799ccaSWu Mianzhi }
33777799ccaSWu Mianzhi
poll(&self, sockets: &mut smoltcp::iface::SocketSet) -> Result<(), SystemError>33891e9d4abSLoGin fn poll(&self, sockets: &mut smoltcp::iface::SocketSet) -> Result<(), SystemError> {
33977799ccaSWu Mianzhi let timestamp: smoltcp::time::Instant = Instant::now().into();
34077799ccaSWu Mianzhi let mut guard = self.iface.lock();
34177799ccaSWu Mianzhi let poll_res = guard.poll(timestamp, self.driver.force_get_mut(), sockets);
34277799ccaSWu Mianzhi if poll_res {
34377799ccaSWu Mianzhi return Ok(());
34477799ccaSWu Mianzhi }
34577799ccaSWu Mianzhi return Err(SystemError::EAGAIN_OR_EWOULDBLOCK);
34677799ccaSWu Mianzhi }
34777799ccaSWu Mianzhi
34877799ccaSWu Mianzhi #[inline(always)]
inner_iface(&self) -> &SpinLock<smoltcp::iface::Interface>34977799ccaSWu Mianzhi fn inner_iface(&self) -> &SpinLock<smoltcp::iface::Interface> {
35077799ccaSWu Mianzhi return &self.iface;
35177799ccaSWu Mianzhi }
352*28fe4ad2S黄铭涛
addr_assign_type(&self) -> u8353*28fe4ad2S黄铭涛 fn addr_assign_type(&self) -> u8 {
354*28fe4ad2S黄铭涛 return self.inner().netdevice_common.addr_assign_type;
355*28fe4ad2S黄铭涛 }
356*28fe4ad2S黄铭涛
net_device_type(&self) -> u16357*28fe4ad2S黄铭涛 fn net_device_type(&self) -> u16 {
358*28fe4ad2S黄铭涛 self.inner().netdevice_common.net_device_type = 1; // 以太网设备
359*28fe4ad2S黄铭涛 return self.inner().netdevice_common.net_device_type;
360*28fe4ad2S黄铭涛 }
361*28fe4ad2S黄铭涛
net_state(&self) -> NetDeivceState362*28fe4ad2S黄铭涛 fn net_state(&self) -> NetDeivceState {
363*28fe4ad2S黄铭涛 return self.inner().netdevice_common.state;
364*28fe4ad2S黄铭涛 }
365*28fe4ad2S黄铭涛
set_net_state(&self, state: NetDeivceState)366*28fe4ad2S黄铭涛 fn set_net_state(&self, state: NetDeivceState) {
367*28fe4ad2S黄铭涛 self.inner().netdevice_common.state |= state;
368*28fe4ad2S黄铭涛 }
369*28fe4ad2S黄铭涛
operstate(&self) -> Operstate370*28fe4ad2S黄铭涛 fn operstate(&self) -> Operstate {
371*28fe4ad2S黄铭涛 return self.inner().netdevice_common.operstate;
372*28fe4ad2S黄铭涛 }
373*28fe4ad2S黄铭涛
set_operstate(&self, state: Operstate)374*28fe4ad2S黄铭涛 fn set_operstate(&self, state: Operstate) {
375*28fe4ad2S黄铭涛 self.inner().netdevice_common.operstate = state;
376*28fe4ad2S黄铭涛 }
37777799ccaSWu Mianzhi }
37877799ccaSWu Mianzhi
37977799ccaSWu Mianzhi impl KObject for E1000EInterface {
as_any_ref(&self) -> &dyn core::any::Any38077799ccaSWu Mianzhi fn as_any_ref(&self) -> &dyn core::any::Any {
38177799ccaSWu Mianzhi self
38277799ccaSWu Mianzhi }
38377799ccaSWu Mianzhi
set_inode(&self, inode: Option<Arc<crate::filesystem::kernfs::KernFSInode>>)384*28fe4ad2S黄铭涛 fn set_inode(&self, inode: Option<Arc<crate::filesystem::kernfs::KernFSInode>>) {
385*28fe4ad2S黄铭涛 self.inner().kobj_common.kern_inode = inode;
38677799ccaSWu Mianzhi }
38777799ccaSWu Mianzhi
inode(&self) -> Option<Arc<crate::filesystem::kernfs::KernFSInode>>38877799ccaSWu Mianzhi fn inode(&self) -> Option<Arc<crate::filesystem::kernfs::KernFSInode>> {
389*28fe4ad2S黄铭涛 self.inner().kobj_common.kern_inode.clone()
39077799ccaSWu Mianzhi }
39177799ccaSWu Mianzhi
parent(&self) -> Option<alloc::sync::Weak<dyn KObject>>39277799ccaSWu Mianzhi fn parent(&self) -> Option<alloc::sync::Weak<dyn KObject>> {
393*28fe4ad2S黄铭涛 self.inner().kobj_common.parent.clone()
39477799ccaSWu Mianzhi }
39577799ccaSWu Mianzhi
set_parent(&self, parent: Option<alloc::sync::Weak<dyn KObject>>)396*28fe4ad2S黄铭涛 fn set_parent(&self, parent: Option<alloc::sync::Weak<dyn KObject>>) {
397*28fe4ad2S黄铭涛 self.inner().kobj_common.parent = parent;
39877799ccaSWu Mianzhi }
39977799ccaSWu Mianzhi
kset(&self) -> Option<Arc<crate::driver::base::kset::KSet>>40077799ccaSWu Mianzhi fn kset(&self) -> Option<Arc<crate::driver::base::kset::KSet>> {
401*28fe4ad2S黄铭涛 self.inner().kobj_common.kset.clone()
40277799ccaSWu Mianzhi }
40377799ccaSWu Mianzhi
set_kset(&self, kset: Option<Arc<crate::driver::base::kset::KSet>>)404*28fe4ad2S黄铭涛 fn set_kset(&self, kset: Option<Arc<crate::driver::base::kset::KSet>>) {
405*28fe4ad2S黄铭涛 self.inner().kobj_common.kset = kset;
40677799ccaSWu Mianzhi }
40777799ccaSWu Mianzhi
kobj_type(&self) -> Option<&'static dyn crate::driver::base::kobject::KObjType>40877799ccaSWu Mianzhi fn kobj_type(&self) -> Option<&'static dyn crate::driver::base::kobject::KObjType> {
409*28fe4ad2S黄铭涛 self.inner().kobj_common.kobj_type
41077799ccaSWu Mianzhi }
41177799ccaSWu Mianzhi
name(&self) -> String41277799ccaSWu Mianzhi fn name(&self) -> String {
41377799ccaSWu Mianzhi self.name.clone()
41477799ccaSWu Mianzhi }
41577799ccaSWu Mianzhi
set_name(&self, _name: String)41677799ccaSWu Mianzhi fn set_name(&self, _name: String) {
417*28fe4ad2S黄铭涛 // do nothing
41877799ccaSWu Mianzhi }
41977799ccaSWu Mianzhi
kobj_state(&self) -> RwLockReadGuard<KObjectState>420*28fe4ad2S黄铭涛 fn kobj_state(&self) -> RwLockReadGuard<KObjectState> {
421*28fe4ad2S黄铭涛 self.locked_kobj_state.read()
42277799ccaSWu Mianzhi }
42377799ccaSWu Mianzhi
kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState>424*28fe4ad2S黄铭涛 fn kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState> {
425*28fe4ad2S黄铭涛 self.locked_kobj_state.write()
42677799ccaSWu Mianzhi }
42777799ccaSWu Mianzhi
set_kobj_state(&self, state: KObjectState)428*28fe4ad2S黄铭涛 fn set_kobj_state(&self, state: KObjectState) {
429*28fe4ad2S黄铭涛 *self.locked_kobj_state.write() = state;
43077799ccaSWu Mianzhi }
43177799ccaSWu Mianzhi
set_kobj_type(&self, ktype: Option<&'static dyn KObjType>)432*28fe4ad2S黄铭涛 fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) {
433*28fe4ad2S黄铭涛 self.inner().kobj_common.kobj_type = ktype;
43477799ccaSWu Mianzhi }
43577799ccaSWu Mianzhi }
43677799ccaSWu Mianzhi
e1000e_driver_init(device: E1000EDevice)43777799ccaSWu Mianzhi pub fn e1000e_driver_init(device: E1000EDevice) {
43877799ccaSWu Mianzhi let mac = smoltcp::wire::EthernetAddress::from_bytes(&device.mac_address());
43977799ccaSWu Mianzhi let driver = E1000EDriver::new(device);
44077799ccaSWu Mianzhi let iface = E1000EInterface::new(driver);
441*28fe4ad2S黄铭涛 // 标识网络设备已经启动
442*28fe4ad2S黄铭涛 iface.set_net_state(NetDeivceState::__LINK_STATE_START);
443*28fe4ad2S黄铭涛
44477799ccaSWu Mianzhi // 将网卡的接口信息注册到全局的网卡接口信息表中
445e32effb1SLoGin NET_DEVICES
4460d6cf65aSLoGin .write_irqsave()
4470d6cf65aSLoGin .insert(iface.nic_id(), iface.clone());
4482eab6dd7S曾俊 info!("e1000e driver init successfully!\tMAC: [{}]", mac);
449*28fe4ad2S黄铭涛
450*28fe4ad2S黄铭涛 register_netdevice(iface.clone()).expect("register lo device failed");
45177799ccaSWu Mianzhi }
452