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

MACsec / GTPv2-C / Diameter / SIP / RTP (P2)

Status: draft

MACsec (IEEE 802.1AE、構造のみ)、GTPv2-C (3GPP TS 29.274)、Diameter (RFC 6733、Credit-Control は RFC 4006)、SIP (RFC 3261)、RTP / RTCP (RFC 3550) (M7) のメモです。定義は crates/wpg-protocols/src/{macsec,gtpv2,diameter,sip,rtp}.rs、サンプルは templates/protocols/l2/macsec.wpg.yaml、templates/protocols/mobile/、templates/protocols/voip/ にあります。

スタックとサンプル

ethernet2 / macsec                          # EtherType 0x88e5 (Auto)。dot1q の後にも置ける
ethernet2 / ipv4 / udp / gtpv2 [/ gtpv2]    # UDP 2123。ピギーバックされたメッセージは 2 つ目の gtpv2 レイヤ
ethernet2 / ipv4 / tcp / diameter           # TCP 3868
ethernet2 / ipv4 / udp|tcp / sip            # UDP / TCP 5060
ethernet2 / ipv4 / udp / rtp / payload      # 任意のポート (レイヤを明示)。UDP 5004 はデコードされる
ethernet2 / ipv4 / udp / rtcp_sr / rtcp_sdes ...  # RTCP 複合パケット。UDP 5005 はデコードされる

UDP / TCP の宛先ポートは Auto ではないので 2123、3868、5060 などを指定します (デコードでは送信元ポートも見ます)。

サンプル内容
macsec明示的な SCI 付きの暗号化フレーム (アソシエーション番号 1、48 オクテットのセキュアデータ、不透明な ICV)
gtpv2-create-session-requestS11 の Create Session Request: IMSI、MSISDN、Serving Network、RAT Type、F-TEID 2 つ、APN、Selection Mode、PDN Type、PAA、AMBR、Bearer Context
gtpv2-create-session-responseCreate Session Response: Cause、F-TEID、PAA、APN Restriction、S1-U の F-TEID と Charging ID を含む Bearer Context
gtpv2-echo-requestTEID なしの Echo Request (Recovery IE)
diameter-cerVendor-Specific-Application-Id (S6a) 付きの Capabilities-Exchange-Request
diameter-ccr-initialSubscription-Id 付きの初回 Credit-Control-Request
sip-inviteUDP での SDP オファー付き INVITE
sip-registerTCP での本文なしの REGISTER
rtp-pcmuG.711 PCMU の 50 パケット (シーケンス番号とタイムスタンプのジェネレータ、160 オクテットのペイロード)
rtcp-sr-sdes受信レポート 1 件の送信者レポートと SDES の CNAME
rtcp-rr-bye受信者レポート、SDES の CNAME、理由付きの BYE
rtcp-feedback-app受信者レポート、PLI (汎用 rtcp レイヤ)、APP パケット

MACsec: 構造のみ

macsec レイヤは SecTAG とフレームの保護部分です。

フィールド内容
v、es、sc、scb、e、cTCI のビット。sc は Auto: sci に要素があれば 1
anアソシエーション番号 (2 ビット)
slショート長 (6 ビット): セキュアデータが 48 オクテット未満のときその長さ、それ以外は 0。手動
pnパケット番号 (32 ビット)
sci[] または [{ system_identifier, port_identifier }]
secure_data不透明なオクテット列。書いた値がそのまま送られ、暗号化はしない
icv不透明な 16 オクテット。計算しない

解析ではフレームの最後の 16 オクテットを ICV、SecTAG と ICV の間をセキュアデータとします。Ethernet の最小長より短いフレームは (実際の回線と同じく) ICV の後に詰め物が付き、解析し直すと詰め物はセキュアデータ / ICV に含まれます。完全性保護のみのフレーム (E = C = 0) もそれ以上はデコードせず、ユーザデータは secure_data に残ります。

GTPv2-C: 1 レイヤ = 1 メッセージ

