SUBNET_DECAP テーブル¶
概要¶
IPinIP トンネルの サブネット単位の decapsulation ルール を定義する CONFIG_DB テーブル1。TUNNEL_DECAP_TABLE が個別の outer IP を起点とした decap を扱うのに対し、SUBNET_DECAP は outer source IP がプレフィックス内に該当する場合に decap を行う という、より広範な一致条件を表す。SmartSwitch / DASH や DualToR 系のシナリオで、ToR 配下のサーバ群から発した IPinIP encapsulated トラフィックを decap するために導入された。
YANG リビジョン 2024-12-19 で追加された比較的新しいテーブル。
データフロー (自動生成)¶
flowchart LR
CDB[("CONFIG_DB<br/>SUBNET_DECAP")]
DM["tunnelmgrd"]
CDB --> DM
APPDB[("APP_DB<br/>APP_TUNNEL_DECAP_TABLE")]
DM --> APPDB
SYNCD["syncd"]
APPDB --> SYNCD
SAI["SAI<br/>sai_tunnel_api"]
SYNCD --> SAI
凡例
CONFIG_DB から SAI までの典型経路を docs/reference/config-db-orch-map.md から機械生成したミニ図。詳細・例外は本ページ本文と対応表を参照。
key 構造¶
<name> はルール名 (任意文字列)。
フィールド¶
| フィールド | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
name (key) |
string | yes | - | サブネット decap ルール名 |
status |
enum (enable/disable) |
- | disable |
ルールの有効/無効 |
src_ip |
inet:ipv4-prefix | mandatory | - | decap 対象とする outer source IPv4 プレフィックス |
src_ip_v6 |
inet:ipv6-prefix | mandatory | - | decap 対象とする outer source IPv6 プレフィックス |
両プレフィックスとも mandatory true で、IPv4 と IPv6 の両方を必ず設定する必要がある(DualStack を前提とした設計)。
status は sonic-types:mode-status (enable/disable) で、最小権限の原則からデフォルトは disable。
制約¶
src_ip/src_ip_v6は YANG でmandatory true。片方だけの設定は validation で拒否される。status = enableでない限りデータプレーンには反映されない。
購読者¶
swssの tunnel-decap オーチェストレータがSUBNET_DECAPを読み、SAI の tunnel term entry を生成する(subnet ベースの match)。- DualToR / DASH のサブシステムが補助的に参照する。
関連 CONFIG_DB / YANG / CLI¶
- 関連 CONFIG_DB:
TUNNEL_DECAP_TABLE(個別 IP の decap)、MUX_CABLE(DualToR) - 関連 CLI: 現状 dedicated CLI コマンドは無く
sonic-cfggen/config load経由で投入することが多い - 関連 YANG:
sonic-subnet-decap
関連リファレンス¶
- YANG:
sonic-subnet-decap
引用元¶
運用ヒント¶
典型値¶
- key 形式:
SUBNET_DECAP|<vrf>。 status:enable、src_ip/dst_ip: T1 ToR ペアの管理サブネット。
よくある誤設定¶
- VxLAN decap ルールと subnet decap の優先順位を誤解して期待した decap が起きない。
確認コマンド¶
値依存挙動マトリクス¶
status 値別挙動¶
| 値 | 挙動 |
|---|---|
enable |
subnetDecapConfig.enable = true。MP2MP tunnel term が有効化され SAI tunnel term entry が生成される。 |
disable |
subnetDecapConfig.enable = false(デフォルト)。MP2MP term から "subnet decap is disabled, ignored." ログでスキップ。データプレーンに反映されない。 |
src_ip フィールド挙動¶
| 状態 | 挙動 |
|---|---|
| 有効な IPv4 prefix | isV4() チェック通過。subnetDecapConfig に格納され tunnel term の送信元 IP として使用。 |
| IPv6 アドレスを誤指定 | isV4() 失敗。SWSS_LOG_ERROR("Invalid source IP prefix") → 処理中断。 |
| 形式不正 | swss::IpPrefix() が std::invalid_argument → SWSS_LOG_ERROR → 処理中断。 |
src_ip_v6 フィールド挙動¶
| 状態 | 挙動 |
|---|---|
| 有効な IPv6 prefix | !isV4() チェック通過。subnetDecapConfig に格納。 |
| IPv4 アドレスを誤指定 | isV4() チェックが成功してしまう → SWSS_LOG_ERROR("Invalid source IPv6 prefix") → 処理中断。 |
例外条件・特殊挙動¶
- src_ip と src_ip_v6 の両方が未設定: どちらも設定されていない場合
SWSS_LOG_ERROR("Both src_ip and src_ip_v6 of subnet decap are not set.")→ エントリ破棄。2 - src_ip に IPv4 以外を指定:
src_ipフィールドに IPv6 アドレスを指定するとisV4()チェック失敗でSWSS_LOG_ERROR("Invalid source IP prefix")→ 処理中断。2 - src_ip_v6 に IPv4 アドレスを指定:
src_ip_v6に IPv4 を指定するとSWSS_LOG_ERROR("Invalid source IPv6 prefix")→ 処理中断。2 - IP プレフィクス形式不正:
swss::IpPrefix()がstd::invalid_argumentを投げた場合もSWSS_LOG_ERROR("Invalid source IP prefix")→ 処理中断。2 - 未知フィールド:
src_ip/src_ip_v6/status以外のフィールドはSWSS_LOG_ERROR("unknown subnet decap table attribute")→ エントリ破棄。2 - シングルトン制約:
subnetDecapConfigはシングルトン構造体として保持されるため、テーブルに複数エントリを書いても最後の SET_COMMAND で上書きされる。2 - MP2MP 以外のトンネル term は紐付け不可: subnet decap トンネルに
MP2MP以外の term を紐付けようとするとSWSS_LOG_ERROR("only MP2MP tunnel decap term is allowed for subnet decap tunnel.")→ 拒否。2
-
YANG 定義:
sonic-subnet-decap.yang(revision 2024-12-19). https://github.com/sonic-net/sonic-buildimage/blob/9ea932ec2e18f35e58268ec2e4456b1d4afd65cd/src/sonic-yang-models/yang-models/sonic-subnet-decap.yang ↩ -
tunneldecaporch 実装:
sonic-swss/orchagent/tunneldecaporch.cpp. https://github.com/sonic-net/sonic-swss/blob/master/orchagent/tunneldecaporch.cpp ↩↩↩↩↩↩↩