Skip to content

Commit 167d8fb

Browse files
authored
Merge pull request #237 from a6d9a6m/new-main
fix:重构网络模块并补上文档
2 parents 8279fd7 + 63340a1 commit 167d8fb

103 files changed

Lines changed: 2158 additions & 2915 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,9 @@ os/loongarch.log
3939

4040
# Local notes
4141
os/可能的改进.md
42+
43+
# Local agent guidance
44+
**/AGENTS.md
45+
46+
# Local planning/refactor notes
47+
docs/

document/SUMMARY.md

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,14 @@
2424

2525
# 网络
2626

27-
- [网络实现指南](net/network_implementation_guide.md)
27+
- [网络模块概览](net/README.md)
28+
- [整体架构](net/architecture.md)
29+
- [设备与接口](net/device_and_interface.md)
30+
- [协议栈运行时](net/stack_runtime.md)
31+
- [Socket 与 syscall](net/socket_syscall.md)
32+
- [Loopback 与 poll](net/loopback_poll.md)
33+
- [测试与排查](net/testing.md)
34+
- [网络实现指南](net/network_implementation_guide.md)
2835
- [netperf / netserver 测试说明](net/netperf.md)
2936

3037
# 同步原语

document/net/README.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# 网络模块概览
2+
3+
网络模块负责把内核网卡设备、接口配置、smoltcp 协议栈、VFS socket 文件和网络 syscall 连接起来。
4+
5+
## 源码入口
6+
7+
- `os/src/device/net/`:网卡设备抽象和 VirtIO/loopback/null 设备。
8+
- `os/src/net/interface.rs`:接口注册表、接口配置和 smoltcp interface 兼容工厂。
9+
- `os/src/net/stack.rs``NetworkStack` 状态对象和协议栈运行时实现。
10+
- `os/src/net/socket.rs``SocketFile`、fd/socket 映射、UDP per-fd 队列和公开 socket 包装 API。
11+
- `os/src/kernel/syscall/network.rs`:网络 syscall ABI 层。
12+
13+
## 文档导航
14+
15+
- `architecture.md`:整体分层和依赖方向。
16+
- `device_and_interface.md`:设备注册、接口对象和中断兼容桥。
17+
- `stack_runtime.md`:smoltcp runtime、poll、socket set 和 loopback link。
18+
- `socket_syscall.md`:SocketFile、fd 映射、syscall errno 边界。
19+
- `loopback_poll.md`:显式 loopback 和 poll/select 唤醒。
20+
- `testing.md`:验证矩阵和常见排查。
21+
- `network_implementation_guide.md`:维护指南。

document/net/architecture.md

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# 网络架构
2+
3+
## 目标模型
4+
5+
```text
6+
device/net NetDevice
7+
|
8+
v
9+
net::register_net_device()
10+
|
11+
v
12+
NetworkInterface registry
13+
|
14+
v
15+
NetworkStack runtime
16+
|
17+
v
18+
SocketFile / syscall ABI
19+
```
20+
21+
依赖方向只能自上而下或通过明确门面调用。设备层不理解 socket,syscall 层不理解 smoltcp 的内部 socket set。
22+
23+
## 当前边界
24+
25+
- `NetworkStack` 是协议栈状态宿主,持有 smoltcp socket set、active interface runtime、loopback link,并提供 TCP/UDP/socket 文件级 API。
26+
- `NetworkInterface` 是控制面接口对象,保存名称、MAC、IP 地址、网关和兼容中断状态。
27+
- `SocketFile` 是 VFS 文件对象,保存 fd 相关逻辑状态,如 local/remote endpoint、flags、shutdown 状态、UDP per-fd 接收队列。
28+
- `kernel::syscall::network` 只负责用户参数、fd table、sockaddr 编解码和 errno。
29+
30+
## 兼容点
31+
32+
- 当前仍是单 active smoltcp runtime,多接口 runtime 需要后续引入真正的 `StackSocketId` 和接口路由。
33+
- `SocketHandle` 仍包装 smoltcp handle,作为旧路径兼容类型。
34+
- `NetworkInterface::create_smoltcp_interface()` 暂时保留为 runtime 初始化工厂。
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# 设备与接口
2+
3+
## 设备层
4+
5+
`os/src/device/net/` 只负责网卡数据面:
6+
7+
- `net_device.rs` 定义 `NetDevice``NetDeviceError` 和 VirtIO net 设备实现。
8+
- `virtio_net.rs` 初始化 VirtIO net 设备,并调用网络子系统注册入口。
9+
- `loopback.rs` 提供显式 loopback 设备。
10+
- `null_net.rs` 仅作为空设备/占位实现,不表示 loopback。
11+
12+
设备层不得直接依赖 IP、网关、socket、syscall 或 smoltcp socket set。
13+
14+
## 注册路径
15+
16+
真实网卡初始化后调用:
17+
18+
```rust
19+
crate::net::register_net_device(device)
20+
```
21+
22+
该入口负责:
23+
24+
- 注册底层 `NetDevice`
25+
- 创建 `NetworkInterface`
26+
- 把接口加入 `NETWORK_INTERFACE_MANAGER`
27+
- 通过 `NetDriverHandle` 注册中断兼容桥。
28+
29+
## 接口层
30+
31+
`NetworkInterface` 保存控制面状态:
32+
33+
- interface name,如 `eth0``lo`
34+
- MAC address。
35+
- IP CIDR 列表。
36+
- IPv4 gateway。
37+
- 兼容中断开关和最后中断时间。
38+
39+
`NetworkInterface` 不应直接实现 `Driver`。中断体系仍需要 `Driver` 时,使用 `NetDriverHandle`
40+
41+
## Loopback
42+
43+
默认网络初始化会确保 `lo` 存在。无真实 NIC 时,`lo` 作为 active runtime 接口,配置 `127.0.0.1/8` 且不配置默认网关。

document/net/loopback_poll.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# Loopback 与 poll
2+
3+
## Loopback 模型
4+
5+
`lo` 是显式接口,不再由 `NullNetDevice` 隐式承担。无真实 NIC 时,默认配置创建 `LoopbackNetDevice`,接口名为 `lo`,地址为 `127.0.0.1/8`
6+
7+
当前仍是单 active smoltcp runtime,因此有真实 NIC 时,127/8 frame 通过 `net::stack` 内部 loopback link 消费;后续多 runtime 可以把 `lo` 升级为独立 smoltcp interface。
8+
9+
## Poll 模型
10+
11+
协议栈推进集中在 `NetworkStack::poll()`
12+
13+
- smoltcp poll。
14+
- loopback link bounded drain。
15+
- UDP per-port dispatch 到 per-fd queue。
16+
- TCP pending close reaping。
17+
- poll/select waiter wakeup。
18+
19+
`poll_until_empty()` 仅作为 loopback/netperf 兼容包装保留,不应成为新的主路径。
20+
21+
## 中断协作
22+
23+
网络中断兼容桥只记录事件和唤醒 waiter,不直接维护另一份协议栈状态。需要处理收包时,由进程上下文中的 poll/read/write/connect 等路径推进 `NetworkStack`

0 commit comments

Comments
 (0)