nicologiuliani6/cavium-cn6640-snic10e-octeon-ii-nic

GitHub: nicologiuliani6/cavium-cn6640-snic10e-octeon-ii-nic

通过逆向工程 PCIe BAR2 共享内存数据路径,为 Cavium CN6640-SNIC10E SmartNIC 提供树外 Linux 驱动和无串口引导工具,使其作为两路独立 10 GbE 接口正常工作。

Stars: 0 | Forks: 0

# cavium-cn6640-snic10e-octeon-ii-nic 适用于 **Cavium CN6640-SNIC10E** 的树外 Linux 驱动程序栈和引导工具 (Octeon II CN6640, PCI `177d:0092`),它通过逆向工程得出的 PCIe BAR2 共享内存数据路径,将网卡作为**两个独立的 10 GbE 主机接口**(`oct0`, `oct1`)暴露出来。无需厂商 NDA 固件。主机 OS 保持原样,完全可逆。 ## 这是什么 SNIC10E 是一款 OEM Cavium “SmartNIC”:一个具备两个 SFP+ 接口的 8 核 Octeon II SoC,旨在运行厂商的 LiquidIO 固件。原生的 `liquidio` 驱动无法驱动此 OEM 板卡(其软复位 + flash 握手引导模式与该板卡不匹配),并且在很长一段时间里,这张卡在架构上看起来无法作为普通的主机 NIC 使用,因为读取两个 PCIe BAR 返回的都是全 `0xFF`。 那道“BAR 墙”实际上是**未编程的 PEM 入站寄存器**,而非硬件 限制。从卡侧(通过普通的 u-boot `write64`,无需固件)编程 `PEMX_P2N_BARx_START` / `PEMX_BAR1_INDEXx`,即可通过 PCIe 开启一个完整的双向主机↔卡通信通道。 在这个通道之上,本仓库构建了一个真正的 NIC: - 该卡**从 RAM 运行 OpenWrt**,并在其 XAUI 接口与通过 **BAR2** 暴露给主机的 共享内存环形缓冲区之间移动数据包; - 主机驱动程序 **`octnic`** 映射该环形缓冲区并注册 `oct0` / `oct1`; - RX(卡→主机)由 Octeon **DPI** 引擎进行 DMA 传输;TX(主机→卡)则通过 PIO 写入至 BAR 窗口。参见 [架构](docs/ARCHITECTURE.md)。 一切都是可逆的:该卡完全从 RAM 运行(为了实现 NIC 功能,不会向 flash 写入任何内容),并且主机端仅使用树外模块 + 脚本。 ## 组件 | 名称 | 端 | 角色 | |---|---|---| | `octboot` | 主机 (bash) | 主机**引导加载程序**:对卡执行 SBR,恢复 BAR,通过 BAR2 将 OpenWrt 镜像推送到卡 DRAM 中,并等待 NIC 心跳。无需串口。 | | `octnic` (`hostmod/octnic.c`) | 主机 (kmod) | 通过卡的 BAR2 窗口注册 `oct0`/`oct1`。自动发现卡(`modprobe octnic ports=2`)。 | | `octshm_card` (`cardmod/`) | 卡 (kmod) | 共享内存数据路径的卡端:per-port 环形缓冲区、DPI RX、XAUI 上行 tap。 | | `octcarrier` (`cardmod/`) | 卡 (kmod) | 在 QLogic DAC 上解锁 `xaui0`/`xaui1` TX(`cvmx_helper_link_set`)。 | | `cavium-up.sh` / `twocard-up.sh` | 主机 | 编排完整的启动流程:引导卡,加载 `octnic`,连接两个接口。 | 完全由 `cavium-nic.service` systemd 单元自动运行(参见 `system/`)。 ## 快速开始 假设卡已完成预配置(一次性的 u-boot env,参见 [烧录](docs/FLASHING.md)) 且模块已构建并安装: ``` sudo systemctl start cavium-nic # boots the card + brings up oct0 and oct1 ip -br addr show oct0 # 10 GbE host interface, port 0 ip -br addr show oct1 # 10 GbE host interface, port 1 ``` 手动等效操作: ``` sudo ./octboot # boot the card (no serial) sudo modprobe octnic ports=2 # oct0 + oct1 appear # 分配 IP / bridge / 像任何 NIC 一样使用 ``` 完整详情:[烧录](docs/FLASHING.md) · [使用说明](docs/USAGE.md) · [硬件](docs/HARDWARE.md) · [架构](docs/ARCHITECTURE.md) · [性能](docs/PERFORMANCE.md)。 ## 仓库结构 ``` cardmod/ octshm_card.c, octcarrier.c — card-side kernel modules (cross-built) hostmod/ octnic.c — host-side kernel module (native build) octboot — host bootloader (no serial) cavium-up.sh, twocard-up.sh, cexec.sh — bring-up orchestration (+ serial fallback) card-temp.sh — card temperature feed set-hostboot.sh, boot-clean.sh, restore-*.sh — one-time provisioning / fallbacks openwrt/ snic10e.config, build-openwrt.sh, files/ — OpenWrt image build + overlay system/ cavium-nic.service, blacklist-liquidio.conf, 99-octnic-unmanaged.conf docs/ HARDWARE, FLASHING, USAGE, ARCHITECTURE, PERFORMANCE, DMA-DESIGN ``` 研发历史(实验、日志、快照、逆向工程参考树)位于本仓库之外且未公开。 ## 要求 - 插在 PCIe 插槽中的 Cavium CN6640-SNIC10E 卡,**BIOS "Above 4G decoding" 已启用**。 - 用于真实流量的第二个 10 GbE 对端(每个端口需要另一张网卡 + DAC;本仓库使用 HP NC523 作为回环对端)。 - 主机:现代 Linux(在 6.14 版本上开发),用于构建卡镜像的 OpenWrt 构建树。 - 仅用于**一次性** u-boot 预配置的 USB-串口 (FT232) 适配器;正常操作无需串口。 ## 许可证 内核模块采用 GPL-2.0 许可证(参见 SPDX 头文件)。除非另有说明,脚本和文档遵循所在仓库的相同许可证。 ## 免责声明 逆向工程、非官方、无任何担保。它会通过 PCIe 对 OEM 卡执行电源循环和重新编程;在重负载下发生死机的卡可能会导致主机挂起(参见 [使用说明 → 故障排除](docs/USAGE.md#troubleshooting))。请在你能够承担重置风险的硬件上使用。
标签:Linux驱动, OpenWrt, PCIe, 云资产清单, 客户端加密, 应用安全, 智能网卡, 硬件接口, 网络接口卡, 逆向工程