|
| 1 | +# URMA CTP 实现计划 |
| 2 | + |
| 3 | +## 当前状态 |
| 4 | + |
| 5 | +### 已完成 |
| 6 | +1. `circle_buffer` 提取到 `coro_io/detail/circle_buffer.hpp` |
| 7 | +2. `urma_device.hpp` 类型冲突修复(`urma_device_wrapper_t`) |
| 8 | +3. `urma_socket.hpp` 基础重构 |
| 9 | +4. JFC/JFR/Jetty 创建流程修正 |
| 10 | + |
| 11 | +### 已知问题 |
| 12 | +1. `urma_query_jetty` 签名不正确 |
| 13 | +2. `urma_import_jetty` 参数结构错误 |
| 14 | +3. ASIO 协程兼容性问题 |
| 15 | +4. Socket wrapper 接口不匹配 |
| 16 | + |
| 17 | +--- |
| 18 | + |
| 19 | +## URMA CTP API 正确用法 |
| 20 | + |
| 21 | +### 1. JFC 创建 (Completion Channel) |
| 22 | +```c |
| 23 | +urma_jfc_cfg_t jfc_cfg = {}; |
| 24 | +jfc_cfg.depth = 64; |
| 25 | +jfc_cfg.flag.value = 0; |
| 26 | +jfc_cfg.jfce = nullptr; // polling mode |
| 27 | +jfc_cfg.user_ctx = 0; |
| 28 | +urma_jfc_t* jfc = urma_create_jfc(ctx, &jfc_cfg); |
| 29 | +``` |
| 30 | + |
| 31 | +### 2. JFR 创建 (Receive Queue) |
| 32 | +```c |
| 33 | +urma_jfr_cfg_t jfr_cfg = {}; |
| 34 | +jfr_cfg.depth = recv_cnt; |
| 35 | +jfr_cfg.flag.value = 0; |
| 36 | +jfr_cfg.trans_mode = URMA_TM_RM; |
| 37 | +jfr_cfg.max_sge = 1; |
| 38 | +jfr_cfg.min_rnr_timer = 12; |
| 39 | +jfr_cfg.jfc = jfc; |
| 40 | +jfr_cfg.token_value = {}; |
| 41 | +urma_jfr_t* jfr = urma_create_jfr(ctx, &jfr_cfg); |
| 42 | +``` |
| 43 | + |
| 44 | +### 3. Jetty 创建 (CTP Mode) |
| 45 | +```c |
| 46 | +urma_jetty_cfg_t jetty_cfg = {}; |
| 47 | +jetty_cfg.flag.bs.share_jfr = 1; |
| 48 | +jetty_cfg.jfs_cfg.depth = send_cnt + 1; |
| 49 | +jetty_cfg.jfs_cfg.flag.value = 0; |
| 50 | +jetty_cfg.jfs_cfg.trans_mode = URMA_TM_RM; |
| 51 | +jetty_cfg.jfs_cfg.jfc = jfc; |
| 52 | +jetty_cfg.jfs_cfg.user_ctx = 0; |
| 53 | +jetty_cfg.shared.jfr = jfr; |
| 54 | +urma_jetty_t* jetty = urma_create_jetty(ctx, &jetty_cfg); |
| 55 | +``` |
| 56 | + |
| 57 | +### 4. Jetty ID 获取 |
| 58 | +```c |
| 59 | +// 通过 jetty->jfs_id.id 获取 |
| 60 | +uint32_t jetty_id = jetty->jfs_id.id; |
| 61 | +``` |
| 62 | + |
| 63 | +### 5. Segment 注册 |
| 64 | +```c |
| 65 | +urma_seg_cfg_t seg_cfg = {}; |
| 66 | +seg_cfg.va = (uint64_t)buffer; |
| 67 | +seg_cfg.len = buffer_size; |
| 68 | +seg_cfg.flag.bs.access = URMA_ACCESS_READ | URMA_ACCESS_WRITE; |
| 69 | +seg_cfg.flag.bs.token_policy = URMA_TOKEN_NONE; |
| 70 | +urma_target_seg_t* tseg = urma_register_seg(ctx, &seg_cfg); |
| 71 | +``` |
| 72 | + |
| 73 | +### 6. 导入远端 Jetty |
| 74 | +```c |
| 75 | +urma_rjetty_t remote = {}; |
| 76 | +remote.jetty_id.eid = peer_eid; |
| 77 | +remote.jetty_id.id = peer_jetty_id; |
| 78 | +remote.trans_mode = URMA_TM_RM; |
| 79 | +remote.type = URMA_JETTY; |
| 80 | +remote.tp_type = URMA_CTP; // or URMA_RTP |
| 81 | +urma_target_jetty_t* remote_tjetty = urma_import_jetty(ctx, &remote, nullptr); |
| 82 | +``` |
| 83 | + |
| 84 | +### 7. 发送数据 (SEND) |
| 85 | +```c |
| 86 | +urma_sge_t sge = { |
| 87 | + .addr = (uint64_t)buffer, |
| 88 | + .len = data_len, |
| 89 | + .tseg = local_tseg |
| 90 | +}; |
| 91 | +urma_sg_t src = { |
| 92 | + .sge = &sge, |
| 93 | + .num_sge = 1 |
| 94 | +}; |
| 95 | +urma_send_wr_t send_wr = { |
| 96 | + .src = src |
| 97 | +}; |
| 98 | +urma_jfs_wr_t jfs_wr = { |
| 99 | + .opcode = URMA_OPC_SEND, |
| 100 | + .send = send_wr, |
| 101 | + .tjetty = remote_tjetty |
| 102 | +}; |
| 103 | +urma_post_jetty_send_wr(jetty, &jfs_wr, &bad_wr); |
| 104 | +``` |
| 105 | +
|
| 106 | +### 8. 轮询完成 |
| 107 | +```c |
| 108 | +urma_cr_t cr[8]; |
| 109 | +int cnt = urma_poll_jfc(jfc, 8, cr); |
| 110 | +for (int i = 0; i < cnt; ++i) { |
| 111 | + // cr[i].completion_len - 传输字节数 |
| 112 | + // cr[i].status - 状态 |
| 113 | + // cr[i].flag.bs.s_r - 0=send, 1=recv |
| 114 | +} |
| 115 | +``` |
| 116 | + |
| 117 | +--- |
| 118 | + |
| 119 | +## 待修复清单 |
| 120 | + |
| 121 | +### 高优先级 |
| 122 | +- [ ] `urma_socket.hpp`: 修复 `urma_query_jetty` 调用 |
| 123 | +- [ ] `urma_socket.hpp`: 修复 `urma_import_jetty` 参数 |
| 124 | +- [ ] `urma_socket.hpp`: 正确获取 Jetty ID |
| 125 | +- [ ] `socket_wrapper.hpp`: 添加缺失接口 |
| 126 | + |
| 127 | +### 中优先级 |
| 128 | +- [ ] ASIO 协程兼容性问题 |
| 129 | +- [ ] `await_ready` Future 使用错误 |
| 130 | +- [ ] `async_read/write` 调用方式 |
| 131 | + |
| 132 | +### 低优先级 |
| 133 | +- [ ] `urma_socket_info` 序列化格式 |
| 134 | +- [ ] 连接握手协议 |
| 135 | + |
| 136 | +--- |
| 137 | + |
| 138 | +## 参考文档 |
| 139 | + |
| 140 | +- URMA API Guide: `.claude/skills/query-urma-docs/URMA API Guide.ch.md` |
| 141 | +- URMA User Guide: `.claude/skills/query-urma-docs/URMA User Guide.ch.md` |
| 142 | +- URMA 头文件: `include/ylt/urma/urma_api.h`, `urma_types.h` |
0 commit comments