SPDK发送和接收连接请求的处理
因工作需要分析了部分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。
驱动调用芯片处理请求的过程为:
将umq_request资源和umq_iocb_pkt资源通过iocb_handle进行关联,如橙色箭头所示;
向芯片的request队列中插入umq_iocb_pkt作为一条entry;
更新队列的生产者指针,告诉芯片有新的iocb入队;
芯片处理iocb,处理完成后将umq_iocb_pkt从request队列移动到response队列;
轮询线程从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发送和接收连接请求的处理的更多相关文章
- [java,2018-01-16] HttpClient发送、接收 json 请求
最近需要用到许多在后台发送http请求的功能,可能需要发送json和xml类型的数据. 就抽取出来写了一个帮助类: 首先判断发送的数据类型是json还是xml: import org.dom4j.Do ...
- 使用HttpRequester模拟发送及接收Json请求
1.开发人员在火狐浏览器里经常使用的工具有Firebug,httprequester,restclient......火狐浏览器有一些强大的插件供开发人员使用!需要的可以在附加组件中扩展. 2.htt ...
- 使用httperrequest,模拟发送及接收Json请求
使用httpreques\Json-Handle\tcpdump\wireshark工具进行,抓取手机访问网络的包,分析request及response请求,通过httprequester来实现模拟发 ...
- 使用firefox插件httperrequest,模拟发送及接收Json请求 【转】
转自[http://blog.csdn.net/feixue1232/article/details/8535212] 目标:使用httpreques\Json-Handle\tcpdump\wire ...
- Go net/http 发送常见的 http 请求
使用 golang 中的 net/http 包来发送和接收 http 请求 开启 web server 先实现一个简单的 http server,用来接收请求 package main import ...
- [Socket网络编程]由于套接字没有连接并且(当使用一个 sendto 调用发送数据报套接字时)没有提供地址,发送或接收数据的请求没有被接受。
原文地址:http://blog.sina.com.cn/s/blog_70bf579801017ylu.html,记录在此方便查看 解决办法: MSDN的说明: Close 方法可关闭远程主机连接, ...
- socket 错误之:OSError: [WinError 10057] 由于套接字没有连接并且(当使用一个 sendto 调用发送数据报套接字时)没有提供地址,发送或接收数据的请求没有被接受。
出错的代码 #server端 import socket import struct sk=socket.socket() sk.bind(('127.0.0.1',8080)) sk.listen( ...
- [NIO]用dawn发送接收HTTP请求
HTTP协议的下层使用的是tcp.所以我们建立一个tcp连接就能发送接收http请求.dawn底层使用了nio.可是经过dawn的封装之后,我们在编写代码的时候,就和使用普通的堵塞式socket一样 ...
- 手把手教你Android手机与BLE终端通信--连接,发送和接收数据
假设你还没有看上一篇 手把手教你Android手机与BLE终端通信--搜索,你就先看看吧,由于这一篇要接着讲搜索到蓝牙后的连接.和连接后的发送和接收数据. 评论里有非常多人问假设一条信息特别长,怎么不 ...
随机推荐
- 简易数据分析 12 | Web Scraper 翻页——抓取分页器翻页的网页
这是简易数据分析系列的第 12 篇文章. 前面几篇文章我们介绍了 Web Scraper 应对各种翻页的解决方法,比如说修改网页链接加载数据.点击"更多按钮"加载数据和下拉自动加载 ...
- Cabloy-CMS:动静结合,解决Hexo痛点问题(进阶篇)
前言 前一篇文章 介绍了如何通过Cabloy-CMS快速搭建一个博客站点. 这里简单介绍Cabloy-CMS静态站点的渲染机制,更多详细的内容请参见https://cms.cabloy.com 渲染规 ...
- jmeter 分布式压测
1.配置主机名称 查看主机名 hostname 配置主机别名 vim /etc/hosts 2.分布式主机也需要配置主机别名 3.每个主机上必需有JAVA环境和jmeter环境 4.如果脚本有参数文件 ...
- DirectX12 3D 游戏开发与实战第一章内容
DirectX12 3D 第一章内容 学习目标 1.学习向量在几何学和数学中的表示方法 2.了解向量的运算定义以及它在几何学中的应用 3.熟悉DirectXMath库中与向量有关的类和方法 1.1 向 ...
- JavaScript之对象基础
现实世界是由无数的事物或对象组成,事物都有各独特的属性和一些动作行为,一般我们可以通过事物的某些特征或行为动作描述它.JavaScript中也是如此,JavaScript对象是多个键值对的集合,键我们 ...
- TCP通信 -C/S中的Socket与ServerSocket
客户端类:Socket类 TCP通信的客户端:向服务器发送连接请求,给服务器发送数据,读取服务器的数据,两次IO流 java.lang.Object 继承者 java.net.Socket 构造方法: ...
- Spring MVC-从零开始-view-向页面传递data(ModelAndView与ModelMap的区别)
1.ModelMap的用法 package com.jt; import org.springframework.stereotype.Controller; import org.springfra ...
- 织梦DEDE分类信息实现联动筛选(支持多条件多级选项)解决方案
发布时间:2017-03-25 来源:未知 浏览:404 关键词: 很多织梦建站的站长在做产品列表页的时候,产品分类多而且都是关联的,用户不能快速的找到自己需要的东西,很多情况下都需要用到筛选功能,织 ...
- 一道短小精悍的JS小题目
看到题目你是不是以为我在开车,没错,我就不承认,你能咋的,你瞅啥,别瞅我,瞅题 题目是这样式的 结果是啥呀,这里我就不买关子了,结果是undefined,相信基础好一点的大佬们一眼就能看出来,像我这种 ...
- Centos6 日常使用小结
网络配置目录 1./etc/sysconfig/network-script/ifcfg-eth0 2.netstat -rn Kernel IP routing table Destination ...