Skip to content

feat(axnet-ng): implement SO_TYPE, SO_PROTOCOL, SO_DOMAIN socket options - #884

Merged
ZR233 merged 1 commit into
rcore-os:devfrom
zyc107109102:pr/socket-options
May 25, 2026
Merged

feat(axnet-ng): implement SO_TYPE, SO_PROTOCOL, SO_DOMAIN socket options#884
ZR233 merged 1 commit into
rcore-os:devfrom
zyc107109102:pr/socket-options

Conversation

@zyc107109102

Copy link
Copy Markdown
Contributor

pip install时,直接报错,因为Python 3.12 ssl.SSLSocket._create() 使用 getsockopt(SO_TYPE) 验证 socket 类型, StarryOS 未实现该选项导致 TLS 握手失败。

于是我选择支持了SO_TYPE,同时还有两个有可能在pip中使用的option,SO_PROTOCOL, SO_DOMAIN,我也加入了支持。

然后我分析option时发现好几个存在bug的option,已经加上todo标签,需要时修改。给未支持的option加上了注释。

添加了三个option有关的测试文件

Summary

实现 SO_TYPESO_PROTOCOLSO_DOMAIN 三个只读 socket option,解决 pip 等软件因 getsockopt(SO_TYPE) 返回 ENOPROTOOPT 而阻塞的问题。

设计

GeneralOptions 新增 domainprotocol 字段,构造签名扩展为:

GeneralOptions::new(socket_type: i32, domain: i32, protocol: i32)

各协议 socket 在构造时传入正确的三元组,值在 socket 生命周期内不变:

协议 socket_type domain protocol
TCP 1 (SOCK_STREAM) 2 (AF_INET) 6 (IPPROTO_TCP)
UDP 2 (SOCK_DGRAM) 2 (AF_INET) 17 (IPPROTO_UDP)
Raw 3 (SOCK_RAW) 2 (AF_INET) u8::from(ip_protocol) (如 ICMP=1)
Unix stream 1 (SOCK_STREAM) 1 (AF_UNIX) 0
Unix dgram 2 (SOCK_DGRAM) 1 (AF_UNIX) 0
Vsock stream 1 (SOCK_STREAM) 40 (AF_VSOCK) 0

三个 option 均为只读,setsockopt 返回 ENOPROTOOPT,符合 Linux 语义。

syscall 层 call_dispatch! 宏将 Linux 常量映射到 GetSocketOption 枚举,通过 Configurable trait 分发到各 socket 实现

变更文件

文件 变更
options.rs 新增 SocketTypeSocketProtocolSocketDomain 枚举变体
general.rs 新增 domain/protocol 字段,构造函数签名扩展,get 返回存储值,set 返回 ENOPROTOOPT
opt.rs syscall 层新增 SO_TYPE/SO_PROTOCOL/SO_DOMAIN 映射,SO_LINGER 移入待支持列表
tcp.rs / udp.rs / raw.rs 传入 (type, domain, protocol) 三元组
unix/dgram.rs / unix/stream.rs / vsock/stream.rs 传入正确的 AF_UNIX / AF_VSOCK 三元组
test-sockopt/ 9 个测试用例覆盖三种 option 的 get 返回值和 set 拒绝行为,使用 test_framework.h

@mai-team-app mai-team-app Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PR #884 Review: feat(axnet-ng): implement SO_TYPE, SO_PROTOCOL, SO_DOMAIN socket options

变更概述

本 PR 为 axnet-ng 的 GeneralOptions 新增 socket_typedomainprotocol 三个字段,实现 SO_TYPESO_PROTOCOLSO_DOMAIN 三个只读 socket option,解决 pip/ssl 因 getsockopt(SO_TYPE) 返回 ENOPROTOOPT 而失败的问题。

实现正确性

  1. Linux 语义符合:三个 option 均为只读,getsockopt 返回 socket 创建时的常量值,setsockopt 返回 ENOPROTOOPT,完全符合 Linux socket(7) / getsockopt(2) 语义。
  2. 构造函数签名扩展合理:移除 Default impl,改为 new(socket_type, domain, protocol),所有调用方均正确传入三元组。各 socket 类型的参数值(TCP: 1/2/6, UDP: 2/2/17, Raw: 3/2/protocol, Unix: */1/0, Vsock: */40/0)均正确。
  3. syscall 层映射正确:通过 call_dispatch! 宏将 (SOL_SOCKET, SO_TYPE/SO_PROTOCOL/SO_DOMAIN) 映射到对应枚举变体,使用 Int<i32> 转换,类型正确。
  4. 代码风格一致domain/protocol 为构造后不可变的 i32socket_typeAtomicI32(与其他原子字段风格一致),getOrdering::Relaxed 读取,无竞态风险。

测试覆盖

  • 新增 test-sockopt 测试套件,覆盖 SO_TYPE/SO_PROTOCOL/SO_DOMAIN 的 get 返回值(TCP+UDP)和 set 拒绝(ENOPROTOOPT),共 9 个检查点。
  • QEMU 配置文件覆盖 x86_64/riscv64/aarch64/loongarch64 四架构。
  • success_regexfail_regex 设置正确,能可靠区分通过/失败。

建议改进(非阻塞)

  1. 测试仅覆盖 AF_INET (TCP/UDP),未覆盖 AF_UNIX 和 AF_VSOCK socket。如后续有 Unix socket 测试环境,建议补充。
  2. 魔数(1, 2, 3, 6, 17, 40)可以考虑定义常量或引用 linux_raw_sys 中的 SOCK_*/AF_*/IPPROTO_* 常量,提高可读性。但当前风格与已有代码一致,可后续统一重构。

CI 状态

CI 全部 skipped,为外部 fork PR 的正常行为(GitHub Actions 需手动批准运行)。本地检查:

  • cargo fmt --check:本 PR 未引入新的格式问题(base 分支已有的 let-chain 警告非本 PR 引入)。

重复/重叠分析

  • base 分支 (origin/dev) 无 SO_TYPE/SO_PROTOCOL/SO_DOMAIN 实现。
  • 检查所有 open PR(#882 xattr, #885 thread snapshot, #865 shm, #867 membarrier 等),均不涉及 socket option 实现,无重复或冲突。

结论

实现正确、测试充分、无重复、无阻塞问题。Approve

Powered by glm-5.1

@ZR233
ZR233 merged commit 653b8ca into rcore-os:dev May 25, 2026
43 checks passed
@github-actions github-actions Bot mentioned this pull request May 25, 2026
@zyc107109102
zyc107109102 deleted the pr/socket-options branch May 26, 2026 12:20
This was referenced May 27, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants