概述
MMU介於Ingress和Egress之間,被所有端口共享。MMU同時支持內部和外部緩存。
一個入口報文,可以緩存到內部緩存、外部緩存或者both,取決於報文轉發到哪個端口(Egress Port)。每個Egress Port要么指定內部緩存,要么指定外部緩存,not both。對於組播報文這種轉發到多個Egress Ports的情況,則可能報文會根據Egress Port同時緩存到內部和外部緩存中。
MMU包含以下功能組件:(buffer blocks用來緩存報文,queue blocks用來緩存控制結構和轉發數據)
- Admission Control:根據入端口和優先級、出端口、隊列和緩存占用情況,決定轉發還是丟棄報文
- Internal Buffer:2MB片內SRAM,EMA(External Memory Access) buffer pool也在其中
- External Buffer:外部DRAM(外接DDR)
- EMA Queues:訪問External Buffer的隊列,即Ingress和外部DRAM之間的緩沖區
- Replication Engine Work Queues:組播、鏡像包和copy_to_cpu報文的隊列
- Egress Port Queues:每個Egress Port一組隊列,包括Internal Buffer Queues和External Buffer Queues,總共有256K條egress queues
Life of a Packet Inside the MMU
MMU內部報文轉發流程如下圖,主要分為控制路徑和數據路徑:
- 控制路徑上報文頭(packet header)緩存在Replication Engine Queues和Egress Queues中;
- 數據路徑上報文負載(packet payload)緩存到Internal Buffers、EMA和External Buffers。

在入端口報文准許進入Ingress Queue之前,均會進行Ingress和Egress資源限制的檢查(Admission Control),檢查失敗報文將被丟棄。假設所有資源均可用,對單個報文而言,存在上圖五種報文轉發路徑。
除了正常的L2/L3 multicast報文轉發之外,MMU按照組播轉發流程處理COPY_TO_CPU,mirror,broadcast報文。Replication Engine負責將這些報文復制到各Egress Queues。根據IPMC表轉發的組播報文在進入Egress Ports之前復制。Replication Engine每個時鍾周期可以復制最多4個報文,如果組播報文需要復制超過4份,那么就可能發生擁塞。類似於Egress Queues,Replication Engine也可以配置thresholds和limits,用來處理擁塞。

Buffer Management
Buffer Management指為每個Egress Queue,Ingress Priority Group和Ingress Port分配MMU緩存的機制。主要有兩個目的,其一為每個Ingress Port公平地分配緩存資源,其二處理報文擁塞,主要是突發報文的吸能。
Resource Types
- 2MB internal buffer, 192Bytes cell size,一個報文最少使用一個cell且不能與其他報文共享cell。
- External memory access pool在2MB internal buffer中,EMA pool大小在初始化時指定且不能動態調整。
- 8K Replication Engine(RE) work queue entries,用來進行multicast,mirror, or copy_to_cpu報文的復制。
- External buffer,768Bytes cell size。
- 256K egress queue entrise(EQEs),EQEs類似於packet pointers。256K EQE限制了internel & external buffer最大緩存報文數。每個報文需要一個packet pointer,無論報文的長度是多少,即64字節報文和9216字節報文都只占用一個packet pointer。
Accounting Sites
Ingress & Egress Admission Control需要清楚地知道cells和packet pointers資源的使用情況,才能決定是否准許報文進入隊列。交換芯片通過維護一個基於端口的Ingress & Egress的包計數來實現,Admission Control准許報文進入隊列時,計數增加,報文轉發出端口時,計數減少。
在Ingress方向,每個入端口報文均按照端口和per-port per-priority-group兩個維度計數。對於單播、組播和廣播報文均如此。組播、廣播和copy_to_cpu報文的復制在入Egress Queues之前完成,隨后才能Scheduling流程,無論復制多少份,在Ingress Port包計數中,只計數一個包。
在Egress方向,每個出端口報文均按照分類和隊列兩個維度計數。對於單播報文,每個報文增加一個egress queue counter。對於組播、廣播和copy_to_cpu這種復制報文,Egress方向每個復制的報文均計數,因為每個復制的報文均占據了EQEs資源。
Memory Allocation
緩存分配分為動態分配和靜態分配兩種方式。動態分配依據alpha值來動態分配shared資源。
以THDO_QCONFIG_CELL為例
1)Q_MIN_CELL限制了每個EQ最少使用資源數。
2)Q_LIMIT_ENABLE_CELL為0,則該EQ隊列使用cell超過Q_MIN_CELL時,可以使用共享資源,Q_LIMIT_ENABLE_CELL為1,則丟棄報文。
3)Q_LIMIT_DYNAMIC_CELL為0,則為靜態分配,可以使用的共享資源數受Q_SHARED_LIMIT_CELL限制;如果為1,則為動態分配,根據Q_SHARED_ALPHA_CELL值從共享資源池中取相應比例的資源。如果某一隊列沒有流量,那么alpha值大或者小,不會影響其他隊列。
4)動態模式下,PORT_MAX_SHARED_CELL寄存器配置各端口共享緩存資源池的資源數。
tips: QENTRY和CELL是一樣的,只不過是計量單位有區別。可以讀取QSTATUS_CELL即可。
Ingress Admission Control
目的:
1) Ingress port starvation avoidance
2) Ingress fairness
3) Lossless frame delivery
交換芯片會對以下資源進行Ingress Admission Control檢查:
1) Internal buffer ingress pool (cell)
2) External buffer ingress pool (cell) 寄存器前綴EXT
3) EMA ingress pool (cell) 寄存器前綴EMA
4) RE work enqueue entry pool (RQE) 寄存器前綴REQ
5) Egress queue entry pool (EQE) 寄存器前綴QEN
每種資源單獨統計入端口報文數,並根據各自閾值進行檢查。
當入端口報文占用緩存資源達到PG_SHARED_LIMIT時,觸發PAUSE幀或者PFC流控幀,通知入端口方向停止發送報文;當占用緩存資源達到PG_RESET_VALUE和PG_RESET_FLOOR的較大值時,通知發送方繼續發送報文。

緩存可以按照PG(Priority Group)、Ingress Port、Pool三個層級設置閾值。並分為三類:
1) Guaranteed
2) Shared
3) Headroom
PG和報文優先級的映射是通過PORT_PRI_GRP0/1寄存器配置。


Egress Admission Control
目的:
Egress Queue擁塞的時候,公平地分配緩存資源。
Egress admission check涉及以下四種資源:
1) Egress buffer
2) EMA pool
3) Egress queue entries
4) Replication engine work queue entries


按照queue/queue set/buffer pool三個層級設置閾值,並分為兩類:
1) Guaranteed
2) Shared

Traffic Management
兩種常用的流量監管的方式是——PAUSE流控和Egress Port限速。
