支持iSCSI读操作和iSCSI烟囱的方法和系统的制作方法

文档序号:7947391阅读:225来源:国知局
专利名称:支持iSCSI读操作和iSCSI烟囱的方法和系统的制作方法
技术领域
本发明的某些实施例涉及网络系统、方法和架构。更具体地说,本发明的某些实施例涉及一种支持iSCSI读操作和iSCSI chimney的方法和系统。
背景技术
受带宽密集型应用的驱动,数据通信技术的革新使网络硬件吞吐量每四年左右即可得到十倍增长。网络性能从每秒10兆比特(Mbps)增长到100Mbps,再增长到现在的每秒1吉比特(Gbps),而10吉比特也已经崭露头角,这些网络性能的增长已经超过了中央处理单元(CPU)的处理能力。为了解决这一两难的问题并释放CPU资源以处理一般的运算任务,将传输控制协议/因特网协议(TCP/IP)功能卸载到专有的网络处理硬件上是一种基本的改进方法。TCP/IP烟囱(chimney)卸载可最大化地将主机CPU资源用于例如吉比特和多吉比特网络中的应用工作负荷。
TCP/IP烟囱卸载提供了一种整体技术,用于将TCP/IP处理成可由专有网络处理控制器硬件和操作系统(OS)处理的任务。TCP/IP烟囱卸载将大多数与TCP/IP相关的任务转发到网络控制器进行处理,从而释放与网络相关的CPU资源的开销。这将提高总体系统性能,并消除和/或减轻系统瓶颈。此外,TCP/IP烟囱卸载技术在服务器的可升级性中扮演了重要角色,从而使下一代服务器满足了当今高速网络的性能标准,如吉比特(GbE)网络。
尽管TCP/IP卸载不是新技术,但是传统的TCP/IP卸载应用是针对特定平台的,而且无法与操作系统的网络堆栈无缝地连接在一起。因此,这些传统的卸载应用是孤立的应用程序,与平台相关,这将严重影响部署。此外,由于无法在操作系统堆栈集成,所以导致在一个服务器上运行两个或多个互不相关的不同TCP/IP应用,从而使系统的管理更加复杂。
TCP/IP烟囱卸载可利用基于PC或基于服务器的平台、相关操作系统(OS)和TCP卸载引擎(TOE)网络接口卡(NIC)来执行。TCP堆栈内置在主机系统的操作系统中。用于执行的硬件卸载和用于控制连接的主机堆栈的结合,使得在保持标准OS TCP堆栈的灵活性和可管理性的同时可得到最佳OS性能。由于降低了CPU的利用,TCP/IP烟囱卸载可大大提高应用的性能。由于TCP/IP烟囱卸载架构在TOE网络堆栈和操作系统网络堆栈之间分割了TCP/IP处理任务,所有网络流量都可通过单个TCP/IP烟囱卸载适配器得到加速,这可使用现有的标准方法进行管理。传统TCP卸载以及TCP烟囱卸载被用于有线和无线通信应用中。
因特网小型计算机系统接口(iSCSI)是基于TCP/IP的协议,用于建立和管理在基于IP的存储设备、主机和客户端之间的连接。ISCSI协议定义了SCSI的传输协议,这在TCP顶层操作并提供了在IP系统中封装SCSI命令的机制。iSCSI协议可用在其中使用了TCP/IP架构的数据存储系统中。
通过将常规和传统方法与如参照附图的本申请下文所述的本发明进行比较,本领域的技术人员可清楚地了解到常规和传统解决方案的其他限制和缺点。

发明内容
一种支持iSCSI读操作和iSCSI烟囱的方法和/或系统,如结合至少一幅附图的说明和/或描述,在权利要求书中有更完整的说明。
本发明的这些及其它优点、特征和创新点,以及示例性实施例的详细信息,从下述说明和附图中将会得到更充分的理解。


