xref: /DragonOS/kernel/src/net/socket/handle.rs (revision d623e90231ef6a31d091c3f611c0af3a83d3343b)
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