Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

LDP / RSVP-TE / BFD (P2)

Status: draft

LDP (RFC 5036)、RSVP-TE (RFC 2205 / RFC 3209)、BFD (RFC 5880 / 5881 / 5883、Micro-BFD RFC 7130) の補足 (M7)。定義は crates/wpg-protocols/src/{ldp,rsvp,bfd}.rs、サンプルは templates/protocols/mpls/ と templates/protocols/oam/ にあります。

到達経路とサンプル

ethernet2 / ipv4 / udp / ldp       # UDP 646: Hello (基本ディスカバリは 224.0.0.2、拡張はユニキャスト)
ethernet2 / ipv4 / tcp / ldp       # TCP 646: セッション (Initialization 以降)
ethernet2 / ipv4 / rsvp            # IPv4 protocol 46 (Auto)
ethernet2 / ipv6 / rsvp            # IPv6 next header 46 (Auto)
ethernet2 / ipv4 / udp / bfd       # UDP 3784 (シングルホップ)、4784 (マルチホップ)、6784 (Micro-BFD)

IPv6 の LDP (RFC 7552) も ipv6 / udp|tcp / ldp で組めます。UDP / TCP の宛先ポートは Auto ではありません。646 / 3784 などを指定してください (解析時は送信元ポートでも判別します)。BFD のエコーポート 3785 の中身は送信側にしか意味がないためデコードしません。

サンプル内容
ldp-hello224.0.0.2 へのリンク Hello (GTSM ビット、IPv4 トランスポートアドレス)
ldp-targeted-hello拡張ディスカバリの Targeted Hello (T / R ビット、構成シーケンス番号)
ldp-initialization1 PDU に Initialization (Common Session Parameters) と KeepAlive
ldp-label-mappingAddress と Label Mapping 2 つ (プレフィックス FEC、汎用ラベル。暗黙 NULL 3 を含む)
ldp-label-withdrawワイルドカード FEC の Label Withdraw と Notification (Shutdown)
rsvp-te-pathRouter Alert 付き Path (厳密 / 緩い ERO、SESSION_ATTRIBUTE、SENDER_TSPEC、RRO)
rsvp-te-resvSE スタイルの Resv (FLOWSPEC、FILTER_SPEC、LABEL、ラベル付き RRO)
rsvp-path-errERROR_SPEC (Routing Problem) 付き PathErr
rsvp-path-tearPathTear
rsvp-helloHELLO REQUEST 付き Hello
bfd-single-hop状態 Up、300 ms 間隔の制御パケット (10 個、4 pps)
bfd-authMeticulous Keyed SHA1 認証付きの Poll
bfd-multihop-ipv6IPv6 上のマルチホップ (UDP 4784、状態 Init)
micro-bfdLAG メンバーリンクの Micro-BFD (UDP 6784、宛先 MAC 01:00:5e:90:00:01)

LDP: 1 レイヤ = 1 PDU

ldp レイヤは PDU ヘッダ (version、pdu_length、lsr_id、label_space) と PDU 内の全メッセージ (messages) です。メッセージは PDU 長で終わるので、同じ TCP セグメントの後続 PDU は次のレイヤ (raw) になります。

メッセージと TLV は同じ形の項目です: 16 ビット型 (U ビット、TLV では F ビットも型の上位ビットに含む)、値だけの 16 ビット長、値。どのメッセージも先頭が message_id、続いて tlvs です。

- protocol: ldp
  fields:
    lsr_id: 192.0.2.1
    messages:
      - label_mapping:
          message_id: 11
          tlvs:
            - fec:
                elements: [{ prefix_length: 24, prefix: "c6 33 64" }]
            - generic_label: { label: 299776 }
      - label_withdraw:
          message_id: 12
          tlvs:
            - fec_wildcard
型メッセージ (name)型TLV (name) と値フィールド
0x0001notification0x0100fec (elements: {element_type (2), address_family, prefix_length, prefix})、fec_wildcard (要素型 1)
0x0100hello0x0101address_list (IPv4) / address_list_ipv6 (address_family、addresses)
0x0200initialization0x0103 / 0x0104hop_count、path_vector (lsr_ids)
0x0201keepalive0x0200generic_label (label: 20 ビット)
0x0300 / 0x0301address / address_withdraw0x0300status (e、f、status_code、message_id、message_type)
0x0400label_mapping0x0400common_hello_parameters (hold_time、t、r、g (GTSM、RFC 6720))
0x0401label_request0x0401 / 0x0403ipv4_transport_address / ipv6_transport_address
0x0402label_withdraw0x0402configuration_sequence_number
0x0403label_release0x0500common_session_parameters (protocol_version、keepalive_time、a、d、pv_lim、max_pdu_length、receiver_lsr_id、receiver_label_space)
0x0404label_abort_request0x0600label_request_message_id

FEC TLV は値の先頭オクテット (要素型) で fec_wildcard と fec を、Address List は先頭 2 オクテット (アドレスファミリ) で IPv4 / IPv6 を選び分けます。その他の型 (ATM / Frame Relay のラベルとセッションパラメータ、ベンダー TLV など) は { type: N, data: "..." } として保持します。