图1是可与本发明实施例结合使用的iSCSI存储区网络操作原理的典型系统方框图;图2a是根据本发明实施例的iSCSI发送端应用程序中的iSCSI软件架构的方框图;
图2b是根据本发明实施例的说明iSCSI架构中的控制平面和数据平面间的数据流的方框图;图3是根据本发明实施例的典型iSCSI烟囱的方框图;图4是根据本发明实施例的通过TCP卸载引擎(TOE)进行数据iSCSI卸载的方框图;图5是根据本发明实施例的通过TCP卸载引擎(TOE)执行SCSI读操作中包括的具体步骤流程图;图6是根据本发明实施例的接收端的典型iSCSI烟囱的方框图;图7是根据本发明实施例的用于支持iSCSI烟囱的TCP卸载引擎(TOE)在接收端执行SCSI写操作的具体步骤流程图。
具体实施例方式
本发明的某些实施例涉及一种通过TCP卸载引擎执行SCSI读操作的方法和系统。该方法包括接收从iSCSI端口驱动到TCP卸载引擎的iSCSI读命令。iSCSI读命令可由硬件格式化为TCP片段,进而传送到网络中。该方法可进一步包括接收读取数据的TCP片段并判断该片段是否为iSCSI协议数据单元的第一帧。如果iSCSI缓存已经被写入(post),则已接收得到的TCP片段将被处理,读取的数据将被零复制到iSCSI缓存中,而如果iSCSI缓存未被写入,则将根据对已接收TCP序列号的处理,将读取的数据存放到缓存中。这也适用于其中采用了用于处理iSCSI数据的加强TCP卸载引擎的iSCSI接收端设备。该接收端处于与发送端同等的位置上,且在此使用的iSCSI术语是从发送端的角度来描述的。例如,读命令由发送端发出并到达接收端,该接收端可在协议数据单元中向发送端发送数据,如Dataln PDU。当数据交换(transaction)结束时,该接收端可发送iSCSI状态PDU。
图1是可与本发明实施例结合使用的iSCSI存储区网络操作原理的典型系统方框图。如图1所示,其中给出了多个客户端设备102、104、106、108、110和112,多个以太网交换机114和120,服务器116,iSCSI发送端118,iSCSI接收端122和存储设备124。
多个客户端设备102、104、106、108、110和112可包括适当的逻辑、电路和/或代码,适用于来自服务器116的特定服务,且可作为整个传统的基于IP的数据处理LAN的一部分,例如,与服务器116连接的LAN。服务器116可包括适当逻辑和/或电路,可与基于IP的存储区域网络(SAN)相连,而SAN与IP存储设备124相连。服务器116可处理来自客户端设备的请求,这些请求可能需要访问IP存储设备124中的特定文件信息。以太网交换机114可包括适当逻辑和/或电路,所述电路与基于IP的LAN和服务器116相连。iSCSI发送端118可包括适当逻辑和/或电路,用于接收来自服务器116的特定SCSI命令,并将这些SCSI命令封装到TCP/IP数据包中,这些数据包可嵌入到以太网帧中并通过交换或路由SAN存储网络发送到IP存储设备124中。以太网交换机120可包括适当逻辑和/或电路,所述电路与基于IP的SAN和服务器116相连。iSCSI接收端122可包括适当逻辑、电路和/或代码,用于接收以太网帧,剥离该帧中的至少一部分并重新获得TCP/IP内容。iSCSI接收端也可用于解封装ICP/IP内容,获取为得到请求信息所需的SCSI命令并将该SCSI命令转发到IP存储设备124中。IP存储设备124可包括多个存储设备,例如,磁盘阵列或磁带库。
iSCSI协议可将SCSI命令封装到TCP/IP会话数据包中,该数据包可嵌入到以太网帧中以备进一步的传送。该处理过程开始于来自客户端设备的请求,例如,客户端设备102通过LAN向服务器116请求一条信息。服务器116可用于从SAN中的特定存储设备获取满足该客户端请求的必要信息。服务器116接着可发布满足客户端设备102所需的特定SCSI命令,且可将该命令传送到本地连接的iSCSI发送端118。iSCSI发送端118可将这些SCSI命令封装到可嵌入到以太网帧中的TCP/IP数据包中,并通过交换或路由存储网络发送到存储设备124。
ISCSI接收端122也可用于解封装数据包,并获得要获取请求信息所需的SCSI命令。该处理过程也可反过来进行,且获取的信息可封装为TCP/IP片段形式。该信息可以嵌入到一个或多个以太网帧中,并可返回到服务器116中的iSCSI发送端118,其中它将得到解封装,并作为服务器116发送的SCSI命令的数据被返回。服务器接着可完成请求并将该响应置于IP帧中,以备接下来通过LAN进一步传送到发出请求的客户端设备102。
图2a是根据本发明实施例的iSCSI发送端应用程序中的iSCSI软件架构的方框图。图2a中所示的各单元可位于图1的服务器116和iSCSI发送端118中。如图2a所示,其中示出了管理实体和代理模块202、管理接口库模块204、iSCSI发送端服务模块206、注册模块208、Windows管理规范(WMI)模块210、因特网存储名称服务协议(iSNS)客户端模块212、设备特定模块(DSM)模块214、多路径输入输出(MPIO)模块216、磁盘种类驱动模块218、WindowsiSCSI端口驱动模块220、iSCSI软件发送端模块222、套接字层模块226、TCP/IP模块230、网络驱动接口规范(NDIS)模块232、NDIS微端口驱动模块234、iSCSI微端口驱动模块224、TCP卸载引擎(TOE)/远程直接内存存取(RDMA)封装器模块228、其他协议模块236、虚拟总线驱动模块238、硬件模块240和iSCSI烟囱242。该示意图适用于使用微软Windows操作系统的接收端。对于使用其他操作系统的接收端,硬件240、TCP/IP 230和iSCSI接收端实体将代替微软iSCSI SW发送端222。
管理实体和代理模块202可包括适当逻辑、电路和/或代码,用于配置设备管理和控制面板应用程序。管理接口库模块204可包括适当逻辑、电路和/或代码,用于管理和配置操作系统中的各种接口库。管理接口库模块204可连接到管理实体和代理模块202、iSCSI发送端服务模块206和Windows管理规范(WMI)模块210。iSCSI发送端服务模块206可用于管理多个iSCSI发送端,例如,网络适配器和代表操作系统的主机总线适配器。
iSCSI发送端服务模块206可用于汇总发现信息并管理安全性。iSCSI发送端服务模块206可连接到管理接口库模块204、注册模块208、iSNS客户端模块212和Windows管理规范(WMI)模块210。注册模块208包括集中式分层数据库,微软Windows 9x、Windows CE、Windows NT和Windows 2000等操作系统可利用该数据库保存为一个或多个用户、应用程序和硬件设备配置系统时所需的信息。注册模块208包括操作系统在操作过程中可参考的信息,诸如各用户的概述、安装在计算机上的应用程序及其各应用程序可创建的文档类型、文件夹和应用程序图标的特性表设置、系统中存在的硬件和正在被使用的端口。
Windows管理规范(WMI)模块210可用于将各数据项的特性组织为包括相关信息的数据块或数据结构中。数据块可具有一个或多个数据项。各数据项在数据块中有唯一索引,且各数据块可用全球唯一的128比特编号来命名,所述编号例如被称为全球唯一标识符(GUID)。WMI模块210可用于为数据产生者发出通知,告知其何时开始和停止收集可组成数据块的数据项。Windows管理规范(WMI)模块210可进一步连接到Windows iSCSI端口驱动模块220。
Internet存储名称服务协议(iSNS)客户端模块212可包括适当逻辑、电路和/或代码,用于为IP网络中的存储设备提供命名和资源发现服务。iSNS客户端模块212可构建在IP和光纤信道技术上。iSNS协议可将iSNS服务器用作跟踪关于接收端和发送端的信息的中央位置。ISNS服务器可在网络中的任何主机、接收端或发送端上运行。各主机发送端或存储接收端设备中可要求iSNS客户端软件,以便于与服务器进行通信。在发送端,iSNS客户端模块212可注册发送端并询问接收端列表。在接收端,iSNS客户端模块212可在服务器上注册接收端。
多路径输入输出MPIO模块216包括供应商的通用代码,以适应他们的特定硬件设备,这样当与存储接收端断开连接时,操作系统可提供多路径I/O冗余所需的逻辑。设备特定模块DSM模块214可在多个重要事件中发挥作用,例如,特定设备初始化,请求处理和错误恢复。在设备初始化期间,可依次联系各DSM模块214,以判断其是否可为特定设备提供支持。如果DSM模块214支持该设备,接着将指明该设备是否为新安装设备,或者是否为现在通过新路径可看到的先前已安装设备。在请求处理期间,当应用程序对特定设备发出I/O请求时,DSM模块214可根据其内部负载平衡算法判断发送该请求的路径。如果I/O请求因为路径断开无法从该路径发送,DSM模块214可用于例如切换到错误处理模式。在错误处理期间,DSM模块214可判断是否需要重新发送输入/输出(I/O)请求,或者将该错误判断为致命的以进行必要的错误修复。当发生致命错误时,路径可能无效,重新建立请求并通过不同的设备路径传送。
磁盘种类驱动模块218可包括适当逻辑、电路和/或代码,用于接收应用程序请求并将他们转换为SCSI命令,该命令可在命令描述块(CDB)中进行传送。磁盘种类驱动模块218可连接到DSM模块214、MPIO模块216、WindowsiSCSI端口驱动模块220和iSCSI软件发送端模块222。在操作系统中,如Windows,至少有两条其中可使用网络堆栈的路径。例如,通过允许与硬件240直接交换iSCSI CDB、缓存信息和数据,而不需要进一步复制数据,iSCSI软件发送端模块222可用于支持iSCSI烟囱242。第二路径可使用iSCSI微端口驱动224。iSCSI微端口驱动224与硬件240的交互方式与上述iSCSI软件发送端模块222相同。从硬件240到iSCSI软件发送端模块222的潜在iSCSI烟囱242的使用减少了数据复制和iSCSI路径上的计算开销,同时允许操作系统使用一个用于网络和存储的TCP堆栈,与在iSCSI存储堆栈中使用第三方TCP堆栈相比,该方案更加可靠。内置在TOE/RDMA封装器228中的TCP堆栈可受到拒绝服务攻击并可得到维护。iSCSI软件发送端模块222和硬件240之间的接口也可调整为通过RDMA支持iSCSI,这称为RDMA的iSCSI扩展(iSER)。第二路径可通过存储堆栈提供iSCSI启动的支持。iSCSI启动功能允许发送端从通过网络连接到系统如服务器116上的磁盘(图1)启动,并允许iSCSI与磁盘通信。不过对于其它操作系统,iSCSI烟囱242可支持处理iSCSI数据,并通过网络堆栈和/或存储堆栈控制iSCSI启动服务。
Windows iSCSI端口驱动模块220可包括多个端口驱动,用于根据适配器类型,如使用中的USB、SCSI、iSCSI或光纤通道(FC),来管理不同类型的传输。iSCSI软件发送端模块222可用作网络堆栈,例如,TCP/IP上的iSCSI,也可支持标准以太网适配器和TCP/IP卸载网络适配器,也可用于支持iSCSI烟囱242。iSCSI软件发送端模块222也支持使用加速网络适配器,从而将TCP开销从主机处理器卸载到网络适配器中。iSCSI微端口驱动模块224包括多个相关设备驱动,称为微端口驱动。微端口驱动可用于执行与存储适配器硬件交互所需的程序。微端口驱动可与端口驱动结合,以执行存储堆栈中的完整层。微端口接口或传输驱动接口(TDI)可说明一组功能以及访问它们所用的呼叫机制,传输驱动和TDI客户端可通过这些功能进行通信。
管理并拥有iSCSI状态的iSCSI软件发送端模块222或任何其它软件实体,或者其它操作系统的类似实体可包括适当逻辑、电路和/或代码,用于接收来自Windows iSCSI端口驱动220的数据,并通过iSCSI烟囱242将其卸载到硬件模块240。在接收端,iSCSI软件接收端模块也可支持使用加速网络适配器,将TCP开销从主机处理器卸载到网络适配器中。iSCSI软件接收端模块也可使用iSCSI烟囱242。
套接字层226可由TCP烟囱或需要套接字服务的任何消费者使用。套接字层226可用于与支持TCP烟囱的硬件240交互。对于非卸载TCP通信,TCP/IP模块230可使用用于在相互连接的网络中进行通信的传输控制协议/因特网协议。网络驱动接口规范NDIS模块232包括用于为网络驱动提供硬件和协议独立性的设备驱动规范,并可提供协议复用,这样在同一主机中可同时存在多个协议栈。NDIS微端口驱动模块234可包括用于与存储适配器硬件交互的程序,且可连接到NDIS模块232和虚拟总线驱动(VBD)模块238。为了简化硬件240系统接口和主机上多个堆栈的请求的内部处理,可要求VBD模块238,不过与iSCSI烟囱242一起使用的VBD 238是可选的。
iSCSI烟囱242可包括多个控制结构,该结构可说明iSCSI软件发送端模块222或iSCSI微端口驱动模块224与硬件模块240之间的数据流,从而使iSCSI层得到分布式且更为高效的实现。TOE/RDMA模块228可包括适当逻辑、电路和/或代码,可用于执行远程直接内存存取,从而允许数据从一台计算机的内存传送到另一台计算机的内存中,而不需经过任一设备的中央处理单元(CPU)。在此,不需要对操作系统内核进行扩展缓存和附加调用。TOE/RDMA模块228可连接到虚拟总线驱动模块238和iSCSI微端口驱动模块224。特别地对于iSCSI,可用于本地支持iSER或RDMA的NFS或依赖于RDMA服务的其它传输。这些RDMA服务也可在接收端得到支持。
虚拟总线驱动模块238可包括多个驱动,便于在iSCSI软件发送端模块222和硬件模块240之间通过iSCSI烟囱242传送数据。虚拟总线驱动模块238也可连接到TOE/RDMA模块228、NDIS微端口驱动模块234、套接字层模块226、其它协议模块236和硬件模块240。其它协议模块236可包括适当逻辑、电路和/或代码,用于执行各种协议,例如,光纤通道协议(FCP)或SCSI-3协议标准,从而在光纤通道网络上实现串行SCSI。硬件模块240可包括适当逻辑和/或电路,可用于处理来自驱动、网络接口或其它连接到硬件模块240的其它设备的已接收数据。
网络中的iSCSI发送端118[图1]和iSCSI接收端122设备可用唯一标识符来命名,并可分配访问地址。iSCSI发送端118和iSCSI接收端节点122可使用iSCSI限定名(IQN)或企业唯一标识符(EUI)。两种类型的标识符都可赋予永久且全球唯一的名称。各节点的地址包括IP地址、TCP端口号以及IQN或EUI名称。IP地址可通过网络中普遍使用的相同方法来分配,例如,动态主机控制协议(DHCP)或手动配置。在发现阶段,iSCSI软件发送器222或iSCSI微端口驱动224可为管理层WMI 210、iSCSI发送端服务206、管理接口库204以及管理实体和代理202判断或接收网络中可用的存储资源,并判断是否允许访问这些存储。例如,接收端条目地址可手工配置而发送端可建立发现会话。接收端设备可通过发送发送端可得到的附加接收端的完整列表进行响应。
Internet存储名称服务协议(iSNS)是设备发现协议,可为IP网络中的存储设备提供名称和资源发现服务,并建立于IP和光纤通道技术上。该协议可利用iSNS服务器作为追踪关于接收端和发送端的信息的中央位置。该服务器也可运行于网络上的任何主机、接收端或发送端中。在各主机发送端或存储接收端设备上需要iSNS客户端软件,用于与服务器进行通信。在发送端,iSNS客户端可注册发送端并请求接收端列表。在接收端,iSNS客户端在服务器上注册该接收端。
针对发送端向接收端发送信息,发送端首先通过iSCSI登录进程建立与接收端的会话。该进程开始TCP/IP连接,并通过认证校验发送端是否拥有接收端的访问权限。发送端也可验证接收端。该进程也可允许各参数协商,其中包括所使用的安全协议类型和最大数据包大小。如果登录成功,可为发送端和接收端均分配ID。例如,可为发送端分配发送端会话ID(ISID),为接收端分配接收端会话ID(TSID)。在各发送端接收端对之间可建立多个TCP连接,在会话期间允许更多处理,或者在其中一个连接断开时可作为冗余和故障恢复。
图2b是根据本发明实施例的iSCSI架构中的控制平面和数据平面间的数据流的方框图。如图2b所示,其中给出了SCSI层模块252、缓存地址集合254,其中每个地址指向数据存储缓存、执行控制平面处理的iSCSI控制平面模块256、执行数据平面处理的iSCSI数据平面模块258、以及硬件模块260。控制平面256和数据平面258都连接到硬件模块260,从而允许与IP网络进行通信。SCSI层模块252可包括多个功能模块,例如,磁盘种类驱动模块218(图2a)和iSCSI软件发送端模块222,这两者可用于支持使用各种SCSI存储方案,包括SCSIHBA、光线通道HBA、iSCSI HBA,以及加速网络适配器,从而将TCP和iSCSI开销从主机处理器卸载到网络适配器上。缓存地址模块254可包括多个缓存点,用于存储向驱动传送或者从驱动中获取的信息。iSCSI控制平面模块256可包括适当逻辑、电路和/或代码,用于提供最新的存储管理。控制平面利用简单的网络连接来处理登录和会话管理。这些操作不能认为是时间敏感的。逻辑和会话管理都需要大量的状态。当SCSI层模块252要求高性能操作时,如读或写操作,控制平面可为该操作分配ITT并将该请求传送到数据平面。控制平面可处理命令所需的简单开销操作,如暂停。
在发现阶段,iSCSI发送端222(图2a)能够判断网络中是否可获得这两种存储资源,以及是否允许访问该存储。例如,接收端条目地址为手动配置而发送端可建立发现会话。接收端设备可通过发送发送端可得到的附加接收端的完整列表进行响应。因特网存储名称服务(iSNS)协议可将iSNS服务器用作追踪关于接收端和发送端的信息的中心位置。该服务器可在网络中的任何主机、接收端或发送端上运行。
各主机发送端或存储接收端设备中可要求iSNS客户端软件,以便与服务器进行通信。在发送端,iSNS客户端可注册发送端并请求接收端列表。在接收端,iSNS客户端向服务器注册该接收端。针对发送端向接收端发送信息,发送端首先通过iSCSI登录进程建立与接收端的会话。该进程开始TCP/IP连接,校验发送端是否拥有接收端的访问权限(认证),同时还可允许各参数协商,其中包括所使用的安全协议类型和最大数据包大小。如果登录成功,可为发送端分配例如发送端会话ID(ISID),为接收端分配例如接收端会话ID(TSID)。
iSCSI数据平面模块258可包括适当逻辑、电路和/或代码,用于处理以性能为中心的来自驱动以及其他设备与硬件模块260间的数据传送和接收。控制平面用于向数据平面传送CDB。CDB可包括命令,例如,特定接收端特定位置的读或写、缓存指针和CDB唯一的发送端传送标志(ITT)值。当数据平面258完成操作时,它向控制平面256发送状态信息用于说明该操作是否成功完成。
图3是根据本发明实施例的典型iSCSI烟囱方框图。如图3所示,其中示出了位于iSCSI上层的SCSI请求列表301、缓存集合B1 316、B2 314、B3312和B4 310,各缓存例如B4 310都具有物理缓存地址列表和与其相关的长度(Len)、iSCSI命令链319、iSCSI PDU链327、iSCSI Rx消息链335和iSCSI完成链342,所述iSCSI上层表示软件驱动或HBA中保持的状态。图3还给出了硬件保持的状态,其中包括数据加速层中的iSCSI请求表363、SCSI命令模块集合350、352、354和362、数据输出模块集合356、358和360、TCP转换表389、iSCSI数据输出链395、数据输入模块372、376、378、382、384、状态指示符模块集合374和388、请求发送(R2T)模块380和异步消息模块386。
SCSI请求列表301可包括一组命令描述符模块(CDB)302、304、306和308。iSCSI命令链319可包括一组命令序列模块320、322、324和326。iSCSIPDU链327可包括一组CDB 328、330、332和334。iSCSI Rx消息链335可包括一组固定大小缓存336、338、340和341。iSCSI完成链342可包括一组状态模块343、344、346和348。iSCSI请求表363可包括一组命令序列模块364、366、368和370。TCP转换表389可包括一组序列模块390、392和394。iSCSI数据输出链395可包括一组数据输出模块396、398和399。
命令描述符模块(CDB)302中的发送端任务标记(ITT)值为4,对应于CDB 4且执行读操作。CDB 304的ITT值为3,对应于CDB3且执行读操作。CDB306的ITT值为2,对应于CDB2且执行写操作,CDB 308的ITT值为1,对应于CDB1且执行读操作。CDB 302、304、306和308中的每一个可分别映射到相应缓存B4 310、B3 312、B2 314和B1 316。如模块318所示,各缓存B4 310、B3 312、B2 314和B1 316可表示为要保存的数据序列地址及其相应的长度。ITT值可由数据加速层管理。ISCSI上层提交请求之前,它向数据加速层请求该ITT值。ISCSI上层可从iSCSI请求表363中分配ITT值以唯一标识该命令。可选择ITT值,这样当相应iSCSI PDU,如iSCSI数据长度(Dataln)PDU或iSCSI R2T PDU到达时,数据加速层可利用该ITT或ITT中的一部分随时确认iSCSI请求表中的条目。
iSCSI命令链319可包括一组示例性命令序列模块(CSB)320、322、324和326。CSB 320中的相关ITT值为1,命令序列(CmdSn)值为101,缓存B1316,且为读操作。CSB 322中的相关ITT值为2,CmdSn值为102,缓存B2 314,且为写操作。CSB 324中的相关ITT值为3,CmdSn值为103,缓存B3 312,且为读操作。CSB 324中的相关ITT值为4,CmdSn值为104,缓存B4 310,且为读操作。iSCSI PDU链327可包括一组示例性CDB 328、330、332和334。例如,CDB 328的相关ITT值为1,CmdSn值为101且为读操作。CDB 330的相关ITT值为2,CmdSn值为102且为写操作。CDB 332的相关ITT值为3,CmdSn值为103且为读操作。CDB 334的相关ITT值为4,CmdSn值为104且为读操作。iSCSI消息链335可包括一组示例性固定大小缓存336、338、340和341,分别对应于各CDB 320、322、324和326。iSCSI完成链342可包括一组状态模块343、344、346和348,且分别具有相应ITT值1、ITT值3、ITT值4和ITT值2。
iSCSI请求表363可包括一组命令序列模块364、366、368和370。CSB 364具有相关ITT值1、CmdSn值101、数据序列(DataSn)和缓存B1。CSB 366具有相关ITT值2、CmdSn值102、数据序列(DataSn)和缓存B2。CSB 368具有相关ITT值3、CmdSn值103、数据序列(DataSn)和缓存B3。CSB 370具有相关ITT值4、CmdSn值104、数据序列(DataSn)和缓存B4。通过设置iSCSI请求表363中的命令,ITT中的一部分可选作iSCSI请求表363内的条目索引。当命令完成时,相应iSCSI请求表条目可被标识为已完成且不要重新设置其他命令。可按任何顺序完成CDB 320、322、324和326。一旦iSCSI请求表条目被标识为已完成,数据加速层将停止将任何其他数据放入到该缓存中。
尽管在本发明的另一实施例中,当iSCSI请求表363满了之后,iSCSI上层仍然可以通过iSCSI上层的构造来发送命令。iSCSI请求表363不需要事先进行测定大小,而iSCSI烟囱242在命令请求数超过数据加速层的容量或者超过iSCSI请求表363的大小时仍可继续工作。
SCSI命令模块350、352、354和362分别带有相关示例性的ITT值1、ITT值2、ITT值3和ITT值4。数据输出模块356带有相关ITT值2、DataSn值0和最终(F)值0。数据输出模块358带有相关ITT值2、DataSn值1和最终(F)值0。数据输出模块360带有相关ITT值2、DataSn值2和最终(F)值1。TCP转换表389可包括一组序列模块390、392和394。序列模块390对应于序列2000和长度800。序列模块392对应于序列2800和长度3400。序列模块392对应于序列6200和长度200。SCSI PDU和TCP比特间可能没有固定联系,但其中一比特可能具有与之相关的固定值。
TCP转换表389用于存储发送到iSCSI请求表363的请求副本,进而可重传TCP比特。iSCSI数据输出链395可包括一组相应的数据输出模块396、398和399。数据输出模块396具有相关ITT值2、最终(F)值0、DataSn值0和偏移量值0。数据输出模块398具有相关ITT值2,最终(F)值0,DataSn值1和偏移量值1400。数据输出模块399具有相关ITT值2、最终(F)值0、DataSn值2和偏移量值2400。iSCSI数据输出链395可用于接受来自R2T模块380的R2T信号,并将其与先前保存的数据比较并向数据输出模块356生成数据输出(DO)信号。数据加速层可用于处理R2T。R2T PDU 380中的ITT字段可用于查询iSCSI请求表363。可标识iSCSI请求表条目366及其相关缓存B2。数据加速层可将数据输出PDU 356、358和360格式化。数据输出PDU 356、358和360可被发送出去。ISCSI上层不包括R2T处理。
例如,模块372中的数据包括相关ITT值1、DataSn值0和最终F值1。模块376中的数据包括相关ITT值3、DataSn值0和最终(F)值0。模块378中的数据包括相关ITT值3、DataSn值1、最终(F)值1、以及状态信号(状态)。模块382中的数据包括相关ITT值4、DataSn值0和最终(F)值0。模块384中的数据包括相关ITT值4、DataSn值1、最终(F)值1和状态信号(状态)。而状态指示符模块374具有相关ITT值1和状态信号(状态),状态指示符模块388具有相关ITT值2和状态信号状态。请求发送(R2T)模块380用于向iSCSI数据输出链模块396发送R2T信号,iSCSI数据输出链模块396可进一步将数据输出信号发送到数据输出模块356。异步消息模块可用于向固定大小缓存336发送异步消息信号。
在操作中,为了进行分布式实现,iSCSI烟囱可包括多个描述发送端和硬件之间的数据流的控制结构。SCSI结构可混合在iSCSI层中,这样在它被发送到硬件进行数据加速之前可以被封装在TCP数据中。其中有多个读和写操作,如,将数据块从发送端传送到接收端可进行三次读操作和一次写操作。读操作可包括用于说明已接收数据存放的位置地址的信息。写操作可说明数据传送的位置地址。SCSI请求表301包括一组命令描述符模块302、304、306和308,以进行读和写操作,各CDB可分别与相应的缓存B4 310、B3 312、B2 314和B1316相关。驱动可用于将保存在SCSI请求表301中的信息重新编码到iSCSI命令链319中。iSCSI命令链319可包括一组命令序列模块(CSB)320、322、324和326,各CSB可在iSCSI PDU链327中转化为PDU,iSCSI PDU链327中包括一组CDB 328、330、332和334。
iSCSI命令链CDB 320可用于向SCSI命令模块350发送读命令,同时可更新TCP转换表序列模块390和iSCSI请求表命令序列模块364。iSCSI请求表363与iSCSI上层中的SCSI请求表一样关联到相同的缓存集合中。iSCSI命令链CDB 322可用于更新与缓存B2 314相关的iSCSI请求表命令序列模块366,创建报头并向SCSI命令模块352发送写命令。iSCSI命令链CDB 324用于向SCSI命令模块354发送读命令,同时更新TCP转换表序列模块392和iSCSI请求表命令序列模块368。
模块372中的数据可标识从发送端接收到的数据,并将已接收数据与存放在与iSCSI请求表CSB 364相关的缓存B1 316中的数据进行比较,并将已接收到的数据存放到缓存B1 316中。状态指示符模块374可向iSCSI完成链状态模块342发送状态信号,说明读操作已完成同时释放iSCSI请求表CSB 364。模块376中的数据可标识从发送端接收到的数据,并将已接收数据与存放在与iSCSI请求表CSB 368相关的缓存B3 312中的数据进行比较,并将已接收到的数据存放到缓存B3 312中。状态指示符模块378可用于向iSCSI完成链状态模块344发送状态信号,说明读操作已完成同时释放iSCSI请求表CSB 368。
处理iSCSI写命令时,iSCSI主机驱动可向iSCSI卸载硬件提交与已分配的ITT相关的缓存信息。当收到对应iSCSI响应PDU时,iSCSI主机驱动可处理iSCSI写命令的结束操作。通过向发送端发送一个或多个iSCSI准备传送(R2T)PDU,iSCSI接收端可请求任何位置任何大小的写数据。在iSCSI处理中,可解析这些R2T PDU,而由R2T PDU中指定的写数据可以在iSCSI数据中从PDU封装中发送出去。通过iSCSI烟囱,可由iSCSI卸载硬件处理R2T PDU,所述硬件利用R2T PDU中的ITT定位待处理的写命令,利用R2T PDU中的的偏移量和长度来表示相应的数据输出PDU。由于不包括主机驱动,iSCSI主机驱动的处理可得到减少。
R2T模块380用于向DataSn值为0的iSCSI数据输出链模块396发送R2T信号,iSCSI数据输出链模块396可向DataSn值为0且最终F值为0的数据输出模块356发送数据输出信号。R2T模块380可用于同时更新iSCSI数据输出链模块396和iSCSI请求表命令序列模块366。iSCSI请求表命令序列模块366将已接收数据与存放在缓存B2 314中的数据进行比较,并将要写入的数据发送到数据输出模块356。iSCSI数据输出链395用于记录正在被传送的写命令,并将其与已接收R2T信号进行比较。R2T模块380用于向DataSn值为1的iSCSI数据输出链模块398发送R2T信号,并可向DataSn值为1且最终(F)值为0的数据输出模块358发送数据输出信号。R2T模块380可进一步向DataSn值为2的iSCSI数据输出链模块399发送R2T信号。R2T模块380可进一步向DataSn值为2且最终F值为1的数据输出模块360发送数据输出信号。
iSCSI命令链CDB326用于向SCSI命令模块362发送读命令,同时更新TCP转换表序列模块394和iSCSI请求表命令序列模块370。模块382中的数据可标识接收来自发送端的数据,并将已接收数据与存放在与iSCSI请求表CSB370相关的缓存B4 310中的数据进行比较,并将已接收到的数据存放到缓存B4 310中。状态指示符模块384可向iSCSI完成链状态模块346发送状态信号,说明读操作已完成同时释放iSCSI请求表CSB 370。状态指示符模块388可向iSCSI完成链状态模块348发送状态信号,说明写操作已完成同时释放iSCSI请求表CSB 366。当CPU进入空闲模式时,iSCSI完成链341可接收到读和写操作的已完成状态命令,相应缓存和iSCSI请求表363中的条目将被释放以备下一组操作的使用。
图4是根据本发明实施例的通过TCP卸载引擎(TOE)进行数据iSCSI卸载的方框图。如图4所示,其中示出了网络堆栈400。网络堆栈400包括SCSI层模块402、iSCSI驱动模块404、TCP/IP模块406、NDIS模块408、网络驱动模块410、虚拟总线驱动模块412、硬件模块414和iSCSI烟囱416。
SCSI层模块402包括多个功能模块,例如,磁盘种类驱动模块218(图2a)和iSCSI软件发送端模块222,这些可用于支持加速网络适配器。加速网络适配器可用于将TCP开销从主机处理器重卸载到网络适配器中。iSCSI驱动模块404包括多个端口驱动,用于根据适配器类型,如USB、SCSI或光纤信道(FC),管理不同类型的传送。TCP/IP模块406用于实现在相互连接的网络中通信。网络驱动接口规范NDIS模块408包括用于为网络驱动提供硬件和协议独立性的设备驱动规范,并可提供协议复用,这样在同一主机中可同时存在多个协议栈。
网络驱动模块410包括用于与存储适配器硬件交互的程序,可连接到NDIS模块408和虚拟总线驱动模块412。为了得到分布式实现,iSCSI烟囱416可包括多个控制结构,用于说明iSCSI驱动模块404和硬件模块414之间的数据流。虚拟总线驱动模块412包括多个驱动,可通过iSCSI烟囱416实现iSCSI驱动模块404和硬件模块414之间的数据传送。硬件模块414包括适当的逻辑和/或电路,用于处理从驱动以及与硬件模块414相连的其他设备中接收得到的数据。通过TCP卸载引擎进行的数据iSCSI卸载包括各种不同的操作,例如SCSI读操作或SCSI写操作。
图5是根据本发明实施例的通过TCP卸载引擎(TOE)执行SCSI读操作中所包括的具体步骤流程图。如图5所示,示例性步骤开始于步骤502。在步骤504中,驱动向接收端发送iSCSI读命令。iSCSI读命令包括发起任务标记(ITT)、SCSI读命令描述符模块(CDB)和数据流的长度。在步骤506中,接收端接收来自发送端的iSCSI读命令,进行处理并从存储设备中获取数据。在步骤508中,硬件可将数据零复制到发送端并向发送端重传TCP。发送到发送端的数据包括ITT、数据序列号(DataSn)和缓存偏移量值。在步骤510中,发送端检查已接收数据是否为协议数据单元(PDU)中的第一帧。如果不是,该控制流程转到步骤512,在步骤512中发送端检查缓存是否已经被写入。如果缓存已经被写入,则控制流程转到步骤514,在此硬件处理TCP并将载荷零复制到iSCSI缓存中,接着控制流程转到步骤528。如果缓存未被写入,则控制流程转到步骤516,在此硬件处理TCP数据并将载荷存放到驱动的缓存中。如果步骤510中已接收数据是协议数据单元中的第一帧,则控制流程转到步骤516。
在步骤518中,硬件保存下一个要接收字节的TCP序列号。在步骤520中,驱动可处理iSCSI PDU报头。而在步骤522中,可剥离该iSCSI报头并将数据存放在iSCSI缓存中。本发明的实施例包括从非零复制模式切换到零复制模式,而不使用iSCSI协议的完整功能。在步骤524中,iSCSI协议可谓PDU中的下一帧提供缓存,而在步骤526中,驱动写入至硬件的该缓存。在步骤528中,发送端检查已接收数据帧是否按正确顺序排列。如果不是,则在步骤530中,驱动可指示失序(000)消息且控制转到结束步骤536。如果已接收数据帧是按正确顺序排列,则在步骤532中,接收端向发送端发送SCSI状态信号。在步骤534中,发送端处理从接收器收到的SCSI状态信号,验证已接收数据,接着控制流程转到结束步骤536。
图6是根据本发明实施例的接收端上的典型iSCSI烟囱的方框图。如图6所示,示出了在iSCSI上层中的在TCP连接中从发送端接收得到的iSCSI请求列表601、缓存集合B1 616、B2 614、B6 612和B4 610,各缓存如B4 610都具有物理缓存地址列表和与其相关的长度、iSCSI命令链619、iSCSI PDU链627、iSCSI Rx消息链635和iSCSI完成链642,用于说明软件驱动或HBA中在某些情况下保存的状态。图3还示出了硬件保持的状态数据加速层中的iSCSI请求表663、SCSI命令模块集合650、652、654和662、数据输出模块集合656、658和660、TCP转换表689、iSCSI R2T链695、数据输入模块672、676、678、682、状态指示符模块集合674和688,请求发送(R2T)模块680和异步消息模块686。
SCSI请求列表601可包括一组从发送端接收得到的命令描述符模块(CDB)602、604、606和608。iSCSI命令链619可包括一组命令序列模块620、621、622、623、624、625和626。iSCSI PDU链627可包括一组CDB 628、630、632和634。iSCSI消息链635可包括一组固定大小缓存636、638、640和641。iSCSI完成链642可包括一组状态模块643、644、646和648。iSCSI请求表663可包括一组命令序列模块664、666、668和670。TCP转换表689可包括一组序列模块690、692和694。iSCSI R2T链695可包括一组R2T模块696、698和699。
命令描述符模块(CDB)602中的发送端任务标记(ITT)值为4,对应于CDB4且执行自动写操作。CDB 304的ITT值为6,对应于CDB6且执行读操作。CDB 306的ITT值为2,对应于CDB2且执行自动写操作,CDB 308的ITT值为1,对应于CDB1且执行读操作。CDB 602、604、606和608中的每一个可分别映射到相应缓存B4 610、B3 612、B2 614和B1 616。各缓存B4 610、B3 612、B2 614和B1 616如模块618所示,可表示为要保存的数据序列地址及其相应的长度。ITT由发送端的数据加速层管理而TTT由接收端的数据加速层管理。iSCSI上层向发送端提交R2T之前,它向数据加速层请求该TTT值。TTT唯一标识了与从发送端接收得到的未来数据相关的R2T命令。可选择TTT值,这样当相应iSCSI PDU,如输出PDU的iSCSI数据到达时,数据加速层可利用该TTT或TTT中的一部分随时确认iSCSI请求表663中的条目。
iSCSI命令链619可包括一组示例性命令序列模块(CSB)620、621、622、623、624、625和626。CSB 620具有相关ITT值1、命令序列(CmdSn)值101、缓存B1 616,且为读操作。CSB 621具有相关ITT值1,且为读操作的状态响应。CSB 622具有相关ITT值3、命令序列(CmdSn)值103、缓存B3 612且为与其状态相连的写操作。CSB 623具有相关ITT值2、CmdSn值102、缓存B2 614,且为对应于写操作的R2T。CSB 624中的相关ITT值为4、CmdSn值为104,且为对应于读操作的状态响应。CSB 625是同步消息。CSB 626具有相关ITT值2,且为写操作的状态响应。iSCSI PDU链627可包括一组示例性CDB 628、630、632和634。例如,CDB 628的相关ITT值为1,CmdSn值为101且为读操作。CDB 630的相关ITT值为2,CmdSn值为102且为写操作。CDB 632的相关ITT值为3,CmdSn值为103且为读操作。CDB 634的相关ITT值为4,CmdSn值为104且为读操作。iSCSI消息链635可包括一组示例性固定大小缓存636、638、640和641。iSCSI完成链642可包括一组状态模块643、644、646和648,且分别具有相应ITT值1、ITT值3、ITT值4和ITT值2。
iSCSI请求表663可包括一组命令序列模块664、666、668和670。ITT值为1的CSB 664与ITT值2、CmdSn值102、数据序列(DataSn)和缓存B2相关。通过安排iSCSI请求表663中的命令,ITT中的全部或其中一部分可选作iSCSI请求表663内的条目索引。由于只有数据可以承载命令,指向数据输出的R2T是给定的TTT值,为节省搜索时间和硬件资源,所有其他命令不能由数据加速层指定。当命令完成时,相应的iSCSI请求表条目可被标识为已完成且不要重新安排其他命令。可按任何顺序完成命令620、622、624和626。一旦iSCSI请求表条目被标识为已完成,数据加速层将停止把任何其它数据存放到相关缓存中。
SCSI命令模块650、652、654和662分别带有相关示例性的ITT值1、ITT值2、ITT值3和ITT值4。数据输出模块656带有相关ITT值2、DataSn值0和最终(F)值0。数据输出模块658带有相关ITT值2、DataSn值1和最终(F)值0。数据输出模块660带有相关ITT值2、DataSn值2和最终(F)值1。
TCP转换表689可包括一组序列模块690、692和694。它们对应于所传输的iSCSI PDU。序列模块690对应于序列2000和长度800。序列模块692对应于序列2800和长度3400。序列模块694对应于序列6200和长度200。SCSI PDU和TCP比特间可能没有固定联系,但其中一个比特可能具有与之相关的固定值。
TCP转换表689用于存储发送到iSCSI请求表663的请求副本,进而使其重传TCP比特。iSCSI R2T链695可包括一组相应的数据输出模块696、698和699。数据输出模块696具有相关TTT值1、ITT值2、最终(F)值0、DataSn值0和偏移量值0。数据输出模块698具有相关TTT值1、ITT值2、最终(F)值0、DataSn值1和偏移量值1400。数据输出模块699具有相关TTT值1、ITT值2、最终(F)值0、DataSn值2和偏移量值2400。iSCSI R2T链695可用于接收来自数据输出模块656和658的信号,并将其与先前保存的数据比较并使其与iSCSI请求表663相关联,进而寻找缓存,从而将数据输出正确位置的载荷存储在缓存B2 614内。对R2T的处理在数据加速层中完成。R2T PDU 680中的TTT字段或其中一部分可用于查询iSCSI请求表663。可标识请求664及其相关缓存B2。数据加速层可剥离数据输出PDU 656、658和660的报头,并将它们放在缓存B2中的正确偏移量中。iSCSI请求表663利用iSCSI R2T链695中的单元保存目前已接收的数据输出段的控制信息。iSCSI上层不介入到与所请求的数据输出相关的任何数据定位。
例如,模块672中的数据包括相关ITT值1、DataSn值0和最终F值1。模块676中的数据包括相关ITT值3、DataSn值0和最终(F)值0。模块678中的数据包括相关ITT值3、DataSn值1、最终(F)值1和状态信号(状态)。模块682中的数据包括相关ITT值4、DataSn值0和最终(F)值0。模块684中的数据包括相关ITT值4、DataSn值1、最终(F)值1和状态信号(状态)。状态指示符模块674具有相关ITT值1和状态信号(状态)。而状态指示符模块688具有相关ITT值2和状态信号状态。准备发送(R2T)模块680用于向iSCSI请求表模块664发送信号,664记录TTT值1和ITT值2之间的关系以及接收端请求的特定偏移量和长度。当接收端将其准备发送到发送(R2T)模块680时,它将通知iSCSI请求表663帮助它在iSCSI请求表663中分配正确的条目。异步消息模块625用于向固定大小缓存636发送异步消息信号。发送端的主动数据输出也可向iSCSI Rx消息链635发送信号。
在操作中,为了进行分布式实现,iSCSI烟囱可包括多个描述接收端和硬件之间的数据流的控制结构。SCSI结构(如,对于状态)可混合在iSCSI层中,这样在发送到硬件进行数据加速之前可以将它封装在TCP数据中。其中有多个读和写操作,如可执行两次读操作、一次被动写操作和一次主动写操作,从而将数据块从发送端传送到接收端,反之亦然。读操作可包括用于说明数据从中发送的位置地址的信息。被动写操作说明已接收数据存放的位置地址。主动写操作说明了已接收数据所存放的iSCSI Rx消息链635中的固定大小缓存。SCSI请求表301包括一组命令描述符模块602、604、606和608,以进行读和写操作,各CDB可分别与相应的缓存B4 610、B3 612、B2 614和B1 616相关。由于602是发送端的主动请求,接收端可能尚未给其分配任何已命名的缓存,因此B4 610可能与602相关也可能与602无关。驱动可用于将保存在SCSI请求表601中的信息重新编码到iSCSI命令链619中。iSCSI命令链619包括一组命令序列模块(CSB)620、621、622、623、624、625和626,各CSB可在iSCSI PDU链627中转化为PDU,iSCSI PDU链627中包括一组CDB 628、630、632和634。
iSCSI命令链CDB 620可用于格式化至SCSI命令模块650的响应数据,同时可更新TCP转换表序列模块690。iSCSI请求表663与iSCSI上层中的SCSI请求表一样关联到相同的缓存集合中。iSCSI命令链CDB 621可用于格式化至SCSI命令模块650的状态回复,同时更新TCP转换表序列模块690。iSCSI命令链CDB 622可用于格式化至SCSI命令模块654的响应数据以及状态回复,同时更新TCP转换表序列模块690。iSCSI命令链CDB 623用于更新与缓存B2614关联的iSCSI请求表命令序列模块666,创建报头并将响应的R2T命令发送到SCSI命令模块652。iSCSI命令链CDB 624用于向SCSI命令模块654发送响应数据,同时更新TCP转换表序列模块692和iSCSI请求表命令序列模块668。
模块650中的数据可记录在iSCSI消息链635中。驱动可检查iSCSI消息链635并创建608数据模块同时分配缓存B1。驱动可在iSCSI命令链619中构造620数据模块。硬件可使用附加信息来格式化PDU中的数据并将数据模块672发送到发送端。通过在iSCSI完成链642中存放完成指示符643,硬件可告知驱动已成功完成数据模块672的发送。驱动可写入模块621,硬件模块621触发硬件向发送端发送模块674 SCSI状态PDU。硬件可将另一完成信息放置到642,模块624触发驱动,从而释放与模块608和缓存616相关的资源。模块652中的数据被接收到时,可被记录到模块iSCSI消息链635中。驱动依次在SCSI请求列表601中分配条目606,分配缓存B2 614并请求硬件在iSCSI请求表663中分配条目。同时,硬件可接收模块654并将其放置到iSCSI接收消息链635中。驱动执行命令,创建条目604并分配缓存B3 612。驱动可在iSCSI命令链619中构造622数据模块。硬件可使用附加信息来格式化PDU中的数据并将676发送到发送端。由于数据可能比PDU中的数据更长,硬件同时创建模块678。驱动可包括在622指示符中,使硬件利用失败状态(collapsedstatus)。最后的PDU中的数据也可包括SCSI状态信息。当成功完成传送时,硬件可向642传送完成信息。
此时,硬件可向驱动发送TTT值1,以响应它与652相关的请求。驱动完成其开始代表652的接收的操作,并完成606的创建和B2 614的分配。驱动可将模块623传送到619,作为硬件命令,从而向发送端发送R2T消息。在发送消息680之前,硬件使用TTT值1作为索引,将条目664填充到iSCSI请求表663中。该条目包括将TTT值1分配到操作中及其与652中发送端参数的关系。下一模块680包括可通过硬件发送到发送端的R2T PDU。
为响应680,发送端发送656、658和660。接收端利用内置在这些消息中的TTT值1将它们与iSCSI请求表663中的条目664关联。每一个输入的数据输出消息都构成多个TCP片段,硬件利用695保存信息,直到完成与数据输出相关的全部任务。此时,可清除695中的条目且硬件将完成指示符传送到642。
模块662中的数据被接收之后,也被记录到635中。由于662中的数据为主动数据,所以没有为之预先分配缓存。硬件将该数据与命令一起保存在635中。随后,驱动为该数据创建条目602并分配已命名缓存B4 610。驱动可处理PDU,将635中的数据复制到610。驱动创建条目624,其中包括发送到发送端的SCSI状态响应。硬件创建数据模块684并将其传送到发送端。
驱动创建另一条目625,使硬件对应于异步消息向发送端发送模块686。最后,保存在664中请求的在642中传送的完成信息到达驱动,驱动传送619中的条目626。当硬件处理条目626时,它创建模块688并将其发送到发送端。当发送端确认688的接收时,硬件清除iSCSI请求表663中的条目664,该请求表663使另一操作可利用TTT值1。
图7是根据本发明实施例的通过用于支持iSCSI烟囱的TCP卸载引擎(TOE)在接收端执行SCSI写操作的具体步骤流程图。如图7所示,示例性步骤开始于步骤702。在步骤704中,驱动向接收端发送iSCSI写命令。iSCSI写命令包括发起任务标记(ITT)、SCSI写命令描述符模块(CDB)和所请求数据的长度。在步骤706中,接收端处理命令,分配包括用于缓存数据的缓存在内的资源。接收端通过返回包括接收端的接收传送标记(TTT)在内的R2T消息,对发送端做出响应。在步骤708中,发送端处理R2T命令并准备要传送的相关数据。根据数据大小,数据可封装在一个或多个PDU中,或者封装到一个或多个TCP片段中。在步骤710中,接收端硬件可接收来自发送端的TCP片段。在步骤712中,发送端硬件检查已接收的TCP片段是否按顺序排列并且是否包括PDU报头。PDU报头被要求用来解码所需操作,且可描述PDU中的iSCSI报头和载荷。如果TCP片段按顺序排列,则控制流程转到步骤714。在步骤714中,硬件查询其表格中条目所保存的关于在发送端数据输出信息中引用的TTT和ITT信息,所述条目如iSCSI请求表363中的364。如果缓存已被写入,则控制流程转到步骤716。在步骤716中,硬件可剥离报头并将数据零复制到被预先写入的缓存中。如果缓存未被写入,则控制流程转到步骤718。如果已接收TCP片段不是PDU中的第一个TCP片段,则控制流程转到步骤718。在步骤718中,硬件只执行TCP级别的处理。硬件可将载荷存放在临时缓存中。2003年8月29号申请的美国申请号No.10/652,270(代理案号No.15064US02)公开了处理失序TCP片段的方法,在此引用作为参考。在步骤720中,硬件可保存即将被接收的下一接收字节的TCP片段号。在步骤722中,硬件检查最后接收到的TCP片段是否插入到已接收TCP片段列表中的空缺位。如果没有插入,则控制流程转到步骤730。在步骤730中,控制流程等待另一TCP片段,接着控制流程转到步骤712。如果已插入该空缺位,则控制流程转到步骤724。在步骤724中,驱动处理iSCSI PDU报头。在步骤726中,驱动移除报头,更新其状态并将数据存放在缓存中,且将目前已按序排列的PDU重新发送到硬件中,让硬件执行按序处理。
如果是报头和/或数据摘要,硬件也可计算该摘要并将其与TCP片段中保存的信息进行比较。由于PDU的长度可能大于一个TCP片段,硬件可能保存部分摘要结果,且在收到包含当前PDU的后续信息的下一个按序TCP片段时才继续计算。接着控制流程转到步骤728。在步骤728中,可根据其长度来判断它是否为该PDU中的最后一个片段。如果不是当前PDU的最后一个片段,则转到步骤730。如果是当前PDU的最后一个片段,则转到步骤732。在步骤732中,接收端根据iSCSI协议向发送端发送状态回复。在步骤734中,接收端接收到该状态回复并检查是否所有写入数据都得到了确认。如果该写命令中的一部分即还有一些TCP片段没有收到,在步骤728中控制流程将转到步骤730,等待其他片段的到达,且在收到下一TCP片段时才继续进行操作。接着控制流程转到步骤736。
本发明的某些实施例涉及一种通过TCP卸载引擎执行SCSI读操作的方法和系统。本方法的某些方面包括接收从iSCSI端口驱动到TCP卸载引擎的iSCSI读命令。iSCSI读命令可由硬件格式化为TCP片段,进而传送到网络中。该方法可进一步包括接收读取数据的TCP片段并判断该片段是否为iSCSI协议数据单元的第一帧。如果iSCSI缓存已经被写入,已接收得到的TCP片段将得到处理,则读取数据将零复制到iSCSI缓存中,而如果iSCSI缓存未被写入,则将根据对已接收TCP序列号的处理将读取数据存放到该缓存中。
要接收的读取数据下一字节的已接收TCP序列号可得到保存。可从iSCSI协议数据单元中将报头剥离并将读取数据存放在iSCSI缓存中。可为iSCSI协议数据单元中的读取数据的下一片段分配iSCSI缓存。可写入到硬件的已分配的iSCSI缓存,并判断读取数据的片段是否按序排列。如果读取数据的片段不按顺序排列,则可能生成失序消息。如果读取数据的各帧按序排列,则向SCSI驱动发送SCSI状态信号。可处理已发送的SCSI状态信号并验证读取数据。利用iSCSI的部分功能,从缓存到iSCSI驱动的读取数据可转换为非零复制模式。
根据本发明的另一实施例,提供了一种通过TCP卸载引擎执行SCSI读操作的系统。在此,该系统包括至少一个处理器,用于接收来自发送端的iSCSI读命令,如iSCSI软件发送端222(图2a)。处理器可用于根据已接收iSCSI读命令从缓存中获取数据。已获取数据可从缓存零复制到发送端222,且TCP序列可重新传送到发送端222。如果缓存已被写入,则处理器可判断零复制获取的数据是否为iSCSI PDU链327中保存的iSCSI协议数据单元中的第一帧。如果缓存已被写入,则处理器将处理重新传送的TCP序列且将获取数据零复制到iSCSI缓存中,如B1 316。如果缓存未被写入,根据对重新传送的TCP序列的处理,该系统可通过处理器将零复制的已获取数据存放到缓存中。
处理器可用于将要接收的零复制已获取数据下一字节的已重新传送的TCP序列保存到TCP转换表389中。处理器可将保存在iSCSI PDU链327中的iSCSI协议数据单元的报头剥离,且零复制的已获取数据被存放在iSCSI缓存B1 316中。iSCSI缓存B1 316可由处理器分配给保存在iSCSI PDU链327中的iSCSI协议数据单元中的零复制已获取数据的下一帧。至硬件240的iSCSI缓存B1 316可由处理器写入,且处理器可用于检查零复制已获取数据的各帧是否按序排列。如果零复制已获取数据的各帧不按顺序排列,则处理器可生成失序消息。如果零复制已获取数据的各帧按序排列,则处理器向发送端222发送SCSI状态信号。如,图3中,处理器可从状态指示符模块372向iSCSI完成链状态模块343发送状态信号,说明读操作已完成并释放iSCSI请求表CSB364。处理器可用于处理已传送SCSI状态信号并验证零复制已获取数据。
因此,本发明可以通过硬件、软件,或者软、硬件结合来实现。本发明可以在至少一个计算机系统中以集中方式实现,或者由分布在几个互连的计算机系统中的不同部分以分散方式实现。任何可以实现所述方法的计算机系统或其它设备都是可适用的。常用软硬件的结合可以是安装有计算机程序的通用计算机系统,通过安装和执行所述程序控制计算机系统,使其按所述方法运行。
本发明还可以通过计算机程序产品进行实施,所述程序包含能够实现本发明方法的全部特征,当其安装到计算机系统中时,通过运行,可以实现本发明的方法。本文件中的计算机程序所指的是可以采用任何程序语言、代码或符号编写的一组指令的任何表达式,该指令组使系统具有信息处理能力,以直接实现特定功能,或在进行下述一个或两个步骤之后,a)转换成其它语言、编码或符号;b)以不同的格式再现,实现特定功能。
虽然本发明是通过几个具体实施例进行说明的,本领域技术人员应当明白,在不脱离本发明范围的情况下,还可以对本发明进行各种变换及等同替代。另外,针对特定情形或具体情况,可以对本发明做各种修改,而不脱离本发明的范围。因此,本发明不局限于所公开的具体实施例,而应当包括落入本发明权利要求范围内的全部实施方式。
权利要求
1.一种执行SCSI读操作的方法,其特征在于,该方法包括通过TCP卸载引擎接收来自iSCSI端口驱动的iSCS工读命令;通过所述TCP卸载引擎将所述已接收iSCSI读命令格式化为至少一个TCP片段;和格式化所述至少一个TCP片段以备传送。
2.根据权利要求1所述的方法,其特征在于,进一步包括判断所述TCP片段是否为iSCSI协议数据单元的第一个片段。
3.根据权利要求1所述的方法,其特征在于,进一步包括判断缓存是否被写入;如果所述缓存已被写入,处理所述已格式化的TCP片段并将读取数据零复制到iSCSI缓存中;如果所述缓存未被写入,根据对所述已格式化TCP片段的处理将所述零复制读取数据存放到所述缓存中;如果所述缓存未被写入,保存要接收的所述零复制读取数据的下一字节的所述已格式化TCP片段的序列号。
4.根据权利要求1所述的方法,其特征在于,进一步包括从iSCSI协议数据单元剥离报头。
5.根据权利要求1所述的方法,其特征在于,进一步包括将零复制读取数据存放在iSCSI缓存中;为iSCSI协议数据单元中的所述零复制读取数据的下一片段分配所述iSCSI缓存;和写入至硬件的所述已分配iSCSI缓存。
6.根据权利要求5所述的方法,其特征在于,进一步包括判断所述零复制读取数据的片断是否按序排列。
7.根据权利要求5所述的方法,其特征在于,进一步包括,如果所述零复制读取数据的片段不按序排列,则生成失序消息。
8.根据权利要求5所述的方法,其特征在于,进一步包括,如果所述零复制读取数据的各片断按序排列,则向所述iSCSI端口驱动发送SCSI状态信号。
9.根据权利要求8所述的方法,其特征在于,进一步包括处理所述已发送的SCSI状态信号并验证所述零复制读取数据。
10.根据权利要求1所述的方法,其特征在于,进一步包括利用iSCSI的部分功能,将从缓存到所述iSCSI端口驱动的零复制读取数据转换为非零复制模式。
11.一种通过TCP卸载引擎执行SCSI读操作的系统,其特征在于,包括接收端,用于通过TCP卸载引擎接收来自iSCSI端口驱动的iSCSI读命令;至少一个处理器,用于通过所述TCP卸载引擎将所述已接收iSCSI读命令格式化为至少一个TCP片段;以及所述至少一个处理器格式化所述至少一个TCP片段以备传送。
12.根据权利要求11所述的系统,其特征在于,所述至少一个处理器判断所述TCP片段是否为iSCSI协议数据单元中的第一片段。
13.根据权利要求11所述的系统,其特征在于,所述至少一个处理器判断缓存是否已被写入;如果所述缓存已被写入,所述至少一个处理器处理所述已格式化的TCP片段并将读取数据零复制到iSCSI缓存中;如果所述缓存未被写入,所述至少一个处理器根据对所述已格式化TCP片段的处理,将所述零复制读取数据存放到所述缓存中;如果所述缓存未被写入,所述至少一个处理器保存要接收的所述零复制读取数据的下一字节的所述已格式化TCP片段的序列号。
14.根据权利要求11所述的系统,其特征在于,所述至少一个处理器从iSCSI协议数据单元剥离报头。
15.根据权利要求11所述的系统,其特征在于,其中所述至少一个处理器将零复制读取数据存放在iSCSI缓存中;所述至少一个处理器为iSCSI协议数据单元中的所述零复制读取数据的下一片段分配所述iSCSI缓存;和所述至少一个处理器写入至硬件的所述已分配iSCSI缓存。
16.根据权利要求11所述的系统,其特征在于,所述至少一个处理器判断所述零复制读取数据的片断是否按序排列。
17.根据权利要求11所述的系统,其特征在于,如果所述零复制读取数据的片段不按序排列,所述至少一个处理器生成失序消息。
18.根据权利要求11所述的系统,其特征在于,如果所述零复制读取数据的各片断按序排列,所述至少一个处理器向所述iSCSI端口驱动发送SCSI状态信号。
19.根据权利要求18所述的系统,其特征在于,所述至少一个处理器处理所述已发送的SCSI状态信号并验证所述零复制读取数据。
20.根据权利要求11所述的系统,其特征在于,所述至少一个处理器利用iSCSI的部分功能,将从缓存至所述iSCSI端口驱动的零复制读取数据转换为非零复制模式。
全文摘要
本发明的某些实施例涉及一种通过TCP卸载引擎执行SCSI读操作的方法和系统。该方法包括接收来自发送端(118)的iSCSI读命令。根据已接收的iSCSI读命令从缓存中获取数据。已获取数据可从缓存零复制到发送端(118),且可向发送端重新传送TCP序列。该方法进一步包括检查零复制已获取数据是否为iSCSI协议数据单元中的第一帧,且缓存是否已被写入。如果缓存已被写入,则处理已重新传送的TCP序列并将已获取数据零复制到iSCSI缓存中。
文档编号H04L12/56GK1985492SQ200580019432
公开日2007年6月20日 申请日期2005年6月17日 优先权日2004年6月17日
发明者尤里·埃尔·朱, 康·弗兰克·凡, 斯科特·麦克丹尼尔 申请人:美国博通公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1