2.6队列控制器
设备的队列控制器使用具有资源预留功能的高级非阻塞,八个优先级,输出端口队列体系结构。因此该设备支持可定义的帧延迟,并保证了帧传输(对于高优先级帧),而在任何拥塞的环境中(对于所有帧优先级)都不会出现行的头部阻塞问题或无阻塞流干扰。
2.6.1帧延时
该设备具有独特的高性能的八位优先级的帧延时系统,当商品退出当前优先级较低的优先级帧时,一个高优先级的帧始终会在下一个帧或要退出端口的帧的后面。无论优先级如何,以及交换机的出口端口调度模式如何。
2.6.2没有行的头部的块
慢速或拥塞的输出端口从来不影响帧的传输到拥塞的端口。设备是确保所有未拥塞的流量都经过交换机而不会降低,而与交换机其他位置的拥塞无关。.
2.6.3有和没有流控的QoS
队列控制器针对有一种操作模式进行了优化:
1、 在所有端口上禁用流控
2、 在所有端口上启用流控
3、 在某些端口上启用了流控制,而在其余端口上禁用了流控。
当流控是启用的,不会丢失任何帧,并且优先级较高的流会从交换机接收到更高的带宽(即如果优先级较高的流与优先级较低的流之间存在拥塞,则这些流的约束较少)。每个流接收的带宽百分比由调度模式确定。流控制可防止丢帧,但是会严重影响使用流控制的任何网段上的可用带宽。如果使用IEEE802.3X标准则流出网络上的较高优先级数据的等待时间也会增加,因此在QoS切换环境时下流控可能不是理想的。所以设备支持IEEE 802.1Qbb优先级流控,并且还进行了优化,可以在没有流控的情况下正常工作。
当流控是禁用的并且出现长时间的拥塞则帧会被丢弃。在所有的交换机中都是如此。设备丢弃当前帧,即低优先级的帧。较高优先级的帧将获得较高优先级的百分比缓冲区。这个百分比由调度模式确定。
在混合流控情况下,如果在非流控路径上发生了拥塞帧会被丢弃,然而流控的路径不丢任何帧。每个端口接收的带宽百分比基于优先级。并且交换机中所有端口之间均保持公平性(由调度模式确定)。在混合模式下,如果帧的源端口和目标端口都启用了流控(FCPath清零,端口偏移量为0x02索引为0x10)
由不会丢弃帧。如果使能了流控入口端口映射一个帧到使能非流控的出口端口,如果发生拥塞(同样的丢弃动作将会发生:如果入口端口不是流控使能而入口端口是流控使能)则会丢弃帧。
为了不丢帧要求源端口和目的端口必须启用流控,这是外部交换机端口之间的最佳模式。但是通常不是最适合内部交换机的端口,例如连接到内部CPU的端口。在这种情况下流控只能在内部CPU的端口被使能,并且CPU发送到交换机的帧不会被丢弃即使在目的端口没有被打开。通过设置端口的FCPath位为1来支持此模式。(端口偏移量为0x02索引为0x10)
PS:启用流控:优点是不丢帧,优先级高的会更高的带宽缺点是会严重影响可用带宽会增加等待时间
禁用流控:长时间拥塞会丢帧
混合流控下,禁用流控的路径会丢帧,流控的路径不会丢帧。
2.6.4无需流控即可保证帧的传输
由于其智能的资源预留系统,即使禁用了流控制,该设备也可以保证高优先级的帧传送。如果由于缺少缓冲区而导致较高优先级的帧无法进入交换机,拥有具有多个优先级的输出队列不足以支持服务质量(QoS)。设备为更高优先级的帧保留缓冲区,以便可以接收它们然后进行切换。这些高优先级缓冲区是第一个从空闲队列中补充的缓冲区,该队列为下一个高优先级帧准备了接收端口。
2.6.5队列
交换机的队列:

