Ethernetの動的VID登録と有効期限¶
文書バージョン:1.2.0
対象GitHubバージョン:v1.2.0
文書ID:guide-ethernet-vid-registration
文書状態:公開用完成稿
更新履歴¶
| 文書バージョン | 更新日 | 更新内容 |
|---|---|---|
1.2.0 |
2026-10-22 |
v1.2.0の対象タグ・文書版を確定。過去の測定基準と公開済み履歴を保持 |
1.1.1 |
2026-10-16 |
390pxの有効VID表は横スクロールで右端列を読めることを実操作で確認し、表示説明を訂正 |
1.1.0 |
2026-10-16 |
初版:出口portの登録寿命だけを変える6入力実習、正式版実測、実Viewerとportごとの期限を追加 |
目的:経路が同じでもVIDの有効期限で配送が変わる¶
VLAN受入条件の実習では静的な受入条件を比較しました。今回は動的Ethernetの vlan_register を使い、portへ一時的にVID20を追加します。配線と宛先経路を変えず、Switchの出口portの登録寿命だけを2000000/5000000psにして、同じ2フレームが届くかを調べます。
要求は、「登録可能」と「現在有効」を分け、送信元・Switch入口・出口・受信側それぞれのVID条件を追えることです。出口に宛先の静的FDBがあっても、そのportでVIDが無効なら配送できません。また、一つのportの登録は対向portへ自動伝播しません。
profileは ethernet.l2.dynamic.v1。測定と画面は正式v1.1.4 Release、source b45515644dfc65c205216d564d5bf7ef00280622 から取得しました。掲載時のmain 594458ee50aed5c14d4c84d5b68422e26d41d358 に含まれる後続NED修正は、正式版の実測に含めていません。
構成と責務:登録許可、有効状態、転送先を分ける¶
公開Ethernetの1 Switch・3 Endpoint配線をそのまま使います。aからbへの経路は次の2段です。cとの往復配線も残しますが、今回の宛先経路には使いません。
Main.a.tx → Main.sw.rx_a Main.sw.tx_b → Main.b.rx
| 構成・入力 | 責務と境界 | 固定する依存 |
|---|---|---|
| NED | Endpoint・Switch・Linkの配線と媒体時間 | 6方向Link、1Gbps、伝搬1000ps |
| Port.vlans | 常時使える静的VID | すべてVID10 tagged、PVID10 |
| dynamic.registrable | 追加を許可するPort/VID/tag形式 | 6 portでVID20 taggedを許可。許可だけでは有効にならない |
| workload controls | 時刻付きのVID登録と期限 | 4 portを時刻0に登録。出口以外の寿命は8000000ps |
| Switch FDB | 宛先MACとVIDに対する出口を指定 | VID20のb宛はMain.sw.tx_b、処理2000ps |
| a / b | 指定時刻の生成と、自分宛の受信完了 | aは0/3000000psに生成、TX/RX処理0ps |
Port設定の Main.sw.tx_a は、対応する入口 Main.sw.rx_a のVID判定にも使われます。同様にbの受信側は Main.b.tx のPort設定で表します。入力のport名はNEDの対になる入出力を表すための正規名です。
有効VIDは静的 Port.vlans と現在の動的registrationの和集合です。今回はVID10を残し、VID20だけを期限付きで追加します。PVIDやuntaggedの分類は変更しません。静的FDBにVID20行を置いてもVID membershipを追加する効果はありません。
登録が必要なのは Main.a.tx、Main.sw.tx_a、Main.sw.tx_b、Main.b.tx の4か所です。aだけ登録してもsw入口は有効にならず、sw出口だけ登録してもbの受信条件は有効になりません。今回は対向側も明示的に登録してから、出口の寿命一つだけを比較します。
利用フロー:最初の配送と期限後の次の配送を追う¶
- INIでNED・model・workloadを選び、validateします。
- 時刻0のphase0で4つのVID20登録を適用し、その後aが最初のframe
unicast:0を生成します。 - a→sw到着609000ps、sw処理完了611000psで、静的FDBのb向け出口が現在VID20を使えるかを調べます。最初は両条件とも有効です。
- shortでは2000000psに出口のVID20だけが失効します。対向のbは8000000psまでVID20を保持します。
- aが3000000psに別frame
unicast:1を生成します。swの入口は両条件とも有効ですが、shortの出口は無効です。known宛先の不適格として候補0になり、floodへ切り替えません。 - longでは5000000psまで出口が有効なので、次のframeもbへ届きます。8000000psには共通の残り3登録も失効し、静的VID10だけが残ります。
短い登録は [0,2000000)、長い登録は [0,5000000) psで有効です。期限はframeの生成・到着時刻からではなくregister時刻から数えます。今回はrefresh/unregisterを使いません。
手順:公開入力で出口のlifetimeだけを変える¶
独立6入力ZIPを展開するか、examples/guide/ethernet-vid-registration を使います。ZIPはリポジトリ相対の構成で、他の記事のファイルを必要としません。
| ファイル | 内容 |
|---|---|
models/ethdemo/Main.ned |
公開Ethernetの配線を変更せず同梱 |
model.json |
公開VLAN設定由来の動的modelへVID20の静的FDB行とregistrableを共通追加 |
short.json / long.json |
公開registration負荷をMain名・VID20・2回生成・4 port登録へ共通整理 |
short.ini / long.ini |
対応workloadを選ぶ。model・profile・上限時刻は共通 |
比較するcontrolは次の1行です。long.json では lifetime_ps だけを "5000000" にします。残り3 portの "8000000" は変えません。
{"id":"egress","at_ps":"0","kind":"vlan_register",
"port":"Main.sw.tx_b","vid":20,"lifetime_ps":"2000000"}
正式v1.1.4の dir-simulator をPATHへ置き、リポジトリ又はZIP展開先ルートで実行します。次はBash用です。
mkdir -p registration-results
for case in short long; do
dir-simulator validate --config examples/guide/ethernet-vid-registration/$case.ini &&
dir-simulator run --config examples/guide/ethernet-vid-registration/$case.ini \
--output registration-results/$case &&
dir-simulator view --input registration-results/$case/results.json \
--output registration-results/$case-viewer.html
done
PowerShellでは $case の2値を各コマンドへ順に代入できます。親ディレクトリを先に作り、各runの出力先は未使用のものにします。validate/run/viewの各終了0、manifestの status: complete と partial: false を確認してください。runのJSON・CSV・診断・manifestを保存し、そのresults.jsonから作ったViewer HTMLを開きます。ブラウザーでの確認にサーバーは不要です。
実測:登録が切れても対向portは残る¶
tag付きMAC68byteとpreamble/SFDの8byteでwireは608bit、1Gbpsなら608000psです。伝搬1000psを足して最初のsw到着609000ps、処理2000ps後の転送SOF611000ps、b到着1220000psになります。次のframeは各時刻に3000000psを加えます。
| 観測 | short | long |
|---|---|---|
| sw.tx_bのVID20期限 ps | 2000000 | 5000000 |
| b.txのVID20期限 ps | 8000000 | 8000000 |
| 最初のb受信完了 ps | 1220000 | 1220000 |
| 次のsw到着 / 処理完了 ps | 3609000 / 3611000 | 3609000 / 3611000 |
| 次のsw reception | filtered | forwarded |
| 次のsw→b SOF / b受信 ps | 生成なし | 3611000 / 4220000 |
| generated / serialized | 2 / 3 | 2 / 4 |
| forwarded / received | 1 / 1 | 2 / 2 |
| reception filtered / copy dropped | 1 / 0 | 0 / 0 |
shortでもa→swは送信完了しています。入口は有効で処理まで進み、静的FDBが指す出口の不適格で候補0になったため known_egress_ineligible です。出口queueへ入れたcopyをdropした結果ではありません。serialized はframe数ではなくhopごとのcopy数です。
両runは上限10000000psまでのcomplete結果、events_exhausted・pending0です。最後のイベントは8000000psの共通登録失効でした。静的FDBにある送信元aの static_shadowed 記録は動的MAC学習の抑制を示し、受信失敗の件数ではありません。
Viewer:有効VIDとregistrationを照合する¶
- 各Viewerで時刻
4000000へJumpします。shortではsw.tx_bの有効VIDは10だけ、longでは10と20です。対向のb.txは両条件で10と20です。 - Policyの
registrationを展開します。shortは3件、longは4件です。port/vidとexpires_atを照合してください。 - shortでは
1999999で出口登録あり、2000000でなしになります。前の時刻へ戻すと同じ表が復元されます。longの境界は4999999/5000000psです。 5000000でunicast:1のa→sw行を選びます。shortはknown_egress_ineligible、longはbの受信完了です。8000000でregistrationは空になります。各portの静的VID10は残ります。
次は正式v1.1.4の実Viewerを4000000ps・600px表示で取得した画面です。入口や対向を含め、同じVIDの有効期間がportごとに異なることを確認できます。390px幅では有効VID表の右端列が初期表示の外にありますが、表内を横スクロールすると読めます。掲載画像は比較しやすいよう表全体を表示しています。


制約と仕様への入口¶
単一Switch・VID20・2 frame・競合なしで登録寿命を比較した実習です。refresh/unregister、登録上限、期限とlookupの同時刻全境界、待機中copyのdrop、link/STP切替や複数Switch構成は測定していません。registrableは静的VIDと重複できず、動的VIDはtagged形式だけです。静的VID10の解除を試す入力にはなっていません。
登録は設定した事実を時刻どおり適用する抽象controlです。実MVRP packetの交換・分散登録protocolやIEEE全体適合を示すものではありません。正式sourceのclean dev buildを使い、最適化ビルドの性能比較はしていません。
詳しい契約は正式版の動的Ethernet仕様、実施範囲は動的Ethernet検証仕様を参照してください。日本語検索では「登録」「期限」でこの記事を探せます。