在主机到控制层的方向上,流控制可以避免造成控制层缓冲区的溢出。主机控制接口接口有命令流控和数据流控两种形式。控制器使用命令流控同时处理多个主机控制接口命令。主机可以通过控制器来获知缓冲区的长度,从而得知可以同时发送的命令的最大数量。要启动命令流控,命令完成事件和命令状态事件都必须包含一个Num HCI Command Packets参数表示控制器能缓存多少命令,还会在其中包含缓冲区的剩余空间。
数据流控与命令流控差不多。每次控制器都从一个缓冲区提取数据包来发送给对端设备,一旦数据包发送成功,控制器释放该缓冲区,以便装填主机发送给控制器的新数据包。主机通过命令LE Read Buffer Size获知缓冲区的剩余数量,控制器发送Number Of CompletedPackets事件给主机,使其知道释放了多少个缓冲区及哪些数据发送到了对端设备。基于控制层缓冲区状态的信息,主机会决定是否向控制层提交新的命令与数据,或者是否等待。
在控制层到主机方向上,没有直接的流控制。主机控制接口不支持事件流控,因为事件的数量受限于可处理命令的数量,并且主机比控制器有更多资源能够顺序地缓冲和处理这些事件。控制器到主机的数据流控可以忽略,因为大部分主机都能处理从控制器到主机的大量数据,没有必要进行流控。
如有必要,主机控制接口的流量控制可由主机控制器来实现对主机的控制,可以通过Set_Host_Controller_To_Host_Flow_Control命令设置,其控制过程基本与主机控制过程类似,只是命令稍有不同。当主机收到断链确认的事件后,就认为所有传往主机控制器的数据包已经全部被丢弃了,主机控制器中的数据缓冲区也被释放了 。