mod.rs 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. use alloc::{fmt, vec::Vec};
  2. use alloc::{string::String, sync::Arc};
  3. use sysfs::netdev_register_kobject;
  4. use crate::{
  5. libs::{rwlock::RwLock, spinlock::SpinLock},
  6. net::socket::inet::{common::PortManager, InetSocket},
  7. process::ProcessState,
  8. };
  9. use smoltcp;
  10. use system_error::SystemError;
  11. pub mod class;
  12. mod dma;
  13. pub mod e1000e;
  14. pub mod irq_handle;
  15. pub mod loopback;
  16. pub mod sysfs;
  17. pub mod virtio_net;
  18. bitflags! {
  19. pub struct NetDeivceState: u16 {
  20. /// 表示网络设备已经启动
  21. const __LINK_STATE_START = 1 << 0;
  22. /// 表示网络设备在系统中存在,即注册到sysfs中
  23. const __LINK_STATE_PRESENT = 1 << 1;
  24. /// 表示网络设备没有检测到载波信号
  25. const __LINK_STATE_NOCARRIER = 1 << 2;
  26. /// 表示设备的链路监视操作处于挂起状态
  27. const __LINK_STATE_LINKWATCH_PENDING = 1 << 3;
  28. /// 表示设备处于休眠状态
  29. const __LINK_STATE_DORMANT = 1 << 4;
  30. }
  31. }
  32. #[derive(Debug, Copy, Clone)]
  33. #[allow(dead_code, non_camel_case_types)]
  34. pub enum Operstate {
  35. /// 网络接口的状态未知
  36. IF_OPER_UNKNOWN = 0,
  37. /// 网络接口不存在
  38. IF_OPER_NOTPRESENT = 1,
  39. /// 网络接口已禁用或未连接
  40. IF_OPER_DOWN = 2,
  41. /// 网络接口的下层接口已关闭
  42. IF_OPER_LOWERLAYERDOWN = 3,
  43. /// 网络接口正在测试
  44. IF_OPER_TESTING = 4,
  45. /// 网络接口处于休眠状态
  46. IF_OPER_DORMANT = 5,
  47. /// 网络接口已启用
  48. IF_OPER_UP = 6,
  49. }
  50. #[allow(dead_code)]
  51. pub trait Iface: crate::driver::base::device::Device {
  52. /// # `common`
  53. /// 获取网卡的公共信息
  54. fn common(&self) -> &IfaceCommon;
  55. /// # `mac`
  56. /// 获取网卡的MAC地址
  57. fn mac(&self) -> smoltcp::wire::EthernetAddress;
  58. /// # `name`
  59. /// 获取网卡名
  60. fn iface_name(&self) -> String;
  61. /// # `nic_id`
  62. /// 获取网卡id
  63. fn nic_id(&self) -> usize {
  64. self.common().iface_id
  65. }
  66. /// # `poll`
  67. /// 用于轮询接口的状态。
  68. /// ## 参数
  69. /// - `sockets` :一个可变引用到 `smoltcp::iface::SocketSet`,表示要轮询的套接字集
  70. /// ## 返回值
  71. /// - 成功返回 `Ok(())`
  72. /// - 如果轮询失败,返回 `Err(SystemError::EAGAIN_OR_EWOULDBLOCK)`,表示需要再次尝试或者操作会阻塞
  73. fn poll(&self);
  74. /// # `update_ip_addrs`
  75. /// 用于更新接口的 IP 地址
  76. /// ## 参数
  77. /// - `ip_addrs` :一个包含 `smoltcp::wire::IpCidr` 的切片,表示要设置的 IP 地址和子网掩码
  78. /// ## 返回值
  79. /// - 如果 `ip_addrs` 的长度不为 1,返回 `Err(SystemError::EINVAL)`,表示输入参数无效
  80. fn update_ip_addrs(&self, ip_addrs: &[smoltcp::wire::IpCidr]) -> Result<(), SystemError> {
  81. self.common().update_ip_addrs(ip_addrs)
  82. }
  83. /// @brief 获取smoltcp的网卡接口类型
  84. #[inline(always)]
  85. fn smol_iface(&self) -> &SpinLock<smoltcp::iface::Interface> {
  86. &self.common().smol_iface
  87. }
  88. // fn as_any_ref(&'static self) -> &'static dyn core::any::Any;
  89. /// # `sockets`
  90. /// 获取网卡的套接字集
  91. fn sockets(&self) -> &SpinLock<smoltcp::iface::SocketSet<'static>> {
  92. &self.common().sockets
  93. }
  94. /// # `port_manager`
  95. /// 用于管理网卡的端口
  96. fn port_manager(&self) -> &PortManager {
  97. &self.common().port_manager
  98. }
  99. fn addr_assign_type(&self) -> u8;
  100. fn net_device_type(&self) -> u16;
  101. fn net_state(&self) -> NetDeivceState;
  102. fn set_net_state(&self, state: NetDeivceState);
  103. fn operstate(&self) -> Operstate;
  104. fn set_operstate(&self, state: Operstate);
  105. }
  106. /// 网络设备的公共数据
  107. #[derive(Debug)]
  108. pub struct NetDeviceCommonData {
  109. /// 表示网络接口的地址分配类型
  110. pub addr_assign_type: u8,
  111. /// 表示网络接口的类型
  112. pub net_device_type: u16,
  113. /// 表示网络接口的状态
  114. pub state: NetDeivceState,
  115. /// 表示网络接口的操作状态
  116. pub operstate: Operstate,
  117. }
  118. impl Default for NetDeviceCommonData {
  119. fn default() -> Self {
  120. Self {
  121. addr_assign_type: 0,
  122. net_device_type: 1,
  123. state: NetDeivceState::empty(),
  124. operstate: Operstate::IF_OPER_UNKNOWN,
  125. }
  126. }
  127. }
  128. /// 将网络设备注册到sysfs中
  129. /// 参考:https://code.dragonos.org.cn/xref/linux-2.6.39/net/core/dev.c?fi=register_netdev#5373
  130. fn register_netdevice(dev: Arc<dyn Iface>) -> Result<(), SystemError> {
  131. // 在sysfs中注册设备
  132. netdev_register_kobject(dev.clone())?;
  133. // 标识网络设备在系统中存在
  134. dev.set_net_state(NetDeivceState::__LINK_STATE_PRESENT);
  135. return Ok(());
  136. }
  137. pub struct IfaceCommon {
  138. iface_id: usize,
  139. smol_iface: SpinLock<smoltcp::iface::Interface>,
  140. /// 存smoltcp网卡的套接字集
  141. sockets: SpinLock<smoltcp::iface::SocketSet<'static>>,
  142. /// 存 kernel wrap smoltcp socket 的集合
  143. bounds: RwLock<Vec<Arc<dyn InetSocket>>>,
  144. /// 端口管理器
  145. port_manager: PortManager,
  146. /// 下次轮询的时间
  147. poll_at_ms: core::sync::atomic::AtomicU64,
  148. /// 默认网卡标识
  149. /// TODO: 此字段设置目的是解决对bind unspecified地址的分包问题,需要在inet实现多网卡监听或路由子系统实现后移除
  150. default_iface: bool,
  151. }
  152. impl fmt::Debug for IfaceCommon {
  153. fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
  154. f.debug_struct("IfaceCommon")
  155. .field("iface_id", &self.iface_id)
  156. .field("sockets", &self.sockets)
  157. .field("bounds", &self.bounds)
  158. .field("port_manager", &self.port_manager)
  159. .field("poll_at_ms", &self.poll_at_ms)
  160. .finish()
  161. }
  162. }
  163. impl IfaceCommon {
  164. pub fn new(iface_id: usize, default_iface: bool, iface: smoltcp::iface::Interface) -> Self {
  165. IfaceCommon {
  166. iface_id,
  167. smol_iface: SpinLock::new(iface),
  168. sockets: SpinLock::new(smoltcp::iface::SocketSet::new(Vec::new())),
  169. bounds: RwLock::new(Vec::new()),
  170. port_manager: PortManager::new(),
  171. poll_at_ms: core::sync::atomic::AtomicU64::new(0),
  172. default_iface,
  173. }
  174. }
  175. pub fn poll<D>(&self, device: &mut D)
  176. where
  177. D: smoltcp::phy::Device + ?Sized,
  178. {
  179. let timestamp = crate::time::Instant::now().into();
  180. let mut sockets = self.sockets.lock_irqsave();
  181. let mut interface = self.smol_iface.lock_irqsave();
  182. let (has_events, poll_at) = {
  183. (
  184. matches!(
  185. interface.poll(timestamp, device, &mut sockets),
  186. smoltcp::iface::PollResult::SocketStateChanged
  187. ),
  188. loop {
  189. let poll_at = interface.poll_at(timestamp, &sockets);
  190. let Some(instant) = poll_at else {
  191. break poll_at;
  192. };
  193. if instant > timestamp {
  194. break poll_at;
  195. }
  196. },
  197. )
  198. };
  199. // drop sockets here to avoid deadlock
  200. drop(interface);
  201. drop(sockets);
  202. use core::sync::atomic::Ordering;
  203. if let Some(instant) = poll_at {
  204. let _old_instant = self.poll_at_ms.load(Ordering::Relaxed);
  205. let new_instant = instant.total_millis() as u64;
  206. self.poll_at_ms.store(new_instant, Ordering::Relaxed);
  207. // TODO: poll at
  208. // if old_instant == 0 || new_instant < old_instant {
  209. // self.polling_wait_queue.wake_all();
  210. // }
  211. } else {
  212. self.poll_at_ms.store(0, Ordering::Relaxed);
  213. }
  214. self.bounds.read().iter().for_each(|bound_socket| {
  215. // incase our inet socket missed the event, we manually notify it each time we poll
  216. bound_socket.on_iface_events();
  217. if has_events {
  218. bound_socket
  219. .wait_queue()
  220. .wakeup(Some(ProcessState::Blocked(true)));
  221. }
  222. });
  223. // TODO: remove closed sockets
  224. // let closed_sockets = self
  225. // .closing_sockets
  226. // .lock_irq_disabled()
  227. // .extract_if(|closing_socket| closing_socket.is_closed())
  228. // .collect::<Vec<_>>();
  229. // drop(closed_sockets);
  230. }
  231. pub fn update_ip_addrs(&self, ip_addrs: &[smoltcp::wire::IpCidr]) -> Result<(), SystemError> {
  232. if ip_addrs.len() != 1 {
  233. return Err(SystemError::EINVAL);
  234. }
  235. self.smol_iface.lock().update_ip_addrs(|addrs| {
  236. let dest = addrs.iter_mut().next();
  237. if let Some(dest) = dest {
  238. *dest = ip_addrs[0];
  239. } else {
  240. addrs.push(ip_addrs[0]).expect("Push ipCidr failed: full");
  241. }
  242. });
  243. return Ok(());
  244. }
  245. // 需要bounds储存具体的Inet Socket信息,以提供不同种类inet socket的事件分发
  246. pub fn bind_socket(&self, socket: Arc<dyn InetSocket>) {
  247. self.bounds.write().push(socket);
  248. }
  249. // TODO: 需要在inet实现多网卡监听或路由子系统实现后移除
  250. pub fn is_default_iface(&self) -> bool {
  251. self.default_iface
  252. }
  253. }