gtpv2 レイヤはヘッダ (version 2、p、t、mp、message_type、message_length、teid、sequence_number、message_priority) と IE (ies) です。

  • t は teid から Auto: teid: [0x1001] で TEID を送り、teid: [] (Echo) で省きます。
  • message_length は Auto (先頭 4 オクテットより後のオクテット数)。IE はこの長さで終わるので、ピギーバックされたメッセージ (p: 1) は次の gtpv2 レイヤになります。
  • IE は 8 ビット型、IE データの 16 ビット長、長さに数えないスペア / インスタンスの 1 オクテット (wpg-core TlvDef::uncounted_octets) です。型付きの IE はどれも先頭に spare と instance フィールドを持ちます。
- protocol: gtpv2
  fields:
    message_type: create_session_request
    teid: [0]
    ies:
      - imsi: { digits: "00 01 01 21 43 65 87 f9" }   # TBCD
      - fteid: { interface_type: s11_mme_gtp_c, teid: 0x1001, ipv4: 192.0.2.1 }
      - apn: { apn: "08 69 6e 74 65 72 6e 65 74" }    # DNS ラベル
      - bearer_context:
          ies:
            - ebi: { ebi: 5 }
            - bearer_qos: { pl: 9, qci: 9 }
型IE (name) とデータのフィールド
1 / 75 / 76imsi / mei / msisdn (digits、TBCD のオクテット列)
2cause (cause、pce、bce、cs、offending_ie)
3recovery (restart_counter)
71apn (apn、DNS ラベルのオクテット列)
72ambr (uplink、downlink、kbps)
73ebi (ebi)
74ip_address / ip_address_ipv6 (address)。IE 長で判別
77 / 78 / 84 / 86indication (flags)、pco、bearer_tft、uli (data / tft のオクテット列)
79paa / paa_ipv6 / paa_ipv4v6 (pdn_type、ipv6_prefix_length、ipv6、ipv4)。IE 長で判別
80bearer_qos (pci、pl、pvi、qci、mbr_uplink、mbr_downlink、gbr_uplink、gbr_downlink)
82rat_type
83serving_network (MCC / MNC の各桁)
87fteid / fteid_ipv6 / fteid_ipv4v6 (v4、v6、interface_type、teid、ipv4、ipv6)。IE 長で判別
93bearer_context (ies: 上の IE。1 段のみ)
94 / 95charging_id、charging_characteristics
99pdn_type
114 / 127 / 128ue_time_zone、apn_restriction、selection_mode
255private_extension (enterprise_id、value)

その他の IE は { type: N, data: "..." } (データはインスタンスのオクテットから始まる) で保持します。GTPv1-C (バージョン 1、同じ UDP 2123) はモデル化していません。そのメッセージはバージョンの警告付きで gtpv2 としてデコードされます。

Diameter: ヘッダと AVP

diameter レイヤはヘッダ (version、message_length (Auto)、r / p / e / t フラグ、command_code、application_id、hop_by_hop、end_to_end) と AVP (avps) です。AVP はメッセージ長で終わるので、同じ TCP セグメント内の 2 つ目のメッセージは次のレイヤ (raw) になります。

AVP は 32 ビットのコード、フラグのオクテット (コードと長さの間: wpg-core TlvDef::head_octets)、ヘッダとデータを数え詰め物を数えない 24 ビット長 (Auto)、V フラグが 1 のときの Vendor-ID、4 オクテット境界まで詰めたデータ (Auto) です。型付きの AVP はどれも v (vendor_id から Auto)、m、p、reserved、vendor_id ([] または [10415]) の後にデータのフィールドを持ちます。

データ型AVP (name)データのフィールド
OctetString / UTF8String / DiameterIdentity / DiameterURIsession_id、origin_host、origin_realm、destination_host、destination_realm、product_name、user_name、error_message、route_record、proxy_host、proxy_state、class、redirect_host、service_context_id、subscription_id_data などvalue (オクテット列。テキストは '"..."')
Unsigned32 / Timevendor_id、supported_vendor_id、auth_application_id、acct_application_id、origin_state_id、firmware_revision、session_timeout、experimental_result_code、cc_request_number、event_timestamp などvalue
Unsigned64accounting_sub_session_idvalue
Enumeratedresult_code、disconnect_cause、auth_session_state、auth_request_type、re_auth_request_type、termination_cause、accounting_record_type、cc_request_type、subscription_id_type、multiple_services_indicatorvalue (名前で指定可)
Addresshost_ip_address / host_ip_address_ipv6。AVP 長で判別address_family、address
Groupedvendor_specific_application_id、failed_avp、proxy_info、experimental_result、subscription_idavps (上の AVP。1 段のみ)

