透過使用者空間配置 DSA 交換機

目前,DSA 交換機配置尚未整合到主要的使用者空間網路配置套件中,必須手動執行。

配置展示

要配置 DSA 交換機,需要執行一些命令。 本文件將一些常見的配置場景作為展示進行處理。

單埠

每個交換機埠都充當不同的可配置乙太網埠

橋接

每個交換機埠都是一個可配置乙太網橋的一部分

閘道器

除一個上游埠外的每個交換機埠都是可配置乙太網橋的一部分。 上游埠充當不同的可配置乙太網埠。

所有配置均使用 iproute2 中的工具執行,該工具可在 https://kernel.linux.club.tw/pub/linux/utils/net/iproute2/ 獲取

透過 DSA,交換機的每個埠都像普通的 Linux 乙太網介面一樣處理。 CPU 埠是連線到乙太網 MAC 晶片的交換機埠。 相應的 Linux 乙太網介面稱為通道介面。 所有其他相應的 Linux 介面稱為使用者介面。

使用者介面取決於通道介面是否啟動,以便它們傳送或接收流量。 在核心 v5.12 之前,通道介面的狀態必須由使用者顯式管理。 從核心 v5.12 開始,行為如下

  • 當啟動 DSA 使用者介面時,通道介面會自動啟動。

  • 當通道介面關閉時,所有 DSA 使用者介面都會自動關閉。

本文件中使用以下乙太網介面

eth0

通道介面

eth1

另一個通道介面

lan1

使用者介面

lan2

另一個使用者介面

lan3

第三個使用者介面

wan

專用於上游流量的使用者介面

可以類似地配置其他乙太網介面。 配置的 IP 和網路是

單埠
  • lan1: 192.0.2.1/30 (192.0.2.0 - 192.0.2.3)

  • lan2: 192.0.2.5/30 (192.0.2.4 - 192.0.2.7)

  • lan3: 192.0.2.9/30 (192.0.2.8 - 192.0.2.11)

橋接
  • br0: 192.0.2.129/25 (192.0.2.128 - 192.0.2.255)

閘道器
  • br0: 192.0.2.129/25 (192.0.2.128 - 192.0.2.255)

  • wan: 192.0.2.1/30 (192.0.2.0 - 192.0.2.3)

具有標記支援的配置

基於標記的配置是大多數 DSA 交換機所期望和支援的。 這些交換機能夠標記傳入和傳出流量,而無需使用基於 VLAN 的配置。

單埠
# configure each interface
ip addr add 192.0.2.1/30 dev lan1
ip addr add 192.0.2.5/30 dev lan2
ip addr add 192.0.2.9/30 dev lan3

# For kernels earlier than v5.12, the conduit interface needs to be
# brought up manually before the user ports.
ip link set eth0 up

# bring up the user interfaces
ip link set lan1 up
ip link set lan2 up
ip link set lan3 up
橋接
# For kernels earlier than v5.12, the conduit interface needs to be
# brought up manually before the user ports.
ip link set eth0 up

# bring up the user interfaces
ip link set lan1 up
ip link set lan2 up
ip link set lan3 up

# create bridge
ip link add name br0 type bridge

# add ports to bridge
ip link set dev lan1 master br0
ip link set dev lan2 master br0
ip link set dev lan3 master br0

# configure the bridge
ip addr add 192.0.2.129/25 dev br0

# bring up the bridge
ip link set dev br0 up
閘道器
# For kernels earlier than v5.12, the conduit interface needs to be
# brought up manually before the user ports.
ip link set eth0 up

# bring up the user interfaces
ip link set wan up
ip link set lan1 up
ip link set lan2 up

# configure the upstream port
ip addr add 192.0.2.1/30 dev wan

# create bridge
ip link add name br0 type bridge

# add ports to bridge
ip link set dev lan1 master br0
ip link set dev lan2 master br0

# configure the bridge
ip addr add 192.0.2.129/25 dev br0

# bring up the bridge
ip link set dev br0 up

沒有標記支援的配置

少數交換機無法使用標記協議 (DSA_TAG_PROTO_NONE)。 這些交換機可以透過基於 VLAN 的配置進行配置。

單埠

該配置只能透過 VLAN 標記和橋接設定進行設定。

# tag traffic on CPU port
ip link add link eth0 name eth0.1 type vlan id 1
ip link add link eth0 name eth0.2 type vlan id 2
ip link add link eth0 name eth0.3 type vlan id 3

# For kernels earlier than v5.12, the conduit interface needs to be
# brought up manually before the user ports.
ip link set eth0 up
ip link set eth0.1 up
ip link set eth0.2 up
ip link set eth0.3 up

# bring up the user interfaces
ip link set lan1 up
ip link set lan2 up
ip link set lan3 up

# create bridge
ip link add name br0 type bridge

# activate VLAN filtering
ip link set dev br0 type bridge vlan_filtering 1

