Login
升级VIP 登录 注册 安全退出
当前位置: 首页 > word文档 > 标准规范 > PMC光纤通讯卡PPC软件实施方案1.3wp

PMC光纤通讯卡PPC软件实施方案1.3wp

收藏

本作品内容为PMC光纤通讯卡PPC软件实施方案1.3wp,格式为 doc ,大小 1760256 KB ,页数为 44页

PMC光纤通讯卡PPC软件实施方案1.3wp


('PMC光纤通讯卡软件实施方案1、目的与目标制定本方案,目的是根据FC-AE-FCLP协议的需求,设计详细的软件功能函数和软件工作流程,以备软件技术人员编写与调试代码参照。2、参考文件a、FIBRECHANNELFRAMINGANDSIGNALING(FC-FS)b、FIBRECHANNELAVIONICSENVIRONMENT(FC-AE)c、FX400LightweightProtocol(FXLP)Version4.00APIGuided、InformationSystems-dpANSFibreChannelProtocolforSCSI3、主要内容3.1软件协议分层分析本通讯卡所采用的光纤通道协议是FC-AE-FCLP(FiberChannelLightWeightProtocol)协议。FC-AE-FCLP一般应用在任务关键型的航空系统中,特点是低传输延迟、高数据吞吐量及低CPU占用率,能够保证大块数据的可靠传输FC-AE-FCLP协议是在FC-2层的FC-FS标准和FC-4层的FCP标准(FiberChannelProtocolforSCSI)等光纤通道协议标准的基础之上,依赖于上述协议标准支持的各种服务定义,在满足通信服务质量的前提下,进行必要的裁减与扩充,从而使得在航空电子网络环境下,能更好地支持各种通信紧急命令能进行高效率的低延迟和低开销数据通信服务。1本通讯卡实现FC-AE-FCLP协议,其关键点就是在FC-4层实现的FCLP协议,在FC-2层实现FC-FS标准。下面对这两个协议标准做简要概述。3.1.1FCLP协议概述FCLP协议是以FCP协议为基础,根据通信服务的要求进行相应裁减形成的标准。FCP协议是光纤通道高层映射协议FC-4层的一部分,它工作于低一级的FC协议之上,主要是对高层SCSI的映射机制。SCSI协议是通过基本的I/O读写操作来实现命令、响应、数据传输等协议功能的。FCP协议中定义支持了四种主要的功能管理机制。它们是设备管理、任务管理、进程登录/登出管理和连接管理,其中在设备和任务管理中规定了SCSI协议的命令、响应、数据到光纤网络上的传输单位帧、序列等的转换。FCP协议是从FCIU和交换的角度来定义功能的,一对支持FC-4层协议映射功能的FCP端口可以生成IU和FCP交换。对于SCSI协议中的一个I/O操作被映射为一个光纤通道的交换,一个专门携带了上层SCSII/O功能的交换称之为FCP交换。典型的SCSII/O操作的请求和响应序列被映射为光纤通道信息单元(IU),FCP协议包含的几种信息单元主要是:命令服务请求FCP_CMNDIU、数据传送准备FCP_XFER_RDYIU、数据传送动作FCP_DATAIU和命令服务响应FCP_RSPIU。它们和对应SCSI功能的关系如下图3-1所示:图3-1FCP和标准SCSI功能的对应23.1.2FC-FS标准概述FC-FS协议为上层协议(ULPs)提供了通用数据传输层。整个FC协议如图3-2所示为层级结构。FC-FS协议包含了FC-1,FC-2,FC-3的功能定义。从FC协议的层级关系图可以看到,尽管FC-4层以上可以变换多种协议,但在FC-3层以下都是用相同协议实现的。在FC-FS协议里,FC-1层定义传输协议,包括串行编译码和差错控制等。在FC-2信号协议层定义了传输端到端数据块的规则。FC-2的功能包含类型服务,帧格式定义,序列打包和解包,交换管理,地址分配,虚地址定义,多点传送管理和堆栈连接请求。FC-3提供了同一节点上(node)不同Nx端口的公共服务机制。其还包括连接服务协议等。其中连接服务是FC-2层要求必需完成。图3-2FC协议层次关系在利用上层协议(ULP)进行数据传输之前,光纤通道必需建立好传输环境(握手协议)。光纤通道的传输环境的建立是通过F端口登录和N端口登录完成的。一旦两类登录都已完成,一个FC-4层就可以利用光纤通道进行数据传输,除非其中的一个或者两个登录变成无效。3F端口登录和N端口登录主要完成两个任务:a)确定什么种类的端口连接到链路的另一端b)确定该N端口可能希望通信的网络上的其它N端口的操作特性。N端口注册应该发生在希望相互通信的每一对N端口上。F端口登录和N端口登录是由一个端口通过发送一个含有操作特性或“服务参数”的测试集序列,以及接收一个返回的含有类似的或修改过的服务参数集的序列来进行的。两个序列的组合构成一个协商,即在传送的序列中含有发送方想要用的服务参数,而返回的序列中则包括两个端口一致同意的服务参数,后续的通信就只用一致同意的参数。其中,端口间交换的服务参数集即是按照FC-FS标准定义的。3.1.3小结本节将光纤通道功能层次与FC协议簇相结合,以分层分析的方法概要分析了本光纤通讯卡所采用的协议。FC-AE-FCLP协议是在FC-2层的FC-FS标准和FC-4层的FCP标准等光纤通道协议标准的基础之上,依赖于上述协议标准支持的各种服务定义。本光纤卡的关键是在FC-4层上实现FCLP协议到底层FC协议的映射,并根据需求在FC-3、FC-2层上实现FC-FS标准的功能。3.2软件协议分层实现3.2.1FCLP协议的实现3.2.1.1FCLP协议功能架构描述本光纤通讯卡在FC-4层上实现的是FCLP协议,FCLP协议属于端到端协议,FCLP协议系统为用户提供了简单的应用程序接口来实现数据的高速传输,用户可以通过建立虚拟通道的最终实现形式进行高速数据传输。FCLP协议系统从功能上可以分为4大功能管理模块,分别是设备管理功能模块、任务管理功能模块、通信连接管理功能模块和错误处理功能模块。各功能模块的结构层次如图3-3所示。4图3-3PMC光纤通讯卡软件功能模块划分(1)设备管理功能模块主要完成对通信过程中设备、网络、协议的各种状况进行控制管理,对设备进行的各种操作进行记录监控,是其它模块工作的基础,包含初始化工作,对创建删除APID和Channel的信息记录,以及其它一些设备、网络信息的记录。设备管理模块是其它模块工作的前提,其余模块的运行都是在此模块上运行的。(2)任务管理功能模块任务管理主要负责通信数据包的处理和加工,包含对包的分析并分配,它是通信连接模块的基础。任务管理主要负责各个通道的状态控制和数据传输。所有的上层数据传输任务都将分配到这些任务开启的通道操作中。各个通道的操作是并行的,每个光纤通道接口卡可以最多开设128路通道,由任务管理来管理这些通道间的协调工作和通道本身的执行流程。(3)通信连接管理功能模块通信连接管理模块是光纤卡软件的主体部分,它处理用户最关心的通信数据包,分为通信部分和连接部分。其中连接部分包括建立通道命令、确认通道建立、发送数据命令、关闭通道命令、获取APID命令,这是发送与接收数据前的准备工作,在此工作过程中,调用设备管理模块对建立通道信息进行记录。通信部分包括主、从模式下注册服务、注册服务响应、服务参数、服务参数响应、FCP_CNTL、FCPDataIU、FCPResponseIU等通信单元的封装、组织发送、接收、解封等通信处理功能,是整个协议通信的核心,只有在设备管理模块和任务管5理模块良好的工作时,通信连接模块才能正常工作。通信和连接管理负责协议底层操作封装为光纤卡固件可以执行的命令块操作以完成通信与连接过程。同时监控这些通信过程,并向上层提供可靠通信服务。FCLP协议通信系统以FCP提供的5个标准SCSI命令实现所有的通信。(4)错误处理模块错误处理模块穿插于前三个模块之中,其它所有模块产生的错误都要交给错误处理模块进行相关的处理,包括提示错误并进行恢复,从而保证其它模块正常工作。错误处理在整个系统得各个环节都进行错误监控,针对发生的各种错误进行分类处理,并最终反馈调用者。错误被分为参数错误、资源分配错误、超时错误、设备状态错误、网络连接错误五类向上层汇报。3.2.1.2FCLP协议软件框架设计PMC光纤通讯卡软件框架设计根据功能划分,主要包括如下四个方面的设计,如图3-4。图3-4PMC光纤通讯卡软件框架设计6(1)设备管理设计负责在打开和关闭驱动过程中,为应用分配和销毁系统资源,创建整个软件系统的基础lp_device_t结构体。在lp_open_driver函数中打开光卡设备,取得设备指针;对结构体进行初始化工作,为lp_device_t结构体分配地址空间,初始化成员变量;创建任务管理所需的三个队列。在lp_close_driver函数中关闭光卡设备;释放lp_device_t结构体的地址空间;销毁任务管理的三个队列。设备管理是整个光卡软件的基础,完成对系统资源整体调度的功能。(2)任务管理设计通过对三个handle队列的管理实现对应用中所有任务的管理。应用中的每个任务都由一个handle结构体唯一标识,handle结构体中包含本地的访问节点号、通道号以及任务类型码等。在设备管理模块为空闲分配32个handle资源,并将处理队列和结果队列初始化为空队列。进行一次通信任务时,用户递交命令(调用对应的接口函数)。接口函数从空闲队列中申请一个空的handle结构体,将命令类型、访问号以及通道号等信息填充到handle结构体中,任务管理负责将创建好的handle结构体递交下层发送,并强其加入到处理队列中,表示此次任务在处理过程中;当光卡固件返回中断时,中断服务程序将中断信息转移到中断处理队列中,并调用FCLP处理例程,通过handle结构体区分任务是否完成,并将已完成的handle结构体加入到结果队列中(未完成的继续进行处理);任务管理从结果队列中取出处理结果并将处理结果递交给接口函数,同时将handle结构体清除,释放到空闲队列中已备继续使用。接口函数处理任务管理返回的结果信息并提交给用户。至此,一次通信任务完成。任务管理是通信系统的神经中枢,协调、管理并监控整个通信过程。(3)通信与连接管理设计负责在用户使用初期创建用户指定的APID,在通信结束时删除用户指定的APID,发送获取APID请求、建立通道请求、发送数据请求以及关闭通道请求。通信与连接管理构建了FCLP协议通信的框架。(4)错误管理设计负责对参数的合法性进行检查,对通信中的超时错误、连接错误进行相应的处理。73.2.1.4.1通道连接的建立根据FCLP协议通信原理,建立Channel需要发送两个命令来完成,第一个命令为FCLP_SETUP_CHAN_CMD,该命令是一个写命令,用于主端向从方发送自己的设备Channel信息;第二个命令为FCLP_SETUP_CHAN_ACK_CMD,该命令是一个读命令,用于主端获取从端的相关设备Channel信息。每个命令的处理过程都是要主从双方通过底层光纤通道网卡和FCLP光纤网络实现的。而对于命令的内部处理过程,可以划分更具体的步骤来完成。对于第一个FCP写命令,主端FCLP协议处理层首先根据FCP写命令和FCLP协议需要的APID和Channel等信息组织构造CommandEntryIOCB结构然后把组织好的IOCB通过底层接口,交付给光卡,光卡内部通过请求队列进行本次命令处理,剩下的过程,一直到命令成功返回或者命令失败都是由光卡内部完成的;光卡处理完本次命令结果后,通过中断的方式告知FCLP协议层当前命令的完成状态和结果,FCLP协议层根据通信逻辑进行后续操作。而在命令处理的过程中,从端的FCLP需要做更多的工作,当从端光卡固件收到FCP_CMD后,会把FCP_CMD命令分析组装成AcceptTargetI/O(ATIO)Type2IOCB并放入响应队列,中断通知FCLP协议处理层来处理;FCLP协议层会解析ATIO内容,根据解析结果组成CTIOIOCB交给固件请求队列继续后续操作,固件处理CTIOIOCB后,光卡底层发送FCP_XFER_RDYIU;从端FCLP协议实体会处理下次中断,来查看刚才CTIOIOCB的完成状态,根据完成状态要底层固件发送不同的FCP_RSPIU给主端。对于第二个命令的处理与此类似。具体流程如下图3-5所示。8图3-5通道建立详细步骤根据上述对通道建立内部过程的分析,进行了具体上层接口函数和内部功能调用函数的设计。(1)主端的主要函数设计如下:lp_setup_chan():此函数为应用接口函数。供主端应用与从端应用建立channel时使用,是一个阻塞调用函数,它将等待以下事件发生:1.得到建立ChannelACK;2.发生超时。每个APID最多有8个Channel,如果要再建立channel,必须新建APID。若此函数成功完成,则返回创建成功的本地通道号(channum)。lp_SendSetupChanCmd():此函数为内部功能函数。该函数用于发送建立通道过程中第一个命令,即建立通道命令(FCLP_SETUP_CHAN_CMD)的功能,命令码为Hex’E0’;lp_RecvSetupChanRsp():此函数为内部功能函数。建立通道过程中的第一个命令即建立通道命令(FCLP_SETUP_CHAN_CMD)被从端处理完后,从端返回9RSP信息,该命令用于处理命令完成的中断,并分析RSP信息。lp_SendSetupChanAckCmd():此函数为内部功能函数。在建立通道过程中需要发送两个命令,该函数用于发送第二个命令,即确认建立通道命令(FCLP_SETUP_CHAN_ACK_CMD)的功能,命令码为Hex’E1’;lp_RecvSetupChanAckRsp():此函数为内部功能函数。建立通道过程中的第二个命令即确认建立通道命令(FCLP_SETUP_CHAN_ACK_CMD)被从端处理完后,从端返回RSP信息,该命令用于处理命令完成的中断,并分析RSP信息。(2)从端的主要函数设计如下:lp_waitfor_chan():此函数为上层应用接口函数。它用于从端(target)建立与主端的虚拟通道(对应于initiator的lp_setup_chan())。Receiver通过此函数来告知发送者自身的接收数据能力。函数最终会返回一个ACK给发送端,以指示channel建立可以使用;或者超时退出。若此函数成功完成,则返回创建成功的本地通道号(channum)。lp_RecvSetupChanCmd():此函数为内部功能函数。在建立通道过程中需要发送两个命令,该函数用于从端接收并处理主端发送过来的第一个命令,即建立通道的命令,命令码为Hex’E0’,命令类型是FCLP_SETUP_CHAN_CMD;lp_RecvSetupChanData():此函数为内部功能函数。用于在建立通道过程中接收主端发送给从端的各种APID和地址连接信息,并调用其它内部函数回送本地APID和通道连接信息。lp_RecvSetupChanAckCmd():此函数为内部功能函数。在建立通道过程中需要发送两个命令,该函数用于接收并处理第二个命令,即确认建立通道命令(FCLP_SETUP_CHAN_ACK_CMD)的功能,命令码为Hex’E1’;在底层光纤通道网卡接口的基础上,依赖于中断服务例程,主从双方按FCLP协议的通信规则建立虚拟通道。设计的各个功能函数的调用顺序是按channel建立的流程依次调用的,具体调用过程按图3-6所示。10图3-6通道建立过程的函数调用3.2.1.4.2通道连接的拆除通道连接关闭的实现过程是通过API函数lp_close_chan()来实现的,对于关闭通道的命令,它发送的FCP命令为FCLP_CLOSE_CHAN_CMD类型,该命令为FCP控制命令。对于一个已经建立成功的通道连接,通道两端均可以发起关闭通道的命令,也可以两端同时发起关闭通道的命令,按时间最先被处理的命令来完成关闭通道的任务。发起关闭通道命令的一方为主端,从端接收到该命令的光卡硬件向FCLP协议层进行中断通知,中断服务例程调用FCLP协议处理功能例程,FCLP协议处理功能进行分析处理,判断能否完成关闭Channel的操作,如果现在channel正处在数据收发的过程中,则返回设备忙的消息通知主端暂时不能关闭channel;如果channel处在空闲中状态,则从端调用内部函数lp_ClearChan()先清理本地channel资源,然后应答成功关闭的消息给主端,主端在收到成功的应答消息后也清理本地资源,然后返回给API函数lp_close_chan()报告channel关闭成功。具体函数调用流程如图3-7所示。11图3-7通道拆除过程的函数调用3.2.1.5数据收发管理设计3.2.1.5.1数据收发的过程管理依据FCLP协议数据传输模型,在FCLP网络中两终端节点进行数据的收发依赖于先前建立好的APID和Channel,数据传输所需要的地址信息是上述两者的信息组合。数据通信的发送端为主端,接收端为从端。在FCLP数据通信中,主从双方最基础的通信方式是同步式通信,即首先从端进入阻塞等待状态,从端可以在某一固定时间内等待主端发送数据;主端调用底层光卡的硬件接口发送数据,根据光纤通道网卡的队列I/O机制,主端构造一个与发送数据的命令对应的CommandEntryIOCB控制块,把该命令控制块提交给光卡固件的请求队列,由光卡固件发送命令和数据,这是写数据的FCP操作。FCLP协议处理层构造CommandEntryIOCB控制块时,会把主从端要求APID和Channel的地址信息、上层用户交给FCLP协议层要发送给从端的数据缓冲和数据长度填入CommandEntryIOCB控制块中,封装了完整信息的CommandEntryIOCB控制块被交给光卡固件的请求队列。在底层光卡固件和中断服务例程的支持下,主从两端对等的FCLP协议实体按照FCPI/O操作的写流程,进行数据包的传输管理。12根据FCLP协议数据传输的流程进行了具体的功能函数的设计,其中关键的主端和从端函数设计如下:(1)主端的主要函数设计lp_send():为上层应用接口函数。函数通过Channel调用FCLP_SEND_DATA_CMD命令发送数据并监控发送的数据量(不能超过接收者的接收限制)。函数内部通过中断服务和光卡固件完成一个完整的FCP写操作。数据发送成功该函数会返回成功信息。lp_recvSendDataRsp():此函数为内部功能函数。主端向从端发送写操作FCP命令,从端按FCP写操作处理完毕后,从端返回RSP信息,主端FCLP协议层会调用此函数接收处理RSP信息。(2)从端的主要函数设计lp_receive():此函数为上层应用接口函数。本函数用于同步接收(blocking)。仅供从端将接收到的数据通过FCLP协议层交给上层用户。接收数据结束、buffer已满或者channel被发送者关闭的情况下函数将退出。lp_RecvSendDataCmd():此函数为内部功能函数。用于接收命令FCLP_SEND_DATA_CMD,分析命令完成下一步操作。lp_SendSendDataXfer():此函数为内部功能函数。在FCP写交换流程中,从端根据写命令(FCLP_SEND_DATA_CMD)需要向主端发送FCP_XFER_RDYIU,该函数即完成发送此IU信息。lp_SendSendDataRsp():此函数为内部功能函数。用于向主端反馈本次本次写操作完成的状态信息,向主端发送FCP_RSPIU信息。主从端关键功能函数的执行流程如图3-8所示。13图3-8数据收发函数调用流程3.2.1.5.2数据收发的模型根据本光纤卡的硬件结构设计,为了提高数据收发的效率,本系统采用的是非阻塞式数据收发模式,因为在数据发送端,主机先向PPC发出发送数据命令,然后向QDR中写入数据,则主机对QDR的数据写入和FC-2固件从QDR读数据并成数据帧可以并行操作,提高了主机发送数据时系统带宽利用率。同样在数据接收端,PPC首先通知主机接收数据,然后FC-2固件向QDR写入数据和主机从QDR读取数据可以并行执行,提高了主机接收数据时的通信带宽利用率。数据收发是建立在主从两端已经在各自的APID上建立好虚拟通道的前提下进行的,由apnum和chnum标识该虚拟通道。主端主机调用lp_send()函数,向PPC发出发数命令,然后启动DMA向QDR里写入数据,FC-2固件接收到发数命令后,检测到QDR中有数据到来,则开始成读取QDR中数据,并成数据帧向从端光卡发送数据,在发完第一帧数据后,通知从端光卡PPC已有数据写入QDR中,PPC将此信息上报给主机,则主机开始读取QDR中数据,FC-2固件继续成数据帧向从端光卡写入数据,实现主机读取QDR和FC-2固件写入14QDR的并行化执行。3.2.2FC-FS协议的实现FC-FS协议包含了对FC-1,FC-2,FC-3功能的定义,光纤端口在利用上层协议(ULP)进行通信之前,端口间必须协商好FC协议传输所采用的参数,建立传输环境。光纤通道的传输环境的建立是通过F端口登录和N端口登录完成的。3.2.2.1端口注册描述3.2.2.1.1F端口注册实现1、F端口注册(1)简介对所有N端口来说,不管它支持哪种服务类型,F端口注册是要求完成的。只有当F端口注册完成以后,N端口才会尝试与其它N端口进行通信。F端口注册完成如下几项功能:(a)判别是否存在交换机(b)如果交换机存在,它(F端口注册)将向N端口提供与整个交换机相关的详尽的操作特性参数,F端口名字和交换机名字(c)如果交换机存在,它(F端口注册)将向交换机提供详尽的操作特性参数,N端口名字和N端口节点名字(d)如果交换机存在,交换机可以选择分配N_Port_ID或者对发起注册的N_Port_ID进行确认(对净荷内容确认)(e)如果交换机存在,它(F端口注册)将要初始化buffer-to-bufferCredit。2、显式F端口注册(1)简介显式F端口注册需要N端口发出一个F端口注册的链路服务ELS。显式F端口注册将会替换以前的服务参数。注册过程将遵循交换和序列管理规则。一个序列中的帧将根据R_RDY原语信号,ACK,还有Link_Response规则15进行操作。(2)显式F端口注册请求N端口会在一个新交换中发出FLOGI。FLOGI的载荷包括N端口服务参数,一个64-bit的Nx_port名字N_Port_Name,一个64-bit节点名字。服务参数在15.6节介绍。用于交换机注册的服务参数应用在表216和221中给出。N端口要分配一个OX_ID并且要设置D_ID为F端口公共地址(hex’FFFFFE’).如果N端口是为确定的,那么N端口需要将FLOGI中的S_ID设置为hex’000000’或者是hex’0000YY’.如果N端口将S_ID设置为hex’000000’那么N端口请求交换机完全分配24位N_Port_ID。如果N端口将S_ID设置为hex’0000YY’,那么N端口请求交换机分配高16位的值,第23位到第8位,保留N_Port_ID低8位的值。(3)显式F端口注册的响应当N端口发出FLOGI后,可能接收到如下几种响应:a)LS_ACC回复序列,其OX_ID等于FLOGI的OX_ID,公共服务参数N_Port/F_Port位被设置为1(证明是Fx_Port)——这是对F端口注册请求的正常响应。LS_ACC序列的D_ID就是由交换机分配的N_Port_ID。如果FLOGI中的S_ID是hex’000000’,则分配的D_ID将会是hex’XXXXXX’,如果FLOGI中的S_ID是hex’0000YY’,则分配的D_ID将会是hex’XXXXYY’.如果FLOGI中的S_ID是hex’XXXXXX’,则分配的D_ID将是同样的值hex’XXXXXX’.载荷将包括完整的交换机服务参数,64-bit的F_Port_Name和64-bit的Fabric_Name。b)LS_ACC回复序列,其OX_ID等于FLOGI的OX_ID,公共服务参数N_Port/F_Port位被设置为0(证明是Nx_Port)——指明是与另外一个N端口的点对点的连接。LS_ACC序列的D_ID就是FLOGI的S_ID。LS_ACC的载荷将对FLOGI的各类型服务参数标记无效,载荷中包含被连接N端口64-bit的N_Port_Name和一个64-bit的Node_Name.如果收到的N_Port_Name小于本地N端口的N_Port_Name,则本地Nx_Port发起N_PortLogin。如果收到的N_Port_Name大于本地N端口的N_Port_Name,则本地Nx_Port等待与之连接的N_Port发出PLOGI。c)F_BSY,其OX_ID等于FLOGI的OX_ID。其D_ID是FLOGI的S_ID。此回复用以16指示Fabric忙,则本地Nx_Port可以延迟某时间后重新发出FLOGI。d)P_BSY序列,其OX_ID等于FLOGI的OX_ID。其D_ID是FLOGI的S_ID。用以指示是本地Nx_Port与另一个Nx_Port的点对点的连接,且另一Nx_Port现在正忙。则本地Nx_Port将会延迟一段时间等待目的端Nx_Port不忙后继续发起N_PortLogin。e)F_RJT序列,其OX_ID等于FLOGI的OX_ID。其D_ID是FLOGI的S_ID。此序列指示Fabric已经拒绝了FLOGI请求。载荷中包含了拒绝的原因码,此原因码决定了Nx_Port的后续的操作。如果原因码是“类型不被支持”,则Nx_Port可按照另一不同的服务类型发起一个FLOGI。如果原因码是“无效的S_ID”,则Nx_Port可用另一不同的S_ID发起一个FLOGI。(A)如果被拒绝的FLOGI的S_ID是hex‘000000’或者hex‘0000YY’,则Nx_Port可以选择一个24-bit的值,hex‘XXXXXX’作为它的N_Port_ID并将其作为S_ID发起一个FLOGI。(B)如果被拒绝的FLOGI的S_ID是hex‘XXXXXX’,则Nx_Port可以选择一个值,hex‘XXXXXX’或者hex‘0000YY’或者一个新的值hex‘XXXXXX’作为它的N_Port_ID,并将其作为S_ID发起一个FLOGI。如果拒绝序列中的原因代码是其它的原因代码,则Nx_Port将根据情况作出相应的响应f)P_RJT序列,其OX_ID等于FLOGI的OX_ID。其D_ID是FLOGI的S_ID。此序列指示此Nx_Port是与另一个Nx_Port的点到点的连接。包含于载荷中的原因代码决定了此Nx_Port的后续操作。如果原因代码是‘类型不支持’,则此Nx_Port可按照与FLOGI不同的另一种服务类型发起一个N_Port_Login。对于其它原因码,Nx_Port应该根据情况作出相应的响应。g)FLOGI序列。此序列指示本地N端口是与另一个Nx_Port的点对点的连接。序列载荷包括被连接节点的64-bit的N_Port_Name和64-bit的Node_Name。如果接收到的N_Port_Name小于本地N_Port_Name,则Nx_Port接着要执行N_PortLogin。如果接收到的N_Port_Name大于本地N_Port_Name,则Nx_Port等待来自互连接点的PLOGI。h)LS_RJT序列,其OX_ID等于FLOGI的OX_ID。LS_RJT的D_ID是由Fabric分配的N_Port_ID。如果FLOGI中的S_ID是hex‘000000’,则D_ID将是17hex‘XXXXXX’,如果FLOGI中的S_ID是hex‘0000YY’,则D_ID将是hex‘XXXXYY’。如果FLOGI中的S_ID是hex‘XXXXXX’,则D_ID将是hex‘XXXXXX’。包含在载荷中的原因代码决定了Nx_Port的处理操作。Nx_Port可以基于原因码选择服务参数并发起一个新的FLOGI。i)无反应。这指示出是发生了传输错误,也就是物理层上的传输错误。则Nx_Port将执行一个错误恢复,恢复完后,此Nx_Port可再发起一个新的FLOGI。j)如果接收到的N_Port_Name等于本地N_Port_Name,那么此Nx_Port是与自己连接了,此FLOGI在此不作考虑。3.2.2.1.2N端口注册实现1、N端口注册(1)简介紧随着FabricLogin之后是N_PortLogin。N_PortLogin主要完成如下功能:a)提供每一个Nx_Port与其它Nx_Port的操作特性参数,N_Port_Name和Node_Name。b)如果Fabric不存在,N端口注册程序将会为两个Nx_Port分配N_Port_ID。c)也许还有初始化end-to-endCredit。d)如果在点到点拓扑中的Nx_Port间或者同一个环拓扑中的NL_Port间,需要初始化buffer-to-bufferCredit。当两个N端口都相互接收到了对方的服务参数后,N_PortLogin就完成了。N_PortLogin有显式和隐式两种注册方式。N端口需要与其期望通信的每一个N端口进行N_PortLogin,包括与保留的和公共的地址识别符的N_PortLogin,因为这些地址也被认为是Nx_Port。2、显式N端口注册显式N_PortLogin过程需要一个Nx_Port传输一个PLOGI链路请求序列。显式N_PortLogin将替代以前的服务参数。18(1)Fabric存在时的N端口注册目的端Nx_Port显式注册程序要求传输一个N_PortLogin(PLOGI)链路服务序列。PLOGI在一个交换中被发出,要为此交换分配OX_ID、目的端Nx_Port的D_ID和发起端Nx_Port的S_ID。序列载荷包含PLOGI注册序列发起端Nx_Port的服务参数、N_Port_Name和Node_Name。目的端Nx_Port对PLOGI链路服务序列的正常响应序列是在同一个交换中回应一个LS_ACC链路响应序列。此序列的OX_ID是注册序列的OX_ID,RX_ID是由响应端分配的,D_ID是发起端的N_Port_ID,S_ID是响应端的N_Port_ID。LS_ACC的载荷包含响应端Nx_Port的服务参数。(2)Fabric存在情况下的N端口注册响应在Fabric存在的情况下,Nx_Port发出PLOGI后可能接收到的响应如下:a)LS_ACC回复序列,其OX_ID等于PLOGI的OX_ID,公共服务参数N_Port/F_Port位被设置为0(证明是Nx_Port)——这是对N端口注册请求的正常响应。LS_ACC序列的D_ID就是PLOGI的S_ID,LS_ACC序列的S_ID就是PLOGI的D_ID。LS_ACC的载荷将包括目的端N端口的服务参数,64-bit的N_Port_Name和64-bit的Node_Name。此Nx_Port可以与远端N_Port开始正常的通信。b)F_BSY,其OX_ID等于PLOGI的OX_ID,D_ID就是PLOGI的S_ID。说明Fabric正忙,此Nx_Port将会在延迟后重试PLOGI。c)F_RJT序列,其OX_ID等于PLOGI的OX_ID,D_ID就是PLOGI的S_ID。说明Fabric已经拒绝了PLOGI请求。包含在载荷中的原因代码决定了Nx_Port的操作处理。如果原因代码说是无效的D_ID,则N_Port不能与被寻址的Nx_Port完成N_PortLogin,则Nx_Port将尝试登录注册其它目的Nx_Port。对于其它的原因代码,Nx_Port将根据代码进行相应的响应。d)P_BSY序列,其OX_ID等于PLOGI的OX_ID,D_ID就是PLOGI的S_ID。说明目的端Nx_Port正忙,此Nx_Port延迟一段时间后将重试PLOGI。e)P_RJT序列,其OX_ID等于PLOGI的OX_ID,D_ID就是PLOGI的S_ID。19包含在载荷中的原因代码决定了Nx_Port的操作处理。如果原因代码是说“类型不支持”,则此Nx_Port将以另一不同的服务类型进行PLOGI,对于其它的原因代码,Nx_Port将根据代码进行相应的响应。f)PLOGI序列,其D_ID是正在接收的Nx_Port的N_Port_ID,其S_ID是正在发送的Nx_Port的N_Port_ID,其OX_ID由发起端Nx_Port分配。载荷中要包括PLOGI发起端Nx_Port的64-bit的N_Port_Name和64-bit的Node_Name,这说明存在一个来自于目的端Nx_Port的N端口注册碰撞。如果接收到的N_Port_Name小于正在接收的Nx_Port的N_Port_Name,则Nx_Port通过向发起端Nx_Port发送LS_RJT,序列中包含原因代码,指出登录注册正在进行中。如果接收到的N_Port_Name大于Nx_Port的N_Port_Name,则Nx_Port继续处理接收到的PLOGI。g)LS_RJT序列,其OX_ID等于PLOGI的OX_ID,D_ID就是目的端N端口的N_Port_ID。包含在载荷中的原因代码决定了Nx_Port的操作处理。则此Nx_Port将根据原因代码选择服务参数然后发起一个新的PLOGI。h)无响应。说明发生了传输错误,也就是说发生了物理传输的错误。等错误恢复后,则此Nx_Port可以发起一个新的PLOGI。(3)Fabric不存在时的N端口注册在Nx_Port尝试FabricLogin时,如果Nx_Port发现Fabric不存在,则按照如下步骤进行N_PortLogin。目的端N_Port显式登录注册需要在一个新交换中传输一个PLOGI链路服务序列。目的端Nx_Port显式注册程序要求传输一个N_PortLogin(PLOGI)链路服务序列。PLOGI在一个交换中被发出,要为此交换分配OX_ID、目的端Nx_Port的D_ID和发起端Nx_Port的S_ID。序列载荷包含PLOGI注册序列发起端Nx_Port的服务参数、N_Port_Name和Node_Name。在点对点连接中,只需要其中一个Nx_Port发出一个PLOGI。如果N_Port_Name在Fabric注册时已经互换完毕,则具有最高N_Port_Name的Nx_Port将发出PLOGI序列。如果两端N端口都没有获取互连Nx_Port的N_Port_Name,那么它将发出一个PLOGI。两端N端口在发出PLOGI后还要完成对接收到PLOGI的处理要求,这20样就解决了两个Nx_Port都发出PLOGI的情况。点对点连接中的一个Nx_Port在一个新的交换中发出一个PLOGI,其S_ID应该与其D_ID不同。序列的载荷包括PLOGI序列发起端Nx_Port的服务参数、N_Port_Name和Node_Name。(4)Fabric不存在情况下的N端口注册响应在点对点连接情况下,Nx_Port发出PLOGI后可能接收到的响应如下:a)LS_ACC回复序列,其OX_ID等于PLOGI的OX_ID,公共服务参数N_Port/F_Port位被设置为0(证明是Nx_Port)——这是对N端口注册请求的正常响应。LS_ACC序列的D_ID就是PLOGI的S_ID,LS_ACC序列的S_ID就是目的N端口的N_Port_ID,由PLOGI的D_ID来分配。LS_ACC的载荷将包括目的端N端口的服务参数,64-bit的N_Port_Name和64-bit的Node_Name。这是对N_PortLogin请求的正常响应,此Nx_Port可以与远端N_Port开始正常的通信。b)P_BSY序列,其OX_ID等于PLOGI的OX_ID,D_ID就是PLOGI的S_ID。说明目的端Nx_Port正忙,此Nx_Port延迟一段时间后将重试PLOGI。c)P_RJT序列,其OX_ID等于PLOGI的OX_ID,D_ID就是PLOGI的S_ID。包含在载荷中的原因代码决定了Nx_Port的操作处理。如果原因代码是说“类型不支持”,则此Nx_Port将尝试以另一不同的服务类型进行N_PortLogin,对于其它的原因代码,Nx_Port将根据代码进行相应的响应。d)PLOGI序列,其D_ID是正在接收的Nx_Port的Port_Identifier,其S_ID是序列发起Nx_Port的N_Port_ID,其OX_ID由发起端Nx_Port分配。载荷中要包括PLOGI发起端Nx_Port的64-bit的N_Port_Name和64-bit的Node_Name,这说明本地N端口注册来自于目的端Nx_Port的N端口注册碰撞。如果接收到的N_Port_Name小于正在接收的Nx_Port的N_Port_Name,则Nx_Port通过向发起端Nx_Port发送LS_RJT,序列中包含原因代码,指出登录注册正在进行中。如果接收到的N_Port_Name大于Nx_Port的N_Port_Name,则Nx_Port继续处理接收到的PLOGI。21e)无响应。说明发生了传输错误,也就是说发生了物理传输的错误。等错误恢复后,则此Nx_Port可以发起一个新的PLOGI。f)如果接收到的N_Port_Name等于本地N_Port_Name,那么此Nx_Port是与自己的点到点连接,对此情况不考虑。3.2.3小结本节在分析FC-AE-FCLP协议的基础上,详细划分了系统功能架构、设计了协议软件架构并设计了相关API函数,给出了在典型应用情况下的API函数调用流程。本节简要分析了FC-FS协议的内容,FC-FS协议主要是对FC-1,FC-2,FC-3功能的定义,端口间进行通信前需通过注册以获取操作环境参数,此操作参数集即是按照FC-FS协议给出的。最后详细给出了端口注册的流程以及响应处理措施。3.3基于光卡硬件的PPC软件设计3.3.1硬件连接架构如图3-9所示为PPC嵌入式系统及其外设连接框图图3-9PPC嵌入式系统及其外设连接图22PPC嵌入式系统通过双口RAM分别与下层FC固件和上层用户端主机的PCI协议处理单元相连,其中FC固件主要实现FC-2层的功能,PCI协议处理单元主要用于用户层操作指令和PPC操作请求的交互。PPC嵌入式系统可以同时与多个FC固件(N端口)相连接。其中,每个FC固件需要两个双口RAM,一个用于将FC固件信息的上传PPC,一个用于FC固件接收PPC下传的信息。另外还需要5根GPIO状态及中断线完成PPC与FC固件间信息状态的传递,PPC初始化完成后,通过对GPIOReset线置位触发FC固件完成链路初始化,FC固件通过GPIO链路状态线向PPC传递底层链路状态,链路有效时PPC才可以进行相关操作,当底层链路状态变化或FC_PPC_RAM中有数据写入时,FC固件通过GPIO中断线触发PPC中断处理,PPC通过对FC_PPC_RAM状态线和PPC_FC_RAM状态线的置位和清零告知FC固件当前FC_PPC_RAM和PPC_FC_RAM的满状态和空状态。PPC嵌入式系统与用户端PCI协议处理单元通过两个双口RAM和一根GPIO中断线相连接。其中,一个用于将PPC信息上传给用户端主机,一个用于PPC接收用户端主机下传的信息。当PPC将上传信息写入PPC_PCI_RAM后,通过此GPIO信号线采用中断的方式通知用户端主机读取信息。PPC嵌入式系统外挂一个Flash存储器和一个DDR2存储器。其中,Flash存储器用于存储FPGA系统的硬件加载文件(.mcs文件,由.bit文件转化)和PPC的软件程序(.srec文件,由.elf文件转化)。DDR2用作PPC的内存。233.3.2PPC软件设计如图3-10所示为基于队列的FC-4层软件整体控制架构图3-10FC-4软件整体控制架构243.3.2.1PPC软件工作机制PPC软件基于队列机制实现控制与处理功能。软件系统设计了4个队列,分别是用于存储主机PCI到PPC信息的请求队列(pci_ppc_req_que)、用于存储PPC到主机PCI信息的结果队列(ppc_pci_res_que)、用于存储PPC到FC固件信息的结果队列(ppc_fc_res_que)以及用于存储FC固件到PPC信息的请求队列(fc_ppc_req_que)。PPC软件循环于图1所示粉色和绿色两个环路中。a)粉色环路工作机制:此环路主要通过查询与响应中断的方式完成PPC与主机PCI接口、PPC与FC固件的信息交互。环路根据中断状态和各个双口RAM的查询结果以决定后续处理。进入软件主循环后,PPC对FC_PPC_RAM的读取操作采用中断与查询的方式。FC固件将数据写入FC_PPC_RAM后会触发中断通知PPC读取,PPC首先将FC_PPC_RAM状态线置位以禁止FC固件写FC_PPC_RAM,然后PPC查询fc_ppc_req_que是否处于满状态,若不满则将FC_PPC_RAM中数据读出并按照规定格式写入对列fc_ppc_req_que,然后将FC_PPC_RAM清空并将FC_PPC_RAM状态线清零允许FC固件的写入;若队列fc_ppc_req_que已满,则软件不作处理继续后续的循环。PPC查询FC_PPC_RAM,若此双口RAM中有数据,则PPC将查询队列fc_ppc_req_que是否已处于满状态,若不满则将FC_PPC_RAM中数据读出并按照规定格式写入队列fc_ppc_req_que,然后清空FC_PPC_RAM并将FC_PPC_RAM状态线清零允许FC固件的写入;若队列fc_ppc_req_que已满,则软件不作处理继续后续的循环。PPC查询PCI_PPC_RAM,若此双口RAM中有数据,则PPC将查询队列pci_ppc_req_que是否已处于满状态,若不满则将PCI_PPC_RAM中数据读出并按照规定格式写入队列pci_ppc_req_que,然后清空PCI_PPC_RAM;若队列pci_ppc_req_que已满,则软件不作处理继续后续的循环。若此双口RAM中没有数据,则软件不作处理继续后续的循环。25PPC查询PPC_PCI_RAM,若此双口RAM为空,则PPC将查询队列ppc_pci_res_que是否处于空状态,若非空则将队列ppc_pci_res_que中元素数据读出并按照规定格式写入PPC_PCI_RAM中,然后触发PCI中断以通知主机端读取;若队列ppc_pci_res_que处于空状态,则软件不作处理继续后续的循环。若此双口RAM非空,则软件不作处理继续后续的循环。PPC查询PPC_FC_RAM,若此双口RAM为空,则PPC首先将PPC_FC_RAM状态线清零。然后PPC将查询队列ppc_fc_res_que是否处于空状态,若非空则将队列ppc_fc_res_que中元素数据读出并按照规定格式写入PPC_FC_RAM中,并将PPC_FC_RAM状态线置位以通知FC固件读取;若队列ppc_pci_res_que处于空状态,则软件不作处理继续后续的循环。若此双口RAM非空,则软件不作处理继续后续的循环。b)绿色环路工作机制:此循环主要是在查询软件系统内几个队列的基础上,根据空满状态作相应处理。PPC查询FC到PPC的请求队列fc_ppc_req_que是否为空,若为空,则不作处理继续后续的循环。若不为空,则查询队列ppc_fc_res_que和ppc_pci_res_que是否都处于非满状态,若都处于非满状态,则按顺序读出队列fc_ppc_req_que的元素数据进行处理,处理结果要保存到队列ppc_fc_res_que或ppc_pci_res_que之中;若队列ppc_fc_res_que和ppc_pci_res_que有一个处于满状态或两者都处于满状态,则软件不作处理继续后续循环。PPC查询PCI到PPC的请求队列pci_ppc_req_que是否为空,若为空,则不作处理继续后续的循环。若不为空,则查询队列ppc_fc_res_que和ppc_pci_res_que是否都处于非满状态,若都处于非满状态,则按顺序读出队列pci_ppc_req_que的元素数据进行处理,处理结果要保存到队列ppc_fc_res_que或ppc_pci_res_que之中;若队列ppc_fc_res_que和ppc_pci_res_que有一个处于满状态或两者都处于满状态,则软件不作处理继续后续循环。PPC查询PPC到PCI的结果队列ppc_pci_res_que是否为空,若为空,则不作处理继续后续的循环。若队列ppc_pci_res_que不为空,则查询PPC_PCI_RAM是否为空,若为空,则将队列pci_ppc_res_que中元素按顺序读出并写入PPC_PCI_RAM,然后中断通知主机端PCI读取;若PPC_PCI_RAM不为空,则26软件不作处理继续后续循环。PPC查询PPC到FC的结果队列ppc_fc_res_que是否为空,若为空,则不作处理继续后续的循环。若队列ppc_fc_res_que不为空,则查询PPC_FC_RAM是否为空,若为空,则将队列ppc_fc_res_que中元素按顺序读出并写入PPC_FC_RAM,然后将PPC_FC_RAM状态线置位通知FC-2读取;若PPC_FC_RAM不为空,则软件不作处理继续后续循环。3.3.2.2PPC函数设计与说明3.3.2.2.1结构体变量设计与说明此PPC软件根据FC-AE-FCLP协议要求,为方便软件的设计和管理特设计了几个结构体变量,现介绍如下。3.3.2.2.1.1注册过程管理与结构体设计端口信息管理:一、本端端口信息管理;二、远端端口信息管理3.3.2.2.1.1.1本地端口信息管理结构体设计:structport_info{unsignedintLocal_Port_Name_Hi;unsignedintLocal_Port_Name_Lo;unsignedintN_Port_Name_Hi;unsignedintN_Port_Name_Lo;unsignedintNode_Name_Hi;unsignedintNode_Name_Lo;unsignedintPort_ID;unsignedintCom_SerPara[2];unsignedintCom_SerPara_FLOGI;unsignedintCom_SerPara_PLOGI;unsignedintCom_SerPara_E_D_TOV;unsignedintCl1_SerPara[4];unsignedintCl2_SerPara[4];unsignedintCl3_SerPara[4];27unsignedintCl4_SerPara[4];};此结构体中,包含本端Port_Name、Node_Name、Port_ID、公共服务参数以及端口所支持的服务类型服务参数。此结构体主要用于管理本地端口的信息,在端口间注册阶段,本端口将这些本端口信息与对方端口进行握手,建立两个端口间的FC-2层协议间的协商。然后在约定好的参数下完成数据在FC-2层的成帧、传输和解帧等。在底层FC-2硬件支持下,这些端口参数可以进行灵活的修改、配置以满足不同需求。3.3.2.2.1.1.2远端端口信息管理结构体设计:structport_info{unsignedintLocal_Port_Name_Hi;unsignedintLocal_Port_Name_Lo;unsignedintN_Port_Name_Hi;unsignedintN_Port_Name_Lo;unsignedintNode_Name_Hi;unsignedintNode_Name_Lo;unsignedintPort_ID;unsignedintCom_SerPara[2];unsignedintCom_SerPara_FLOGI;unsignedintCom_SerPara_PLOGI;unsignedintCom_SerPara_E_D_TOV;unsignedintCl1_SerPara[4];unsignedintCl2_SerPara[4];unsignedintCl3_SerPara[4];unsignedintCl4_SerPara[4];};此结构体中,包含远端Port_Name、远端Node_Name、远端Port_ID、本端Port_Name、公共服务参数以及远端端口所支持的服务类型服务参数。根据协议规定,一个本端端口可以最多与16个远端端口建立注册链接,所以设计分配了16个远端端口结构体变量用于存储与本地端口建立注册链接的远端端口的端口信息。每次端口注册完成后,本地端PPC都将获取到远端端口的信息,则本地PPC将远端端口的信息保存到空的远端端口结构体变量中。当有超过16个端口28与本地端端口建立注册链接关系时,返回错误信息。3.3.2.2.1.1.3FLOGI及FLOGILS_ACC结构体structFLOGI_LSACC_table{unsignedintinfo_type;unsignedintinfo_length;unsignedintD_ID;unsignedintS_ID;unsignedintROX_ID;unsignedintLSS_Command;unsignedintFCPH_BtoB;unsignedintCF_BB_RE;unsignedintR_A_TOV;unsignedintE_D_TOV;unsignedintN_Port_Name_Hi;unsignedintN_Port_Name_Lo;unsignedintNode_Name_Hi;unsignedintNode_Name_Lo;unsignedintCla1_SO_IC;unsignedintCla1_RC_resev;unsignedintCla1_resev_TCS_EtoE;unsignedintCla1_resev_ES_resev;unsignedintCla2_SO_IC;unsignedintCla2_RC_resev;unsignedintCla2_resev_TCS_EtoE;unsignedintCla2_resev_ES_resev;unsignedintCla3_SO_IC;unsignedintCla3_RC_resev;unsignedintCla3_resev_TCS_EtoE;unsignedintCla3_resev_ES_resev;unsignedintCla4_SO_IC;unsignedintCla4_RC_resev;unsignedintCla4_resev_TCS_EtoE;unsignedintCla4_resev_ES_resev;unsignedintVendor_Version[3];};此结构体用来存储FLOGI及FLOGILS_ACC的信息,各信息参数参照FC-FS协议定制。293.3.2.2.1.1.4PLOGI及PLOGILS_ACC结构体structPLOGI_LSACC_table{unsignedintinfo_type;unsignedintinfo_length;unsignedintD_ID;unsignedintS_ID;unsignedintROX_ID;unsignedintLSS_Command;unsignedintFCPH_BtoB;unsignedintCF_BB_RE;unsignedintresev_TCS_roinfo;unsignedintE_D_TOV;unsignedintN_Port_Name_Hi;unsignedintN_Port_Name_Lo;unsignedintNode_Name_Hi;unsignedintNode_Name_Lo;unsignedintCla1_SO_IC;unsignedintCla1_RC_resev;unsignedintCla1_resev_TCS_EtoE;unsignedintCla1_resev_ES_resev;unsignedintCla2_SO_IC;unsignedintCla2_RC_resev;unsignedintCla2_resev_TCS_EtoE;unsignedintCla2_resev_ES_resev;unsignedintCla3_SO_IC;unsignedintCla3_RC_resev;unsignedintCla3_resev_TCS_EtoE;unsignedintCla3_resev_ES_resev;unsignedintCla4_SO_IC;unsignedintCla4_RC_resev;unsignedintCla4_resev_TCS_EtoE;unsignedintCla4_resev_ES_resev;unsignedintVendor_Version[3];};此结构体用来存储PLOGI及PLOGILS_ACC的信息,各信息参数参照FC-FS协议定制。3.3.2.2.1.2光卡驱动初始化管理与结构体设计结构体设计30structPort_attr{unsignedintPort_Name_Hi;unsignedintPort_Name_Lo;unsignedintfc2_link_state;unsignedintfc2_login_state;};structNode_Info{unsignedintWWN_Hi;unsignedintWWN_Lo;structPort_attrport_attr0;structPort_attrport_attr1;};此结构体中,包含本地光卡WWN、Port_Name、FC2链路状态和端口的注册登录状态。主机调用光卡驱动初始化函数后,光卡将会向主机返回上述信息。3.3.2.2.1.3打开光卡驱动的管理与结构体设计结构体设计:structport_ap_binding{unsignedintPort_Name_Hi;unsignedintPort_Name_Lo;unsignedintPort_ID;unsignedintAPID[16];};structnode_ap_binding{unsignedintWWN_Hi;unsignedintWWN_Lo;structport_ap_bindingport0_ap;structport_ap_bindingport1_ap;};此结构体中,包括光卡的WWN和端口的Port_Name、Port_ID、以及APIDs与端口挂接的情况。主机调用打开光卡驱动管理函数后,光卡将会向主机返回上述信息。313.3.2.2.1.4APIDs绑定管理与结构体设计结构体设计:structport_ap_binding{unsignedintPort_Name_Hi;unsignedintPort_Name_Lo;unsignedintPort_ID;unsignedintAPID[16];};structnode_ap_binding{unsignedintWWN_Hi;unsignedintWWN_Lo;structport_ap_bindingport0_ap;structport_ap_bindingport1_ap;};structap_chan_num{unsignedintlocal_apnum;unsignedintlocal_chanum;unsignedintlocal_APID;unsignedintlocal_port_ID;};上述结构体完成APIDs与光卡端口绑定的管理。调用绑定APID的函数后,PPC将APID与指定的端口进行绑定,并为绑定的APID分配apnum和chanum。3.3.2.2.1.5通道建立过程管理与结构体设计3.3.2.2.1.5.1主端通道信息管理结构体设计:structSET_UP_CHAN_INFO_MANG{unsignedintRX_ID;unsignedintOX_ID;unsignedintWWN_Hi;unsignedintWWN_Lo;unsignedintBuffer_size;unsignedintLocal_max_frag_size;unsignedintLocal_Port_ID;32unsignedintLocal_APID;unsignedintLocal_apnum;unsignedintLocal_chanum;unsignedintRemote_max_frag_size;unsignedintRemote_Port_ID;unsignedintRemote_APID;unsignedintRemote_apnum;unsignedintRemote_chanum;};structSET_UP_CHAN_REPORT_IU{unsignedintmax_frag_size;unsignedintlocal_APID;unsignedintlocal_chanum;unsignedintlocal_apnum;unsignedintremote_APID;unsignedintremote_chanum;unsignedintremote_apnum;};此结构体主要包括本地最大缓冲包大小(Local_max_frag_size),本地端口ID(Local_Port_ID),本地APID(Local_APID),本地apnum(Local_apnum),本地chanum(Local_chanum);远端最大缓冲包大小(Remote_max_frag_size),远端端口ID(Remote_Port_ID),远端APID(Remote_APID),远端apnum(Remote_apnum),远端chanum(Remote_chanum)。当通道建立完成以后,PPC软件要完成通道管理,其实就是将建立通道的信息寄存到PPC软件内的结构体变量中,当通过此通道发送数据时,PPC软件通过通道信息完成通道与端口间的映射。并将通道建立信息上报给主端主机,上报的信息存在SET_UP_CHAN_REPORT_IU结构体变量中。3.3.2.2.1.5.2从端通道信息管理从端通道信息管理的结构体设计与管理映射策略与主端类似,不再赘述。3.3.2.2.1.6数据收发过程管理与结构体设计3.3.2.2.1.6.1主端数据发送过程管理结构体设计:33structSEND_DATA_OK_DATA{unsignedintempty_or_full;unsignedintinfo_type;unsignedintstatus;};此结构体主要包括发送数据完成的状态信息,当一包数据传输完毕后,主端PPC会将此信息上传给主端主机。在发送数据时主端PPC解析完命令后,查询通道管理的结构体信息完成虚拟通道到底层端口的映射,然后通过底层端口传输数据。3.3.2.2.1.6.2从端数据接收过程管理结构体设计:structPPC_PCI_DATA_RECEIVE_DATA{unsignedintempty_or_full;unsignedintinfo_type;unsignedintdata_length;unsignedintstatus;};此结构体主要包括数据到来的状态和要接收的数据长度。当从端QDR缓冲存储中有数据被写入后,PPC会收到来自底层FC-2固件的信息,PPC解析出是数据到来的信息后,将此信息上报通知给从端主机以触发从端主机接收数据。3.3.2.2.1.7关闭通道过程管理与结构体设计结构体设计:structPPC_PCI_CLOSE_CHAN_REPORT_DATA{unsignedintempty_or_full;unsignedintinfo_type;unsignedintlocal_chanum;unsignedintlocal_apnum;unsignedintremote_chanum;unsignedintremote_apnum;unsignedintclose_status;};此结构体主要包括通道关闭状态,本地apnum(local_chanum),本地chanum(local_apnum),远端apnum(remote_chanum),远端34chanum(remote_apnum)。PPC接收到主机关闭通道的命令后,查询相应的通道管理结构体,并将相应的结构体清空,则主从两端间的虚拟通道被关闭。同时将关闭通道的状态信息上传给主机端。3.3.2.2.1.8关闭光卡驱动管理与结构体设计主从两端结构体设计与打卡光卡驱动过程的结构体设计相同。PPC接收到主机关闭光卡驱动的命令后,查询并清空相应的结构体变量,则光卡驱动即被关闭。3.3.2.2.1.9获取远端APIDs管理与结构体设计结构体设计:structremote_ap{unsignedintlocal_port_ID;unsignedintremote_port_ID;unsignedintremote_APID[16];};structreturn_APID{unsignedintinfo_type;unsignedintinfo_length;unsignedintD_ID;unsignedintS_ID;unsignedintROX_ID;unsignedintFCP_LUN_Hi;unsignedintFCP_LUN_Lo;unsignedintFCP_CNTL;unsignedintFCP_CDB[2];unsignedintport_ID;unsignedintAPID[16];};前一个结构体主要包括本地Port_ID、远端Port_ID以及远端端口上绑定的APIDs,完成获取APID的命令后PPC将此结构体的信息上传给主端主机。后一个结构体主要用于存储PPC写给FC-2固件的信息单元,此信息单元由PPC解析上端主机命令生成。在执行获取APIDs命令时实现主从光卡PPC间35的握手与通信。3.3.2.2.2main函数设计与说明3.3.2.2.2.1初始化部分主要包括GPIO初始化,外挂双口RAM初始化,队列初始化,结构体变量初始化,全局变量初始化,中断初始化。3.3.2.2.2.2while循环部分主要是通过查询链路状态、查询双口RAM状态、查询几个队列的状态以及响应中断以调用相关的处理函数处理。while循环部分是整个软件的主体控制部分。3.3.2.2.3子函数设计与说明3.3.2.2.3.1中断响应函数主要是对中断的响应,包括禁止中断、响应中断、给出状态、使能中断等操作。3.3.2.2.3.2读双口RAM函数同时也是增加请求队列成员的函数,主要是将双口RAM中数据读出,并按照相应格式写入请求处理队列中。此函数是内部功能函数。函数原型:voidpci_ppc_ram_read(unsignedintbaseaddr)参数说明:baseaddr:要读取的双口RAM的基地址。无返回信息。363.3.2.2.3.3写双口RAM函数同时也是读出结果队列成员的函数,主要是读取结果队列中的函数,并将队列成员按照相应格式写入双口RAM中,并给出GPIO状态标志触发FC固件读取。此函数是内部功能函数。函数原型:voidppc_pci_ram_write(XGpioState_GPIO,unsignedintbaseaddr,structiocbppc_pci_res_que_data);参数说明:XGpioState_GPIO:触发FC2读取双口RAM的GPIO指针baseaddr:要写入数据的双口RAM的基地址ppc_pci_res_que_data:要写入双口RAM中的结果队列元素无返回信息。3.3.2.2.3.4请求队列处理函数读取请求队列中成员,按照要求,对各种类型的队列成员进行相应处理,并将处理结果存入结果队列中。此函数是内部功能函数。函数原型:voidpci_ppc_req_que_handler();无入口参数。无返回信息。3.3.2.2.3.5FLOGI及FLOGILS_ACC函数通过向双口RAM写入注册信息单元,向另一端口发起FLOGI注册,或者向另一端口回复FLOGILS_ACC响应。此函数是内部功能函数。函数原型:voidFLOGI(XGpioGPIO,unsignedintbaseaddr,structport_infolocal_port);37参数说明:XGpioGPIO:触发FC2读取双口RAM的GPIO指针baseaddr:要写入数据的双口RAM的基地址local_port:要写入双口RAM中的端口信息无返回信息。3.3.2.2.3.6PLOGI及PLOGILS_ACC函数根据前端函数处理结果,生成PLOGI及PLOGILS_ACC信息单元,并将信息单元作为结果队列的成员写入到结果队列中。此函数是内部功能函数。函数原型:voidPLOGI(structPLOGI_LSACC_tablePLOGI_table,unsignedintbaseaddr);参数说明:PLOGI_table:PlOGI时写入双口RAM的信息单元包含端口信息baseaddr:要写入数据的双口RAM的基地址无返回信息。3.3.2.2.3.7LP_OPEN_DRIVER函数此函数供上层主机调用,功能是打开光卡。用于将本地APID、本地设备资源等信息写入板卡中供后续函数调用。此函数是与主机的接口函数。函数原型:unsignedintlp_open_driver();无入口参数。返回信息:参看总体方案3.2.4.3中lp_open_driver()返回值信息单元格式所示,包括:WWN,Port0端口名,Port0端口注册状态,Port0端口链路状态,Port1端口名,38Port1端口注册状态,Port1端口链路状态3.3.2.2.3.8LP_CREATE_AP函数此函数供上层主机调用,功能是获取远端光卡的APID并产生APNUM。函数原型:unsignedintlp_create_ap(unsignedintLocal_APID,unsignedintPort_Name_Hi,unsignedintPort_Name_Lo);参数说明:Local_APID:要绑定的本地APIDPort_Name_Hi:本地端口名的高32位Port_Name_Lo:本地端口名的低32位返回信息:参看总体方案3.2.4.3中lp_create_ap()返回值信息单元格式所示,包括:为Local_APID分配的apnum为apnum分配的通道号chanum3.3.2.2.3.9LP_SETUP_CHAN函数此函数供主端上层主机调用,功能是根据已获取的远端APNUM以及本地APNUM建立两个端口间的虚拟通道,并分配通道号CHANNUM。函数原型:unsignedintlp_setup_chan(unsignedintLocal_apnum,unsignedintLocal_WWN,unsignedintRemote_APID,unsignedintLocal_chanum,unsignedintRemote_Port_ID)参数说明:Local_apnum:本地APID所对应的apnumLocal_WWN:本地光卡的WWN39Remote_APID:远端光卡的APIDLocal_chanum:本地光卡为通道分配的通道号Remote_Port_ID:远端端口所对应的Port_ID返回信息:参看总体方案3.2.4.3中lp_setup_chan()返回值信息单元格式所示,包括:通道允许的最大帧:max_frag_size本地APID:Local_APID本地apnum:Local_apnum本地chanum:Local_chanum远端APID:Remote_APID远端apnum:Remote_apnum远端chanum:Remote_chanum3.3.2.2.3.10LP_SEND函数此函数供上层主机调用,功能是根据已建立的虚拟通道,在两个端口间传输数据。函数原型:unsignedintlp_send(unsignedintrequests_fragment_size,unsignedintLocal_apnum,unsignedintLocal_chanum,unsignedintRemote_apnum,unsignedintRemote_chanum,unsignedintRemote_APID,unsignedintTX_buffer_size);参数说明:requests_fragment_size:请求传输数据块大小Local_apnum:本地APID对应的apnumLocal_chanum:本地通道对应的chanumRemote_apnum:远端APID对应的apnumRemote_chanum:远端通道对应的chanum40Remote_APID:远端APIDTX_buffer_size:通道的缓冲区大小返回信息:参看总体方案3.2.4.3中lp_send()返回值信息单元格式所示,包括:光卡发送完PCI端传来的数据后,通知主机端可以继续发送数据,返回信息如下:0xE2:信息类型QDR_data_length:已发送的QDR缓冲区数据长度光卡接收到FC2固件传来的数据后,通知主机端接收数据,返回的信息如下:0xD:信息类型QDR_data_length:需接收的QDR缓冲区中数据长度3.3.2.2.3.11LP_CLOSE_CHAN函数此函数供上层主机调用,功能是根据拆除已建立的虚拟通道,撤销已经分配的通道号CHANNUM。函数原型:lp_close_chan(unsignedintLocal_apnum,unsignedintLocal_chanum,unsignedintRemote_apnum,unsignedintRemote_chanum)参数说明:Local_apnum:本地APID对应的apnumLocal_chanum:本地通道对应的chanumRemote_apnum:远端APID对应的apnumRemote_chanum:远端通道对应的chanum返回信息:参看总体方案3.2.4.3中lp_close_chan()返回值信息单元格式所示,包括:0xE3:执行的命令类型Local_apnum:本地apnum41Local_chanum:本地chanumRemote_apnum:远端apnumRemote_chanum:远端chanumstatus:通道关闭状态。3.3.2.2.3.12LP_DESTORY_AP函数此函数供上层主机调用,功能是撤销已经分配的APID号APNUM,释放APID资源。函数原型:lp_destroy_ap(unsignedintapnum)参数说明:apnum:删除为APID分配的apnum返回信息:参看总体方案3.2.4.3中lp_destroy_ap()返回值信息单元格式所示,包括:0xA5:执行的命令类型status:命令完成的状态apnum:被删除的apnumchanum:本删除的chanum3.3.2.2.3.13LP_CLOSE_DRIVER函数此函数供上层主机调用,功能是关闭光卡驱动、释放光卡资源。函数原型:lp_close_driver();无函数入口参数。返回信息:参看总体方案3.2.4.3中lp_close_driver()返回值信息单元格式所示,包括:0xA3:命令完成状态WWN:本地光卡全球识别名status:关闭状态423.3.2.3典型应用流程描述基于光纤通道的FCLP协议通信系统,通过给上层用户提供一套友好的用户接口来向用户提供FCLP协议通信服务。对于一次典型的应用操作来说,FCLP协议通信网络中的一对通信节点,一方担任主端(Initiator)角色,另一方担任从端(Target)角色。一个完整的操作过程是主从端交互配合来完成的,每一步的操作都可以利用FCLP协议通信系统提供给用户的上层API接口来完成。一次完整的应用主从端大致包含如下的操作步骤:(1)启动设备接口为:lp_open_driver();(2)创建APID接口为:lp_create_ap();(3)建立通道接口为:lp_setup_chan()/lp_wait_for_chan();(4)收发数据接口为:lp_send()/lp_recv();(5)关闭通道接口为:lp_close_chan();(6)删除APID接口为:lp_destroy_ap();(7)关闭设备接口为:lp_close_driver();API详细调用流程图如下图3-11所示:43图3-11FCLP通信系统API函数调用流程44',)


  • 编号:1700877726
  • 分类:标准规范
  • 软件: wps,office word
  • 大小:44页
  • 格式:docx
  • 风格:商务
  • PPT页数:1760256 KB
  • 标签:

广告位推荐

相关标准规范更多>