一覧にないコードのベンダ固有 AVP (3GPP など) は、フラグのオクテット・Vendor-ID・値を data に含めた { type: N, data: "..." } で保持します。SCTP 上の Diameter はメッセージのオクテット列を SCTP DATA チャンクのユーザデータに入れて作ります。SCTP はユーザデータをデコードしません (SCTP を参照)。

SIP: テキストの行

sip レイヤはテキストです。start_line と headers の各要素は CRLF で終わる行 (wpg-core Length::Until) で、CRLF なしで書くと合成時に CRLF とヘッダ後の空行が付きます。body はメッセージの残り (SDP のオファー / アンサーなど) です。

- protocol: sip
  fields:
    start_line: '"INVITE sip:bob@example.com SIP/2.0"'
    headers:
      - '"Via: SIP/2.0/UDP 192.0.2.1:5060;branch=z9hG4bK74bf9"'
      - '"Content-Type: application/sdp"'
      - '"Content-Length: 132"'
    body: '"v=0\r\no=alice ...\r\n"'

Content-Length は通常のヘッダ行で手動のままです。本文に合わせてください (サンプルは合わせてあります)。空行のないメッセージは sip としてデコードされません。

RTP と RTCP

RTP には決まったポートがなく、セッションのポートは SDP で決まります。udp の後に rtp / rtcp_* レイヤを明示的に置いてください。解析では IANA の rtp-avp / rtcp-avp ポート 5004 / 5005 だけを RTP / RTCP として選びます (tshark でも -d udp.port==N,rtp の指定が必要です)。

rtp は固定ヘッダ、csrc (数 cc は Auto)、header_extension ([] または [{ profile, data }]。X ビットとワード単位の長さは Auto、data は 32 ビットワードのリスト、profile 0xBEDE は RFC 8285 の 1 バイト要素) です。メディアのペイロードは次のレイヤ (payload / raw) です。パディングビットと詰め物は手動です。

RTCP は 1 パケット 1 レイヤなので、複合パケットは RTCP レイヤを重ねて作ります。件数 (report_count / source_count) と length (32 ビットワード数 − 1) は Auto で、各パケットはその長さで終わります。

レイヤパケットタイプ本体のフィールド
rtcp_sr200ssrc、ntp_timestamp_msw / lsw、rtp_timestamp、packet_count、octet_count、report_blocks、extension
rtcp_rr201ssrc、report_blocks、extension
rtcp_sdes202chunks: [{ ssrc, items: [{ type, text }] }] (項目の長さ、null オクテット、詰め物は Auto)
rtcp_bye203ssrcs、reason ([] または [{ text }])
rtcp_app204subtype (件数フィールド)、ssrc、name (4 オクテット)、data
rtcp任意count、body (オクテット列)。解析時は 200〜204 なら型付きのパケットとして読み直す

対象外

  • MACsec の暗号化 / ICV 計算、XPN (64 ビットのパケット番号)、完全性保護のみのユーザデータのデコード
  • GTPv1-C、上の表で型付けしていない GTPv2-C の IE (ULI、Indication のフラグ、PCO の中身はオクテット列)、入れ子の Bearer Context
  • Diameter のベンダ固有 AVP 辞書 (3GPP の S6a / Gx / Gy など)、2 段以上のグループ化 AVP、SCTP DATA チャンクからの Diameter の demux
  • SIP の Content-Length の Auto、ヘッダの名前 / 値への分解、SIP over TLS (5061)、マルチパート本文
  • RTP のペイロード形式、SRTP、RTCP のフィードバック (RTPFB / PSFB) と XR の本体 (rtcp でオクテット列として保持)

自動生成リファレンス

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

ipv4 · udp · ipv6 · macsec · gtpv2 · diameter · sip · rtp · rtcp · rtcp_sr · rtcp_rr · rtcp_sdes · rtcp_bye · rtcp_app · payload · raw