# add ports to bridges
ip link set dev lan1 master br0
ip link set dev lan2 master br0
ip link set dev lan3 master br0

# tag traffic on ports
bridge vlan add dev lan1 vid 1 pvid untagged
bridge vlan add dev lan2 vid 2 pvid untagged
bridge vlan add dev lan3 vid 3 pvid untagged

# configure the VLANs
ip addr add 192.0.2.1/30 dev eth0.1
ip addr add 192.0.2.5/30 dev eth0.2
ip addr add 192.0.2.9/30 dev eth0.3

# bring up the bridge devices
ip link set br0 up
橋接
# tag traffic on CPU port
ip link add link eth0 name eth0.1 type vlan id 1

# For kernels earlier than v5.12, the conduit interface needs to be
# brought up manually before the user ports.
ip link set eth0 up
ip link set eth0.1 up

# bring up the user interfaces
ip link set lan1 up
ip link set lan2 up
ip link set lan3 up

# create bridge
ip link add name br0 type bridge

# activate VLAN filtering
ip link set dev br0 type bridge vlan_filtering 1

# add ports to bridge
ip link set dev lan1 master br0
ip link set dev lan2 master br0
ip link set dev lan3 master br0
ip link set eth0.1 master br0

# tag traffic on ports
bridge vlan add dev lan1 vid 1 pvid untagged
bridge vlan add dev lan2 vid 1 pvid untagged
bridge vlan add dev lan3 vid 1 pvid untagged

# configure the bridge
ip addr add 192.0.2.129/25 dev br0

# bring up the bridge
ip link set dev br0 up
閘道器
# tag traffic on CPU port
ip link add link eth0 name eth0.1 type vlan id 1
ip link add link eth0 name eth0.2 type vlan id 2

# For kernels earlier than v5.12, the conduit interface needs to be
# brought up manually before the user ports.
ip link set eth0 up
ip link set eth0.1 up
ip link set eth0.2 up

# bring up the user interfaces
ip link set wan up
ip link set lan1 up
ip link set lan2 up

# create bridge
ip link add name br0 type bridge

# activate VLAN filtering
ip link set dev br0 type bridge vlan_filtering 1

# add ports to bridges
ip link set dev wan master br0
ip link set eth0.1 master br0
ip link set dev lan1 master br0
ip link set dev lan2 master br0

# tag traffic on ports
bridge vlan add dev lan1 vid 1 pvid untagged
bridge vlan add dev lan2 vid 1 pvid untagged
bridge vlan add dev wan vid 2 pvid untagged

# configure the VLANs
ip addr add 192.0.2.1/30 dev eth0.2
ip addr add 192.0.2.129/25 dev br0

# bring up the bridge devices
ip link set br0 up

轉發資料庫 (FDB) 管理

現有的 DSA 交換機沒有必要的硬體支援來保持橋接的軟體 FDB 與硬體表同步,因此這兩個表是分開管理的(bridge fdb show 同時查詢兩個表,並且根據是否使用 selfmaster 標誌,bridge fdb addbridge fdb del 命令作用於一個或兩個表中的條目)。

直到核心 v4.14,DSA 僅支援使用橋接旁路操作(不更新軟體 FDB,只更新硬體 FDB)使用 self 標誌(這是可選的,可以省略)的使用者空間橋接 FDB 條目管理。

bridge fdb add dev swp0 00:01:02:03:04:05 self static
# or shorthand
bridge fdb add dev swp0 00:01:02:03:04:05 static

由於一個錯誤,DSA 提供的橋接旁路 FDB 實現無法區分 staticlocal FDB 條目(static 意味著被轉發,而 local 意味著在本地終止,即傳送到主機埠)。 相反,所有帶有 self 標誌(隱式或顯式)的 FDB 條目都被 DSA 視為 static,即使它們是 local

# This command:
bridge fdb add dev swp0 00:01:02:03:04:05 static
# behaves the same for DSA as this command:
bridge fdb add dev swp0 00:01:02:03:04:05 local
# or shorthand, because the 'local' flag is implicit if 'static' is not
# specified, it also behaves the same as:
bridge fdb add dev swp0 00:01:02:03:04:05

最後一個命令是使用橋接旁路操作將靜態橋接 FDB 條目新增到 DSA 交換機的不正確方法,並且由於錯誤而起作用。 其他驅動程式會將透過同一命令新增的 FDB 條目視為 local,因此不會轉發它,這與 DSA 相反。

在核心 v4.14 和 v5.14 之間,DSA 並行支援兩種將橋接 FDB 條目新增到交換機的模式:上面討論的橋接旁路,以及使用 master 標誌的新模式,該模式也會在軟體橋中安裝 FDB 條目。

bridge fdb add dev swp0 00:01:02:03:04:05 master static

自核心 v5.14 以來,DSA 獲得了與橋接軟體 FDB 更強的整合,並且對其橋接旁路 FDB 實現的支援(使用 self 標誌)已被刪除。 這導致以下更改

