@SRCHACKさんからわけてもらってコードを書いたKSZ8995MAのetherswitchの使い方のメモです。
VLANの設定
port4をCPUポートにしてport0とVLANを組んでみます。
# etherswitchcfg config vlan_mode DOT1Q
# etherswitchcfg port0 pvid 2
# etherswitchcfg port0 striptag
# etherswitchcfg port4 pvid 2
# etherswitchcfg port4 addtag
# etherswitchcfg vlangroup2 vlan 2
# etherswitchcfg vlangroup2 members 0,4
# ifconfig vlan2 create vlan 2 vlandev arge0
# ifconfig vlan2 inet 10.10.10.111/24
vlangroupはどれでもよいです。
通常のSwitchの場合とDot1Q+VLANでのpingのping 100回の応答速度を2回確認したところなぜか処理が多いはずのDot1Qの方が早かったです。謎です。
通常のSwitch
round-trip min/avg/max/stddev = 1.069/4.698/77.992/13.074 ms
round-trip min/avg/max/stddev = 1.085/4.604/76.116/13.094 ms
Dot1Q+VLAN
round-trip min/avg/max/stddev = 0.997/3.877/70.568/10.973 ms
round-trip min/avg/max/stddev = 1.039/3.469/59.865/9.355 ms
Mirroringの設定
port0の送受信をport4でモニターします。下記がデータシートのレジスタです。portは1始まりになっています。
# etherswitchcfg config vlan_mode NONE
# etherswitchcfg reg 17=0x7f
# etherswitchcfg reg 81=0x9f
port4のinterfaceでtcpdumpするとport0の通信が確認できます。
etherswitchはVLANなどの最低限の機能はコマンドでサポートするけど、チップによって機能が様々なので個別の機能はレジスタ叩いてねって、ポリシーのようです。
スイッチへの接続はSPIやMDIO,I2Cなどですが、etherswitchcfgで全て同じように読み書きできるのは現実的な実装だと思います。
MIB
mruby-etherswitchを使ってMIBを拾ってみました。
mib = ARGV[0].to_i
t = EtherSwitch.new(0)
port = 0
while port < 5 do
t.writereg(110, 0x1c)
t.writereg(111, (0x20 * port) | mib)
c = (t.readreg(117) << 24) | (t.readreg(118) << 16)
c = c | (t.readreg(119) << 8) | t.readreg(120)
c = c & 0x3fffffff
if port != 0 then
print ","
end
print c.to_s
port = port + 1
end
実行してみます。
# /usr/local/bin/mruby ks.rb 14
413,0,0,0,0
困ったことにこのMIBはアクセスした時点でリセットされるようです。bsnmp-ucdでは定期的に呼ばれて、最後の値が読み取れるので、この仕様だと、そのままは使えません。:(