|
88 | 88 | ## 5. 总体门禁结论 |
89 | 89 |
|
90 | 90 | **PASS**。v3 spec 全集与实际代码一致(19/19)。范式已正确收敛为:**复用并标准化 F-Stack 现有"单 API + `SOCK_KERNEL`/`SOCK_FSTACK` 标记选栈 + 胶水自动适配" + config.ini 全局默认开关**,覆盖**服务端 + 客户端(连本机/外部内核服务)双向**与 **hook + 原生双模式**;已彻底移除 `ff_local_*` 双 API 与 gazelle 线程级选栈;KNI 仅作边界澄清。关键事实 D4(原生 `ff_socket` 不识别选栈标记)已如实记录为实现阶段补强项。可进入本地提交。 |
| 91 | + |
| 92 | +--- |
| 93 | + |
| 94 | +# 实现阶段门禁报告(M1-M6,2026-06-15) |
| 95 | + |
| 96 | +> 对"本地 socket/fd/event 支持"实现做编译/单测/覆盖率/集成 实测门禁。结论来自实际编译与运行,证据可复现。 |
| 97 | +
|
| 98 | +## I.1 代码改动核验(Leader 实测,全部 PASS) |
| 99 | + |
| 100 | +| 编号 | 断言 | 结果 | 证据 | |
| 101 | +|---|---|---|---| |
| 102 | +| G1 | 标记对外暴露(M1) | PASS | `lib/ff_api.h` `#ifndef SOCK_FSTACK 0x01000000` / `SOCK_KERNEL 0x02000000`,值与 `adapter/syscall/ff_adapter.h:7-8` 一致 | |
| 103 | +| G2 | config 结构(M3) | PASS | `lib/ff_config.h` `struct ff_config` 新增 `struct { int default_to_kernel; } stack;`(kni 段后) | |
| 104 | +| G3 | config 解析/默认/访问器(M3) | PASS | `ff_config.c:1027` `MATCH("stack","default_stack")`(`strcasecmp(value,"kernel")?1:0`);`:1365` 默认 0;`:1382` `ff_default_stack_is_kernel()` | |
| 105 | +| G4 | config.ini 段(M3) | PASS | 项目根 `config.ini` 新增 `[stack] default_stack=fstack` + 注释 | |
| 106 | +| G5 | 宿主桥声明(M4) | PASS | `lib/ff_host_interface.h` 声明 `ff_host_socket` / `ff_default_stack_is_kernel` | |
| 107 | +| G6 | 宿主桥实现(M4) | PASS | `ff_host_interface.c:240` `ff_host_socket` 调宿主 `socket()`;新增 `#include <sys/socket.h>`;`ff_getenv:234` 完整 | |
| 108 | +| G7 | ff_socket 选栈分支(M4,零回归) | PASS | `ff_syscall_wrapper.c:928-931` 新分支;原 FreeBSD 路径(`:933` 起)**逐字节未改**(NFR-1) | |
| 109 | +| G8 | cmocka 单测(M6) | PASS | `tests/unit/test_ff_config.c` 新增 4 用例并注册;`extern ff_default_stack_is_kernel` | |
| 110 | +| G9 | fixtures(M6) | PASS | `valid_stack_kernel.ini`/`valid_stack_garbage.ini`;`valid_all_sections.ini` 含 `[stack] default_stack=fstack` | |
| 111 | +| G10 | 范式一致 | PASS | 未新造 `ff_local_*`;单 API + 标记 + config 默认,符合 05/06 | |
| 112 | +| G11 | hook 层 config 边界 | PASS | `ff_hook_syscall.c:31` `ff_global_cfg` 注释 "Just for so, no used" → config 默认仅原生模式生效(已据实记录) | |
| 113 | + |
| 114 | +## I.2 编译与单测(硬门禁,PASS) |
| 115 | + |
| 116 | +- **lib 编译**:`cd lib && make` 在 `-Werror` 下成功重链 `libfstack.a`(三处改动文件均通过)。 |
| 117 | +- **cmocka 单测**:`test_ff_config` **54/54 PASS**(新增 4 个 `[stack]` 用例);全部可构建 binary 合计 **176 TC,0 失败**。 |
| 118 | +- **覆盖率(G8)**:`ff_config.c` 行 **89.96%** / 分支 **85.30%**(与基线持平,新增代码已覆盖)。 |
| 119 | + |
| 120 | +## I.3 集成实测(核心特性真实跑通,无需 DPDK NIC) |
| 121 | + |
| 122 | +示例 `example/helloworld_stacksel`(`ff_socket(SOCK_KERNEL)`→宿主内核栈,免 EAL): |
| 123 | + |
| 124 | +| 用例 | 命令 | 结果 | |
| 125 | +|---|---|---| |
| 126 | +| selftest | `./helloworld_stacksel` | `INTEGRATION PASS: kernel-stack server+client over loopback` | |
| 127 | +| FR-1 本机 curl 直访内核栈监听 | `curl 127.0.0.1:18099` | 返回 `hello-stacksel` | |
| 128 | +| FR-2 内核 ICMP | `ping -c1 127.0.0.1` | `0% packet loss` | |
| 129 | +| FR-3 客户端经内核栈 connect 本机服务 | `helloworld_stacksel client 127.0.0.1 18100` | `connected via kernel stack` + `HTTP/1.1 200 OK` | |
| 130 | +| M4 原生 ff_socket(SOCK_KERNEL) | 上述均经 `ff_socket(SOCK_KERNEL)` | 返回真实宿主内核 fd,收发正常 | |
| 131 | + |
| 132 | +## I.4 Skip 项(环境不具备,附实测证据;按 Q1 处置) |
| 133 | + |
| 134 | +| 项 | 原因(实测) | 证据 | |
| 135 | +|---|---|---| |
| 136 | +| F-Stack 数据面端到端 / hook 模式 / 性能基线 PERF-* | 沙箱**无 DPDK 绑定物理 NIC**(大页存在 `HugePages_Total:4096`,但无可用 NIC/数据面) | — | |
| 137 | +| FR-4 连外部内核栈服务 | 机制同 FR-3(仅目的地址不同),FR-3 已实测通;外网出口不保证 | 复用 FR-3 证据 | |
| 138 | +| `tests/unit/test_ff_dpdk_if` 与 `tests/integration/*` | **预存基线** 缺失 `ff_tcp_hpts_softclock`(`ff_dpdk_if.c:2459`);`git stash` 还原本轮改动后**同样失败**,证明非本特性回归 | `git stash` 复现,缺失符号一致 | |
| 139 | + |
| 140 | +> `ff_tcp_hpts_softclock` 缺失影响所有链接 `ff_dpdk_if.o` 的测试 binary,属与本特性无关的预存测试基建问题,建议单独处理;本特性硬门禁不依赖该 binary。 |
| 141 | +
|
| 142 | +## I.5 Bounce 记录 |
| 143 | + |
| 144 | +| # | 触发 | 处置 | 复核 | |
| 145 | +|---|---|---|---| |
| 146 | +| 自纠 | 编辑 `ff_host_interface.c` 一处 replace 误删 `ff_getenv` 签名 | 同步骤立即恢复 + 加 `ff_host_socket` | 编译通过、`ff_getenv` 完整(G6 PASS) | |
| 147 | + |
| 148 | +- 阶段门禁 bounce:0(无跨步骤打回;上为同步骤即时自纠,< 3 上限)。 |
| 149 | + |
| 150 | +## I.6 实现阶段总体结论 |
| 151 | + |
| 152 | +**PASS(硬门禁)**:编译 + cmocka 单测全绿(176 TC)+ `ff_config.c` 覆盖率维持;核心"本地 socket/fd/event 访问"特性(标记选栈 M1/M4、config 默认开关 M3、服务端内核栈监听 FR-1/FR-2、客户端内核栈 connect FR-3)已**真实运行验证**。DPDK-NIC 数据面相关(hook 端到端 / 性能基线 / FR-4 外部 / 预存 `ff_tcp_hpts_softclock` 阻塞的测试 binary)因环境无物理 NIC 按 Q1 **skip 并附实测证据**,不影响硬门禁。 |
0 commit comments