Skip to content

收窄控制面并限制 raw DLI 命令 #5

Description

@sanchuanhehe

What to build

为内核对外 Interface 建立明确且互不混用的写入权威,避免 ioctl、Generic Netlink、configfs、debugfs、raw DLI 和新的 backend proxy 同时修改同一状态机。

建议将三类 Interface 分开:

  1. Managed control Interface:正常情况下只有 slkd 是 writer,用于声明式管理 controller、连接、安全 mechanism、PHY mechanism 和用户态 policy 结果。
  2. BackendProxy Interface:只有受信任 slk-vendord 可独占注册/拥有一个 UserspaceProxyBackend controller。它承载 controller lifecycle 和 controller RX/TX packet,不是应用管理 Interface,也不是 raw DLI 注入 Interface。
  3. Diagnostic Interface:raw DLI 只在独占诊断模式开放;snoop/debugfs 只读,不消费状态事件或 command completion。

Generic Netlink 仅保留适合 multicast 或明确需要的操作,configfs 仅承载启动期配置,debugfs 与 snoop 只读。每个状态变化必须有唯一 canonical writer 和 schema。

BackendProxy security model

  • REGISTER 校验 UAPI version/size、descriptor、capability、max packet、调用者凭据和 controller ownership,返回独占 lease 与 generation。
  • 同一 controller 不允许两个 daemon owner;owner fd 关闭、进程退出、lease 撤销或 generation 变化后,旧消息立即失效。
  • kernel → daemon 只发送 DLI Host 产生的完整 command/data packet;daemon → kernel 只提交 controller event/data 与受控 lifecycle result。
  • daemon 不能调用面向 slkd 的管理 operation,也不能通过 BackendProxy 要求 Host 执行任意 DLI command。内核重新校验 packet type、length、sequence、generation、状态迁移和队列限制。
  • BackendProxy device node 使用独立权限,默认只允许 slk-vendord service account;要求 CAP_NET_ADMIN 或更小的专用授权,并支持 LSM/udev/systemd sandbox。
  • proxy TX/RX 使用有界队列和非阻塞 poll,不能在 subsystem/global mutex 下等待用户态;daemon 卡死、overflow 或 hangup 只使对应 controller fault/unavailable。

BackendProxy UAPI 与 daemon 由 #1OpenSparklink/sparklink#7 具体跟踪。

Acceptance criteria

  • 文档列出 Managed control、BackendProxy、event subscription、raw diagnostic、snoop/debugfs、Generic Netlink 与 configfs 的唯一用途、权限、方向、并发和生命周期语义。
  • 正常管理操作只有 slkd 一个 writer;其他 Interface 不再重复实现状态变化。
  • BackendProxy 与普通管理 chardev/raw DLI 使用不同 capability 和 ownership 模型,不能由普通应用 fd 升级或复用为 backend owner。
  • BackendProxy REGISTER/UNREGISTER 不再是打印后返回成功,而是创建/撤销 per-controller Backend handle、lease、generation、queue 与 readiness state。
  • 同一 controller 只允许一个有效 backend owner;测试覆盖重复 owner、fd 继承、daemon crash/restart、stale generation、controller hot-unplug 与并发 unregister。
  • kernel 对 daemon 上送的 message header、packet type/length、controller id、generation、状态迁移、capability 和 queue budget 全部重新验证。
  • daemon 只能返回 controller RX/lifecycle,不获得绕过 DLI Host 的 arbitrary command path;标准 DLI command 仍只由 DLI Host 生成。
  • raw DLI 需要 CAP_NET_ADMIN 或更严格 capability,并与 managed mode 及 BackendProxy 正常 transaction 互斥;不能绕过 DLI Host 状态机改变 controller。
  • reset、BondCredential、PHY、连接参数、Backend register/recover 等危险操作按权限和 controller ownership 校验。
  • UAPI 有 canonical schema,kernel Rust、kernel C、Rust crate 与 C FFI 通过生成或 ABI conformance test 保持一致。
  • 对现有 ioctl 与 Generic Netlink command 给出保留、迁移、deprecated、删除清单和兼容窗口。
  • 所有阻塞/await 均在全局锁外;有界队列提供 backpressure、timeout、overflow/dropped counter 和确定的 teardown。
  • 负向测试覆盖未授权用户、两个 managed writer、两个 backend owner、伪造 controller/generation、畸形 packet、raw command 与正常 transaction 竞争。

Blocked by

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions