一种 IPMI 消息传输装置、 系统及计算机设备 【技术领域】
本发明属于计算机领域, 尤其涉及一种 IPMI 消息传输装置、 系统及计算机设备。背景技术 在智能平台管理接口 (Intelligent Platform Management Interface, IPMI) 规 范中, 支持通过增加额外的管理控制器来扩展系统的平台管理功能。这些管理控制器之间 通过智能平台管理总线 (Intelligent Platform Management Bus, IPMB) 来实现通信。 IPMB 2 2 总线是基于 I C 的串行总线, IPMB 总线上可以挂载智能和非智能的 I C 设备。
智 能 平 台 管 理 总 线 协 议 (Intelligent Platform Management Bus Communications Protocol Specification v1.0) 定义了智能设备之间的 IPMI 消息包的字 节级传输协议, 该协议和 I2C 物理接口共同组成了 IPMB 总线。
IPMB 总线使用请求 (request)/ 应答 (response) 的通信机制 ( 当给一个智能设备 发送一个请求消息, 该设备会返回一个应答消息 ), 请求消息和应答消息格式如图 1 所示, 其中 :
rs Slave Addr. 表示请求目的端的 I2C 设备从地址, 用来标示这条请求消息是发 给谁的 ;
rq Slave Addr. 表示请求发出方的 I2C 设备从地址, 用来标示这条请求消息是谁 发出的 ;
net Fn 表示网络功能号, 在 IPMI 规范中, 通过网络功能号将命令分成不同的功能 域以便管理, 在 IPMB 协议消息中通过网络功能号的奇偶来区分是请求消息还是应答消息 ;
rsLUN 表示应答设备逻辑分区, 用来指示该命令是由目的设备的哪个逻辑模块来 应答 ;
rqLUN 表示请求设备逻辑分区, 用来标示该请求命令是源设备的哪个逻辑模块发 出的 ;
rqSeq 表示请求消息序列号, 用来区分是重发消息还是新消息 ;
cmd 表示命令号, 它和网络功能号一起唯一确定一条 IPMI 命令 ;
data byte 表示命令数据域, 不同的命令长度不同 ;
checksum 表示消息校验字, 使得整条消息相加和为 0。
不管是请求消息还是应答消息, 对于 I2C 总线来说, 都是通过 “主写模式” (Master Write) 来传输的。
在现有的智能平台管理总线协议中, 只定义了 IPMI 消息的数据格式以及接口的 一些硬件特性, 缺乏具体的实现方式。
发明内容
本发明实施例的目的在于提供一种 IPMI 消息传输装置, 提供了 IPMB 驱动的实现 方案, 实现了 IPMB 消息的传输。本发明实施例是这样实现的, 一种 IPMI 消息传输装置, 所述装置包括 :
IPMB 消息接收处理任务单元, 用于从 IPMB 总线消息缓冲队列中取得消息, 若取 得的消息为应答消息, 则进行应答消息匹配, 若取得的消息为请求消息, 则将请求消息放入 IPMB 请求消息队列 ;
IPMB 消息接收接口, 用于读取所述 IPMB 请求消息队列中的消息 ;
IPMB 消息发送接口, 用于将校验通过的 IPMI 消息通过 I2C 总线驱动发送出去 ; 以 及
IPMB 消息发送并等待应答接口, 用于调用所述 IPMB 消息发送接口发送 IPMI 请求 消息, 并获取所述 IPMB 消息接收处理任务单元所取得的对应的应答消息。
本发明实施例的另一目的在于提供一种 IPMI 消息传输系统, 所述系统包括 I2C 总 2 线驱动和 IPMB 驱动, IPMI 固件应用程序调用所述 I C 总线驱动的接口进行 IPMI 消息收发, 所述 IPMB 驱动的数据收发通过所述 I2C 总线驱动实现 ;
所述 IPMB 驱动包括 :
IPMB 消息接收处理任务单元, 用于从 IPMB 总线消息缓冲队列中取得消息, 若取 得的消息为应答消息, 则进行应答消息匹配, 若取得的消息为请求消息, 则将请求消息放入 IPMB 请求消息队列 ;
IPMB 消息接收接口, 用于读取所述 IPMB 请求消息队列中的消息 ;
IPMB 消息发送接口, 用于将校验通过的 IPMI 消息通过所述 I2C 总线驱动发送出 去; 以及
IPMB 消息发送并等待应答接口, 用于调用所述 IPMB 消息发送接口发送 IPMI 请求 消息, 并获取所述 IPMB 消息接收处理任务单元所取得的对应的应答消息。
本发明实施例的另一目的在于提供一种包含上述 IPMI 消息传输系统的计算机设 备。
本发明实施例提供了 IPMB 总线驱动的具体结构和流程, 实现了 IPMI 消息的传输, 从而实现了智能平台管理总线协议, 为 IPMI 智能平台管理网络的组建提供了连接保证。 附图说明
图 1 是现有技术提供的 IPMI 请求消息和应答消息的格式图 ;
图 2 是本发明实施例提供的 IPMB 总线连接模型示意图 ;
图 3 是本发明实施例提供的 IPMI 消息传输系统的结构图 ;
图 4 是本发明实施例提供的 IPMB 消息接收处理任务单元的结构图 ;
图 5 是本发明实施例提供的 IPMB 消息发送并等待应答接口的结构图 ;
图 6 是本发明实施例提供的 IPMB 驱动和 I2C 总线驱动以及 IPMI 固件应用程序之 间的关系示意图 ;
图 7 是本发明实施例提供的 IPMB 驱动中各个接口函数以及内部的 IPMB 消息处理 任务之间相互协作的层次关系, 及其之间的数据流向图 ;
图 8 是本发明实施例提供的 I2C 总线中断处理函数的实现流程图 ;
图 9 是本发明实施例提供的 IPMB 消息接收处理任务函数的实现流程图 ;
图 10 是本发明实施例提供的 IPMB 总线接口发送消息并等待应答消息的接口函数的实现流程图。 具体实施方式
为了使本发明的目的、 技术方案及优点更加清楚明白, 以下结合附图及实施例, 对 本发明进行进一步详细说明。 应当理解, 此处所描述的具体实施例仅仅用以解释本发明, 并 不用于限定本发明。
本发明实施例提供了 IPMI 智能设备通过 IPMB 总线发送、 接收消息所需要的程序 接口、 驱动架构、 数据结构以及实现的程序流程, 实现了 IPMI 消息的传输。
在 IPMI 规范中所定义的 IPMB 总线上可以挂载智能和非智能的 I2C 设备, 图2示 出了一个简单的 IPMB 总线连接模型, 其中 :
基 板 管 理 控 制 器 (Baseboard Management Controller, BMC) 和 管 理 控 制 器 (Management Controller) 是智能设备, FRU SEEPROM( 存储现场可替换单元信息的具有串 行接口的电可擦除可变成只读存储器 ) 为非智能设备, 通过 IPMB 总线连接器 (Connector) 2 将 I C 总线延伸至机架内其他的远端管理载板 (Remote Management Card) 上, 远端的 IPMI 设备则有可能是智能设备, 也有可能是非智能设备。此外, IPMB 总线还可以通过连接器连 接平台内各个外插卡上的平台管理设备, 组建分布于整个平台的智能平台管理网络。 对于非智能设备, 如外插模块上用于存放现场可替换单元 (Field-Replaceable Unit, FRU) 数据的电可擦除可编程只读存储器 (Electrically Erasable Programmable Read-Only Memory, EEPROM)、 温度传感器等, 只需要使用 I2C 总线驱动加上特定的设备驱动 即可使用。
智能设备主要是指具有自主处理能力的设备, 如 Micro TCA 架构中的模块管理控 制器 (Module Management Controller, MMC), 双方两个智能设备都需要发送和接收 IPMI 消 息, 因此在总线连接的两边都需要实现 IPMB 总线接收、 发送 IPMI 消息的接口驱动。
图 3 示出了本发明实施例提供的 IPMI 消息传输系统的结构, 为便于说明, 仅示出 了与本发明实施例相关的部分。
该 IPMI 消息传输系统可以广泛应用于支持 IPMI 相关规范的计算机设备。
IPMI 固件应用程序 1 调用 IPMB 驱动 2 的接口进行 IPMI 消息的收发, IPMB 驱动 2 2 的数据的收发通过 I C 总线驱动 3 实现。
I2C 中断服务单元 31 接收消息包, 将接收到的消息包存放在 IPMB 总线消息缓冲队 列。
IPMB 消息接收处理任务单元 21 从 IPMB 总线消息缓冲队列中取得消息, 若取得的 消息为应答消息, 则进行应答消息匹配, 若取得的消息为请求消息, 则将请求消息放进 IPMB 请求消息队列。
IPMB 消息接收接口 22 读取 IPMB 请求消息队列中的消息。
IPMB 消息发送并等待应答接口 23 调用 IPMB 消息发送接口 24 发送 IPMI 请求消 息, 并从 IPMB 消息接收处理任务单元 21 获取对应的应答消息。IPMB 消息发送接口 24 将校 验通过的 IPMI 消息通过 I2C 总线驱动 3 的 I2C 写单元 (I2C write)32 发送出去。
IPMI 固件应用程序 1 通过 IPMB 消息接收接口 22 从 IPMB 请求消息队列中每次读 取一条 IPMI 请求消息进行处理, 通过 IPMB 消息发送接口 24 将得到的应答消息发送出去。
另外, IPMI 固件应用程序通过 IPMB 消息发送并等待应答接口 23 发送一条 IPMI 请 求消息, 并可获得对应的应答消息。
图 4 示出了本发明实施例提供的 IPMB 消息接收处理任务单元的结构, 为了便于说 明, 仅示出了与本发明实施例相关的部分。
消息读取模块 211 从 IPMB 总线消息缓冲队列中读取消息。
消息校验模块 212 校验消息包的消息校验字 checksum。
消息判断模块 213 根据消息的网络功能号 (net Fn) 判断校验通过的消息是否为 请求消息, 当为请求消息时, 将其放入 IPMB 请求消息队列。
应答消息匹配模块 214 当消息判断模块 213 判断消息为应答消息时, 在等待应答 匹配链表中查询应答消息的应答匹配项, 将应答消息发送给应答匹配项中描述的邮箱。
图 5 示出了本发明实施例提供的 IPMB 消息发送并等待应答接口的结构, 为了便于 说明, 仅示出了与本发明实施例相关的部分。
消息邮箱创建模块 231 判断要发送的消息是否为请求消息, 是则为请求消息创建 一个消息邮箱。
应答等待模块 232 打包一个描述有该消息邮箱的应答匹配项, 并加入等待应答匹 配链表。 应答处理模块 233 将从消息邮箱中接收到的应答消息拷贝进返回数据缓存中, 从 等待应答匹配链表中删除该应答匹配项。
在本发明实施例中, 上述 IPMB 驱动接口可以通过函数实现, 具体包括 :
IPMB 总线接口打开函数 IpmbIntfOpen() ;
IPMB 总线接口关闭函数 IpmbIntfClosed() ;
IPMB 总线接口接收函数 IpmbIntfRecv() ;
IPMB 总线接口发送函数 IpmbIntfSend() ;
IPMB 总线接口发送消息并等待应答消息的接口函数 IpmbIntfSendRecv() ;
IPMB 总线初始化函数 IpmbInit()。
图 6 示出了 IPMB 驱动和 I2C 总线驱动以及 IPMI 固件应用程序之间的关系, 其中 虚线内的部分是嵌入式操作系统所使用的文件系统, 如 Linux 操作系统, 对于 uCOSII 等不 使用文件系统的操作系统, 应用程序直接调用 IPMB 驱动的接口, IPMB 驱动的数据的收发最 2 终通过 I C 总线驱动来实现。
IPMI 固件应用程序通过 IpmbIntfRecv() 接口读取一条 IPMI 请求消息进行处 理, 通过 IpmbIntfSend() 接口将得到的应答消息发送出去 ; 另外, IPMI 固件应用程序通过 IpmbIntfSendRecv() 接口发送一条 IPMI 请求消息, 并可获得对应的应答消息。
智 能 平 台 管 理 总 线 协 议 (Intelligent Platform Management Bus Communications Protocol Specification v1.0) 定义了智能设备之间的 IPMI 消息包的格 式, 如图 1 所示。
本发明实施例针对该数据格式配置了一个联合体 (IPMI_MESSAGE) 来描述 IPMB 消 息, 示例如下 :
typedef union
{
struct { INT8U INT8U INT8U INT8U INT8U INT8U INT8U INT8U INT8U }Req ; struct { INT8UrsSA ; rsLUN:2 ; NetFn:6 ; Checksum1 ; rqSA ; rqLUN:2 ; rqSeq:6 ; Cmd ; Data[1] ;rqSA ;INT8U rqLUN:2 ;
INT8U NetFn:6 ;
INT8U Checksum1 ;
INT8U rsSA ;
INT8U rsLUN:2 ;
INT8U rqSeq:6 ;
INT8U Cmd ;
INT8U CCode ;
INT8U Data[1] ;
}Rsp ;
}IPMI_MESSAGE ;
对于 request 和 response 数据中的数据域 (data bytes), 定义一个字节的数组。 在使用的过程中配置一个 IPMI_MESSAGE 类型的指针指向接收的消息包。
由于实际的数据长度比本发明实施例中配置的数据长度要长, 所以可以使用大于 0 的下标来读取 Data[]。由于 IPMB 总线协议定义的数据长度不固定 ( 最长 2 个字节 ), 而 2 I C 总线在接收一段消息包时能够获取到数据的长度, 所以本发明实施例将 IPMB 驱动各个 模块之间传递的消息包格式配置成如下的形式, 这样通过给出数据长度, 方便后续程序实 现:
typedef struct
{
INT8U Len ;
INT8U Data[2] ; //IPMI Message
}MSG_Q_MSG ;
图 7 示出了 IPMB 驱动中各个接口函数以及内部的 IPMB 消息处理任务之间相互协作的层次关系, 及其之间的数据流向, 其中, 单箭头表示输入数据流, 宽箭头表示输出数据 2 流, 图中的 I C 总线驱动部分运行在主从模式, I2cInterruptServicer() 为 I2C 总线中断服 务函数, IpmbintfTask() 为 IPMB 消息接收处理任务函数。
IPMI 固件应用程序调用 IpmbIntfSendRecv() 函数向外发送一条请求消息, 该函 2 数调用 IpmbIntfSend() 函数将请求消息通过 I C 总线驱动发送出去, 并建立一个应答匹配 项挂入等待应答匹配链表中, 其数据结构示例如下 :
typedef struct
{
LIST_ENTRY Link ;
INT8U rsSA ;
INT8U rsLUN:2 ;
INT8U NetFn:6 ;
INT8U rqLUN:2 ;
INT8U rqSeq:6 ;
INT8U Cmd ;
INT8U Timeout ;
OS_EVENT *MBox ;
}MMC_RSP_MATCH_ENTRY ;
I2C 总线中断服务函数 I2cInterruptServicer() 接收到一个消息包后 (I2C 以起始 信号来判断一个消息包的开始, 以结束信号来判断一个消息包的结束 ), 将其存放在 IPMB 总线消息缓冲队列内。
具体实现流程如图 8 所示, 详述如下 :
在步骤 S801 中, 关闭中断 ;
在步骤 S802 中, 接收数据 ;
在步骤 S803 中, 判断数据是否到结束条件, 是则执行步骤 S804, 否则返回执行步 骤 S802 ;
在步骤 S804 中, 将消息包存放在 IPMB 总线消息缓冲队列内 ;
在步骤 S805 中, 开启中断。
IPMB 消息接收处理任务函数 IpmbIntfTask() 从 IPMB 总线消息缓冲队列中取 得消息包, 根据消息的网络功能号 (net Fn) 的奇偶来分辨是请求消息还是应答消息, 如果是奇数, 进行应答消息匹配, 如果有匹配的请求消息正在等待 ( 即有任务正在调用 IpmbIntfSendRecv() 发出请求消息等待应答 ), 则将该应答消息发送给对应的邮箱, 这样 发送请求消息的任务就可以通过 IpmbIntfSendRecv() 函数返回对应的应答消息 ; 如果是 偶数则将该请求消息放进 IPMB 请求消息队列。
具体实现流程如图 9 所示, 详述如下 :
在步骤 S901 中, 从 IPMB 总线消息缓冲队列中读取一条消息 ;
在步骤 S902 中, 判断 IPMB 总线消息缓冲队列是否为空, 是则返回执行步骤 S901, 否则执行步骤 S903 ;
在步骤 S903 中, 校验消息包的消息校验字 checksum ;在 步 骤 S904 中, 判 断 校 验 是 否 通 过, 是 则 执 行 步 骤 S904, 否则返回执行步骤S901 ; 在步骤 S905 中, 判断消息是否为请求消息 Request, 是则执行步骤 S906, 否则执行 步骤 S907 ;
在步骤 S906 中, 将请求消息放到 IPMB 请求消息队列 ;
在步骤 S907 中, 在等待应答匹配链表中查询匹配项 ;
在步骤 S908 中, 判断是否找到匹配项, 是则执行步骤 S909, 否则返回执行步骤 S901。
在步骤 S909 中, 将应答消息发送给匹配项中描述的邮箱。
IPMI 应用层通过 IpmbIntfRecv() 函数读取消息, IPMI 应用层进行请求消息处理 之后, 产生应答消息, 直接调用 IpmbIntfSend() 函数发送出去。
IPMI 应用层通过 IpmbIntfSendRecv() 函数发送一条请求消息, 并获取对应的应 答消息。
IpmbIntfSendRecv() 函数先要判断要发送消息是否为一个请求消息, 如果是, 则 为其创建一个消息邮箱, 并根据上述数据结构打包一个匹配项挂入等待应答匹配链表中, 调用 IpmbIntfSend() 函数将消息发送出去, 完成后等待邮箱接收返回消息, 应答消息会从 该邮箱中获得, 之后便删除此邮箱和等待应答匹配链表中刚加进去的节点, 返回应答消息。
具体实现流程如图 10 所示, 详述如下 : 在步骤 S1001 中, 判断要发送的消息是否为请求消息 ; 在步骤 S1002 中, 为请求消息创建一个消息邮箱 ; 在步骤 S1003 中, 打包一个应答匹配项, 并加入等待应答匹配链表 ; 在步骤 S1004 中, 调用 IpmbIntfSend() 函数发送请求消息 ; 在步骤 S1005 中, 设置超时时间, 等待邮箱返回 ; 在步骤 S1006 中, 判断邮箱返回是否正确, 是则执行步骤 S1007, 否则执行步骤S1008 ; 在步骤 S1007 中, 将接收到的应答消息拷贝进返回数据缓存中 ;
在步骤 S1008 中, 从等待应答匹配链表中删除应答匹配项。
IpmbIntfRevc() 主要实现请求消息队列的读取, IpmbIntfSend() 则是将校验通 2 过的消息包通过 I2cWrite() 发送出去, I C 总线驱动不属于 IPMB 总线协议定义的范围, 不 再赘述。
本发明实施例提供了 IPMB 总线驱动的具体结构和流程, 实现了 IPMI 消息的传输, 从而实现了智能平台管理总线协议, 为 IPMI 智能平台管理网络的组建提供了连接保证。
以上所述仅为本发明的较佳实施例而已, 并不用以限制本发明, 凡在本发明的精 神和原则之内所作的任何修改、 等同替换和改进等, 均应包含在本发明的保护范围之内。