xref: /DragonOS/kernel/src/net/socket/unix.rs (revision 6046f77591cf23dc9cc53b68b25c0d74f94fa493)
1*6046f775S裕依 use alloc::{boxed::Box, sync::Arc, vec::Vec};
2*6046f775S裕依 use system_error::SystemError;
3*6046f775S裕依 
4*6046f775S裕依 use crate::{libs::spinlock::SpinLock, net::Endpoint};
5*6046f775S裕依 
6*6046f775S裕依 use super::{Socket, SocketInode, SocketMetadata, SocketOptions, SocketType};
7*6046f775S裕依 
8*6046f775S裕依 #[derive(Debug, Clone)]
9*6046f775S裕依 pub struct StreamSocket {
10*6046f775S裕依     metadata: SocketMetadata,
11*6046f775S裕依     buffer: Arc<SpinLock<Vec<u8>>>,
12*6046f775S裕依     peer_inode: Option<Arc<SocketInode>>,
13*6046f775S裕依 }
14*6046f775S裕依 
15*6046f775S裕依 impl StreamSocket {
16*6046f775S裕依     /// 默认的元数据缓冲区大小
17*6046f775S裕依     pub const DEFAULT_METADATA_BUF_SIZE: usize = 1024;
18*6046f775S裕依     /// 默认的缓冲区大小
19*6046f775S裕依     pub const DEFAULT_BUF_SIZE: usize = 64 * 1024;
20*6046f775S裕依 
21*6046f775S裕依     /// # 创建一个 Stream Socket
22*6046f775S裕依     ///
23*6046f775S裕依     /// ## 参数
24*6046f775S裕依     /// - `options`: socket选项
25*6046f775S裕依     pub fn new(options: SocketOptions) -> Self {
26*6046f775S裕依         let buffer = Arc::new(SpinLock::new(Vec::with_capacity(Self::DEFAULT_BUF_SIZE)));
27*6046f775S裕依 
28*6046f775S裕依         let metadata = SocketMetadata::new(
29*6046f775S裕依             SocketType::Unix,
30*6046f775S裕依             Self::DEFAULT_BUF_SIZE,
31*6046f775S裕依             Self::DEFAULT_BUF_SIZE,
32*6046f775S裕依             Self::DEFAULT_METADATA_BUF_SIZE,
33*6046f775S裕依             options,
34*6046f775S裕依         );
35*6046f775S裕依 
36*6046f775S裕依         Self {
37*6046f775S裕依             metadata,
38*6046f775S裕依             buffer,
39*6046f775S裕依             peer_inode: None,
40*6046f775S裕依         }
41*6046f775S裕依     }
42*6046f775S裕依 }
43*6046f775S裕依 
44*6046f775S裕依 impl Socket for StreamSocket {
45*6046f775S裕依     fn read(&self, buf: &mut [u8]) -> (Result<usize, SystemError>, Endpoint) {
46*6046f775S裕依         let mut buffer = self.buffer.lock_irqsave();
47*6046f775S裕依 
48*6046f775S裕依         let len = core::cmp::min(buf.len(), buffer.len());
49*6046f775S裕依         buf[..len].copy_from_slice(&buffer[..len]);
50*6046f775S裕依 
51*6046f775S裕依         let _ = buffer.split_off(len);
52*6046f775S裕依 
53*6046f775S裕依         (Ok(len), Endpoint::Inode(self.peer_inode.clone()))
54*6046f775S裕依     }
55*6046f775S裕依 
56*6046f775S裕依     fn write(&self, buf: &[u8], _to: Option<Endpoint>) -> Result<usize, SystemError> {
57*6046f775S裕依         if self.peer_inode.is_none() {
58*6046f775S裕依             return Err(SystemError::ENOTCONN);
59*6046f775S裕依         }
60*6046f775S裕依 
61*6046f775S裕依         let peer_inode = self.peer_inode.clone().unwrap();
62*6046f775S裕依         let len = peer_inode.inner().write_buffer(buf)?;
63*6046f775S裕依         Ok(len)
64*6046f775S裕依     }
65*6046f775S裕依 
66*6046f775S裕依     fn connect(&mut self, endpoint: Endpoint) -> Result<(), SystemError> {
67*6046f775S裕依         if self.peer_inode.is_some() {
68*6046f775S裕依             return Err(SystemError::EISCONN);
69*6046f775S裕依         }
70*6046f775S裕依 
71*6046f775S裕依         if let Endpoint::Inode(inode) = endpoint {
72*6046f775S裕依             self.peer_inode = inode;
73*6046f775S裕依             Ok(())
74*6046f775S裕依         } else {
75*6046f775S裕依             Err(SystemError::EINVAL)
76*6046f775S裕依         }
77*6046f775S裕依     }
78*6046f775S裕依 
79*6046f775S裕依     fn write_buffer(&self, buf: &[u8]) -> Result<usize, SystemError> {
80*6046f775S裕依         let mut buffer = self.buffer.lock_irqsave();
81*6046f775S裕依 
82*6046f775S裕依         let len = buf.len();
83*6046f775S裕依         if buffer.capacity() - buffer.len() < len {
84*6046f775S裕依             return Err(SystemError::ENOBUFS);
85*6046f775S裕依         }
86*6046f775S裕依         buffer.extend_from_slice(buf);
87*6046f775S裕依 
88*6046f775S裕依         Ok(len)
89*6046f775S裕依     }
90*6046f775S裕依 
91*6046f775S裕依     fn metadata(&self) -> SocketMetadata {
92*6046f775S裕依         self.metadata.clone()
93*6046f775S裕依     }
94*6046f775S裕依 
95*6046f775S裕依     fn box_clone(&self) -> Box<dyn Socket> {
96*6046f775S裕依         Box::new(self.clone())
97*6046f775S裕依     }
98*6046f775S裕依 
99*6046f775S裕依     fn as_any_ref(&self) -> &dyn core::any::Any {
100*6046f775S裕依         self
101*6046f775S裕依     }
102*6046f775S裕依 
103*6046f775S裕依     fn as_any_mut(&mut self) -> &mut dyn core::any::Any {
104*6046f775S裕依         self
105*6046f775S裕依     }
106*6046f775S裕依 }
107*6046f775S裕依 
108*6046f775S裕依 #[derive(Debug, Clone)]
109*6046f775S裕依 pub struct SeqpacketSocket {
110*6046f775S裕依     metadata: SocketMetadata,
111*6046f775S裕依     buffer: Arc<SpinLock<Vec<u8>>>,
112*6046f775S裕依     peer_inode: Option<Arc<SocketInode>>,
113*6046f775S裕依 }
114*6046f775S裕依 
115*6046f775S裕依 impl SeqpacketSocket {
116*6046f775S裕依     /// 默认的元数据缓冲区大小
117*6046f775S裕依     pub const DEFAULT_METADATA_BUF_SIZE: usize = 1024;
118*6046f775S裕依     /// 默认的缓冲区大小
119*6046f775S裕依     pub const DEFAULT_BUF_SIZE: usize = 64 * 1024;
120*6046f775S裕依 
121*6046f775S裕依     /// # 创建一个 Seqpacket Socket
122*6046f775S裕依     ///
123*6046f775S裕依     /// ## 参数
124*6046f775S裕依     /// - `options`: socket选项
125*6046f775S裕依     pub fn new(options: SocketOptions) -> Self {
126*6046f775S裕依         let buffer = Arc::new(SpinLock::new(Vec::with_capacity(Self::DEFAULT_BUF_SIZE)));
127*6046f775S裕依 
128*6046f775S裕依         let metadata = SocketMetadata::new(
129*6046f775S裕依             SocketType::Unix,
130*6046f775S裕依             Self::DEFAULT_BUF_SIZE,
131*6046f775S裕依             Self::DEFAULT_BUF_SIZE,
132*6046f775S裕依             Self::DEFAULT_METADATA_BUF_SIZE,
133*6046f775S裕依             options,
134*6046f775S裕依         );
135*6046f775S裕依 
136*6046f775S裕依         Self {
137*6046f775S裕依             metadata,
138*6046f775S裕依             buffer,
139*6046f775S裕依             peer_inode: None,
140*6046f775S裕依         }
141*6046f775S裕依     }
142*6046f775S裕依 }
143*6046f775S裕依 
144*6046f775S裕依 impl Socket for SeqpacketSocket {
145*6046f775S裕依     fn read(&self, buf: &mut [u8]) -> (Result<usize, SystemError>, Endpoint) {
146*6046f775S裕依         let mut buffer = self.buffer.lock_irqsave();
147*6046f775S裕依 
148*6046f775S裕依         let len = core::cmp::min(buf.len(), buffer.len());
149*6046f775S裕依         buf[..len].copy_from_slice(&buffer[..len]);
150*6046f775S裕依 
151*6046f775S裕依         let _ = buffer.split_off(len);
152*6046f775S裕依 
153*6046f775S裕依         (Ok(len), Endpoint::Inode(self.peer_inode.clone()))
154*6046f775S裕依     }
155*6046f775S裕依 
156*6046f775S裕依     fn write(&self, buf: &[u8], _to: Option<Endpoint>) -> Result<usize, SystemError> {
157*6046f775S裕依         if self.peer_inode.is_none() {
158*6046f775S裕依             return Err(SystemError::ENOTCONN);
159*6046f775S裕依         }
160*6046f775S裕依 
161*6046f775S裕依         let peer_inode = self.peer_inode.clone().unwrap();
162*6046f775S裕依         let len = peer_inode.inner().write_buffer(buf)?;
163*6046f775S裕依         Ok(len)
164*6046f775S裕依     }
165*6046f775S裕依 
166*6046f775S裕依     fn connect(&mut self, endpoint: Endpoint) -> Result<(), SystemError> {
167*6046f775S裕依         if self.peer_inode.is_some() {
168*6046f775S裕依             return Err(SystemError::EISCONN);
169*6046f775S裕依         }
170*6046f775S裕依 
171*6046f775S裕依         if let Endpoint::Inode(inode) = endpoint {
172*6046f775S裕依             self.peer_inode = inode;
173*6046f775S裕依             Ok(())
174*6046f775S裕依         } else {
175*6046f775S裕依             Err(SystemError::EINVAL)
176*6046f775S裕依         }
177*6046f775S裕依     }
178*6046f775S裕依 
179*6046f775S裕依     fn write_buffer(&self, buf: &[u8]) -> Result<usize, SystemError> {
180*6046f775S裕依         let mut buffer = self.buffer.lock_irqsave();
181*6046f775S裕依 
182*6046f775S裕依         let len = buf.len();
183*6046f775S裕依         if buffer.capacity() - buffer.len() < len {
184*6046f775S裕依             return Err(SystemError::ENOBUFS);
185*6046f775S裕依         }
186*6046f775S裕依         buffer.extend_from_slice(buf);
187*6046f775S裕依 
188*6046f775S裕依         Ok(len)
189*6046f775S裕依     }
190*6046f775S裕依 
191*6046f775S裕依     fn metadata(&self) -> SocketMetadata {
192*6046f775S裕依         self.metadata.clone()
193*6046f775S裕依     }
194*6046f775S裕依 
195*6046f775S裕依     fn box_clone(&self) -> Box<dyn Socket> {
196*6046f775S裕依         Box::new(self.clone())
197*6046f775S裕依     }
198*6046f775S裕依 
199*6046f775S裕依     fn as_any_ref(&self) -> &dyn core::any::Any {
200*6046f775S裕依         self
201*6046f775S裕依     }
202*6046f775S裕依 
203*6046f775S裕依     fn as_any_mut(&mut self) -> &mut dyn core::any::Any {
204*6046f775S裕依         self
205*6046f775S裕依     }
206*6046f775S裕依 }
207