1 use alloc::{boxed::Box, collections::BTreeMap, sync::Arc};
2 use smoltcp::{socket::dhcpv4, wire};
3
4 use crate::{
5 driver::net::NetDriver,
6 kdebug, kinfo, kwarn,
7 libs::rwlock::RwLockReadGuard,
8 net::NET_DRIVERS,
9 syscall::SystemError,
10 time::timer::{next_n_ms_timer_jiffies, Timer, TimerFunction},
11 };
12
13 use super::socket::{SOCKET_SET, SOCKET_WAITQUEUE};
14
15 /// The network poll function, which will be called by timer.
16 ///
17 /// The main purpose of this function is to poll all network interfaces.
18 struct NetWorkPollFunc();
19 impl TimerFunction for NetWorkPollFunc {
run(&mut self)20 fn run(&mut self) {
21 poll_ifaces_try_lock(10).ok();
22 let next_time = next_n_ms_timer_jiffies(10);
23 let timer = Timer::new(Box::new(NetWorkPollFunc()), next_time);
24 timer.activate();
25 }
26 }
27
net_init() -> Result<(), SystemError>28 pub fn net_init() -> Result<(), SystemError> {
29 dhcp_query()?;
30 // Init poll timer function
31 let next_time = next_n_ms_timer_jiffies(5);
32 let timer = Timer::new(Box::new(NetWorkPollFunc()), next_time);
33 timer.activate();
34 return Ok(());
35 }
dhcp_query() -> Result<(), SystemError>36 fn dhcp_query() -> Result<(), SystemError> {
37 let binding = NET_DRIVERS.write();
38
39 let net_face = binding.get(&0).ok_or(SystemError::ENODEV)?.clone();
40
41 drop(binding);
42
43 // Create sockets
44 let mut dhcp_socket = dhcpv4::Socket::new();
45
46 // Set a ridiculously short max lease time to show DHCP renews work properly.
47 // This will cause the DHCP client to start renewing after 5 seconds, and give up the
48 // lease after 10 seconds if renew hasn't succeeded.
49 // IMPORTANT: This should be removed in production.
50 dhcp_socket.set_max_lease_duration(Some(smoltcp::time::Duration::from_secs(10)));
51
52 let mut sockets = smoltcp::iface::SocketSet::new(vec![]);
53 let dhcp_handle = sockets.add(dhcp_socket);
54
55 const DHCP_TRY_ROUND: u8 = 10;
56 for i in 0..DHCP_TRY_ROUND {
57 kdebug!("DHCP try round: {}", i);
58 let _flag = net_face.poll(&mut sockets);
59 let event = sockets.get_mut::<dhcpv4::Socket>(dhcp_handle).poll();
60 // kdebug!("event = {event:?} !!!");
61
62 match event {
63 None => {}
64
65 Some(dhcpv4::Event::Configured(config)) => {
66 // kdebug!("Find Config!! {config:?}");
67 // kdebug!("Find ip address: {}", config.address);
68 // kdebug!("iface.ip_addrs={:?}", net_face.inner_iface.ip_addrs());
69
70 net_face
71 .update_ip_addrs(&[wire::IpCidr::Ipv4(config.address)])
72 .ok();
73
74 if let Some(router) = config.router {
75 net_face
76 .inner_iface()
77 .lock()
78 .routes_mut()
79 .add_default_ipv4_route(router)
80 .unwrap();
81 let cidr = net_face.inner_iface().lock().ip_addrs().first().cloned();
82 if cidr.is_some() {
83 let cidr = cidr.unwrap();
84 kinfo!("Successfully allocated ip by Dhcpv4! Ip:{}", cidr);
85 return Ok(());
86 }
87 } else {
88 net_face
89 .inner_iface()
90 .lock()
91 .routes_mut()
92 .remove_default_ipv4_route();
93 }
94 }
95
96 Some(dhcpv4::Event::Deconfigured) => {
97 kdebug!("Dhcp v4 deconfigured");
98 net_face
99 .update_ip_addrs(&[smoltcp::wire::IpCidr::Ipv4(wire::Ipv4Cidr::new(
100 wire::Ipv4Address::UNSPECIFIED,
101 0,
102 ))])
103 .ok();
104 net_face
105 .inner_iface()
106 .lock()
107 .routes_mut()
108 .remove_default_ipv4_route();
109 }
110 }
111 }
112
113 return Err(SystemError::ETIMEDOUT);
114 }
115
poll_ifaces()116 pub fn poll_ifaces() {
117 let guard: RwLockReadGuard<BTreeMap<usize, Arc<dyn NetDriver>>> = NET_DRIVERS.read();
118 if guard.len() == 0 {
119 kwarn!("poll_ifaces: No net driver found!");
120 return;
121 }
122 let mut sockets = SOCKET_SET.lock();
123 for (_, iface) in guard.iter() {
124 iface.poll(&mut sockets).ok();
125 }
126 SOCKET_WAITQUEUE.wakeup_all((-1i64) as u64);
127 }
128
129 /// 对ifaces进行轮询,最多对SOCKET_SET尝试times次加锁。
130 ///
131 /// @return 轮询成功,返回Ok(())
132 /// @return 加锁超时,返回SystemError::EAGAIN_OR_EWOULDBLOCK
133 /// @return 没有网卡,返回SystemError::ENODEV
poll_ifaces_try_lock(times: u16) -> Result<(), SystemError>134 pub fn poll_ifaces_try_lock(times: u16) -> Result<(), SystemError> {
135 let mut i = 0;
136 while i < times {
137 let guard: RwLockReadGuard<BTreeMap<usize, Arc<dyn NetDriver>>> = NET_DRIVERS.read();
138 if guard.len() == 0 {
139 kwarn!("poll_ifaces: No net driver found!");
140 // 没有网卡,返回错误
141 return Err(SystemError::ENODEV);
142 }
143 let sockets = SOCKET_SET.try_lock();
144 // 加锁失败,继续尝试
145 if sockets.is_err() {
146 i += 1;
147 continue;
148 }
149
150 let mut sockets = sockets.unwrap();
151 for (_, iface) in guard.iter() {
152 iface.poll(&mut sockets).ok();
153 }
154 SOCKET_WAITQUEUE.wakeup_all((-1i64) as u64);
155 return Ok(());
156 }
157
158 // 尝试次数用完,返回错误
159 return Err(SystemError::EAGAIN_OR_EWOULDBLOCK);
160 }
161