1*d623e902SGnoCiYeH use ida::IdAllocator; 2*d623e902SGnoCiYeH use smoltcp::iface::SocketHandle; 3*d623e902SGnoCiYeH 4*d623e902SGnoCiYeH int_like!(KernelHandle, usize); 5*d623e902SGnoCiYeH 6*d623e902SGnoCiYeH /// # socket的句柄管理组件 7*d623e902SGnoCiYeH /// 它在smoltcp的SocketHandle上封装了一层,增加更多的功能。 8*d623e902SGnoCiYeH /// 比如,在socket被关闭时,自动释放socket的资源,通知系统的其他组件。 9*d623e902SGnoCiYeH #[derive(Debug, Hash, Eq, PartialEq, Clone, Copy)] 10*d623e902SGnoCiYeH pub enum GlobalSocketHandle { 11*d623e902SGnoCiYeH Smoltcp(SocketHandle), 12*d623e902SGnoCiYeH Kernel(KernelHandle), 13*d623e902SGnoCiYeH } 14*d623e902SGnoCiYeH 15*d623e902SGnoCiYeH static KERNEL_HANDLE_IDA: IdAllocator = IdAllocator::new(0, usize::MAX); 16*d623e902SGnoCiYeH 17*d623e902SGnoCiYeH impl GlobalSocketHandle { new_smoltcp_handle(handle: SocketHandle) -> Self18*d623e902SGnoCiYeH pub fn new_smoltcp_handle(handle: SocketHandle) -> Self { 19*d623e902SGnoCiYeH return Self::Smoltcp(handle); 20*d623e902SGnoCiYeH } 21*d623e902SGnoCiYeH new_kernel_handle() -> Self22*d623e902SGnoCiYeH pub fn new_kernel_handle() -> Self { 23*d623e902SGnoCiYeH return Self::Kernel(KernelHandle::new(KERNEL_HANDLE_IDA.alloc().unwrap())); 24*d623e902SGnoCiYeH } 25*d623e902SGnoCiYeH smoltcp_handle(&self) -> Option<SocketHandle>26*d623e902SGnoCiYeH pub fn smoltcp_handle(&self) -> Option<SocketHandle> { 27*d623e902SGnoCiYeH if let Self::Smoltcp(sh) = *self { 28*d623e902SGnoCiYeH return Some(sh); 29*d623e902SGnoCiYeH } 30*d623e902SGnoCiYeH None 31*d623e902SGnoCiYeH } 32*d623e902SGnoCiYeH kernel_handle(&self) -> Option<KernelHandle>33*d623e902SGnoCiYeH pub fn kernel_handle(&self) -> Option<KernelHandle> { 34*d623e902SGnoCiYeH if let Self::Kernel(kh) = *self { 35*d623e902SGnoCiYeH return Some(kh); 36*d623e902SGnoCiYeH } 37*d623e902SGnoCiYeH None 38*d623e902SGnoCiYeH } 39*d623e902SGnoCiYeH } 40