RSVP-TE: オブジェクトは「長さ → 型」

rsvp レイヤは共通ヘッダ (version、flags、msg_type、checksum、send_ttl、length) とメッセージ内の全オブジェクト (objects) です。オブジェクトは 16 ビット長 (4 オクテットのヘッダを含む) の後に Class-Num と C-Type が続き、2 つを合わせた 16 ビット (class_num << 8 | c_type) を型として扱います (wpg-core の TlvDef::len_first)。項目名はクラスと C-Type から付けています。

型名前 (name)型名前 (name)
0x0101 / 0x0102session_ipv4 / session_ipv60x0b01sender_template_ipv4
0x0107 / 0x0108session_lsp_tunnel_ipv4 / _ipv60x0b07 / 0x0b08sender_template_lsp_tunnel_ipv4 / _ipv6
0x0301 / 0x0302rsvp_hop_ipv4 / rsvp_hop_ipv60x0c02sender_tspec (IntServ)
0x0501time_values0x0f01resv_confirm_ipv4
0x0601 / 0x0602error_spec_ipv4 / error_spec_ipv60x1001label
0x0701scope_ipv40x1301label_request (l3pid)
0x0801style (sharing、sender_selection。既定 SE)0x1401 / 0x1501explicit_route / record_route (subobjects)
0x0902flowspec (IntServ、制御負荷)0x1601 / 0x1602hello_request / hello_ack
0x0a01filter_spec_ipv40x1701 / 0x1801 / 0x1802message_id / message_id_ack / message_id_nack (RFC 2961)
0x0a07 / 0x0a08filter_spec_lsp_tunnel_ipv4 / _ipv60xcf07 / 0xcf01session_attribute / session_attribute_ra (リソースアフィニティ付き)

EXPLICIT_ROUTE のサブオブジェクトは ipv4_prefix、ipv6_prefix、unnumbered_interface、as_number で、_loose を付けた名前が L ビット付き (緩いホップ) です。RECORD_ROUTE のサブオブジェクトは ipv4_address、ipv6_address、label、unnumbered_interface (それぞれ flags 付き) です。ADSPEC・POLICY_DATA・INTEGRITY などその他のオブジェクトは値オクテットのまま保持します。

SENDER_TSPEC / FLOWSPEC のトークンバケット (token_bucket_rate、token_bucket_size、peak_data_rate) は IEEE 754 単精度浮動小数点のビットパターンを 32 ビット整数で指定します (例: 1,000,000 オクテット/秒 = 0x49742400、無限大 = 0x7f800000)。既定は 125,000 オクテット/秒 (1 Mbit/s)。

Path・PathTear・ResvConf は IP の Router Alert オプション付きで送るのが通常です (ipv4 の options: [router_alert: 0])。

BFD

bfd レイヤは必須セクションと省略可能な認証セクション (authentication) です。フラグは p、f、c、a、d、m の 1 ビットフィールドです。認証セクションの型は簡易パスワード (simple_password: key_id、password)、keyed_md5 / meticulous_keyed_md5 (key_id、sequence_number、16 オクテットの digest)、keyed_sha1 / meticulous_keyed_sha1 (20 オクテットの hash) です。

- protocol: bfd
  fields:
    state: up
    my_discriminator: 0x101
    your_discriminator: 0x201
    desired_min_tx_interval: 300000 # マイクロ秒
    required_min_rx_interval: 300000
    authentication:
      - simple_password: { key_id: 1, password: '"secret"' }

Auto フィールド

フィールド規則
ldp.pdu_lengthバージョンと PDU 長を除く PDU の長さ
LDP のメッセージ / TLV の長さ値の長さ (型と長さを除く)
rsvp.checksumフィールドを 0 としたメッセージ全体のインターネットチェックサム
rsvp.length、オブジェクト / サブオブジェクトの長さヘッダを含む長さ
SESSION_ATTRIBUTE の name_length と padding名前のオクテット数、4 オクテット境界までのゼロ詰め (長さに含む)
bfd.length認証セクションを含む制御パケットの長さ
bfd.a認証セクションがあれば 1

制約

  • 状態を持ちません。LDP のセッション確立、RSVP のリフレッシュ、BFD の状態遷移とタイマーは行いません。値はそのまま送り、変化させるにはジェネレータを使います。
  • BFD の MD5 ダイジェスト / SHA1 ハッシュ、RSVP の INTEGRITY は手動です (鍵による計算はしません)。
  • LDP の 1 レイヤは 1 PDU です。同じセグメントに PDU を複数入れる場合、後続の PDU はデコード時に raw になります。
  • RSVP は GMPLS (RFC 3473) のオブジェクト、ADSPEC、POLICY_DATA を型付けしません。RSVP over UDP (RFC 2205 付録 C) は対象外です。
  • IntServ のパラメータは 1 つ目 (トークンバケット) だけを型付けし、以降 (保証サービスの Rate / Slack など) は parameters のオクテット列です。

自動生成リファレンス

このページのプロトコルのフィールドリファレンス (定義から自動生成):

ipv4 · ldp · rsvp · bfd · raw