xref: /DragonOS/kernel/src/net/mod.rs (revision 2b7818e80e00fcfe4d03533f587cc125ea5e4bec)
1 use core::{
2     fmt::{self, Debug},
3     sync::atomic::AtomicUsize,
4 };
5 
6 use alloc::{collections::BTreeMap, sync::Arc};
7 
8 use crate::{driver::net::NetDevice, libs::rwlock::RwLock};
9 use smoltcp::wire::IpEndpoint;
10 
11 use self::socket::SocketInode;
12 
13 pub mod event_poll;
14 pub mod net_core;
15 pub mod socket;
16 pub mod syscall;
17 
18 lazy_static! {
19     /// # 所有网络接口的列表
20     /// 这个列表在中断上下文会使用到,因此需要irqsave
21     pub static ref NET_DEVICES: RwLock<BTreeMap<usize, Arc<dyn NetDevice>>> = RwLock::new(BTreeMap::new());
22 }
23 
24 /// 生成网络接口的id (全局自增)
25 pub fn generate_iface_id() -> usize {
26     static IFACE_ID: AtomicUsize = AtomicUsize::new(0);
27     return IFACE_ID.fetch_add(1, core::sync::atomic::Ordering::SeqCst);
28 }
29 
30 bitflags! {
31     /// @brief 用于指定socket的关闭类型
32     /// 参考:https://code.dragonos.org.cn/xref/linux-6.1.9/include/net/sock.h?fi=SHUTDOWN_MASK#1573
33     pub struct ShutdownType: u8 {
34         const RCV_SHUTDOWN = 1;
35         const SEND_SHUTDOWN = 2;
36         const SHUTDOWN_MASK = 3;
37     }
38 }
39 
40 #[derive(Debug, Clone)]
41 pub enum Endpoint {
42     /// 链路层端点
43     LinkLayer(LinkLayerEndpoint),
44     /// 网络层端点
45     Ip(Option<IpEndpoint>),
46     /// inode端点
47     Inode(Option<Arc<SocketInode>>),
48     // todo: 增加NetLink机制后,增加NetLink端点
49 }
50 
51 /// @brief 链路层端点
52 #[derive(Debug, Clone)]
53 pub struct LinkLayerEndpoint {
54     /// 网卡的接口号
55     pub interface: usize,
56 }
57 
58 impl LinkLayerEndpoint {
59     /// @brief 创建一个链路层端点
60     ///
61     /// @param interface 网卡的接口号
62     ///
63     /// @return 返回创建的链路层端点
64     pub fn new(interface: usize) -> Self {
65         Self { interface }
66     }
67 }
68 
69 /// IP datagram encapsulated protocol.
70 #[derive(Debug, PartialEq, Eq, Clone, Copy)]
71 #[repr(u8)]
72 pub enum Protocol {
73     HopByHop = 0x00,
74     Icmp = 0x01,
75     Igmp = 0x02,
76     Tcp = 0x06,
77     Udp = 0x11,
78     Ipv6Route = 0x2b,
79     Ipv6Frag = 0x2c,
80     Icmpv6 = 0x3a,
81     Ipv6NoNxt = 0x3b,
82     Ipv6Opts = 0x3c,
83     Unknown(u8),
84 }
85 
86 impl fmt::Display for Protocol {
87     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
88         match *self {
89             Protocol::HopByHop => write!(f, "Hop-by-Hop"),
90             Protocol::Icmp => write!(f, "ICMP"),
91             Protocol::Igmp => write!(f, "IGMP"),
92             Protocol::Tcp => write!(f, "TCP"),
93             Protocol::Udp => write!(f, "UDP"),
94             Protocol::Ipv6Route => write!(f, "IPv6-Route"),
95             Protocol::Ipv6Frag => write!(f, "IPv6-Frag"),
96             Protocol::Icmpv6 => write!(f, "ICMPv6"),
97             Protocol::Ipv6NoNxt => write!(f, "IPv6-NoNxt"),
98             Protocol::Ipv6Opts => write!(f, "IPv6-Opts"),
99             Protocol::Unknown(id) => write!(f, "0x{id:02x}"),
100         }
101     }
102 }
103 
104 impl From<smoltcp::wire::IpProtocol> for Protocol {
105     fn from(value: smoltcp::wire::IpProtocol) -> Self {
106         let x: u8 = value.into();
107         Protocol::from(x)
108     }
109 }
110 
111 impl From<u8> for Protocol {
112     fn from(value: u8) -> Self {
113         match value {
114             0x00 => Protocol::HopByHop,
115             0x01 => Protocol::Icmp,
116             0x02 => Protocol::Igmp,
117             0x06 => Protocol::Tcp,
118             0x11 => Protocol::Udp,
119             0x2b => Protocol::Ipv6Route,
120             0x2c => Protocol::Ipv6Frag,
121             0x3a => Protocol::Icmpv6,
122             0x3b => Protocol::Ipv6NoNxt,
123             0x3c => Protocol::Ipv6Opts,
124             _ => Protocol::Unknown(value),
125         }
126     }
127 }
128 
129 impl From<Protocol> for u8 {
130     fn from(value: Protocol) -> Self {
131         match value {
132             Protocol::HopByHop => 0x00,
133             Protocol::Icmp => 0x01,
134             Protocol::Igmp => 0x02,
135             Protocol::Tcp => 0x06,
136             Protocol::Udp => 0x11,
137             Protocol::Ipv6Route => 0x2b,
138             Protocol::Ipv6Frag => 0x2c,
139             Protocol::Icmpv6 => 0x3a,
140             Protocol::Ipv6NoNxt => 0x3b,
141             Protocol::Ipv6Opts => 0x3c,
142             Protocol::Unknown(id) => id,
143         }
144     }
145 }
146