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