因工作需要分析了部分SPDK代码,主要梳理login请求以及响应的处理,供参考。

参考代码——SPDK代码实现(以PLOGI为例):

SPDK处理PLOGI分为三个阶段:

第一阶段通过一条GET_PARAMETERS的mailbox命令获取本端端口参数;

第二阶段mailbox命令完成后的回调处理中,使用获取的参数填充PLOGI的Payload部分,并进行发送;

第三阶段处理PLOGI的响应;

所需的主要资源以及处理过程如图5- 3、图5- 4所示。umq_hba用于描述一个FC端口,下图标号中的1,4是从端口的req_free队列中取下的umq_request资源;分别用于发送PLOGI和执行mailbox命令以及记录回调函数;标号5用于描述芯片的队列资源,6,7的iocb_pkt是队列中的entry。

驱动调用芯片处理请求的过程为:

  1. 将umq_request资源和umq_iocb_pkt资源通过iocb_handle进行关联,如橙色箭头所示;

  2. 向芯片的request队列中插入umq_iocb_pkt作为一条entry;

  3. 更新队列的生产者指针,告诉芯片有新的iocb入队;

  4. 芯片处理iocb,处理完成后将umq_iocb_pkt从request队列移动到response队列;

  5. 轮询线程从response队列中取出umq_iocb_pkt进行处理,通过umq_iocb_pkt中的handle找到步骤1中关联的umq_request,调用umq_request结构体中记录的回调函数cbfn;

图5- 3 SPDK发送PLOGI所需资源

实际的执过程如下图所示:

1.首先申请一个umq_request结构体,用于发送PLOGI,填充部分信息;

2.再申请一个umq_request结构体,用于执行MBOX_GET_PLOGI_TMPLT的mailbox命令,获取端口参数;

2.芯片执行完mailbox命令后会在response队列中产生一条entry,轮询线程检测到该entry并进行处理;

3.处理entry过程中,通过entry找到关联的步骤2中申请的umq_request结构体,并执行其成员中的回调函数req->cbfn:umq_mailbox_iocb_done;

4.umq_mailbox_iocb_done执行过程中,重新获取到步骤1中申请的umq_request,填充PLOGI的payload DMA buffer,并请求芯片发送;

5.轮询线程从response队列中检测到对端设备发来的LS_ACC并进行处理,将端口状态设置为UMQ_PORT_CB_STATE_PLOGI_ACK;

详细过程可根据下图中的执行过程,结合图5-3中的资源标号以及源代码进行详细分析。

图5- 4  SPDK发送PLOGI过程分析


