zoukankan      html  css  js  c++  java
  • SPDK发送和接收连接请求的处理

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

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

    SPDK处理PLOGI分为三个阶段:

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

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

    第三阶段处理PLOGI的响应;

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

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

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

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

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

    4. 芯片处理iocb,处理完成后将umq_iocb_pktrequest队列移动到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过程分析

  • 相关阅读:
    文本编辑器相关链接0A
    技术博客相关链接0A
    一些有用的 Emacs 配置(窗口快速切换、一键透明效果、任意位置删除整行等)
    一致性Hash算法在Memcached中的应用
    如何使用Fiddler调试线上JS代码
    一些JS周边工具
    利用 Jquery Deferred 异步你的程序
    使用“360云盘“管理你的代码
    剖析Asp.Net Web API中HttpController的激活
    细说Asp.Net Web API消息处理管道(二)
  • 原文地址:https://www.cnblogs.com/leituhaomo/p/9839538.html
Copyright © 2011-2022 走看看