2.6.5.1队列管理器
在复位时(通过硬件RESETn引脚复位,或通过全局开关控制寄存器的SWReset位复位,全局1偏移量0x04),队列管理器通过将所有缓冲区指针放入空闲队列来初始化空闲队列并确保其他队列为空。然后它从空闲队列中获取第一个可用的空闲缓冲区指针,并将它们分配给任何未禁用且链接正常的入口端口。交换机已准备好去接受和交换数据包。每当任何端口的链路出现故障或端口设置为禁用端口状态时,端口的入口缓冲区和输出队列缓冲区都会立即返回到空闲队列。这样可以防止缓冲区过时或丢失,并使“空闲队列”尽可能大,以便可以处理较大的瞬时拥塞突发。当一个非禁用端口链路恢复正常时,它将恢复其入口缓冲区,以便它可以再次开始接收帧。
当MAC接收到数据包时,会将其放入从队列管理器接收到的输入指针指向的地址的嵌入式存储器中。当接收到数据包后,MAC会翻译指针到队列管理器并且从空闲队列中请求新的缓冲区。如果“空闲队列”为空,则MAC在它们变为可用之前不会接收任何指针。如果MAC在没有指针的情况下开始接收数据包,则该数据包将被丢弃。如果启用了流控制,则会在此之前断言。
队列管理器使用从查找引擎(1.2.1ab)和入口逻辑(2节和2.4节)和TCAM(6.1节)返回的数据来确定哪个输出队列或多个队列。数据包的指针应该到达哪个优先级。此时,队列管理器根据交换机的模式及其拥塞程度修改所需的帧映射。支持两种模式,带和不带流控制。两种模式是同时处理的,并且每个端口可以不同(即,一个端口启用了流量控制,另一个端口禁用了流量控制)。
如果在入口端口启用了流控,并且在出口端口也启用了流控(假设端口的FCPath=0,第2.6.3节)的情况下,帧将切换到所需的输出队列。这样做是为了避免丢帧。取而代之的是队列的管理器会仔细的监视输出队列已拥塞,并在导致拥塞的入口端口上启用或禁用流控。这种方法允许未拥塞的流量通过交换机不会降级。
如果在入口端口或出口端口禁用流控则不是会将其交换到所需的输出队列而是会丢弃该帧。如果帧是有超过一个的输出它可能交换到某些和不是其他的。队列管理器的决策方式是很复杂的在做决策之前将许多信息放入到账户中。队列管理器会查看当前帧的优先级以及将帧交换到当前输出队列的拥塞程度,和空闲队列中的空闲缓冲区的数目。结果是即使交换机中其他地方出现拥塞,交换机上的流量也不会阻塞,并且优先级更高的帧,更快地进入交换机并通过交换机。
PS:芯片内部的调度算法
2.6.5.2输出队列
对于任一给定的优先级,输出队列按照接收顺序接收和发送数据包。这对于某些形式的以太网流量非常重要。输出队列尽快清空,但是它们以不同的速率清空。这可能是由于端口配置的速度较慢,也可能是由于网络拥塞(冲突或流量控制)引起的。
每个端口包含八个独立的输出队列,每个优先级一个。帧从每个端口发送出去的顺序由端口的调度位(端口偏移量0x1c索引0x00)控制。可以选择严格的加权循环优先级,也可以选择两者的混合(2.6.6节)。加权轮循是可编程的。(2.6.7节)。
在数据包整个传输到了MAC后,输出队列会将已发送的数据包的指针传递给多播处理程序进行处理。然后MAC开始发送下一个数据包。
2.6.5.3多播处理程序
多播处理程序接收到从所有传输完的数据包的指针。它查找每个指针,它查找每个指针并查看是否被定向到多个输出队列。如果不是,则将指针返回到可再次使用的空闲队列。如果帧被交换到多个输出队列,则多播处理程序会确保在将指针返回到空闲队列之前,该帧已经退出了所有已交换的端口。
2.6.6每个端口固定的或加权优先级
设备支持严格的优先级,加权轮循或基于每个出口端口的选择的混合方式。(端口偏移量0x1c,索引0x00)的调度位进行选择。在严格的优先级方案中,所有最高优先级的帧都向一个端口流出,直到该优先级的队列为空为止。然后下一个较低优先级的队列的帧流出,诸如此类。这种方法会导致较低优先级被饿死,导致它们不能传输帧,但是确保了高优先级的帧能尽可能快的从交换机出口出去。在加权方案中,除非在Qos权重表(2.6.7节)中编写了替代权重,否则将对8个优先级应用33、25、17、12、6、3、2、1权重。这种方法可以防止较低优先级被饿死,而对较高优先级的帧只有很小的延迟。
某些应用程序可能要求最高优先级队列或最高“n”优先级队列处于固定优先级模式,而较低优先级队列以加权方式工作。使用端口偏移量0x1c处索引为0x00的端口调度位,可以在每个端口的基础上选择所有调度模式。如下
0x00 对所有队列使用加权轮询
0x01 对队列7使用严格的优先级,到队列6到0使用加权循环
0x02 对队列7和6使用严格的优先级,对队列5到0使用加权循环
0x03 对队列7到5使用严格的优先级,对队列4到0使用加权循环
0x04 对队列7到4使用严格的优先级,对队列3到0使用加权循环
0x05 对队列7到3使用严格的优先级,对队列2到0使用加权循环
0x06 对队列7到2使用严格的优先级,对队列1和0使用加权循环
0x07 对所有队列使用严格的队列优先级
2.6.7可编程加权表
设备支持一个可编程的加权表,该表对于所有端口都是全局的。该表不仅定义了每个优先级队列的权重,而且还定义了帧如何离开端口的顺序。可以定义适合128个序列步骤的任何序列的权重。
2.6.7.1默认表
默认表使用33、25、17、12、6、3、2、1权重,由7到0来表示优先级那么对应关系为7 、6 、5 、4 、3 、2、1、0。按顺序排列,此权重表如下所示:
7,6,5,7,1,6,7,4,5,7,6,3,7,6,5,7, 4,6,7,2,5,7,6,4,7,6,5,7,3,6,7,4,
5,7,6,0,7,6,5,7,4,6,7,3,5,7,6,4, 7,6,5,7,2,6,7,4,5,7,6,3,7,6,5,7,
4,6,7,1,5,7,6,4,7,6,5,7,3,6,7,4, 5,7,6,2,7,5,6,7,3,5,7,6,3,7,6,5,
7,4,6
对序列中的每个数字进行计数,总共有99个。假设端口上的优先级队列已满,则帧将以该顺序从端口发出。该序列很重要,因为它定义了何时允许较高优先级的帧离开端口。查看上面段落中的默认顺序。如果优先级队列0是其中唯一包含帧的队列,则这些帧将以全线速离开端口。这是因为“下一个要服务的队列”决策始终在一个时钟内完成。因此,如果“服务队列”指针位于列表的中间位置“ 0”,并且如果队列7至1为空,则该指针将在一个时钟后跳回到“ 0”,然后下一帧跳出该端口将来自队列0。发生这种情况时,如果将新帧以优先级1映射到端口的出口队列,则它将是下一个要出口的帧,因为序列列表中先出现数字“ 1”,然后才出现下一个“ 0”。如果将新帧的优先级映射为“ 2”到“ 7”,则会发生相同的情况。
假设队列2是其中唯一包含帧的队列。当“服务队列”指针从列表中的第一个“ 2”到下一个指针时,这些帧将以全线速离开端口。如果队列1在其队列中得到一些帧,则序列将为:2、1、2、2、1、2,其重复为1、2、2、1、2、2,…,作为“ 7”至“ 3和0被跳过。更重要的是,如果在此示例中出现优先级为7的帧,则它将始终是下一帧或该帧之后的下一帧,因为列表中的其他两个条目后面都跟随有“ 7”。因此,无论当前的“服务队列”指针在哪里
列表中,队列7将始终是下一个或第二个。如果有队列,可以对优先级6做出相同的陈述7是空的。假设跳过了“ 7”(因为它为空),则在不超过两个条目之后重复数字“ 6”。
PS:如果队列已满则启用默认优先级,它有99个优先级但是优先级最高的7最多为33个,那么从这个端口出去的优先级为7的队列最多即数据最多,即它的权重最重。
2.6.7.2备用的权重表
默认的加权表在上一节,也可以按下面的顺序将相同的权重编程到设备中:
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,
7,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, 6,5,5,5,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3, 3,3,3,3,2,2,2,
1,1,0
虽然这样做可以允许突发优先级高的序列到来时更快地处理但是如果队列指针指向6时,如果有优先级7的帧过来时,那么必须等65帧(99-33)一个查询时间才能退出。定义权重时要注意这一点。
2.6.7.3可编程Qos加权表
可编程的Qos遵从以下的说明,这里以默认的加权顺序为例。
1、 定义你的加权序列时。确保所有队列按顺序至少显示一次。如果队列中没有队列,则帧将永远不会从该队列中退出,并且这些帧使用的内存缓冲区将永远滞留在端口后面。
2、 取序列7、6中的前两个条目并颠倒其顺序6、7
3、 以二进制的形式写入每个队列号形成8位的值如(01100111)6,7
4、 将此8位值定稿Qos权重寄存器(全局2偏移量0x1c)中的第一个指针(0x00)。
5、 重复序列中的所有条目,直到没有更多条目为止。假设不存在的条目
为零。继续执行该示例,如下所示。
1)5、7变为01110101定稿指针0x01
2)第二个1,6变成01100001定稿指针0x02

6、 未使用的条目不需要写
7、 示例中有99个步骤16进制为0x63,从0x63到0x40定义了序列的长度,并引起新序列的安装和使用(在执行此写入之前,将使用先前的Qos权重表)