SPDK发送和接收连接请求的处理的更多相关文章

  1. [java,2018-01-16] HttpClient发送、接收 json 请求

    最近需要用到许多在后台发送http请求的功能,可能需要发送json和xml类型的数据. 就抽取出来写了一个帮助类: 首先判断发送的数据类型是json还是xml: import org.dom4j.Do ...

  2. 使用HttpRequester模拟发送及接收Json请求

    1.开发人员在火狐浏览器里经常使用的工具有Firebug,httprequester,restclient......火狐浏览器有一些强大的插件供开发人员使用!需要的可以在附加组件中扩展. 2.htt ...

  3. 使用httperrequest,模拟发送及接收Json请求

    使用httpreques\Json-Handle\tcpdump\wireshark工具进行,抓取手机访问网络的包,分析request及response请求,通过httprequester来实现模拟发 ...

  4. 使用firefox插件httperrequest,模拟发送及接收Json请求 【转】

    转自[http://blog.csdn.net/feixue1232/article/details/8535212] 目标:使用httpreques\Json-Handle\tcpdump\wire ...

  5. Go net/http 发送常见的 http 请求

    使用 golang 中的 net/http 包来发送和接收 http 请求 开启 web server 先实现一个简单的 http server,用来接收请求 package main import ...

  6. [Socket网络编程]由于套接字没有连接并且(当使用一个 sendto 调用发送数据报套接字时)没有提供地址,发送或接收数据的请求没有被接受。

    原文地址:http://blog.sina.com.cn/s/blog_70bf579801017ylu.html,记录在此方便查看 解决办法: MSDN的说明: Close 方法可关闭远程主机连接, ...

  7. socket 错误之:OSError: [WinError 10057] 由于套接字没有连接并且(当使用一个 sendto 调用发送数据报套接字时)没有提供地址,发送或接收数据的请求没有被接受。

    出错的代码 #server端 import socket import struct sk=socket.socket() sk.bind(('127.0.0.1',8080)) sk.listen( ...

  8. [NIO]用dawn发送接收HTTP请求

    HTTP协议的下层使用的是tcp.所以我们建立一个tcp连接就能发送接收http请求.dawn底层使用了nio.可是经过dawn的封装之后,我们在编写代码的时候,就和使用普通的堵塞式socket一样 ...

  9. 手把手教你Android手机与BLE终端通信--连接,发送和接收数据

    假设你还没有看上一篇 手把手教你Android手机与BLE终端通信--搜索,你就先看看吧,由于这一篇要接着讲搜索到蓝牙后的连接.和连接后的发送和接收数据. 评论里有非常多人问假设一条信息特别长,怎么不 ...

随机推荐

  1. Day 23 系统服务之救援模式

    1.CentOS6与Centos 7启动流程 4.运行级别C6&C7 0 关机 1 单用户模式 (超级权限 必须面对实体硬件) 2 暂未使用 3 字符界面(黑框) 4 暂未使用 5 图形界面 ...

  2. 07 (OC)* XIB原理和Xib、storyBoard、代码的优缺点

    1:可读性 2:可视化界面.立马看到 3:开发速度. 4:复用性 5:维护性差 本质 编译时对xml文件做了如下操作1,读取xml文件,生成所有界面对象,生成所有object(即自定义的control ...

  3. [C++] 类的设计(2)——拷贝控制(1)

    1.一个类通过定义五种特殊的成员函数来控制此类型对象的拷贝.移动.赋值和销毁:拷贝构造函数.拷贝赋值运算符.移动构造函数.移动赋值运算符和析构函数.(拷贝.移动.析构)   2.拷贝和移动构造函数定义 ...

  4. Unity-遇到的问题小总结

    1. event trigger后面显示不了对应的方法 原因:我是直接把脚本拖拽进去的,这是没有实例化的,拖拽进去的应该是挂载这个脚本的GameObject就可以了 2.制作prefeb 将场景中的单 ...

  5. Spring Boot (七): Mybatis极简配置

    Spring Boot (七): Mybatis极简配置 1. 前言 ORM 框架的目的是简化编程中的数据库操作,经过这么多年的发展,基本上活到现在的就剩下两家了,一个是宣称可以不用写 SQL 的 H ...

  6. Java 代理模式 (二) 动态代理

    代理模式 代理(Proxy)是一种设计模式, 提供了对目标对象另外的访问方式:即通过代理访问目标对象. 这样好处: 可以在目标对象实现的基础上,增强额外的功能操作.(扩展目标对象的功能). 代理模式的 ...

  7. 浏览器端获取短信验证码java实现——阿里云短信服务

    需求:浏览器端输入手机号,获取验证码.点击登录,验证验证码是否输入错误.是否超时等情况,一旦校验通过,将用户数据保存到数据中(业务逻辑). 前提:注册阿里用户,开通短信服务,申请key.秘钥.签名.短 ...

  8. Flask基础(05)-->路由的基本定义

    # 导入Flask from flask import Flask # 创建Flask的应用程序 app = Flask(__name__) # http://127.0.0.1:5000/123或者 ...

  9. [Week 2][Guarantee of PLA] the Correctness Verification of PLA

    Conditions: For the data set D, there exists a $\displaystyle W_{f}$ which satisfies that for every ...

  10. python线程实现异步任务

    了解异步编程 楼主在工作中遇到了以下问题,开发接口爬取数据代码完成之后要写入redis缓存,但是在写入缓存的过程花费2-3s,进行这样就大大影响了接口的性能,于是想到了使用异步存储. 传统的同步编程是 ...