Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
8 changes: 4 additions & 4 deletions Documentation/core-api/drivers.rst
Original file line number Diff line number Diff line change
Expand Up @@ -30,12 +30,12 @@ drivers/ 按 console、tty、video、storage、net、input、usb、sound 等设
- PRO/1000 设备;网络协议栈和回调入口保留内置。
* - ``E1000E``
- ``e1000e``
- Intel 82574L/82574IT、82583V PCIe 千兆网卡;共用单 eth0 服务,
不替换已有网络 owner。设备范围和验证边界见 :doc:`e1000e`。
- Intel 82574L/82574IT、82583V PCIe 千兆网卡;每个 PCI 功能独立注册
网络接口。设备范围和验证边界见 :doc:`e1000e`。
* - ``R8169``
- ``r8169``
- Realtek RTL8111/8168 千兆与 RTL8125 2.5GbE PCIe 网卡;共用单 eth0
服务。芯片版本、固件来源和验证范围见 :doc:`realtek`。
- Realtek RTL8111/8168 千兆与 RTL8125 2.5GbE PCIe 网卡;每个 PCI 功能
独立注册网络接口。芯片版本、固件来源和验证范围见 :doc:`realtek`。
* - ``MOUSE_PS2`` / ``USB_UHCI_HCD``
- ``mouse`` / ``uhci``
- PS/2、VMware 鼠标与 UHCI HID;键盘基础输入和分发入口内置。
Expand Down
9 changes: 4 additions & 5 deletions Documentation/core-api/e1000e.rst
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,10 @@ I217、I218、I219、82571/82572/82573 以及其他未列出的设备不在本
Kbuild/modpost 生成 ``drivers/net/e1000e/e1000e.ko``;``n`` 不编译该驱动。
模块携带精确 PCI 别名,ReliefOS 按实际硬件通过普通 modprobe 加载。

网络继续使用现有 ``eth0`` 和 Linux socket、ioctl、netlink、proc 网络接口。
内核当前只有一个外部 Ethernet 提供者;后来的不同 owner 注册返回
``-EBUSY``,不替换先前的网卡或回调。内部历史名称 ``register_e1000`` 和
``e1000_*`` 服务函数也承载 e1000e,不代表绑定硬件仍是 8254x;本次没有改变
这些服务结构的布局、Linux UAPI 或 BusyBox。
每个受支持的 PCI 功能拥有独立的上下文、DMA 环和 ``ethN`` 网络接口。
Intel e1000、e1000e 与 Realtek 网卡可以同时注册。用户程序使用 Linux
socket、ioctl、netlink 和 proc 接口,接口状态和选路由 :doc:`network-devices`
描述的设备层管理。旧 ``e1000_*`` 内部入口查询首个已发布接口。

接口存在性不依赖网线或 PHY 协商:无载波时仍能查询名称、index、MAC、MTU
和已配置地址,也能设置 ``IFF_UP``。ioctl 与 rtnetlink 分别报告管理状态和
Expand Down
1 change: 1 addition & 0 deletions Documentation/core-api/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
path-cache
resource-limits
drivers
network-devices
e1000e
realtek
usb
Expand Down
83 changes: 83 additions & 0 deletions Documentation/core-api/network-devices.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
========================
Multiple network devices
========================

ReliefNT 为每个受支持的 Ethernet PCI 功能分配独立网络接口。e1000、e1000e
和 r8169 可以同时注册,多张相同型号网卡也分别拥有设备状态和 DMA 环。

Device identity
===============

``lo`` 的 ifindex 为 1。硬件接口从 ifindex 2 开始递增,名称为
``eth<ifindex-2>``。接口在一次启动内保持名称和索引,移除后保留索引空洞。
例如卸载拥有 eth0、eth1 的驱动后,仍存在的 eth2 继续使用原来的编号。
重新加载驱动时,新设备获得新的索引和名称。

私有 ``include/reliefnt/net_device.h`` 的 ``driver_register_netdev`` 接收
版本化回调表、每设备上下文和索引输出。管理器复制回调表,将其与原驱动 owner
绑定,回调前固定 owner,释放服务锁后执行回调。初始化成功后发布接口。
驱动关闭回调接入、排空引用并停止自身全部设备后,管理器移除对应接口。
停止失败的设备保留 DMA 和模块代码,后续卸载可以重试。

旧 ``e1000_*`` 服务入口和 ReliefOS 旧网络管理请求查询首个存活接口。
旧驱动 API 表和公开用户结构继续使用原布局。新设备接口属于 ReliefNT 私有
内核接口,原生模块通过精确构建 ABI 关联。

Configuration and routing
=========================

