1 use alloc::{boxed::Box, collections::BTreeMap, sync::Arc}; 2 use smoltcp::{socket::dhcpv4, wire}; 3 use system_error::SystemError; 4 5 use crate::{ 6 driver::net::NetDriver, 7 kdebug, kinfo, kwarn, 8 libs::rwlock::RwLockReadGuard, 9 net::{socket::SocketPollMethod, NET_DRIVERS}, 10 time::timer::{next_n_ms_timer_jiffies, Timer, TimerFunction}, 11 }; 12 13 use super::{ 14 event_poll::{EPollEventType, EventPoll}, 15 socket::{TcpSocket, HANDLE_MAP, SOCKET_SET}, 16 }; 17 18 /// The network poll function, which will be called by timer. 19 /// 20 /// The main purpose of this function is to poll all network interfaces. 21 #[derive(Debug)] 22 struct NetWorkPollFunc; 23 24 impl TimerFunction for NetWorkPollFunc { 25 fn run(&mut self) -> Result<(), SystemError> { 26 poll_ifaces_try_lock(10).ok(); 27 let next_time = next_n_ms_timer_jiffies(10); 28 let timer = Timer::new(Box::new(NetWorkPollFunc), next_time); 29 timer.activate(); 30 return Ok(()); 31 } 32 } 33 34 pub fn net_init() -> Result<(), SystemError> { 35 dhcp_query()?; 36 // Init poll timer function 37 // let next_time = next_n_ms_timer_jiffies(5); 38 // let timer = Timer::new(Box::new(NetWorkPollFunc), next_time); 39 // timer.activate(); 40 return Ok(()); 41 } 42 43 fn dhcp_query() -> Result<(), SystemError> { 44 let binding = NET_DRIVERS.write_irqsave(); 45 46 let net_face = binding.get(&0).ok_or(SystemError::ENODEV)?.clone(); 47 48 drop(binding); 49 50 // Create sockets 51 let mut dhcp_socket = dhcpv4::Socket::new(); 52 53 // Set a ridiculously short max lease time to show DHCP renews work properly. 54 // This will cause the DHCP client to start renewing after 5 seconds, and give up the 55 // lease after 10 seconds if renew hasn't succeeded. 56 // IMPORTANT: This should be removed in production. 57 dhcp_socket.set_max_lease_duration(Some(smoltcp::time::Duration::from_secs(10))); 58 59 let dhcp_handle = SOCKET_SET.lock_irqsave().add(dhcp_socket); 60 61 const DHCP_TRY_ROUND: u8 = 10; 62 for i in 0..DHCP_TRY_ROUND { 63 kdebug!("DHCP try round: {}", i); 64 net_face.poll(&mut SOCKET_SET.lock_irqsave()).ok(); 65 let mut binding = SOCKET_SET.lock_irqsave(); 66 let event = binding.get_mut::<dhcpv4::Socket>(dhcp_handle).poll(); 67 68 match event { 69 None => {} 70 71 Some(dhcpv4::Event::Configured(config)) => { 72 // kdebug!("Find Config!! {config:?}"); 73 // kdebug!("Find ip address: {}", config.address); 74 // kdebug!("iface.ip_addrs={:?}", net_face.inner_iface.ip_addrs()); 75 76 net_face 77 .update_ip_addrs(&[wire::IpCidr::Ipv4(config.address)]) 78 .ok(); 79 80 if let Some(router) = config.router { 81 net_face 82 .inner_iface() 83 .lock() 84 .routes_mut() 85 .add_default_ipv4_route(router) 86 .unwrap(); 87 let cidr = net_face.inner_iface().lock().ip_addrs().first().cloned(); 88 if cidr.is_some() { 89 let cidr = cidr.unwrap(); 90 kinfo!("Successfully allocated ip by Dhcpv4! Ip:{}", cidr); 91 return Ok(()); 92 } 93 } else { 94 net_face 95 .inner_iface() 96 .lock() 97 .routes_mut() 98 .remove_default_ipv4_route(); 99 } 100 } 101 102 Some(dhcpv4::Event::Deconfigured) => { 103 kdebug!("Dhcp v4 deconfigured"); 104 net_face 105 .update_ip_addrs(&[smoltcp::wire::IpCidr::Ipv4(wire::Ipv4Cidr::new( 106 wire::Ipv4Address::UNSPECIFIED, 107 0, 108 ))]) 109 .ok(); 110 net_face 111 .inner_iface() 112 .lock() 113 .routes_mut() 114 .remove_default_ipv4_route(); 115 } 116 } 117 } 118 119 return Err(SystemError::ETIMEDOUT); 120 } 121 122 pub fn poll_ifaces() { 123 let guard: RwLockReadGuard<BTreeMap<usize, Arc<dyn NetDriver>>> = NET_DRIVERS.read_irqsave(); 124 if guard.len() == 0 { 125 kwarn!("poll_ifaces: No net driver found!"); 126 return; 127 } 128 let mut sockets = SOCKET_SET.lock_irqsave(); 129 for (_, iface) in guard.iter() { 130 iface.poll(&mut sockets).ok(); 131 } 132 let _ = send_event(&sockets); 133 } 134 135 /// 对ifaces进行轮询,最多对SOCKET_SET尝试times次加锁。 136 /// 137 /// @return 轮询成功,返回Ok(()) 138 /// @return 加锁超时,返回SystemError::EAGAIN_OR_EWOULDBLOCK 139 /// @return 没有网卡,返回SystemError::ENODEV 140 pub fn poll_ifaces_try_lock(times: u16) -> Result<(), SystemError> { 141 let mut i = 0; 142 while i < times { 143 let guard: RwLockReadGuard<BTreeMap<usize, Arc<dyn NetDriver>>> = 144 NET_DRIVERS.read_irqsave(); 145 if guard.len() == 0 { 146 kwarn!("poll_ifaces: No net driver found!"); 147 // 没有网卡,返回错误 148 return Err(SystemError::ENODEV); 149 } 150 let sockets = SOCKET_SET.try_lock_irqsave(); 151 // 加锁失败,继续尝试 152 if sockets.is_err() { 153 i += 1; 154 continue; 155 } 156 157 let mut sockets = sockets.unwrap(); 158 for (_, iface) in guard.iter() { 159 iface.poll(&mut sockets).ok(); 160 } 161 let _ = send_event(&sockets); 162 return Ok(()); 163 } 164 165 // 尝试次数用完,返回错误 166 return Err(SystemError::EAGAIN_OR_EWOULDBLOCK); 167 } 168 169 /// 对ifaces进行轮询,最多对SOCKET_SET尝试一次加锁。 170 /// 171 /// @return 轮询成功,返回Ok(()) 172 /// @return 加锁超时,返回SystemError::EAGAIN_OR_EWOULDBLOCK 173 /// @return 没有网卡,返回SystemError::ENODEV 174 pub fn poll_ifaces_try_lock_onetime() -> Result<(), SystemError> { 175 let guard: RwLockReadGuard<BTreeMap<usize, Arc<dyn NetDriver>>> = NET_DRIVERS.read_irqsave(); 176 if guard.len() == 0 { 177 kwarn!("poll_ifaces: No net driver found!"); 178 // 没有网卡,返回错误 179 return Err(SystemError::ENODEV); 180 } 181 let mut sockets = SOCKET_SET.try_lock_irqsave()?; 182 for (_, iface) in guard.iter() { 183 iface.poll(&mut sockets).ok(); 184 } 185 send_event(&sockets)?; 186 return Ok(()); 187 } 188 189 /// ### 处理轮询后的事件 190 fn send_event(sockets: &smoltcp::iface::SocketSet) -> Result<(), SystemError> { 191 for (handle, socket_type) in sockets.iter() { 192 let handle_guard = HANDLE_MAP.read_irqsave(); 193 let item = handle_guard.get(&handle); 194 if item.is_none() { 195 continue; 196 } 197 198 let handle_item = item.unwrap(); 199 200 // 获取socket上的事件 201 let mut events = 202 SocketPollMethod::poll(socket_type, handle_item.shutdown_type()).bits() as u64; 203 204 // 分发到相应类型socket处理 205 match socket_type { 206 smoltcp::socket::Socket::Raw(_) | smoltcp::socket::Socket::Udp(_) => { 207 handle_guard 208 .get(&handle) 209 .unwrap() 210 .wait_queue 211 .wakeup_any(events); 212 } 213 smoltcp::socket::Socket::Icmp(_) => unimplemented!("Icmp socket hasn't unimplemented"), 214 smoltcp::socket::Socket::Tcp(inner_socket) => { 215 if inner_socket.is_active() { 216 events |= TcpSocket::CAN_ACCPET; 217 } 218 if inner_socket.state() == smoltcp::socket::tcp::State::Established { 219 events |= TcpSocket::CAN_CONNECT; 220 } 221 handle_guard 222 .get(&handle) 223 .unwrap() 224 .wait_queue 225 .wakeup_any(events); 226 } 227 smoltcp::socket::Socket::Dhcpv4(_) => {} 228 smoltcp::socket::Socket::Dns(_) => unimplemented!("Dns socket hasn't unimplemented"), 229 } 230 drop(handle_guard); 231 let mut handle_guard = HANDLE_MAP.write_irqsave(); 232 let handle_item = handle_guard.get_mut(&handle).unwrap(); 233 EventPoll::wakeup_epoll( 234 &mut handle_item.epitems, 235 EPollEventType::from_bits_truncate(events as u32), 236 )?; 237 // crate::kdebug!( 238 // "{} send_event {:?}", 239 // handle, 240 // EPollEventType::from_bits_truncate(events as u32) 241 // ); 242 } 243 Ok(()) 244 } 245