1cde5492fSlogin use alloc::{boxed::Box, collections::BTreeMap, sync::Arc}; 213776c11Slogin use smoltcp::{socket::dhcpv4, wire}; 313776c11Slogin 4cde5492fSlogin use crate::{ 5cde5492fSlogin driver::net::NetDriver, 6cde5492fSlogin kdebug, kinfo, kwarn, 7cde5492fSlogin libs::rwlock::RwLockReadGuard, 8cde5492fSlogin net::NET_DRIVERS, 9cde5492fSlogin syscall::SystemError, 10cde5492fSlogin time::timer::{next_n_ms_timer_jiffies, Timer, TimerFunction}, 11cde5492fSlogin }; 12cde5492fSlogin 13cde5492fSlogin use super::socket::{SOCKET_SET, SOCKET_WAITQUEUE}; 14cde5492fSlogin 15cde5492fSlogin /// The network poll function, which will be called by timer. 16cde5492fSlogin /// 17cde5492fSlogin /// The main purpose of this function is to poll all network interfaces. 1836fd0130Shoumkh #[derive(Debug)] 1936fd0130Shoumkh struct NetWorkPollFunc; 2036fd0130Shoumkh 21cde5492fSlogin impl TimerFunction for NetWorkPollFunc { 2236fd0130Shoumkh fn run(&mut self) -> Result<(), SystemError> { 23cde5492fSlogin poll_ifaces_try_lock(10).ok(); 24cde5492fSlogin let next_time = next_n_ms_timer_jiffies(10); 2536fd0130Shoumkh let timer = Timer::new(Box::new(NetWorkPollFunc), next_time); 26cde5492fSlogin timer.activate(); 2736fd0130Shoumkh return Ok(()); 28cde5492fSlogin } 29cde5492fSlogin } 3013776c11Slogin 3113776c11Slogin pub fn net_init() -> Result<(), SystemError> { 3213776c11Slogin dhcp_query()?; 33cde5492fSlogin // Init poll timer function 340dd8ff43SYJwu2023 // let next_time = next_n_ms_timer_jiffies(5); 350dd8ff43SYJwu2023 // let timer = Timer::new(Box::new(NetWorkPollFunc), next_time); 360dd8ff43SYJwu2023 // timer.activate(); 3713776c11Slogin return Ok(()); 3813776c11Slogin } 390dd8ff43SYJwu2023 4013776c11Slogin fn dhcp_query() -> Result<(), SystemError> { 4113776c11Slogin let binding = NET_DRIVERS.write(); 4213776c11Slogin 43cde5492fSlogin let net_face = binding.get(&0).ok_or(SystemError::ENODEV)?.clone(); 4413776c11Slogin 4513776c11Slogin drop(binding); 4613776c11Slogin 4713776c11Slogin // Create sockets 4813776c11Slogin let mut dhcp_socket = dhcpv4::Socket::new(); 4913776c11Slogin 5013776c11Slogin // Set a ridiculously short max lease time to show DHCP renews work properly. 5113776c11Slogin // This will cause the DHCP client to start renewing after 5 seconds, and give up the 5213776c11Slogin // lease after 10 seconds if renew hasn't succeeded. 5313776c11Slogin // IMPORTANT: This should be removed in production. 5413776c11Slogin dhcp_socket.set_max_lease_duration(Some(smoltcp::time::Duration::from_secs(10))); 5513776c11Slogin 560dd8ff43SYJwu2023 let dhcp_handle = SOCKET_SET.lock().add(dhcp_socket); 5713776c11Slogin 5813776c11Slogin const DHCP_TRY_ROUND: u8 = 10; 5913776c11Slogin for i in 0..DHCP_TRY_ROUND { 6013776c11Slogin kdebug!("DHCP try round: {}", i); 610dd8ff43SYJwu2023 net_face.poll(&mut SOCKET_SET.lock()).ok(); 620dd8ff43SYJwu2023 let mut binding = SOCKET_SET.lock(); 630dd8ff43SYJwu2023 let event = binding.get_mut::<dhcpv4::Socket>(dhcp_handle).poll(); 6413776c11Slogin 6513776c11Slogin match event { 6613776c11Slogin None => {} 6713776c11Slogin 6813776c11Slogin Some(dhcpv4::Event::Configured(config)) => { 6913776c11Slogin // kdebug!("Find Config!! {config:?}"); 7013776c11Slogin // kdebug!("Find ip address: {}", config.address); 7113776c11Slogin // kdebug!("iface.ip_addrs={:?}", net_face.inner_iface.ip_addrs()); 7213776c11Slogin 7313776c11Slogin net_face 7413776c11Slogin .update_ip_addrs(&[wire::IpCidr::Ipv4(config.address)]) 7513776c11Slogin .ok(); 7613776c11Slogin 7713776c11Slogin if let Some(router) = config.router { 7813776c11Slogin net_face 7913776c11Slogin .inner_iface() 8013776c11Slogin .lock() 8113776c11Slogin .routes_mut() 8213776c11Slogin .add_default_ipv4_route(router) 8313776c11Slogin .unwrap(); 8413776c11Slogin let cidr = net_face.inner_iface().lock().ip_addrs().first().cloned(); 8513776c11Slogin if cidr.is_some() { 8613776c11Slogin let cidr = cidr.unwrap(); 8713776c11Slogin kinfo!("Successfully allocated ip by Dhcpv4! Ip:{}", cidr); 8813776c11Slogin return Ok(()); 8913776c11Slogin } 9013776c11Slogin } else { 9113776c11Slogin net_face 9213776c11Slogin .inner_iface() 9313776c11Slogin .lock() 9413776c11Slogin .routes_mut() 9513776c11Slogin .remove_default_ipv4_route(); 9613776c11Slogin } 9713776c11Slogin } 9813776c11Slogin 9913776c11Slogin Some(dhcpv4::Event::Deconfigured) => { 10013776c11Slogin kdebug!("Dhcp v4 deconfigured"); 10113776c11Slogin net_face 10213776c11Slogin .update_ip_addrs(&[smoltcp::wire::IpCidr::Ipv4(wire::Ipv4Cidr::new( 10313776c11Slogin wire::Ipv4Address::UNSPECIFIED, 10413776c11Slogin 0, 10513776c11Slogin ))]) 10613776c11Slogin .ok(); 10713776c11Slogin net_face 10813776c11Slogin .inner_iface() 10913776c11Slogin .lock() 11013776c11Slogin .routes_mut() 11113776c11Slogin .remove_default_ipv4_route(); 11213776c11Slogin } 11313776c11Slogin } 11413776c11Slogin } 11513776c11Slogin 11613776c11Slogin return Err(SystemError::ETIMEDOUT); 11713776c11Slogin } 118cde5492fSlogin 119cde5492fSlogin pub fn poll_ifaces() { 120cde5492fSlogin let guard: RwLockReadGuard<BTreeMap<usize, Arc<dyn NetDriver>>> = NET_DRIVERS.read(); 121cde5492fSlogin if guard.len() == 0 { 122cde5492fSlogin kwarn!("poll_ifaces: No net driver found!"); 123cde5492fSlogin return; 124cde5492fSlogin } 125cde5492fSlogin let mut sockets = SOCKET_SET.lock(); 126cde5492fSlogin for (_, iface) in guard.iter() { 127cde5492fSlogin iface.poll(&mut sockets).ok(); 128cde5492fSlogin } 1291496ba7bSLoGin SOCKET_WAITQUEUE.wakeup_all(None); 130cde5492fSlogin } 131cde5492fSlogin 132cde5492fSlogin /// 对ifaces进行轮询,最多对SOCKET_SET尝试times次加锁。 133cde5492fSlogin /// 134cde5492fSlogin /// @return 轮询成功,返回Ok(()) 135cde5492fSlogin /// @return 加锁超时,返回SystemError::EAGAIN_OR_EWOULDBLOCK 136cde5492fSlogin /// @return 没有网卡,返回SystemError::ENODEV 137cde5492fSlogin pub fn poll_ifaces_try_lock(times: u16) -> Result<(), SystemError> { 138cde5492fSlogin let mut i = 0; 139cde5492fSlogin while i < times { 140cde5492fSlogin let guard: RwLockReadGuard<BTreeMap<usize, Arc<dyn NetDriver>>> = NET_DRIVERS.read(); 141cde5492fSlogin if guard.len() == 0 { 142cde5492fSlogin kwarn!("poll_ifaces: No net driver found!"); 143cde5492fSlogin // 没有网卡,返回错误 144cde5492fSlogin return Err(SystemError::ENODEV); 145cde5492fSlogin } 146cde5492fSlogin let sockets = SOCKET_SET.try_lock(); 147cde5492fSlogin // 加锁失败,继续尝试 148cde5492fSlogin if sockets.is_err() { 149cde5492fSlogin i += 1; 150cde5492fSlogin continue; 151cde5492fSlogin } 152cde5492fSlogin 153cde5492fSlogin let mut sockets = sockets.unwrap(); 154cde5492fSlogin for (_, iface) in guard.iter() { 155cde5492fSlogin iface.poll(&mut sockets).ok(); 156cde5492fSlogin } 1571496ba7bSLoGin SOCKET_WAITQUEUE.wakeup_all(None); 158cde5492fSlogin return Ok(()); 159cde5492fSlogin } 160cde5492fSlogin 161cde5492fSlogin // 尝试次数用完,返回错误 162cde5492fSlogin return Err(SystemError::EAGAIN_OR_EWOULDBLOCK); 163cde5492fSlogin } 1640dd8ff43SYJwu2023 165*afc95d5cSYJwu2023 /// 对ifaces进行轮询,最多对SOCKET_SET尝试一次加锁。 1660dd8ff43SYJwu2023 /// 1670dd8ff43SYJwu2023 /// @return 轮询成功,返回Ok(()) 1680dd8ff43SYJwu2023 /// @return 加锁超时,返回SystemError::EAGAIN_OR_EWOULDBLOCK 1690dd8ff43SYJwu2023 /// @return 没有网卡,返回SystemError::ENODEV 1700dd8ff43SYJwu2023 pub fn poll_ifaces_try_lock_onetime() -> Result<(), SystemError> { 1710dd8ff43SYJwu2023 let guard: RwLockReadGuard<BTreeMap<usize, Arc<dyn NetDriver>>> = NET_DRIVERS.read(); 1720dd8ff43SYJwu2023 if guard.len() == 0 { 1730dd8ff43SYJwu2023 kwarn!("poll_ifaces: No net driver found!"); 1740dd8ff43SYJwu2023 // 没有网卡,返回错误 1750dd8ff43SYJwu2023 return Err(SystemError::ENODEV); 1760dd8ff43SYJwu2023 } 1770dd8ff43SYJwu2023 let mut sockets = SOCKET_SET.try_lock()?; 1780dd8ff43SYJwu2023 for (_, iface) in guard.iter() { 1790dd8ff43SYJwu2023 iface.poll(&mut sockets).ok(); 1800dd8ff43SYJwu2023 } 1810dd8ff43SYJwu2023 SOCKET_WAITQUEUE.wakeup_all(None); 1820dd8ff43SYJwu2023 return Ok(()); 1830dd8ff43SYJwu2023 } 184