我想了解 FDB 中用作 VLAN 列的内容。对于 ACCESS 端口,如果帧未标记,则为 PVID;如果帧已标记,则为帧 VID,对于 TRUNK,是否允许 VLAN?
我们可以将 FDB 的 CAM 记录在一个表中表示为如下结构:
type FdbEntry struct {
Port uint16
Address MACAddr
Type uint8
Vlan []uint16
TTL Duration
}
但是如果帧来到trunk端口,trunk端口可以有多个VLAN,我们分别在Vlan
字段中设置一个在trunk接口上指定的VLAN数组。如果端口是 ACCESS,我们使用 PVID。由于与 CAM 表一起获取记录的最快选项是通过哈希映射,因此密钥必须是唯一的,并且我们使用发送者的 MAC 地址作为密钥。这就是为什么 Vlan 字段是一个数组。
当帧到来时,我们必须在 FDB 中找到一个条目(因为我们支持 802.1Q)如果找到了一个条目,我们一定要检查入口端口 ID 和入口端口 ID,因为设备可能会重新连接到另一个端口,因此必须相应地更改端口 ID。如果找不到条目,我们必须在表 (FDB) 中创建一个条目,并将入口端口的 PVID 作为Vlan
字段。或者如果标记了入口帧,我们必须将帧 VID 设置为Vlan
字段而不是入口 PVID?
t = FdbEntry{
Port: ingressPort.Id,
Address: ingressFrame.srcAddr,
Type: DYNAMIC,
Vlan: ingressPort.Vlans(),
TTL: 60 * Second,
}
检查“MAC 运动时刻”
isMoved = fdbEntry.Port != ingressPort.Id
if isMoved {
// Be sure to check if a frame came to us, but from under a different port,
// we must necessarily overwrite the port in the table.
t = FdbEntry{
Port: ingressPort.Id,
Address: fdbEntry.Address,
Type: fdbEntry.Type,
Vlan: fdbEntry.Vlan,
TTL: fdbEntry.TTL,
}
fdbTable.Update(ingressFrame.srcAddr, t) // update hash-map
}
见下图:
此外,我们是在帧到达后立即添加条目(仅在入口过滤(如果启用)之后),还是仅在入口、出口过滤、转发过程成功时添加条目?