プラットフォーム:NXP LS1028ARDB(VSC9959 / Felix スイッチ)
カーネル:Linux 6.18.2-rt3(NXP Yocto real-time-edge、PREEMPT_RT)
トポロジー(DSA):
eno2 (ENETC) = DSAコンジット/NPIポート
swp0 = Felix ユーザーポート(CPUインジェクションパス:CPU → eno2 → NPI → egress swp0 物理ポート)
eno0 (ENETC) = 独立したテストポート(現在はswp0に直接ケーブル接続されており、実際の出力フレームの内容を確認するために使用されます)
用途:AF_PACKET swp0にバインドされたSOCK_RAWソケット、SO_TIMESTAMPING(TX_HARDWARE|RAW_HARDWARE)で、カスタムEtherType 0x88B5でフレームを送信し、ソケットエラーキュー(SCM_TIMESTAMPING)からハードウェアTXタイムスタンプを期待します。
ptp4lはswp0上で実行されています( HWTSTAMP_TX_ON 、正常に同期しており、影響を受けていません)。
swp0 上で送信されるカスタム 0x88B5 (非 PTP) フレーム のハードウェア TX タイムスタンプを 、swp0 上の PTP 同期を損なうことなく取得します。
PTPフレームにはタイムスタンプが付与されます。swp0上の同じAF_PACKET rawソケットを使用し、0x88F7と有効なPTPヘッダーを送信すると、30フレーム中30フレームがエラーキュー経由でハードウェアTXタイムスタンプを返しました( ocelot_get_txtstampが一致し、タイムスタンプがソケットエラーキューに配信されました)。
ドライバーのタイムスタンプリクエストパスはカスタムフレームで動作します。0x88B5フレームがocelot_port_txtstamp_requestに達する (dmesgはfelix-tx-tsを表示:ポート0非PTP=1 ts_id=0..3))、すなわちocelot_port->ptp_cmdはゼロでない(ptp4lによって設定)され、タイムスタンプIDが割り当てられます。
0x88B5フレームの場合、タイムスタンプIDが割り当てられますが、ハードウェアはタイムスタンプを生成しません。
SYS_PTP_STATUS PTP_MESS_VLD = 0 は、0x88B5 フレームのバースト送信直後に発生します (FIFO エントリなし、オーバーフローなし)。
ソケットのエラーキューは空のままです。
結果を確認する
| ocelot_port->ptp_cmd (2段階有効化) | |
| IFHバイパス(ビット127) | |
| IFH REW_OP1 (ビット125~117) | |
| REW_PTP_CFG.PTP_2STEP_DIS | |
| PTP_CFG_MISC.PTP_ENA | |
| SYS_PORT_MODE.DATA_WO_TS (ポート 0/4/6) | |
| REW_PORT_CFG.FCS_UPDATE_CPU_ENA | |
| IS2ルールにより、0x88B5(イングレスswp0、次にswp0|NPI)に対して2段階認証が追加されます。 | |
| インラインタイムスタンプ挿入SYS_TIMESTAMP_OFFSET (ETH_TYPE_CFG=0x88B5、TIMESTAMP_OFFSET=14; レジスタ書き込み/読み出し検証済み) |
VSC9959/Felixの2段階TXタイムスタンプ(IFH REW_OP1、REW_OP[2:0]=3)は、非PTPのEtherTypeを持つCPUインジェクトフレームに対して実際に動作しますか?リファレンス・マニュアル(16.4.13.12.3.1)には「任意のフレーム、非PTPフレームにも適用可能」と記載されていますが、私たちは VLD=0(FIFOエントリゼロ)SYS_PTP_STATUS測定しています。実際のシリコンの挙動としては、BYPASS=1かつIFHでREW_OP1が入っても、リライターはタイムスタンプのFIFOエントリを生成する前にフレームをEtherType / PTPヘッダーでPTPとして分類する必要があるのでしょうか?
SYS_TIMESTAMP_OFFSET (インラインタイムスタンプ挿入)には、 ETH_TYPE_CFGの一致以外に、何か隠された有効化/トリガー条件があるのでしょうか?レジスタが正しく書き込まれていること(ETH_TYPE_CFG=0x88B5、オフセット=14)、FCS更新が有効になっていること、DATA_WO_TS=0であること、そしてswp0↔eno0ケーブルを直接接続して出力フレームの内容を確認したことを確認済みですが、フレームにタイムスタンプは書き込まれていませんでした。この機能はCPUインジェクション(バイパス)パスでも制限されているのでしょうか?
CPUインジェクション(BYPASS=1)パスにおいて、swp0で送信される任意のEtherTypeカスタムフレームのハードウェアTXタイムスタンプを取得するための公式にサポートされている方法はありますか? (例えば、イネーブルビット、PTP分類テーブルの設定、または必須フレームフォーマットなど。)
もしこのシリコンでマニュアルに記載された2つの機構のいずれも非PTPフレームをサポートしていない場合、既知のエラタムや推奨される代替案はありますか?
非PTP CPUインジェクションフレームに対する2段階TXタイムスタンプ
RMドキュメントでは、CPUインジェクションヘッダーのREW_OP[2:0] = 3を「2ステップPTP」として記述しており、REW_OP[8:3]にはタイムスタンプ識別子が含まれています。ID 0~3は、CPUインジェクションフレーム用に明示的に事前割り当てされています。また、2段階タイムスタンプは「任意のフレーム、PTP以外のフレームにも適用可能」と述べています。フレーム自体は変更されず、TXタイムスタンプはSYS::P TP_STATUS / SYS::P TP_TXSTAMPに保存されます。
したがって、RMからBYPASS=1 + IFH REW_OP[2:0]=3は、非PTPフレームを含むCPUインジェクトによる2段階タイムスタンプの有効なメカニズムであるはずです。IFHが2段階コマンドを提供する場合、リライターがまずEtherType/ヘッダーによってフレームをPTPとして分類する必要があるというRMの証拠は見つかりませんでした。矛盾しているのは、IFH REW_OP1 を確認した後の測定値 SYS_PTP_STATUS.PTP_MESS_VLD=0 ですが、これは私が取得した RM テキストでは説明されていません。
SYS_TIMESTAMP_OFFSET / インラインタイムスタンプ挿入
ES_SYS_SYSTEM_TIMESTAMP_OFFSET ETH_TYPE_CFGを照合し、64ビットナノ秒のTXタイムスタンプをTIMESTAMP_OFFSETに配置することが文書化されています。マニュアルには「汎用タイムスタンプ挿入(クロノス)」の例もあり、オフセット14でタイムスタンプをイーサネットフレームの絶対バイト28に配置しています。
一般的なPTP有効化/タイムスタンプオフセット設定以外に追加の隠れた有効ビットがあると記載されたドキュメントや、CPUインジェクトされたBYPASS=1フレームでこの機能がサポートまたはブロックされていると明記したドキュメントは取得できません。RMの文言は汎用的なメカニズムをサポートしていますが、直線ケーブルで予想されるオフセットでバイトが書かれていないことは、このCPU注入経路ではETH_TYPE_CFG一致だけでは十分ではないことを示唆しています。
Linux DSA上で公式に対応している方法で、swp0上で任意のEtherTypeフレームにタイムスタンプを付ける方法があります。
最も強力なソフトウェア側の証拠は、LS1028Aスイッチドライバで使われているDSAフレームワークでは汎用パケットのタイムスタンピングがサポートされていないということです。スイッチハードウェアは対応可能です。
したがって、標準的なDSA Felixドライバモデルでは、PTP/IEEE-1588イベント情報メッセージのタイムスタンプをサポートパスとして扱い、swp0上の任意のEtherType 0x88B5 TXタイムスタンプをSO_TIMESTAMPINGを通じたものは公式にソフトウェアスタックでサポートされていないとみなします。それは、有効な0x88F7 PTPフレームは確実にタイムスタンプが付与されるのに対し、0x88B5はそうではないというあなたの観察結果と一致します。
訂正/推奨代替案
この動作に関するタイムスタンプ固有のLS1028A/Felixの正誤表は見つかりませんでした。私が見つけた証拠によると、取得したチケット資料に記載されているFelixのエラタムはERR A-050484であり、タイムスタンプFIFO生成ではなくNPIフロー制御/フレーム損失マネジメントに関連しています。