xref: /DragonOS/kernel/src/net/net_core.rs (revision 28fe4ad2a0b0d8b5abf1f0cb402b1c3204b42242)
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::{
7*28fe4ad2S黄铭涛     driver::net::{NetDevice, Operstate},
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)]
22bd70d2d1SLoGin #[allow(dead_code)]
2336fd0130Shoumkh struct NetWorkPollFunc;
2436fd0130Shoumkh 
25cde5492fSlogin impl TimerFunction for NetWorkPollFunc {
run(&mut self) -> Result<(), SystemError>2636fd0130Shoumkh     fn run(&mut self) -> Result<(), SystemError> {
27cde5492fSlogin         poll_ifaces_try_lock(10).ok();
28cde5492fSlogin         let next_time = next_n_ms_timer_jiffies(10);
2936fd0130Shoumkh         let timer = Timer::new(Box::new(NetWorkPollFunc), next_time);
30cde5492fSlogin         timer.activate();
3136fd0130Shoumkh         return Ok(());
32cde5492fSlogin     }
33cde5492fSlogin }
3413776c11Slogin 
net_init() -> Result<(), SystemError>3513776c11Slogin pub fn net_init() -> Result<(), SystemError> {
3613776c11Slogin     dhcp_query()?;
37cde5492fSlogin     // Init poll timer function
380dd8ff43SYJwu2023     // let next_time = next_n_ms_timer_jiffies(5);
390dd8ff43SYJwu2023     // let timer = Timer::new(Box::new(NetWorkPollFunc), next_time);
400dd8ff43SYJwu2023     // timer.activate();
4113776c11Slogin     return Ok(());
4213776c11Slogin }
430dd8ff43SYJwu2023 
dhcp_query() -> Result<(), SystemError>4413776c11Slogin fn dhcp_query() -> Result<(), SystemError> {
45e32effb1SLoGin     let binding = NET_DEVICES.write_irqsave();
4613776c11Slogin 
471ea2daadSSMALLC     //由于现在os未实现在用户态为网卡动态分配内存,而lo网卡的id最先分配且ip固定不能被分配
481ea2daadSSMALLC     //所以特判取用id为1的网卡(也就是virto_net)
491ea2daadSSMALLC     let net_face = binding.get(&1).ok_or(SystemError::ENODEV)?.clone();
5013776c11Slogin 
5113776c11Slogin     drop(binding);
5213776c11Slogin 
5313776c11Slogin     // Create sockets
5413776c11Slogin     let mut dhcp_socket = dhcpv4::Socket::new();
5513776c11Slogin 
5613776c11Slogin     // Set a ridiculously short max lease time to show DHCP renews work properly.
5713776c11Slogin     // This will cause the DHCP client to start renewing after 5 seconds, and give up the
5813776c11Slogin     // lease after 10 seconds if renew hasn't succeeded.
5913776c11Slogin     // IMPORTANT: This should be removed in production.
6013776c11Slogin     dhcp_socket.set_max_lease_duration(Some(smoltcp::time::Duration::from_secs(10)));
6113776c11Slogin 
620d6cf65aSLoGin     let dhcp_handle = SOCKET_SET.lock_irqsave().add(dhcp_socket);
6313776c11Slogin 
6413776c11Slogin     const DHCP_TRY_ROUND: u8 = 10;
6513776c11Slogin     for i in 0..DHCP_TRY_ROUND {
662eab6dd7S曾俊         debug!("DHCP try round: {}", i);
670d6cf65aSLoGin         net_face.poll(&mut SOCKET_SET.lock_irqsave()).ok();
680d6cf65aSLoGin         let mut binding = SOCKET_SET.lock_irqsave();
690dd8ff43SYJwu2023         let event = binding.get_mut::<dhcpv4::Socket>(dhcp_handle).poll();
7013776c11Slogin 
7113776c11Slogin         match event {
7213776c11Slogin             None => {}
7313776c11Slogin 
7413776c11Slogin             Some(dhcpv4::Event::Configured(config)) => {
752eab6dd7S曾俊                 // debug!("Find Config!! {config:?}");
762eab6dd7S曾俊                 // debug!("Find ip address: {}", config.address);
772eab6dd7S曾俊                 // debug!("iface.ip_addrs={:?}", net_face.inner_iface.ip_addrs());
7813776c11Slogin 
7913776c11Slogin                 net_face
8013776c11Slogin                     .update_ip_addrs(&[wire::IpCidr::Ipv4(config.address)])
8113776c11Slogin                     .ok();
8213776c11Slogin 
8313776c11Slogin                 if let Some(router) = config.router {
8413776c11Slogin                     net_face
8513776c11Slogin                         .inner_iface()
8613776c11Slogin                         .lock()
8713776c11Slogin                         .routes_mut()
8813776c11Slogin                         .add_default_ipv4_route(router)
8913776c11Slogin                         .unwrap();
9013776c11Slogin                     let cidr = net_face.inner_iface().lock().ip_addrs().first().cloned();
91b5b571e0SLoGin                     if let Some(cidr) = cidr {
92*28fe4ad2S黄铭涛                         // 这里先在这里将网卡设置为up,后面等netlink实现了再修改
93*28fe4ad2S黄铭涛                         net_face.set_operstate(Operstate::IF_OPER_UP);
942eab6dd7S曾俊                         info!("Successfully allocated ip by Dhcpv4! Ip:{}", cidr);
9513776c11Slogin                         return Ok(());
9613776c11Slogin                     }
9713776c11Slogin                 } else {
9813776c11Slogin                     net_face
9913776c11Slogin                         .inner_iface()
10013776c11Slogin                         .lock()
10113776c11Slogin                         .routes_mut()
10213776c11Slogin                         .remove_default_ipv4_route();
10313776c11Slogin                 }
10413776c11Slogin             }
10513776c11Slogin 
10613776c11Slogin             Some(dhcpv4::Event::Deconfigured) => {
1072eab6dd7S曾俊                 debug!("Dhcp v4 deconfigured");
10813776c11Slogin                 net_face
10913776c11Slogin                     .update_ip_addrs(&[smoltcp::wire::IpCidr::Ipv4(wire::Ipv4Cidr::new(
11013776c11Slogin                         wire::Ipv4Address::UNSPECIFIED,
11113776c11Slogin                         0,
11213776c11Slogin                     ))])
11313776c11Slogin                     .ok();
11413776c11Slogin                 net_face
11513776c11Slogin                     .inner_iface()
11613776c11Slogin                     .lock()
11713776c11Slogin                     .routes_mut()
11813776c11Slogin                     .remove_default_ipv4_route();
11913776c11Slogin             }
12013776c11Slogin         }
12113776c11Slogin     }
12213776c11Slogin 
12313776c11Slogin     return Err(SystemError::ETIMEDOUT);
12413776c11Slogin }
125cde5492fSlogin 
poll_ifaces()126cde5492fSlogin pub fn poll_ifaces() {
127e32effb1SLoGin     let guard: RwLockReadGuard<BTreeMap<usize, Arc<dyn NetDevice>>> = NET_DEVICES.read_irqsave();
128cde5492fSlogin     if guard.len() == 0 {
1292eab6dd7S曾俊         warn!("poll_ifaces: No net driver found!");
130cde5492fSlogin         return;
131cde5492fSlogin     }
1320d6cf65aSLoGin     let mut sockets = SOCKET_SET.lock_irqsave();
133cde5492fSlogin     for (_, iface) in guard.iter() {
134cde5492fSlogin         iface.poll(&mut sockets).ok();
135cde5492fSlogin     }
13640609970SGnoCiYeH     let _ = send_event(&sockets);
137cde5492fSlogin }
138cde5492fSlogin 
139cde5492fSlogin /// 对ifaces进行轮询,最多对SOCKET_SET尝试times次加锁。
140cde5492fSlogin ///
141cde5492fSlogin /// @return 轮询成功,返回Ok(())
142cde5492fSlogin /// @return 加锁超时,返回SystemError::EAGAIN_OR_EWOULDBLOCK
143cde5492fSlogin /// @return 没有网卡,返回SystemError::ENODEV
poll_ifaces_try_lock(times: u16) -> Result<(), SystemError>144cde5492fSlogin pub fn poll_ifaces_try_lock(times: u16) -> Result<(), SystemError> {
145cde5492fSlogin     let mut i = 0;
146cde5492fSlogin     while i < times {
147e32effb1SLoGin         let guard: RwLockReadGuard<BTreeMap<usize, Arc<dyn NetDevice>>> =
148e32effb1SLoGin             NET_DEVICES.read_irqsave();
149cde5492fSlogin         if guard.len() == 0 {
1502eab6dd7S曾俊             warn!("poll_ifaces: No net driver found!");
151cde5492fSlogin             // 没有网卡,返回错误
152cde5492fSlogin             return Err(SystemError::ENODEV);
153cde5492fSlogin         }
1540d6cf65aSLoGin         let sockets = SOCKET_SET.try_lock_irqsave();
155cde5492fSlogin         // 加锁失败,继续尝试
156cde5492fSlogin         if sockets.is_err() {
157cde5492fSlogin             i += 1;
158cde5492fSlogin             continue;
159cde5492fSlogin         }
160cde5492fSlogin 
161cde5492fSlogin         let mut sockets = sockets.unwrap();
162cde5492fSlogin         for (_, iface) in guard.iter() {
163cde5492fSlogin             iface.poll(&mut sockets).ok();
164cde5492fSlogin         }
1654ad52e57S裕依2439         send_event(&sockets)?;
166cde5492fSlogin         return Ok(());
167cde5492fSlogin     }
168cde5492fSlogin     // 尝试次数用完,返回错误
169cde5492fSlogin     return Err(SystemError::EAGAIN_OR_EWOULDBLOCK);
170cde5492fSlogin }
1710dd8ff43SYJwu2023 
172afc95d5cSYJwu2023 /// 对ifaces进行轮询,最多对SOCKET_SET尝试一次加锁。
1730dd8ff43SYJwu2023 ///
1740dd8ff43SYJwu2023 /// @return 轮询成功,返回Ok(())
1750dd8ff43SYJwu2023 /// @return 加锁超时,返回SystemError::EAGAIN_OR_EWOULDBLOCK
1760dd8ff43SYJwu2023 /// @return 没有网卡,返回SystemError::ENODEV
poll_ifaces_try_lock_onetime() -> Result<(), SystemError>1770dd8ff43SYJwu2023 pub fn poll_ifaces_try_lock_onetime() -> Result<(), SystemError> {
178e32effb1SLoGin     let guard: RwLockReadGuard<BTreeMap<usize, Arc<dyn NetDevice>>> = NET_DEVICES.read_irqsave();
1790dd8ff43SYJwu2023     if guard.len() == 0 {
1802eab6dd7S曾俊         warn!("poll_ifaces: No net driver found!");
1810dd8ff43SYJwu2023         // 没有网卡,返回错误
1820dd8ff43SYJwu2023         return Err(SystemError::ENODEV);
1830dd8ff43SYJwu2023     }
1840d6cf65aSLoGin     let mut sockets = SOCKET_SET.try_lock_irqsave()?;
1850dd8ff43SYJwu2023     for (_, iface) in guard.iter() {
1860dd8ff43SYJwu2023         iface.poll(&mut sockets).ok();
1870dd8ff43SYJwu2023     }
18840609970SGnoCiYeH     send_event(&sockets)?;
1890dd8ff43SYJwu2023     return Ok(());
1900dd8ff43SYJwu2023 }
19140609970SGnoCiYeH 
19240609970SGnoCiYeH /// ### 处理轮询后的事件
send_event(sockets: &smoltcp::iface::SocketSet) -> Result<(), SystemError>19340609970SGnoCiYeH fn send_event(sockets: &smoltcp::iface::SocketSet) -> Result<(), SystemError> {
19440609970SGnoCiYeH     for (handle, socket_type) in sockets.iter() {
19540609970SGnoCiYeH         let handle_guard = HANDLE_MAP.read_irqsave();
196d623e902SGnoCiYeH         let global_handle = GlobalSocketHandle::new_smoltcp_handle(handle);
197634349e0SLoGin         let item: Option<&super::socket::SocketHandleItem> = handle_guard.get(&global_handle);
19840609970SGnoCiYeH         if item.is_none() {
19940609970SGnoCiYeH             continue;
20040609970SGnoCiYeH         }
20140609970SGnoCiYeH 
20240609970SGnoCiYeH         let handle_item = item.unwrap();
203634349e0SLoGin         let posix_item = handle_item.posix_item();
204634349e0SLoGin         if posix_item.is_none() {
205634349e0SLoGin             continue;
206634349e0SLoGin         }
207634349e0SLoGin         let posix_item = posix_item.unwrap();
20840609970SGnoCiYeH 
20940609970SGnoCiYeH         // 获取socket上的事件
210634349e0SLoGin         let mut events = SocketPollMethod::poll(socket_type, handle_item).bits() as u64;
21140609970SGnoCiYeH 
21240609970SGnoCiYeH         // 分发到相应类型socket处理
21340609970SGnoCiYeH         match socket_type {
21440609970SGnoCiYeH             smoltcp::socket::Socket::Raw(_) | smoltcp::socket::Socket::Udp(_) => {
215634349e0SLoGin                 posix_item.wakeup_any(events);
21640609970SGnoCiYeH             }
21740609970SGnoCiYeH             smoltcp::socket::Socket::Icmp(_) => unimplemented!("Icmp socket hasn't unimplemented"),
21840609970SGnoCiYeH             smoltcp::socket::Socket::Tcp(inner_socket) => {
21940609970SGnoCiYeH                 if inner_socket.is_active() {
22040609970SGnoCiYeH                     events |= TcpSocket::CAN_ACCPET;
22140609970SGnoCiYeH                 }
22240609970SGnoCiYeH                 if inner_socket.state() == smoltcp::socket::tcp::State::Established {
22340609970SGnoCiYeH                     events |= TcpSocket::CAN_CONNECT;
22440609970SGnoCiYeH                 }
22537cef00bSSamuel Dai                 if inner_socket.state() == smoltcp::socket::tcp::State::CloseWait {
22637cef00bSSamuel Dai                     events |= EPollEventType::EPOLLHUP.bits() as u64;
22737cef00bSSamuel Dai                 }
228634349e0SLoGin 
229634349e0SLoGin                 posix_item.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(
235634349e0SLoGin             &posix_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