1cde5492fSlogin use alloc::{boxed::Box, collections::BTreeMap, sync::Arc}; 22eab6dd7S曾俊 use log::{debug, info, warn}; 35e948c56SGnoCiYeH use smoltcp::{socket::dhcpv4, wire}; 491e9d4abSLoGin use system_error::SystemError; 513776c11Slogin 6cde5492fSlogin use crate::{ 7e32effb1SLoGin driver::net::NetDevice, 8cde5492fSlogin libs::rwlock::RwLockReadGuard, 9e32effb1SLoGin net::{socket::SocketPollMethod, NET_DEVICES}, 10cde5492fSlogin time::timer::{next_n_ms_timer_jiffies, Timer, TimerFunction}, 11cde5492fSlogin }; 12cde5492fSlogin 1340609970SGnoCiYeH use super::{ 145e948c56SGnoCiYeH event_poll::{EPollEventType, EventPoll}, 15d623e902SGnoCiYeH socket::{handle::GlobalSocketHandle, inet::TcpSocket, HANDLE_MAP, SOCKET_SET}, 1640609970SGnoCiYeH }; 17cde5492fSlogin 18cde5492fSlogin /// The network poll function, which will be called by timer. 19cde5492fSlogin /// 20cde5492fSlogin /// The main purpose of this function is to poll all network interfaces. 2136fd0130Shoumkh #[derive(Debug)] 2236fd0130Shoumkh struct NetWorkPollFunc; 2336fd0130Shoumkh 24cde5492fSlogin impl TimerFunction for NetWorkPollFunc { 2536fd0130Shoumkh fn run(&mut self) -> Result<(), SystemError> { 26cde5492fSlogin poll_ifaces_try_lock(10).ok(); 27cde5492fSlogin let next_time = next_n_ms_timer_jiffies(10); 2836fd0130Shoumkh let timer = Timer::new(Box::new(NetWorkPollFunc), next_time); 29cde5492fSlogin timer.activate(); 3036fd0130Shoumkh return Ok(()); 31cde5492fSlogin } 32cde5492fSlogin } 3313776c11Slogin 3413776c11Slogin pub fn net_init() -> Result<(), SystemError> { 3513776c11Slogin dhcp_query()?; 36cde5492fSlogin // Init poll timer function 370dd8ff43SYJwu2023 // let next_time = next_n_ms_timer_jiffies(5); 380dd8ff43SYJwu2023 // let timer = Timer::new(Box::new(NetWorkPollFunc), next_time); 390dd8ff43SYJwu2023 // timer.activate(); 4013776c11Slogin return Ok(()); 4113776c11Slogin } 420dd8ff43SYJwu2023 4313776c11Slogin fn dhcp_query() -> Result<(), SystemError> { 44e32effb1SLoGin let binding = NET_DEVICES.write_irqsave(); 4513776c11Slogin 46*1ea2daadSSMALLC //由于现在os未实现在用户态为网卡动态分配内存,而lo网卡的id最先分配且ip固定不能被分配 47*1ea2daadSSMALLC //所以特判取用id为1的网卡(也就是virto_net) 48*1ea2daadSSMALLC let net_face = binding.get(&1).ok_or(SystemError::ENODEV)?.clone(); 4913776c11Slogin 5013776c11Slogin drop(binding); 5113776c11Slogin 5213776c11Slogin // Create sockets 5313776c11Slogin let mut dhcp_socket = dhcpv4::Socket::new(); 5413776c11Slogin 5513776c11Slogin // Set a ridiculously short max lease time to show DHCP renews work properly. 5613776c11Slogin // This will cause the DHCP client to start renewing after 5 seconds, and give up the 5713776c11Slogin // lease after 10 seconds if renew hasn't succeeded. 5813776c11Slogin // IMPORTANT: This should be removed in production. 5913776c11Slogin dhcp_socket.set_max_lease_duration(Some(smoltcp::time::Duration::from_secs(10))); 6013776c11Slogin 610d6cf65aSLoGin let dhcp_handle = SOCKET_SET.lock_irqsave().add(dhcp_socket); 6213776c11Slogin 6313776c11Slogin const DHCP_TRY_ROUND: u8 = 10; 6413776c11Slogin for i in 0..DHCP_TRY_ROUND { 652eab6dd7S曾俊 debug!("DHCP try round: {}", i); 660d6cf65aSLoGin net_face.poll(&mut SOCKET_SET.lock_irqsave()).ok(); 670d6cf65aSLoGin let mut binding = SOCKET_SET.lock_irqsave(); 680dd8ff43SYJwu2023 let event = binding.get_mut::<dhcpv4::Socket>(dhcp_handle).poll(); 6913776c11Slogin 7013776c11Slogin match event { 7113776c11Slogin None => {} 7213776c11Slogin 7313776c11Slogin Some(dhcpv4::Event::Configured(config)) => { 742eab6dd7S曾俊 // debug!("Find Config!! {config:?}"); 752eab6dd7S曾俊 // debug!("Find ip address: {}", config.address); 762eab6dd7S曾俊 // debug!("iface.ip_addrs={:?}", net_face.inner_iface.ip_addrs()); 7713776c11Slogin 7813776c11Slogin net_face 7913776c11Slogin .update_ip_addrs(&[wire::IpCidr::Ipv4(config.address)]) 8013776c11Slogin .ok(); 8113776c11Slogin 8213776c11Slogin if let Some(router) = config.router { 8313776c11Slogin net_face 8413776c11Slogin .inner_iface() 8513776c11Slogin .lock() 8613776c11Slogin .routes_mut() 8713776c11Slogin .add_default_ipv4_route(router) 8813776c11Slogin .unwrap(); 8913776c11Slogin let cidr = net_face.inner_iface().lock().ip_addrs().first().cloned(); 90b5b571e0SLoGin if let Some(cidr) = cidr { 912eab6dd7S曾俊 info!("Successfully allocated ip by Dhcpv4! Ip:{}", cidr); 9213776c11Slogin return Ok(()); 9313776c11Slogin } 9413776c11Slogin } else { 9513776c11Slogin net_face 9613776c11Slogin .inner_iface() 9713776c11Slogin .lock() 9813776c11Slogin .routes_mut() 9913776c11Slogin .remove_default_ipv4_route(); 10013776c11Slogin } 10113776c11Slogin } 10213776c11Slogin 10313776c11Slogin Some(dhcpv4::Event::Deconfigured) => { 1042eab6dd7S曾俊 debug!("Dhcp v4 deconfigured"); 10513776c11Slogin net_face 10613776c11Slogin .update_ip_addrs(&[smoltcp::wire::IpCidr::Ipv4(wire::Ipv4Cidr::new( 10713776c11Slogin wire::Ipv4Address::UNSPECIFIED, 10813776c11Slogin 0, 10913776c11Slogin ))]) 11013776c11Slogin .ok(); 11113776c11Slogin net_face 11213776c11Slogin .inner_iface() 11313776c11Slogin .lock() 11413776c11Slogin .routes_mut() 11513776c11Slogin .remove_default_ipv4_route(); 11613776c11Slogin } 11713776c11Slogin } 11813776c11Slogin } 11913776c11Slogin 12013776c11Slogin return Err(SystemError::ETIMEDOUT); 12113776c11Slogin } 122cde5492fSlogin 123cde5492fSlogin pub fn poll_ifaces() { 124e32effb1SLoGin let guard: RwLockReadGuard<BTreeMap<usize, Arc<dyn NetDevice>>> = NET_DEVICES.read_irqsave(); 125cde5492fSlogin if guard.len() == 0 { 1262eab6dd7S曾俊 warn!("poll_ifaces: No net driver found!"); 127cde5492fSlogin return; 128cde5492fSlogin } 1290d6cf65aSLoGin let mut sockets = SOCKET_SET.lock_irqsave(); 130cde5492fSlogin for (_, iface) in guard.iter() { 131cde5492fSlogin iface.poll(&mut sockets).ok(); 132cde5492fSlogin } 13340609970SGnoCiYeH let _ = send_event(&sockets); 134cde5492fSlogin } 135cde5492fSlogin 136cde5492fSlogin /// 对ifaces进行轮询,最多对SOCKET_SET尝试times次加锁。 137cde5492fSlogin /// 138cde5492fSlogin /// @return 轮询成功,返回Ok(()) 139cde5492fSlogin /// @return 加锁超时,返回SystemError::EAGAIN_OR_EWOULDBLOCK 140cde5492fSlogin /// @return 没有网卡,返回SystemError::ENODEV 141cde5492fSlogin pub fn poll_ifaces_try_lock(times: u16) -> Result<(), SystemError> { 142cde5492fSlogin let mut i = 0; 143cde5492fSlogin while i < times { 144e32effb1SLoGin let guard: RwLockReadGuard<BTreeMap<usize, Arc<dyn NetDevice>>> = 145e32effb1SLoGin NET_DEVICES.read_irqsave(); 146cde5492fSlogin if guard.len() == 0 { 1472eab6dd7S曾俊 warn!("poll_ifaces: No net driver found!"); 148cde5492fSlogin // 没有网卡,返回错误 149cde5492fSlogin return Err(SystemError::ENODEV); 150cde5492fSlogin } 1510d6cf65aSLoGin let sockets = SOCKET_SET.try_lock_irqsave(); 152cde5492fSlogin // 加锁失败,继续尝试 153cde5492fSlogin if sockets.is_err() { 154cde5492fSlogin i += 1; 155cde5492fSlogin continue; 156cde5492fSlogin } 157cde5492fSlogin 158cde5492fSlogin let mut sockets = sockets.unwrap(); 159cde5492fSlogin for (_, iface) in guard.iter() { 160cde5492fSlogin iface.poll(&mut sockets).ok(); 161cde5492fSlogin } 1624ad52e57S裕依2439 send_event(&sockets)?; 163cde5492fSlogin return Ok(()); 164cde5492fSlogin } 165cde5492fSlogin // 尝试次数用完,返回错误 166cde5492fSlogin return Err(SystemError::EAGAIN_OR_EWOULDBLOCK); 167cde5492fSlogin } 1680dd8ff43SYJwu2023 169afc95d5cSYJwu2023 /// 对ifaces进行轮询,最多对SOCKET_SET尝试一次加锁。 1700dd8ff43SYJwu2023 /// 1710dd8ff43SYJwu2023 /// @return 轮询成功,返回Ok(()) 1720dd8ff43SYJwu2023 /// @return 加锁超时,返回SystemError::EAGAIN_OR_EWOULDBLOCK 1730dd8ff43SYJwu2023 /// @return 没有网卡,返回SystemError::ENODEV 1740dd8ff43SYJwu2023 pub fn poll_ifaces_try_lock_onetime() -> Result<(), SystemError> { 175e32effb1SLoGin let guard: RwLockReadGuard<BTreeMap<usize, Arc<dyn NetDevice>>> = NET_DEVICES.read_irqsave(); 1760dd8ff43SYJwu2023 if guard.len() == 0 { 1772eab6dd7S曾俊 warn!("poll_ifaces: No net driver found!"); 1780dd8ff43SYJwu2023 // 没有网卡,返回错误 1790dd8ff43SYJwu2023 return Err(SystemError::ENODEV); 1800dd8ff43SYJwu2023 } 1810d6cf65aSLoGin let mut sockets = SOCKET_SET.try_lock_irqsave()?; 1820dd8ff43SYJwu2023 for (_, iface) in guard.iter() { 1830dd8ff43SYJwu2023 iface.poll(&mut sockets).ok(); 1840dd8ff43SYJwu2023 } 18540609970SGnoCiYeH send_event(&sockets)?; 1860dd8ff43SYJwu2023 return Ok(()); 1870dd8ff43SYJwu2023 } 18840609970SGnoCiYeH 18940609970SGnoCiYeH /// ### 处理轮询后的事件 19040609970SGnoCiYeH fn send_event(sockets: &smoltcp::iface::SocketSet) -> Result<(), SystemError> { 19140609970SGnoCiYeH for (handle, socket_type) in sockets.iter() { 19240609970SGnoCiYeH let handle_guard = HANDLE_MAP.read_irqsave(); 193d623e902SGnoCiYeH let global_handle = GlobalSocketHandle::new_smoltcp_handle(handle); 194d623e902SGnoCiYeH let item = handle_guard.get(&global_handle); 19540609970SGnoCiYeH if item.is_none() { 19640609970SGnoCiYeH continue; 19740609970SGnoCiYeH } 19840609970SGnoCiYeH 19940609970SGnoCiYeH let handle_item = item.unwrap(); 20040609970SGnoCiYeH 20140609970SGnoCiYeH // 获取socket上的事件 20240609970SGnoCiYeH let mut events = 20340609970SGnoCiYeH SocketPollMethod::poll(socket_type, handle_item.shutdown_type()).bits() as u64; 20440609970SGnoCiYeH 20540609970SGnoCiYeH // 分发到相应类型socket处理 20640609970SGnoCiYeH match socket_type { 20740609970SGnoCiYeH smoltcp::socket::Socket::Raw(_) | smoltcp::socket::Socket::Udp(_) => { 20840609970SGnoCiYeH handle_guard 209d623e902SGnoCiYeH .get(&global_handle) 21040609970SGnoCiYeH .unwrap() 21140609970SGnoCiYeH .wait_queue 21240609970SGnoCiYeH .wakeup_any(events); 21340609970SGnoCiYeH } 21440609970SGnoCiYeH smoltcp::socket::Socket::Icmp(_) => unimplemented!("Icmp socket hasn't unimplemented"), 21540609970SGnoCiYeH smoltcp::socket::Socket::Tcp(inner_socket) => { 21640609970SGnoCiYeH if inner_socket.is_active() { 21740609970SGnoCiYeH events |= TcpSocket::CAN_ACCPET; 21840609970SGnoCiYeH } 21940609970SGnoCiYeH if inner_socket.state() == smoltcp::socket::tcp::State::Established { 22040609970SGnoCiYeH events |= TcpSocket::CAN_CONNECT; 22140609970SGnoCiYeH } 22237cef00bSSamuel Dai if inner_socket.state() == smoltcp::socket::tcp::State::CloseWait { 22337cef00bSSamuel Dai events |= EPollEventType::EPOLLHUP.bits() as u64; 22437cef00bSSamuel Dai } 22540609970SGnoCiYeH handle_guard 226d623e902SGnoCiYeH .get(&global_handle) 22740609970SGnoCiYeH .unwrap() 22840609970SGnoCiYeH .wait_queue 22940609970SGnoCiYeH .wakeup_any(events); 23040609970SGnoCiYeH } 23140609970SGnoCiYeH smoltcp::socket::Socket::Dhcpv4(_) => {} 23240609970SGnoCiYeH smoltcp::socket::Socket::Dns(_) => unimplemented!("Dns socket hasn't unimplemented"), 23340609970SGnoCiYeH } 2345e948c56SGnoCiYeH EventPoll::wakeup_epoll( 235b5b571e0SLoGin &handle_item.epitems, 2365e948c56SGnoCiYeH EPollEventType::from_bits_truncate(events as u32), 2375e948c56SGnoCiYeH )?; 23837cef00bSSamuel Dai drop(handle_guard); 2392eab6dd7S曾俊 // crate::debug!( 24040609970SGnoCiYeH // "{} send_event {:?}", 24140609970SGnoCiYeH // handle, 24240609970SGnoCiYeH // EPollEventType::from_bits_truncate(events as u32) 24340609970SGnoCiYeH // ); 24440609970SGnoCiYeH } 24540609970SGnoCiYeH Ok(()) 24640609970SGnoCiYeH } 247