このスイッチでSONiC動きますか?
ホワイトボックススイッチは端的に言えばパケット転送用ハードウェアをPCIeスロットにぶっさしたPCのようなもの、といえる。形状が1Uラックマウントで正面にたくさんのLANポートが並んでいるため、外観はPCとはかけ離れているし、実際利用する段になるとPC的な使われ方をするのは珍しい。
このホワイトボックススイッチだが、実際のところいろんなスイッチベンダーからいろんなモデルが発売されていて、その中のごく一部はAmazonやNTT-X Storeから個人で購入することも不可能ではない。ずばり買えると書かなかったのは単純に価格の問題である。売ってるからと言って80万円とか100万円とかポンと出せる人はなかなかいないだろう。(さっき割引後価格だけど35万円のホワイトボックススイッチを見つけて少し動揺している)
SONiCはホワイトボックススイッチで動作するOSだが、どのスイッチに入れても動くというわけではない。幸い、公式から対応しているデバイス・プラットフォームの一覧が公開されている。ここに載ってれば動くよ! と言いたいところなのだが、実は動かないスイッチが載っている。正確には、対応する設定ファイルが用意されそれに基づいてインストールイメージが作成されていて、実際インストールできるし起動もするけれど、パケット転送機能が動作しないスイッチがあるのだ。
表に載っているのに動かない経緯
自分の知る限り、少なくとも表に載っている中で2つのスイッチはそのままでは動作しない。
- Accton AS7326-56X
- Accton AS7726-32X
これらはいずれも、スイッチASICとしてBroadcom Trident3を採用している。
Accton以外にもTrident3を採用しているスイッチはいくつかあり、例えば
- DELL EMC S5232F-ON
- Delta AG9032v2a
これらについては、表に記載されていて、かつパケット転送動作を確認できている。この差はどこからきているのだろうか。
答えを先に書いてしまうと、BroadcomのスイッチASICの基本設定を記述するconfig.bcmというファイルがあるのだが、Acctonの2モデルはこのファイルの内容に不足があり、またファイルのパスを正しく指定していないため、Trident3の初期化ができていないことが原因である。
ただし、これは単なるAcctonのミスというわけではない。時系列を追って説明する。
- 前提としてconfig.bcmに記述できるキーワードには制限があり、自由に制限を緩めることはできない。ASICベンダーであるBroadcomから了解を得る必要がある。
- Acctonが対応コードとconfig.bcmをPRする。config.bcmに関して、Trident3を動作させるのに必要なキーワードは書けない(書くとビルドに失敗する)ため、それを省いた差分となっている。
- AcctonのPRがマージされる。
- DELL EMC S5232F-ON対応コードがcommitされる。config.bcmにはTrident3に必要な設定が含まれている。このときconfig.bcm用キーワードにも追加があり、またBroadcom SAIもTrident3対応のものに更新されたため、S5232F-ONではこの時点で問題なく動作している。
- Delta AG9032v2a対応コードがcommitされる。こちらのconfig.bcmにもTrident3の動作に必要なキーワードが加えられていた。こちらも問題なく動作している。
- 現在に至る。
つまるところ、Acctonは対応が早すぎたのだ。
動かすには?
config.bcmの中身に設定を追加し、そのファイルを参照するようsai.profileの中身を書き換えればよい。AS7326-56XおよびAS7726-32Xの対応差分が下記である。ソースコードをcloneしてパッチを当てるもよし、変更内容をなぞってインストール済みのSONiCの設定ファイルを書き換えるもよし。思想や感情を創作的に表現したものじゃないので著作権フリーでどうぞ。
なお、sai.profileの中に書くパスはSONiCにログインしても見えない。syncd dockerの中で参照するパスとなっている。
diff --git a/device/accton/x86_64-accton_as7326_56x-r0/Accton-AS7326-56X/sai.profile b/device/accton/x86_64-accton_as7326_56x-r0/Accton-AS7326-56X/sai.profile
index 0e465ce1..47e31074 100644
--- a/device/accton/x86_64-accton_as7326_56x-r0/Accton-AS7326-56X/sai.profile
+++ b/device/accton/x86_64-accton_as7326_56x-r0/Accton-AS7326-56X/sai.profile
@@ -1 +1 @@
-SAI_INIT_CONFIG_FILE=/etc/bcm/td3-as7326-48x25G+8x100G.config.bcm
+SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/td3-as7326-48x25G+8x100G.config.bcm
diff --git a/device/accton/x86_64-accton_as7326_56x-r0/Accton-AS7326-56X/td3-as7326-48x25G+8x100G.config.bcm b/device/accton/x86_64-accton_as7326_56x-r0/Accton-AS7326-56X/td3-as7326-48x25G+8x100G.config.bcm
index 2b7b6fb0..35a79836 100755
--- a/device/accton/x86_64-accton_as7326_56x-r0/Accton-AS7326-56X/td3-as7326-48x25G+8x100G.config.bcm
+++ b/device/accton/x86_64-accton_as7326_56x-r0/Accton-AS7326-56X/td3-as7326-48x25G+8x100G.config.bcm
@@ -30,6 +30,9 @@ tdma_timeout_usec=3000000
skip_L2_USER_ENTRY=0
bcm_tunnel_term_compatible_mode=1
+ifp_inports_support_enable=1
+port_flex_enable=1
+
dport_map_port_1=6
dport_map_port_2=2
dport_map_port_3=1
diff --git a/device/accton/x86_64-accton_as7726_32x-r0/Accton-AS7726-32X/sai.profile b/device/accton/x86_64-accton_as7726_32x-r0/Accton-AS7726-32X/sai.profile
index 46f5cb3b..461cdd76 100644
--- a/device/accton/x86_64-accton_as7726_32x-r0/Accton-AS7726-32X/sai.profile
+++ b/device/accton/x86_64-accton_as7726_32x-r0/Accton-AS7726-32X/sai.profile
@@ -1 +1 @@
-SAI_INIT_CONFIG_FILE=/etc/bcm/td3-as7726-32x100G.config.bcm
+SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/td3-as7726-32x100G.config.bcm
diff --git a/device/accton/x86_64-accton_as7726_32x-r0/Accton-AS7726-32X/td3-as7726-32x100G.config.bcm b/device/accton/x86_64-accton_as7726_32x-r0/Accton-AS7726-32X/td3-as7726-32x100G.config.bcm
index 16cbb8d3..2fe2c1d3 100755
--- a/device/accton/x86_64-accton_as7726_32x-r0/Accton-AS7726-32X/td3-as7726-32x100G.config.bcm
+++ b/device/accton/x86_64-accton_as7726_32x-r0/Accton-AS7726-32X/td3-as7726-32x100G.config.bcm
@@ -33,6 +33,9 @@ bcm_tunnel_term_compatible_mode=1
phy_an_c73=1
+ifp_inports_support_enable=1
+port_flex_enable=1
+
dport_map_port_1=1
dport_map_port_5=2
dport_map_port_9=3
なお、config.bcmへの追加内容についてはPR#2482を参考にしている。
終わりに
わかってしまえば数行いじくるだけではあるが、動かないときはログにもnot supported
などと出るだけでしばらくのあいだ原因がわからず、ずっと頭を抱えていたことを思い出す。自力で解決できたのは偶々であり、このレイヤーについては基本的にスイッチベンダーが対応すべきものだと考える。