ファット ツリー トポロジがあり、Mininet、OpenFlow 1.3、Ryu Controller を使用して ECMP ベースのルーティングを模倣しています。これを行うために、グループ テーブルとフロー テーブルを使用しています。たとえば、s2 と s3 は集約スイッチ (as1 など) のポート 1 と 2 に接続されており、次のルールがインストールされています。
グループ テーブルの定義
# Create two actions that forwards packets to ports 1 and 2 that are connected to two core switches
action1 = sw.ofproto_parser.OFPActionOutput(1)
action2 = sw.ofproto_parser.OFPActionOutput(2)
# Specify two action sets (buckets), each with one action
bucket1 = sw.ofproto_parser.OFPBucket(weight=1, actions=[action1])
bucket2 = sw.ofproto_parser.OFPBucket(weight=1, actions=[action2])
# OFPGT_SELECT chooses between bucket1 and bucket2 based on
# some logic implemented in the switch, typically, round-robin?!
group_mod = sw.ofproto_parser.OFPGroupMod(
datapath=sw, command=ofp.OFPGC_ADD,
type_=ofp.OFPGT_SELECT, group_id=1,
buckets=[bucket1, bucket2])
sw.send_msg(group_mod)
フロー テーブルにグループ テーブル アクションをインストールする
match = sw.ofproto_parser.OFPMatch(eth_type = \
0x0800)
action = sw.ofproto_parser.OFPActionGroup(1)
inst = [ofp_parser.OFPInstructionActions(
ofp.OFPIT_APPLY_ACTIONS, [action])]
mod = sw.ofproto_parser.OFPFlowMod(
datapath=sw, match=match, cookie=0, command=ofp.OFPFC_ADD,
idle_timeout=0, hard_timeout=0, priority=100,
flags=ofp.OFPFF_SEND_FLOW_REM, instructions=inst)
# Other flow entries rules are added here ...
dpctl dump-flows
Mininetのコマンドを使用してこれを確認します。コア スイッチ s2 では、n_packets = n_bytes = 0 ですが、他のコア スイッチ s3 ではそうではないことに注意してください。
*** s2 ------------------------------------------------------------------------
OFPST_FLOW reply (OF1.3) (xid=0x2):
cookie=0x0, duration=71.556s, table=0, n_packets=0, n_bytes=0, send_flow_rem priority=1200,ip,nw_dst=10.0.0.1 actions=output:1
cookie=0x0, duration=71.556s, table=0, n_packets=0, n_bytes=0, send_flow_rem priority=1200,ip,nw_dst=10.0.0.2 actions=output:1
cookie=0x0, duration=71.556s, table=0, n_packets=0, n_bytes=0, send_flow_rem priority=1200,ip,nw_dst=10.0.0.3 actions=output:1
cookie=0x0, duration=71.556s, table=0, n_packets=0, n_bytes=0, send_flow_rem priority=1200,ip,nw_dst=10.0.0.4 actions=output:1
cookie=0x0, duration=71.556s, table=0, n_packets=0, n_bytes=0, send_flow_rem priority=1200,ip,nw_dst=10.0.0.5 actions=output:2
..... コア スイッチ s3 の場合:
*** s3 ------------------------------------------------------------------------
OFPST_FLOW reply (OF1.3) (xid=0x2):
cookie=0x0, duration=71.582s, table=0, n_packets=4436, n_bytes=12043732, send_flow_rem priority=1200,ip,nw_dst=10.0.0.1 actions=output:1
cookie=0x0, duration=71.582s, table=0, n_packets=6306, n_bytes=11448184, send_flow_rem priority=1200,ip,nw_dst=10.0.0.2 actions=output:1
cookie=0x0, duration=71.582s, table=0, n_packets=870, n_bytes=1157688, send_flow_rem priority=1200,ip,nw_dst=10.0.0.3 actions=output:1
cookie=0x0, duration=71.582s, table=0, n_packets=674, n_bytes=644616, send_flow_rem priority=1200,ip,nw_dst=10.0.0.4 actions=output:1
cookie=0x0, duration=71.582s, table=0, n_packets=4475, n_bytes=11918478, send_flow_rem priority=1200,ip,nw_dst=10.0.0.5 actions=output:2
上記のコメントで述べたように、OFPGT_SELECT は、ラウンドロビンなど、スイッチに実装されたロジックに基づいて、bucket1 とbucket2 のどちらかを選択すると思いますか? これは、トポロジ内の下位レベルのスイッチでうまく機能しているようです。つまり、両方のバケットが同じ重みで交互に選択されます。ただし、最上位の集約スイッチの場合は、コア スイッチへのパス (バケット) が常に 1 つだけ選択されます。通常、すべてのパケットは最初のバケット (ポート) または最後のバケット (ポート) のみを選択しますが、両方のバケットを交互に選択することはありません!
ただし、両方のバケットに等しくない重み (1 と 2) を指定すると、機能します。等しい重みの問題が何であるかはわかりません。
どんな助けでも大歓迎です。ありがとう!