本博文主要交流设计思路,在本博客已给出相关博文140多篇,希望对初学者有用。注意这里只是抛砖引玉,切莫认为参考这就可以完成商用IP设计。若有NVME或RDMA 产品及项目需求,请看B站视频后联系。
(1) 建立连接流程
在 CONNECT 状态下,读取一条连接信息缓存中的指令信息,同时判断指令信息中的会话 ID 是否在会话管理池中存在。如会话 ID 不存在,则继续进行建立连接流程,并组装 CM 连接请求包,跳转至 CON_SEND_REQ 状态;如果会话 ID 已存在,则状态跳转至 IDLE 并返回错误信息。在 CON_SEND_REQ 状态下,组装好的 CM 连接请求包将被逐帧发送至 RoCEv2 发送模块,在其发送完毕后状态跳转至 CON_WAIT_REP 状态。
在 CON_WAIT_REP 状态下,状态机等待来自远程主机的连接回复包,当收到回复包后,解析该回复包。如果远程主机同意连接,则跳转至 CON_SEND_RTU 状态;如果远程主机拒绝连接或等待超时,则跳转至 IDLE 状态并返回错误信息。在 CON_SEND_RTU 状态下,状态机组装并逐帧发送 CM 就绪使用包(Ready toUse)至 RoCE v2 发送模块,状态跳转至 DONE 状态,建立连接流程结束。
(2)断开连接流程
在 DISCONNECT 状态下,状态机读取一条连接信息缓存中的指令信息,同时判断指令信息中的会话 ID 是否在会话管理池中存在。如会话 ID 已存在,则断开连接流程继续,组装 CM 断链请求包,跳转至 DISCON_SEND_REQ 状态;如果会话 ID 不存在,则状态跳转至 IDLE 并返回错误信息。在 DISCON_SEND_REQ 状态下,状态机组装 CM 断开连接请求包并逐帧发送至RoCE v2 发送模块,而后跳转至 DISCON_WAIT_REP 状态。
在 DISCON_WAIT_REP 状态下,状态机等待来自远程主机的断开连接回复包,当 收 到 回 复 包 后 , 解 析 该 回 复 包 。 如 果 远 程 主 机 同 意 断 开 连 接 , 则 跳 转 至DISCON_WAIT_REQ 状态;如果远程主机拒绝断开连接或等待超时,则跳转至 IDLE状态并返回错误信息。
在 DISCON_WAIT_REQ 状态下,状态机等待来自远程主机的断开连接请求包,当收到请求包后,解析该请求包并跳转至 DISCON_SEND_REP 状态,如果等待超时,则跳转至 IDLE 状态并返回错误信息。
在 DISCON_SEND_REP 状态下,状态机组装 CM 断开连接回复包并逐帧发送至RoCE v2 发送模块,而后跳转至 DONE 状态,断开连接流程结束。会话管理池在系统复位时被清空,在建立连接结束后写入会话 ID,在断开连接结束后清除对应的会话 ID。由于实际应用中,交换机接口数量有限,故将会话管理池深度设置为 64,足以满足常见应用场景下的性能要求.
B站已给出相关性能的视频,如想进一步了解,请搜索B站用户:专注与守望