浅谈 NCSI 及其在 Linux 上的实现(2)NCSI 控制命令协议
- UID
- 1066743
|
浅谈 NCSI 及其在 Linux 上的实现(2)NCSI 控制命令协议
NCSI 控制命令协议NCSI 控制命令允许管理控制器初始化、规范化自己的 NCSI 接口流量,配置 NCSI 信道过滤规则以及监控网络控制器的运行状态。作为 NCSI 控制命令协议的主体,管理控制器是所有控制命令的发起者,而网络控制器则响应管理控制器发送的控制命令。
NCSI 实例号(IID)所有通过 NCSI 命令发送的 NCSI 请求都有一个唯一的标识符 Instance ID(IID)。IID 是一个 8 比特长的标识序列。每个 NCSI 响应包的 IID 都等于所对应的 NCSI 请求包的 IID。通过使用 IID,可以有效地识别新的 NCSI 请求,提高 NCSI 请求与响应匹配的鲁棒性,并且区分新的 NCSI 请求与超时重传的 NCSI 请求。
网络控制器在收到标记有 IID 的 NCSI 请求时,会遵循如下的操作原则:
- 在响应的包的相应位置会标记有该 NCSI 响应对应的 NCSI 请求的 IID。
- 如果收到的 NCSI 请求的 IID 与之前收到的相同,则表明这是一个超时重发的 NCSI 请求。NCSI 标准规定,此时网络控制器必须对重发的 NCSI 请求作出响应。网络控制器可以根据具体的 NCSI 命令,返回前一次 NCSI 命令的执行结果,如果该执行结果在当前时刻还没有失效。或者,网络控制器也可以重新在当前时刻再执行一遍 NCSI 命令。
- 如果收到的 NCSI 请求的 IID 与之前收到的不同,则网络控制器必须将这个请求看成是一个新的 NCSI 请求。
- 对于一个被重新初始化的网络控制器而言,它所收到的第一个 NCSI 请求一定是一个新的请求,而不管他在没有被重新初始化前是否收到具有相同 IID 的 NCSI 请求。
对于管理控制器而言,它在处理 IID 时遵循如下原则:
- 每个新的 NCSI 请求实例必须有与之前不同的 IID。
- 如果一个 NCSI 请求需要被重传,则其 IID 必须与之前的 NCSI 请求的 IID 相同。
- 由于 NCSI 响应包的 IID 等于其对应的 NCSI 请求包的 IID,所以 IID 可以进一步被管理控制器用作确认某个特定的 NCSI 请求是否被响应的标志。
单线程机制就目前而言,网络控制器只能以单线程的方式支持 NCSI 命令。也就是说,网络控制器一次只能够执行一个 NCSI 命令。只有当它对收到的某个 NCSI 请求发送了响应包之后,才能够继续接受下一个 NCSI 请求。
网络控制器的这种单线程机制使得管理控制器在对同一个网络控制器发送 NCSI 请求时也只能以单线程方式进行。当管理控制器向某个网络控制器发送了一个 NCSI 请求后,它必须保持等待状态,直到收到了网络控制器发出的 NCSI 响应或者超时重传为止。
超时重传机制如果在 NCSI 命令超时的时间间隔内,管理控制器还没有收到网络控制器回复的 NCSI 响应,则管理控制器必须以相同的 IID 重发之前的 NCSI 请求。
管理控制器必须尝试 NCSI 请求至少 3 次,才能够报告网络控制器发生了错误。
在网络环境相对恶劣的情况下,可能管理控制器在收到之前发送的 NCSI 请求的响应的时候,已经超过了超时重发的时间间隔。在这种情况下,管理控制器会收到对于同一个 NCSI 请求的两个响应。管理控制器必须有相应的机制能够检测出这第二个 NCSI 响应,并且将它丢弃。
异步事件通告包AEN(Asynchronous Event Notification)包是网络控制器在某些状态发生变化、且影响其接口正常工作的情况下向管理控制器主动发送的通告数据包。由于 NCSI 命令只是网络控制器处理的众多数据包中的一小部分,网络控制器的一系列事件都会影响到命令的正常执行。这些事件包括:链路状态变化、操作系统驱动加载及卸载、芯片复位等等。
网络控制器对哪些事件会向管理控制器发送 AEN 包是由管理控制器来定义的,管理控制器通过使用控制位(control bit),可以单独地定义网络控制器对各个事件的异步事件通告是否启用。
AEN 包是工作在 NCSI 请求 - 应答机制之外的一种 NCSI 包。也就是说,AEN 包既不是 NCSI 请求,也不是任意 NCSI 请求的响应。AEN 包没有应答,即使一个 AEN 包在传输的过程中丢失了,管理控制器也无从得知。
一个 AEN 包的 IID 始终为 0x00。 |
|
|
|
|
|