Skip to content

refactor(net): the big network rebuild #977

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 82 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
82 commits
Select commit Hold shift + click to select a range
40d9375
ready for merge in master (#964)
Samuka007 Oct 10, 2024
4e4ce68
updates uevent and make fmt
val213 Oct 11, 2024
178486f
新增CommonAttrGroup,基本支持sysfs下各种类型设备的uevent属性文件的读测试
val213 Oct 13, 2024
e67348c
修改net设备的uevent内容,使之与Linux语义一致
val213 Oct 13, 2024
49000bc
删除无用注释
val213 Oct 14, 2024
38d161c
feat: 支持 sysfs下 block, char, Net, rtc, tty 等类型设备的 uevent 文件读操作 (#973)
val213 Oct 14, 2024
b781eaa
Merge remote-tracking branch 'upstream/feat-network-rebuild' into uev…
val213 Oct 14, 2024
2e98aea
Merge remote-tracking branch 'upstream/feat-network-rebuild' into fea…
Samuka007 Oct 14, 2024
7cebb88
can ctrl-c interupt from blocking accept
Samuka007 Oct 14, 2024
8fe49e1
make fmt
Samuka007 Oct 14, 2024
bca536e
clean debug messages
Samuka007 Oct 14, 2024
9a1fe0f
Merge pull request #974 from Samuka007:feat-network-rebuild
Samuka007 Oct 14, 2024
63ccb53
merge master
Samuka007 Oct 14, 2024
91f24d4
Merge pull request #976 from Samuka007/feat-network-rebuild
Samuka007 Oct 14, 2024
d7be7de
清理积弊,不必要的动态分发和智能指针
val213 Oct 15, 2024
4a2b593
remove uevent and netlink
val213 Oct 16, 2024
7025b76
fmt
val213 Oct 16, 2024
b9f04fc
merge upstream
val213 Oct 16, 2024
886504f
remove uevent test
val213 Oct 16, 2024
10e62c7
Merge pull request #980 from val213/feat-network-rebuild
Samuka007 Oct 16, 2024
4736fad
重新组织代码分布
Samuka007 Oct 16, 2024
ce8026c
merge upstream/net
Samuka007 Oct 16, 2024
de148a1
remove unused imports
Samuka007 Oct 16, 2024
b9f27f4
fix it back to old syscall printing style
Samuka007 Oct 17, 2024
ddad6b1
regulate naming to posix
Samuka007 Oct 17, 2024
251e1bc
todo: socket close 及 port 接触占用
Samuka007 Oct 17, 2024
6c812d2
fix: format check
Samuka007 Oct 17, 2024
7cd11b4
feat: remove syscall prettier printing (#988)
Samuka007 Oct 17, 2024
149fc83
remove unnecessary warnings and impls
Samuka007 Oct 17, 2024
c9806be
loopback assign single ip, remove unnecessary comments
Samuka007 Oct 17, 2024
acd3485
fmt
Samuka007 Oct 17, 2024
954dd0a
Merge remote-tracking branch 'upstream/feat-network-rebuild'
Samuka007 Oct 17, 2024
7ead4a0
Merge pull request #992 from Samuka007/feat-network-rebuild
Samuka007 Oct 17, 2024
15cedf3
去除virtio_blk, virtio_net expect错误处理,直接返回错误
1037827920 Oct 17, 2024
bb23a04
Merge pull request #995 from 1037827920/patch-fix-virtio_error_handle
Samuka007 Oct 17, 2024
acfceaa
fix: 修复网卡顺序的bug (#996)
smallcjy Oct 20, 2024
a303dd0
fix: ipv6, AddressFamily有转换问题。
Samuka007 Oct 21, 2024
e0c7255
Merge remote-tracking branch 'upstream/feat-network-rebuild' into fea…
Samuka007 Oct 21, 2024
bca5197
make fmt
Samuka007 Oct 21, 2024
8189cb1
Merge pull request #1004 from Samuka007/feat-network-rebuild
Samuka007 Oct 21, 2024
fad1c09
feat(net): 实现unix抽象地址空间 (#1017)
smallcjy Oct 28, 2024
055c144
feat(doc):添加网络子系统模块 (#1020)
smallcjy Oct 30, 2024
ff13f9f
fix(net): TCP Resources and add syscall print, change to use latest s…
Samuka007 Nov 7, 2024
2b180c4
debug and add socket option level print
Samuka007 Nov 8, 2024
4e8c71b
fix: fix udp and run dog in udp
smallcjy Nov 11, 2024
7411864
Merge pull request #1041 from smallcjy:fix-udp
Samuka007 Nov 13, 2024
d675513
Merge branch 'DragonOS-Community:feat-network-rebuild' into feat-netw…
Samuka007 Nov 13, 2024
aaf9a5f
turn off syscall printing, remove unused imports and make fmt
Samuka007 Nov 13, 2024
e4115c9
turn off syscall printings
Samuka007 Nov 13, 2024
1a04676
merge main
Samuka007 Nov 13, 2024
bd5f713
Merge pull request #1048 from Samuka007/feat-network-rebuild
Samuka007 Nov 15, 2024
f438808
纸糊忙等tcp connecting,尚不明确连接可用的机制。
Samuka007 Nov 20, 2024
dab9a7a
turn off syscall
Samuka007 Nov 20, 2024
14c2143
Merge branch 'master' into feat-network-rebuild
fslongjin Nov 27, 2024
b749598
fix: 修正IfaceCommon的bounds字段的锁使用问题&调度问题
fslongjin Nov 27, 2024
57e0b2e
feat(socket): 实现shutdown系统调用的基础结构并启用相关方法
xiaolin2004 Nov 28, 2024
bbea79e
feat(socket): 添加shutdown方法并实现ShutdownTemp的TryFrom转换
xiaolin2004 Nov 28, 2024
0896c33
Merge pull request #1064 from fslongjin:patch-fix-a-locking-problem
Samuka007 Nov 28, 2024
b9c07e0
Merge remote-tracking branch 'origin/master' into patch-merge-master-…
fslongjin Nov 29, 2024
0e62017
fmt
fslongjin Nov 29, 2024
1848f09
Merge pull request #1068 from fslongjin/patch-merge-master-1129
fslongjin Nov 29, 2024
c4c35ed
Merge remote-tracking branch 'upstream/master' into feat-network-rebuild
Samuka007 Jan 12, 2025
69dde46
fix(net): misc of resources release (#1096)
Samuka007 Mar 10, 2025
55d7280
fix(process): 修复copy_process的一些bug & 支持默认init进程传参 (#1083)
fslongjin Feb 6, 2025
5b4d581
feat: 完善sys_reboot (#1084)
fslongjin Feb 6, 2025
152dbf1
fix: 修复do_wait函数在wait所有子进程时,忘了释放锁就sleep的bug (#1089)
fslongjin Feb 8, 2025
3364e04
feat(virtualization): 内核虚拟化支持 (#1073)
BrahmaMantra Mar 4, 2025
5644e71
fix: 在插入新的timer时,边界条件判断不正确的问题 (#1091)
fslongjin Mar 7, 2025
b361310
fmt
Samuka007 Mar 10, 2025
a02f4c0
feat(net): Add Inet documenation
Samuka007 Mar 10, 2025
a22408b
Revert "Merge Master"
Samuka007 Mar 12, 2025
be0f09c
Merge pull request #1101 from DragonOS-Community/revert-1097-merge-ne…
Samuka007 Mar 12, 2025
9700b68
cleanup codes
Samuka007 Mar 12, 2025
17aa298
refactor: 将设备名称 "lo" 提取为常量 DEVICE_NAME
fslongjin Mar 13, 2025
95f5e08
make fmt (#1109)
sparkzky Mar 18, 2025
91511c9
Merge branch 'master' into feat-network-rebuild
Samuka007 Mar 18, 2025
9fb1d18
fmt (#1110)
sparkzky Mar 24, 2025
06b0853
Merge branch 'master' into feat-network-rebuild
fslongjin Mar 25, 2025
870c34c
refactor: 删除多余的代码
fslongjin Mar 25, 2025
8fef80f
refactor: 移除网络重构分支中,use xxx::*的内容 (#1117)
fslongjin Mar 27, 2025
2452957
feat(net): 引入kthread,将Inet-网卡处理流程移入内核线程中
Samuka007 Apr 9, 2025
32ca9b6
Merge remote-tracking branch 'upstream/master' into feat-network-rebuild
Samuka007 Jun 9, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docs/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
kernel/cpu_arch/index
kernel/container/index
kernel/libs/index
kernel/net/index
kernel/trace/index
kernel/syscall/index

Expand Down
9 changes: 9 additions & 0 deletions docs/kernel/net/index.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
网络子系统
====================================
DragonOS 网络子系统

.. toctree::
:maxdepth: 1

inet
unix
38 changes: 38 additions & 0 deletions docs/kernel/net/inet.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# Internet Protocol Socket

众所都周之,这个 Inet Socket 常用的分为 TCP, UDP 和 ICMP。基于实用性,目前实现的是 TCP 和 UDP。

整个 Inet 网络协议栈与网卡的交互基于 `smoltcp` crate 来实现。

## Roadmap

- [ ] TCP
- [x] 接受连接
- [ ] 发起连接
- [ ] 半双工关闭
- [x] UDP
- [x] 传输数据
- [ ] ICMP
- [ ] ioctl
- [ ] Misc
- [ ] 硬中断转软中断的锁处理(避免死锁)
- [ ] epoll_item 优化
- [ ] 优化 `inet port` 资源管理

## TCP

根据 TCP 状态机来 TCP Socket 的几个状态类
- `Init`: 裸状态
- `Unbound`: 创建出来的状态
- `Bound`: 绑定了地址
- `Listening`: 监听状态
- `Connecting`: 连接中状态
- `Established`: 连接建立状态

## UDP

UDP 是无连接的,所以没有连接状态。UDP 的状态只有 `Unbound` 和 `Bound` 两种。

## BoundInner

另一个对于 Inet Socket 的抽象,用于处理绑定网卡的 `socket`,从而封装 `smoltcp` 的接口,提供统一的资源管理。
22 changes: 22 additions & 0 deletions docs/kernel/net/unix.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# UNIX

## unix socket

unix - 用于进程间通信的socket


## 描述

AF_UNIX socket family 用于在同一台机器中的不同进程之间的通信(IPC)。unix socket地址现支持绑定文件地址,未支持绑定abstract namespace抽象命名空间。

目前unix 域中合法的socket type有:SOCK_STREAM, 提供stream-oriented socket,可靠有序传输消息;SOCK_SEQPACKET,提供connection-oriented,消息边界和按发送顺序交付消息保证的socket。

### unix stream socket 进程通信描述

unix stream socket 提供进程间流式传输消息的功能。假设对端进程作为服务端,本端进程作为客户端。进程间使用stream socket通信过程如下:

分别在对端进程和本端进程创建socket,服务端需要bind地址,客户端不必须bind地址。通信过程类似tcp三次握手流程:服务端调用listen系统调用进入监听状态,监听服务端bind的地址;客户端调用connect系统调用连接服务端地址;服务端调用accept系统调用接受来自客户端的连接,返回建立连接的新的socket。成功建立连接后可以调用write\send\sendto\sendmsg进行写操作,调用read\recv\recvfrom\recvmsg进行读操作。目前尚未支持非阻塞式读写,默认为阻塞式读写。读写完毕后调用close系统调用关闭socket连接。

### unix seqpacket socket 进程通信描述


4 changes: 2 additions & 2 deletions kernel/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion kernel/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ linkme = "=0.3.27"
num = { version = "=0.4.0", default-features = false }
num-derive = "=0.3"
num-traits = { git = "https://git.mirrors.dragonos.org.cn/DragonOS-Community/num-traits.git", rev = "1597c1c", default-features = false }
smoltcp = { version = "=0.11.0", default-features = false, features = [
smoltcp = { version = "=0.12.0", default-features = false, features = [
"alloc",
"socket-raw",
"socket-udp",
Expand All @@ -58,6 +58,7 @@ smoltcp = { version = "=0.11.0", default-features = false, features = [
"socket-dns",
"proto-ipv4",
"proto-ipv6",
"medium-ip",
] }
syscall_table_macros = { path = "crates/syscall_table_macros" }
system_error = { path = "crates/system_error" }
Expand Down
2 changes: 1 addition & 1 deletion kernel/src/driver/acpi/sysfs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ impl AcpiManager {
acpi_table_attr_list().write().push(attr);
self.acpi_table_data_init(&header)?;
}

// TODO:UEVENT
return Ok(());
}

Expand Down
1 change: 1 addition & 0 deletions kernel/src/driver/base/device/dd.rs
Original file line number Diff line number Diff line change
Expand Up @@ -572,6 +572,7 @@ impl DriverManager {
}

// todo: 发送kobj bind的uevent
// kobject_uevent();
}

fn driver_is_bound(&self, device: &Arc<dyn Device>) -> bool {
Expand Down
4 changes: 2 additions & 2 deletions kernel/src/driver/base/device/driver.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ use alloc::{
use core::fmt::Debug;
use log::error;
use system_error::SystemError;

/// @brief: Driver error
#[allow(dead_code)]
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
Expand Down Expand Up @@ -219,7 +218,8 @@ impl DriverManager {
bus_manager().remove_driver(&driver);
})?;

// todo: 发送uevent
// todo: 发送uevent,类型问题
// deferred_probe_extend_timeout();

return Ok(());
}
Expand Down
2 changes: 1 addition & 1 deletion kernel/src/driver/base/device/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -611,7 +611,7 @@ impl DeviceManager {
}

// todo: 发送uevent: KOBJ_ADD

// kobject_uevent();
// probe drivers for a new device
bus_probe_device(&device);

Expand Down
5 changes: 2 additions & 3 deletions kernel/src/driver/base/kobject.rs
Original file line number Diff line number Diff line change
Expand Up @@ -103,10 +103,9 @@ bitflags! {
const ADD_UEVENT_SENT = 1 << 1;
const REMOVE_UEVENT_SENT = 1 << 2;
const INITIALIZED = 1 << 3;
const UEVENT_SUPPRESS = 1 << 4;
}

}

#[derive(Debug)]
pub struct LockedKObjectState(RwLock<KObjectState>);

Expand Down Expand Up @@ -251,7 +250,7 @@ impl KObjectManager {
}

// todo: 发送uevent: KOBJ_REMOVE

// kobject_uevent();
sysfs_instance().remove_dir(&kobj);
kobj.update_kobj_state(None, Some(KObjectState::IN_SYSFS));
let kset = kobj.kset();
Expand Down
1 change: 1 addition & 0 deletions kernel/src/driver/base/kset.rs
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@ impl KSet {
pub fn register(&self, join_kset: Option<Arc<KSet>>) -> Result<(), SystemError> {
return KObjectManager::add_kobj(self.self_ref.upgrade().unwrap(), join_kset);
// todo: 引入uevent之后,发送uevent
// kobject_uevent();
}

/// 注销一个kset
Expand Down
6 changes: 5 additions & 1 deletion kernel/src/driver/base/platform/platform_device.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ use crate::{
kobject::{KObjType, KObject, KObjectCommonData, KObjectState, LockedKObjectState},
kset::KSet,
},
filesystem::kernfs::KernFSInode,
filesystem::{kernfs::KernFSInode, sysfs::AttributeGroup},
libs::{
rwlock::{RwLockReadGuard, RwLockWriteGuard},
spinlock::{SpinLock, SpinLockGuard},
Expand Down Expand Up @@ -329,4 +329,8 @@ impl Device for PlatformBusDevice {
fn set_dev_parent(&self, dev_parent: Option<Weak<dyn Device>>) {
self.inner().device_common.parent = dev_parent;
}

fn attribute_groups(&self) -> Option<&'static [&'static dyn AttributeGroup]> {
None
}
}
82 changes: 20 additions & 62 deletions kernel/src/driver/net/e1000e/e1000e_driver.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@ use crate::{
device::{bus::Bus, driver::Driver, Device, DeviceCommonData, DeviceType, IdTable},
kobject::{KObjType, KObject, KObjectCommonData, KObjectState, LockedKObjectState},
},
net::{register_netdevice, NetDeivceState, NetDevice, NetDeviceCommonData, Operstate},
net::{
register_netdevice, Iface, IfaceCommon, NetDeivceState, NetDeviceCommonData, Operstate,
},
},
libs::{
rwlock::{RwLockReadGuard, RwLockWriteGuard},
Expand All @@ -27,11 +29,8 @@ use core::{
ops::{Deref, DerefMut},
};
use log::info;
use smoltcp::{
phy,
wire::{self, HardwareAddress},
};
use system_error::SystemError;
use smoltcp::{phy, wire::HardwareAddress};
// use system_error::SystemError;

use super::e1000e::{E1000EBuffer, E1000EDevice};

Expand Down Expand Up @@ -78,12 +77,12 @@ impl Debug for E1000EDriverWrapper {
}
}

#[cast_to([sync] NetDevice)]
#[cast_to([sync] Iface)]
#[cast_to([sync] Device)]
#[derive(Debug)]
pub struct E1000EInterface {
driver: E1000EDriverWrapper,
iface_id: usize,
iface: SpinLock<smoltcp::iface::Interface>,
common: IfaceCommon,
name: String,
inner: SpinLock<InnerE1000EInterface>,
locked_kobj_state: LockedKObjectState,
Expand All @@ -97,11 +96,11 @@ pub struct InnerE1000EInterface {
}

impl phy::RxToken for E1000ERxToken {
fn consume<R, F>(mut self, f: F) -> R
fn consume<R, F>(self, f: F) -> R
where
F: FnOnce(&mut [u8]) -> R,
F: FnOnce(&[u8]) -> R,
{
let result = f(self.0.as_mut_slice());
let result = f(self.0.as_slice());
self.0.free_buffer();
return result;
}
Expand Down Expand Up @@ -201,11 +200,9 @@ impl E1000EInterface {
let iface =
smoltcp::iface::Interface::new(iface_config, &mut driver, Instant::now().into());

let driver: E1000EDriverWrapper = E1000EDriverWrapper(UnsafeCell::new(driver));
let result = Arc::new(E1000EInterface {
driver,
iface_id,
iface: SpinLock::new(iface),
driver: E1000EDriverWrapper(UnsafeCell::new(driver)),
common: IfaceCommon::new(iface_id, false, iface),
name: format!("eth{}", iface_id),
inner: SpinLock::new(InnerE1000EInterface {
netdevice_common: NetDeviceCommonData::default(),
Expand All @@ -223,16 +220,6 @@ impl E1000EInterface {
}
}

impl Debug for E1000EInterface {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.debug_struct("E1000EInterface")
.field("iface_id", &self.iface_id)
.field("iface", &"smoltcp::iface::Interface")
.field("name", &self.name)
.finish()
}
}

impl Device for E1000EInterface {
fn dev_type(&self) -> DeviceType {
DeviceType::Net
Expand Down Expand Up @@ -302,52 +289,23 @@ impl Device for E1000EInterface {
}
}

impl NetDevice for E1000EInterface {
impl Iface for E1000EInterface {
fn common(&self) -> &IfaceCommon {
return &self.common;
}

fn mac(&self) -> smoltcp::wire::EthernetAddress {
let mac = self.driver.inner.lock().mac_address();
return smoltcp::wire::EthernetAddress::from_bytes(&mac);
}

#[inline]
fn nic_id(&self) -> usize {
return self.iface_id;
}

#[inline]
fn iface_name(&self) -> String {
return self.name.clone();
}

fn update_ip_addrs(&self, ip_addrs: &[wire::IpCidr]) -> Result<(), SystemError> {
if ip_addrs.len() != 1 {
return Err(SystemError::EINVAL);
}

self.iface.lock().update_ip_addrs(|addrs| {
let dest = addrs.iter_mut().next();

if let Some(dest) = dest {
*dest = ip_addrs[0];
} else {
addrs.push(ip_addrs[0]).expect("Push ipCidr failed: full");
}
});
return Ok(());
}

fn poll(&self, sockets: &mut smoltcp::iface::SocketSet) -> Result<(), SystemError> {
let timestamp: smoltcp::time::Instant = Instant::now().into();
let mut guard = self.iface.lock();
let poll_res = guard.poll(timestamp, self.driver.force_get_mut(), sockets);
if poll_res {
return Ok(());
}
return Err(SystemError::EAGAIN_OR_EWOULDBLOCK);
}

#[inline(always)]
fn inner_iface(&self) -> &SpinLock<smoltcp::iface::Interface> {
return &self.iface;
fn poll(&self) {
self.common.poll(self.driver.force_get_mut())
}

fn addr_assign_type(&self) -> u8 {
Expand Down
13 changes: 5 additions & 8 deletions kernel/src/driver/net/irq_handle.rs
Original file line number Diff line number Diff line change
@@ -1,13 +1,10 @@
use alloc::sync::Arc;
use system_error::SystemError;

use crate::{
exception::{
irqdata::IrqHandlerData,
irqdesc::{IrqHandler, IrqReturn},
IrqNumber,
},
net::net_core::poll_ifaces_try_lock_onetime,
use crate::exception::{
irqdata::IrqHandlerData,
irqdesc::{IrqHandler, IrqReturn},
IrqNumber,
};

/// 默认的网卡中断处理函数
Expand All @@ -21,7 +18,7 @@ impl IrqHandler for DefaultNetIrqHandler {
_static_data: Option<&dyn IrqHandlerData>,
_dynamic_data: Option<Arc<dyn IrqHandlerData>>,
) -> Result<IrqReturn, SystemError> {
poll_ifaces_try_lock_onetime().ok();
super::kthread::wakeup_poll_thread();
Ok(IrqReturn::Handled)
}
}
Loading
Loading