每张网卡拥有独立的行政状态、IPv4 地址、掩码、广播地址和默认网关。
IPv4 路由优先使用最长前缀,再比较 metric 和接口索引。绑定本机源地址和
``SO_BINDTODEVICE`` 的 socket 按其约束选路。ARP 缓存按接口和下一跳地址
区分。TCP 路由变化时重新检查下一跳 MAC,向本机 NIC 地址发送的 TCP、UDP
保留目标接口身份。

IPv6 地址、路由、邻居、多播成员、待发包、重组和 PMTU 携带 ifindex。
逐链路状态通过动态分配管理,RA、RS、DAD、MLD 和发现定时分别推进。
不同链路可以使用相同 link-local 地址,socket 的作用域与设备绑定须一致。
现有 IPv6 地址、路由和邻居等共享表仍有各自的资源容量,耗尽时返回错误。

Linux 网络管理入口覆盖按名称、索引查询,IPv4/IPv6 地址和路由操作,以及
行政状态开关。接口配置修改需要 ``CAP_NET_ADMIN``。首次设置
``SO_BINDTODEVICE`` 允许普通进程,更改已有设备绑定需要 ``CAP_NET_RAW``。
AF_PACKET 和 raw socket 的创建权限继续由对应协议入口检查。

设备直接接收软件提交的帧,发送队列交由各设备的有界 DMA 环管理。
``SIOCGIFTXQLEN`` 报告的软件队列长度为 0。硬件 MTU 为 1500。

.. code-block:: sh

ip link show
ip addr show dev eth1
ip link set dev eth1 up
ip addr add 192.0.2.10/24 dev eth1
ip route add default via 192.0.2.1 dev eth1 metric 100
ip -6 addr add 2001:db8:1::10/64 dev eth1
ip -6 route add default via fe80::1 dev eth1
udhcpc -i eth1
cat /proc/net/dev /proc/net/route /proc/net/arp /proc/net/if_inet6

``/proc/net/dev`` 列举所有已登记接口,包括未分配 IPv4 地址或行政关闭的设备。
``SIOCGIFCONF`` 按 Linux 的 IPv4 地址列表语义输出 loopback 和有地址的接口。
枚举硬件接口可使用 rtnetlink 或 ``/proc/net/dev``,并按名称查询 ifindex。

Validation
==========

``tools/test_net_device.py`` 验证多个 owner、独立回调、计数和索引生命周期。
``tools/test_net_multi_interface.py`` 验证 ioctl、rtnetlink 和逐接口选路。
``tools/test_net_multinic_data.py`` 验证 ARP、UDP 输出和 AF_PACKET 隔离。
既有 TCP、UDP 和 IPv6 定向套件覆盖对应传输的设备绑定、作用域与资源清理。

``tools/tests/multinic_guest.c`` 是标准 socket 用户程序探针,由 ReliefOS 的
``tools/test_multi_nic_qemu.py`` 放入私有来宾执行。来宾使用两张 e1000 和
一张 e1000e,验证独立 DHCP、IPv4/IPv6、并发 TCP/UDP,以及模块卸载期间
另一 owner 的活动 TCP 连接。完整桌面镜像与实体硬件的运行验证分别记录。
VMware 验证未完成。

References
==========

* `Linux network device socket interface <https://man7.org/linux/man-pages/man7/netdevice.7.html>`_
* `Linux packet sockets <https://man7.org/linux/man-pages/man7/packet.7.html>`_
* `IPv6 scoped address architecture, RFC 4007 <https://www.rfc-editor.org/rfc/rfc4007>`_
8 changes: 4 additions & 4 deletions Documentation/core-api/realtek.rst
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,10 @@ tristate,``make defconfig`` 默认选择 ``y``。选择 ``m`` 生成
- RTL8125A ``0x60900000``、B ``0x64100000``、D-1 ``0x68800000``、
D-2 ``0x68900000``。

未知 MAC 家族返回 ``-ENODEV``。现有网络服务仅提供一个外部 Ethernet
接口,先注册的网卡拥有 ``eth0``,后来的 owner 收到 ``-EBUSY``。
驱动复用内部历史名称 ``register_e1000`` 的服务,网络用户程序继续使用
现有 Linux socket、ioctl、netlink 和 proc 接口。
未知 MAC 家族返回 ``-ENODEV``。驱动枚举全部匹配的 PCI 功能,为每张网卡
分配独立 DMA 环和上下文,通过私有 ``driver_register_netdev`` 注册
``eth0``、``eth1`` 等接口。网络用户程序使用 Linux socket、ioctl、netlink
和 proc 接口。接口生命周期和多网卡选路见 :doc:`network-devices`。

.. code-block:: sh

Expand Down
Loading
Loading