xref: /DragonOS/kernel/src/net/net_core.rs (revision afc95d5c2541c27c762091ad38fdffabe355db5a)
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