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