# This is the only valid way of adding an FDB entry that is supported,
# compatible with v4.14 kernels and later:
bridge fdb add dev swp0 00:01:02:03:04:05 master static
# This command is no longer buggy and the entry is properly treated as
# 'local' instead of being forwarded:
bridge fdb add dev swp0 00:01:02:03:04:05
# This command no longer installs a static FDB entry to hardware:
bridge fdb add dev swp0 00:01:02:03:04:05 static

因此,指令碼編寫者在 DSA 交換機介面上處理橋接 FDB 條目時,應使用 master static 標誌集。

使用者埠與 CPU 埠的關聯

通常,DSA 交換機透過單個乙太網介面連線到主機,但在交換機晶片是離散的情況下,硬體設計可能允許使用 2 個或更多埠連線到主機,以提高終止吞吐量。

DSA 可以透過兩種方式使用多個 CPU 埠。 首先,可以靜態地將與某個使用者埠關聯的終止流量分配給某個 CPU 埠進行處理。 這樣,使用者空間可以透過根據可用的 CPU 埠分配關聯性來實現使用者埠之間的靜態負載平衡的自定義策略。

其次,可以在每個資料包的基礎上執行 CPU 埠之間的負載平衡,而不是靜態地將使用者埠分配給 CPU 埠。 這可以透過將 DSA 通道置於 LAG 介面下(繫結或團隊)來實現。 DSA 監視此操作,並在面向構成 LAG 從裝置 的物理 DSA 通道的 CPU 埠上建立此軟體 LAG 的映象。

為了使用多個 CPU 埠,交換機的韌體(裝置樹)描述必須使用 ethernet 引用/控制代碼標記 CPU 埠及其 DSA 通道之間的所有連結。 在啟動時,只會使用單個 CPU 埠和 DSA 通道 - 韌體描述中第一個具有 ethernet 屬性的埠。 由使用者配置系統以使交換機使用其他通道。

DSA 使用 rtnl_link_ops 機制(帶有 “dsa” kind)來允許更改使用者埠的 DSA 通道。 IFLA_DSA_CONDUIT u32 netlink 屬性包含處理每個使用者裝置的通道裝置的 ifindex。 DSA 通道必須是基於韌體節點資訊的有效候選者,或者是一個僅包含作為有效候選者的從屬裝置的 LAG 介面。

使用 iproute2,可以進行以下操作

# See the DSA conduit in current use
ip -d link show dev swp0
    (...)
    dsa master eth0

# Static CPU port distribution
ip link set swp0 type dsa master eth1
ip link set swp1 type dsa master eth0
ip link set swp2 type dsa master eth1
ip link set swp3 type dsa master eth0

# CPU ports in LAG, using explicit assignment of the DSA conduit
ip link add bond0 type bond mode balance-xor && ip link set bond0 up
ip link set eth1 down && ip link set eth1 master bond0
ip link set swp0 type dsa master bond0
ip link set swp1 type dsa master bond0
ip link set swp2 type dsa master bond0
ip link set swp3 type dsa master bond0
ip link set eth0 down && ip link set eth0 master bond0
ip -d link show dev swp0
    (...)
    dsa master bond0

# CPU ports in LAG, relying on implicit migration of the DSA conduit
ip link add bond0 type bond mode balance-xor && ip link set bond0 up
ip link set eth0 down && ip link set eth0 master bond0
ip link set eth1 down && ip link set eth1 master bond0
ip -d link show dev swp0
    (...)
    dsa master bond0

請注意,在使用 LAG 下的 CPU 埠的情況下,並不嚴格需要使用 IFLA_DSA_CONDUIT netlink 屬性,而是 DSA 會對其當前通道 (eth0) 的 IFLA_MASTER 屬性更改做出反應,並將所有使用者埠遷移到 eth0 的新上層 bond0。 同樣,當使用 RTM_DELLINK 銷燬 bond0 時,DSA 會根據韌體描述將分配給此介面的使用者埠遷移到第一個符合條件的物理 DSA 通道(它實際上會恢復到啟動配置)。

因此,在具有 2 個以上物理 CPU 埠的設定中,可以將靜態使用者到 CPU 埠分配與 DSA 通道之間的 LAG 混合使用。 不可能將使用者埠靜態分配給具有任何上層介面的 DSA 通道(這包括 LAG 裝置 - 在這種情況下,通道必須始終是 LAG)。

允許即時更改使用者埠的 DSA 通道(以及 CPU 埠)關聯性,以便允許動態重新分配以響應流量。

允許物理 DSA 通道隨時加入和離開用作 DSA 通道的 LAG 介面; 但是,除非 LAG 介面至少有一個物理 DSA 通道作為從屬裝置,否則 DSA 將拒絕 LAG 介面作為 DSA 通道的有效候選者。