コンテンツにスキップ

VxlanTunnelOrch — encap 処理詳細

概要

orchagentVxlanTunnelOrch / VxlanTunnel クラスが CONFIG_DBVXLAN_TUNNELVXLAN_TUNNEL_MAPVXLAN_EVPN_NVO テーブルを受け取り、SAI sai_tunnel_api->create_tunnel() を呼び出してハードウェアに VXLAN encap トンネルを設定する実装詳細を解説するページ。

本ページは VXLAN_TUNNEL テーブルのフィールド仕様ではなく、orchagent 側が付与する encap 関連のコード由来デフォルトにフォーカスする1。テーブル仕様は VXLAN_TUNNEL を参照。

データフロー

flowchart LR
  CDB[("CONFIG_DB\nVXLAN_TUNNEL\nVXLAN_TUNNEL_MAP\nVXLAN_EVPN_NVO")]
  VTO["VxlanTunnelOrch\n(orchagent)"]
  SAI["SAI\nsai_tunnel_api\ncreate_tunnel()"]
  CDB --> VTO
  VTO --> SAI

encap トンネル生成タイミング

VXLAN_TUNNEL エントリの追加 (VxlanTunnelOrch::addOperation) では SAI トンネルオブジェクトを作成しない。オブジェクト作成は以下のいずれかが発生したときに遅延される1

トリガー 呼び出し元
VXLAN_TUNNEL_MAP エントリ追加 VxlanTunnelMapOrch::addOperation (line 2069)
VXLAN_VRF_MAP エントリ追加 VxlanVrfMapOrch::addOperation (line 2297)
createVxlanTunnelMap 呼び出し VxlanTunnelOrch::createVxlanTunnelMap (line 1491, 1501)

encap mapper モード

encap mapper の生成方式は tunnel_map_use_t 列挙型で制御される1

モード 説明 使用場面
TUNNEL_MAP_USE_DEDICATED_ENCAP_DECAP encap / decap それぞれ専用 mapper を作成 L3VNI (VRF) / Bridge VNI
TUNNEL_MAP_USE_COMMON_ENCAP_DECAP src VTEP の encap / decap mapper を共有 EVPN DIP トンネル
TUNNEL_MAP_USE_COMMON_DECAP_DEDICATED_ENCAP decap は共有、encap は専用 EVPN 混在構成
TUNNEL_MAP_USE_DECAP_ONLY decap のみ(encap mapper なし) 特殊用途

encap mapper タイプ対応

encap 方向の mapper タイプは以下の対応に従って SAI に設定される1

tunnel_map_type_t encap MAP_T (SAI)
TUNNEL_MAP_T_VLAN SAI_TUNNEL_MAP_TYPE_VLAN_ID_TO_VNI
TUNNEL_MAP_T_VIRTUAL_ROUTER SAI_TUNNEL_MAP_TYPE_VIRTUAL_ROUTER_ID_TO_VNI
TUNNEL_MAP_T_BRIDGE SAI_TUNNEL_MAP_TYPE_BRIDGE_IF_TO_VNI

コード由来デフォルト・暗黙挙動

以下のデフォルト値は DB フィールドとして公開されず、vxlanorch.cpp / vxlanorch.h 内でハードコードまたは暗黙的に設定される1

フィールド / SAI 属性 デフォルト / 実挙動 根拠
SAI_TUNNEL_ATTR_TYPE SAI_TUNNEL_TYPE_VXLAN ハードコード vxlanorch.cpp:303-304
SAI_TUNNEL_ATTR_ENCAP_TTL_MODE encap_ttl != 0 の場合 SAI_TUNNEL_TTL_MODE_PIPE_MODEL を設定。encap_ttl == 0 の場合は属性を SAI に渡さない → プラットフォーム依存 vxlanorch.cpp:385-393
SAI_TUNNEL_ATTR_ENCAP_TTL_VAL デフォルト引数 DEFAULT_TUNNEL_ENCAP_TTL = 255 (YANG 未定義フィールド)。encap_ttl 省略呼び出しでは 255 が SAI に設定される vxlanorch.h:49, vxlanorch.h:207, vxlanorch.cpp:392
SAI_TUNNEL_ATTR_PEER_MODE CLI 作成 (TNL_CREATION_SRC_CLI) は常に SAI_TUNNEL_PEER_MODE_P2MP。EVPN DIP トンネル (TNL_CREATION_SRC_EVPN) は SAI_TUNNEL_PEER_MODE_P2P vxlanorch.cpp:358-369, vxlanorch.cpp:903
SAI_TUNNEL_ATTR_DECAP_TTL_MODE ttl_mode 省略時 (VxlanTunnelTTLMode::NOT_SET) は属性を SAI に渡さない → プラットフォーム依存デフォルト vxlanorch.cpp:372-383
SAI_TUNNEL_ATTR_UNDERLAY_INTERFACE gUnderlayIfId(グローバルアンダーレイ RIF)固定 vxlanorch.cpp:307-309
encap mapper 共有/専用 TUNNEL_MAP_USE_DEDICATED_ENCAP_DECAP (L3VNI/Bridge) / TUNNEL_MAP_USE_COMMON_ENCAP_DECAP (EVPN DIP) — DB に設定フィールドなし vxlanorch.cpp:1491, vxlanorch.cpp:1169
SAI tunnel 生成タイミング VXLAN_TUNNEL 追加時は SAI 呼び出しなし。VXLAN_TUNNEL_MAP / VRF map 追加時に遅延生成 vxlanorch.cpp:2063-2070, vxlanorch.cpp:2292-2297

詳細: encap_ttl デフォルトの実際のパス

DEFAULT_TUNNEL_ENCAP_TTL = 255vxlanorch.h:49 に定義されている。 createTunnelHw のシグネチャ (vxlanorch.h:207) でデフォルト引数として宣言されるが、 CONFIG_DB / YANG に対応フィールドは存在しない。

VxlanTunnelMapOrch::addOperation および VxlanVrfMapOrch::addOperation では createTunnelHw(mapper_list, TUNNEL_MAP_USE_DEDICATED_ENCAP_DECAP)encap_ttl を省略して呼ぶため、 内部で 255 → create_tunnel() → encap_ttl != 0 → PIPE_MODEL + TTL=255 の経路を辿る1

詳細: EVPN DIP トンネルの encap TTL

VxlanTunnelOrch::addTunnelUser 内の DIP トンネル生成 (vxlanorch.cpp:1169) では createTunnelHw(mapper_list, TUNNEL_MAP_USE_COMMON_ENCAP_DECAP, false) を呼ぶ。 encap_ttl は省略 → デフォルト 255PIPE_MODEL + TTL=255 が SAI に設定される1

詳細: Peer Mode の決定

src_creation_ == TNL_CREATION_SRC_EVPN  →  p2p = true  →  SAI_TUNNEL_PEER_MODE_P2P
src_creation_ == TNL_CREATION_SRC_CLI   →  p2p = false →  SAI_TUNNEL_PEER_MODE_P2MP (常に)

CLI (config vxlan add) で作成されたトンネルは TNL_CREATION_SRC_CLI で登録され、 dst_ip を明示指定しても SAI レイヤでは P2MP モードになる (vxlanorch.cpp:903-904)1

関連 CONFIG_DB / YANG / CLI

関連リファレンス

引用元