O-RAN フロントホールをテストするための CU プレーン メッセージの生成
この例では、5G Toolbox™ を使用したオープン無線アクセス ネットワーク (O-RAN) 適合性テストのためのフロントホール コントロール プレーン/ユーザー (CU) プレーン メッセージを生成する方法を示します。O-RAN に準拠したこれらのメッセージは、O-RAN 分散ユニット (O-DU) で生成された分割オプション 7.2x テスト ベクトルとみなされます。この例では、これらのメッセージを含むパケット キャプチャ (PCAP) ファイルを生成します。
はじめに
この例では、TS O-RAN.WG4.CUS で定義された O-RAN フロントホール CU プレーン メッセージを構築する方法を示します。これは TS 38.141-1 および TS 38.104 でそれぞれ定義された NR テスト モデル またはアップリンク FRC を送信します。O-RAN に準拠したこれらのメッセージは、O-DU で生成された分割オプション 7.2x テスト ベクトルとみなされます。この例では、このメッセージを含む PCAP ファイルを生成します。生成されたパケットを使用すると、TS O-RAN.WG4.CONF の適合性テスト仕様に基づいて O-RAN 無線ユニット (O-RU) をテストできます。また、Analyze CU-Plane Messages for O-RAN Fronthaul Testingの例またはサードパーティのパケット解析ツールを使用し、生成された PCAP ファイルを解析できます。この例では、Wireshark を使用し、CU プレーン メッセージの内容が期待どおりであるかどうかを確認します。
この例では、指定された NR テスト モデル波形またはアップリンク FRC 波形を送信するのに必要な CU プレーン メッセージを構築します。この例では、スロットごとの拡張アンテナ キャリア識別子 (eAxC ID) に対して少なくとも 1 つの コントロール プレーン (C-Plane) メッセージを生成します。各 C プレーン メッセージは、イーサネット MTU サイズに応じて、シンボルごとに 1 つ以上のユーザー プレーン (U-Plane) メッセージに関連付けられます。C プレーン メッセージは、セクション タイプ 1 (ほとんどのデータの場合) またはセクション タイプ 3 (mixed numerology データの場合) として送信できます。U プレーン メッセージは、メッセージごとに 1 つのセクションを使用して IQ データをカプセル化します。次の図は、セクション タイプ 1 の C プレーン メッセージを使用して単一の eAxC ID に対して生成された CU プレーン メッセージの流れを示しています。
構成パラメーターの設定
構成されたデータ フレームはそれぞれ TS 38.141-1 および TS 38.104 で定義されているように、5G NR テスト モデルのグリッド全体またはアップリンク FRCで構成されます。波形、チャネル帯域幅、およびテスト波形のサブキャリア間隔を設定できます。この例では FDD デュプレックス モードのみをサポートし、プリコーディングまたはビームフォーミングは適用しません。
生成された PCAP ファイルには、イーサネット、eCPRI、および O-RAN のプロトコルが含まれます。このセクションでは、この 3 つのプロトコルで使用できるパラメーターを構成します。
O-RAN — 圧縮法、および圧縮前後の IQ サンプルのビット幅を設定します。
eCPRI — eAxC ID フィールドを設定します。複数のデータ ストリームを作成するには、ID のベクトルを使用して各 CU プレーン ストリームで波形を複製します。
Ethernet — イーサネット MTU、VLAN タグ、および送信元と送信先の MAC アドレスを設定します。
この例では、マネジメント プレーン (M プレーン) メッセージは生成しません。ただし、M プレーン パラメーターである、圧縮モード、バイト順、eAxC ID のフィールドごとのビット数、C プレーン メッセージと U プレーン メッセージの間のタイミング、およびサポートされる numerology の最大値はこの例で設定できます。
波形の構成
基準波形パラメーターの選択
waveConfig = struct(); waveConfig.tm ="NR-FR1-TM1.1"; % Test model (TM) or uplink FRC (G) waveConfig.bw =
"100MHz"; % Channel bandwidth (MHz)li waveConfig.scs =
"30kHz"; % Subcarrier spacing (kHz)
O-RAN 構成
圧縮パラメーターを設定します。
oranConfig = struct(); oranConfig.method ='BFP'; % U-Plane compression method. For modulation compression, SectionType must be 1. oranConfig.SectionType =
1; % C-Plane message Section Type oranConfig.IQWidth =
24; % IQ samples bit-width before or without compression
cIQWidth
フィールドは、BFP、ブロック スケーリング、および μ 則圧縮法にのみ適用できます。
oranConfig.cIQWidth =14; % Compressed IQ samples bit-width (1 to 16).
eCPRI 構成
DU_Port_ID、BandSector_ID、CC_ID および RU_Port_ID の各サブフィールドに基づく eAxC ID 値を設定します。mPlaneConfig
構造体の eAxCIDBits
フィールドは、各 ID パートのビット幅を定義します。
複数の eAxC ID 値を指定するには、各 ID フィールドで値のベクトルを使用します。この場合、すべての指定した eAxC データフローに同じメッセージが送信されます。
eCPRIConfig = struct(); eCPRIConfig.DUPortID =0; % Distributed unit identifiers eCPRIConfig.BandSectorID =
0; % Band and sector identifiers eCPRIConfig.CCID =
0; % Component carrier identifiers eCPRIConfig.RUPortID =
0; % Spatial stream identifiers
4 つの eAxC ID サブフィールド内の値のベクトルを、個々の値の組み合わせに展開します。ここで各組み合わせは単一の eAxC ID です。各 eAxC ID は構造体配列の個別の要素として返されます。
eCPRIConfig = eAxCIDConfigExpand(eCPRIConfig);
イーサネット構成
イーサネット MTU サイズ (バイト単位)
ethernetConfig = struct();
ethernetConfig.MTU =
1500;
イーサネット VLAN タグを選択します。
ethernetConfig.TPID =0x8100; % Tag protocol identifier ethernetConfig.priority =
7; % Priority level (0 to 7) ethernetConfig.DEI =
0; % Drop eligible indicator ethernetConfig.VID =
1; % Unique VLAN identifier (0 to 4095)
送信元と送信先の MAC アドレスを設定します。送信元アドレスは O-DU を表し、送信先アドレスは O-RU を表します。
ethernetConfig.sourceAddress = [0x56 0x3b 0xbe 0xa9 0x92 0x4c]; % MAC source address (hex or string input) ethernetConfig.destAddress = [0xda 0x14 0xde 0xb0 0x55 0x63]; % MAC destination address (hex or string input)
M プレーン 構成
基本 M プレーン パラメーターの設定
mPlaneConfig = struct(); mPlaneConfig.compMode =1; % Compression mode (statically configured over M-Plane or dynamic in the messages) mPlaneConfig.byteOrder =
0; % Byte order of U-Plane IQ data mPlaneConfig.eAxCIDBits =
[2 6 4 4]; % Bits per field in eAxC ID (DUPortID,BandSectorID,CCID,RUPortID) mPlaneConfig.MaxNumerology =
-1; % Highest supported numerology for mixed numerology using section type 3 C-Plane messages
C プレーン メッセージの送信と、関連付けられた最初の U プレーン メッセージの到着との間の時間を構成します。ダウンリンク構成の場合は Tcp_adv_dl
パラメーターを設定し、アップリンク構成の場合は T1a_cp_ul
および Ta3_up_ul
パラメーターを設定します。CU プレーンのタイミングの詳しい情報については、TS O-RAN.WG4.CUS Section 4.4.3 [2] を参照してください。
mPlaneConfig.Tcp_adv_dl =0.00012; % DL CU-Plane timing advance (secs) mPlaneConfig.T1a_cp_ul =
0.00009; % UL C-Plane timing advance (secs) mPlaneConfig.Ta3_up_ul =
0.00003; % UL U-Plane timing delay (secs)
パケット キャプチャ ファイル
PCAP/PCAPNG ファイルの名前および形式を設定します。
pcapFileName ='CUMessages'; % PCAP file name pcapFormat =
0; % PCAP or PCAPNG file format
U プレーン データの生成
hNRReferenceWaveformGenerator
クラスを使用し、前のセクションで選択した完全な 5G NR 波形を生成します。この NR フレーム (分割オプション 7.2x) のリソース グリッドが、U プレーン メッセージで搬送されるデータです。
tmWaveGen = hNRReferenceWaveformGenerator(waveConfig.tm,waveConfig.bw, ... waveConfig.scs,"FDD"); % Generate waveform and get resource grid of one frame of data [~,gridSet,wInfo] = generateWaveform(tmWaveGen); grid = gridSet.ResourceGridBWP; % Get the number of symbols per slot and the number of slots per subframe waveConfig.ModulationInfo = gridSet.Info;
U プレーン データの圧縮
次に、関数 hORANModulationCompressionCoder.encode
を使用するか、または選択した圧縮法に応じた関数 nrORANBlockCompress
を使用して、生成されたリソース グリッドを圧縮します。圧縮法のオプションには、ブロック浮動小数点数 (BFP)、ブロック スケーリング、μ 則、および変調圧縮が含まれます。これらは、TS O-RAN.WG4.CUS の Annex A.1、A.2、A.3、および A.5 でそれぞれ定義されています。
圧縮を適用する前に、リソース グリッド内の IQ サンプルを TS O-RAN.WG4.CUS section 8.1.3.1 で定義されているフル スケールに合わせてスケーリングします。また oranConfig.IQWidth
パラメーターで指定されたビット幅に合わせます。
peakPower = sqrt(max(grid.*conj(grid),[],'all')); scaleFactor = peakPower/2^(oranConfig.IQWidth-1); oranConfig.scaledGrid = round(grid/scaleFactor); % Apply compression to the scaled resource grid, if selected switch oranConfig.method case 'modulationCompression' [oranConfig.cGrid,oranConfig.cIQWidth,oranConfig.CPlaneInfo] = ... hORANModulationCompressionCoder.encode(oranConfig.scaledGrid,oranConfig.IQWidth,tmWaveGen.Config,wInfo); decompressedGrid = hORANModulationCompressionCoder.decode(oranConfig.cGrid,oranConfig.CPlaneInfo, ... oranConfig.cIQWidth,oranConfig.IQWidth); case {'BFP','blockScaling','muLaw'} [oranConfig.cGrid,oranConfig.cParam] = nrORANBlockCompress(oranConfig.scaledGrid, ... oranConfig.method,oranConfig.cIQWidth,oranConfig.IQWidth); decompressedGrid = nrORANBlockDecompress(oranConfig.cGrid,oranConfig.cParam, ... oranConfig.method,oranConfig.cIQWidth,oranConfig.IQWidth); end
CU プレーン メッセージ構造体の作成
関数 hORANProtocolBuilder.getCUMessages
を使用して、次の CU プレーン メッセージのデータ構造体を作成します。
イーサネット ヘッダー
eCPRI ヘッダー
eCPRI ペイロード (O-RAN アプリケーション データ)
[cMessages,uMessages] = hORANProtocolBuilder.getCUMessages(waveConfig,mPlaneConfig,...
oranConfig,eCPRIConfig,ethernetConfig);
CU プレーン メッセージの符号化
関数 hORANProtocolBuilder.encodeMessagesToFile
は、CU プレーン メッセージ構造体を符号化し、パケット オクテットを PCAP ファイルに書き込みます。関数は、参照として .json
ファイルに保存される生成済み O-RAN パケットの概要を返します。
% Encode CU-Plane messages and write the packets to PCAP file [cufilename,summary] = hORANProtocolBuilder.encodeMessagesToFile(waveConfig,cMessages,uMessages,... mPlaneConfig,pcapFileName,pcapFormat,eCPRIConfig(2:end));
Warning: The specified filename is already in use. Writing to file CUMessages1.pcap.
fprintf('Created %s file.',cufilename);
Created CUMessages1.pcap file.
生成された CU プレーン メッセージの分析
CU プレーン パケットの概要をチェックして、PCAP ファイル内に要約された時間、長さ、プロトコル、eAxC ID、およびメッセージ情報が正しいことを確認できます。
struct2table(summary)
ans=2540×5 table
Time Length Protocol eAxCID Info
_________ ______ ___________ ________________ ___________________________________________________
0 60 {'C-Plane'} 0 0 0 0 "C-Plane, Type: 1, Id: 0 (all PRBs, Symbols: 0-13)"
0.00012 1496 {'U-Plane'} 0 0 0 0 "U-Plane, Id: 0 (PRB: 0-33, Symbols: 0)"
0.00012 1496 {'U-Plane'} 0 0 0 0 "U-Plane, Id: 0 (PRB: 34-67, Symbols: 0)"
0.00012 1496 {'U-Plane'} 0 0 0 0 "U-Plane, Id: 0 (PRB: 68-101, Symbols: 0)"
0.00012 1496 {'U-Plane'} 0 0 0 0 "U-Plane, Id: 0 (PRB: 102-135, Symbols: 0)"
0.00012 1496 {'U-Plane'} 0 0 0 0 "U-Plane, Id: 0 (PRB: 136-169, Symbols: 0)"
0.00012 1496 {'U-Plane'} 0 0 0 0 "U-Plane, Id: 0 (PRB: 170-203, Symbols: 0)"
0.00012 1496 {'U-Plane'} 0 0 0 0 "U-Plane, Id: 0 (PRB: 204-237, Symbols: 0)"
0.00012 1496 {'U-Plane'} 0 0 0 0 "U-Plane, Id: 0 (PRB: 238-271, Symbols: 0)"
0.00012 77 {'U-Plane'} 0 0 0 0 "U-Plane, Id: 0 (PRB: 272, Symbols: 0)"
0.0001562 1496 {'U-Plane'} 0 0 0 0 "U-Plane, Id: 0 (PRB: 0-33, Symbols: 1)"
0.0001562 1496 {'U-Plane'} 0 0 0 0 "U-Plane, Id: 0 (PRB: 34-67, Symbols: 1)"
0.0001562 1496 {'U-Plane'} 0 0 0 0 "U-Plane, Id: 0 (PRB: 68-101, Symbols: 1)"
0.0001562 1496 {'U-Plane'} 0 0 0 0 "U-Plane, Id: 0 (PRB: 102-135, Symbols: 1)"
0.0001562 1496 {'U-Plane'} 0 0 0 0 "U-Plane, Id: 0 (PRB: 136-169, Symbols: 1)"
0.0001562 1496 {'U-Plane'} 0 0 0 0 "U-Plane, Id: 0 (PRB: 170-203, Symbols: 1)"
⋮
%winopen(cufilename) % Uncomment to open the file in Wireshark on Windows
生成された CU プレーン メッセージを含む PCAP ファイルをパケット アナライザーで開き、PCAP ファイルのコンテンツと表示された概要を比較することもできます。生成された PCAP ファイルのコンテンツは、Wireshark の O-RAN フロントホール プロトコルの基本設定と一致しなければなりません。次の図は、取得した 2 つの CU プレーン メッセージを Wireshark で解析した結果を示しています。
最初の C プレーン メッセージ
最初の U プレーン メッセージ
参考文献
3GPP TS 38.141-1. "NR; Base Station (BS) conformance testing Part 1: Conducted conformance testing." 3rd Generation Partnership Project; Technical Specification Group Radio Access Network.
TS O-RAN.WG4.CUS. "O-RAN Fronthaul Working Group - Control, User and Synchronization Plane Specification".
TS O-RAN.WG4.CONF. "O-RAN Fronthaul Working Group - Conformance Test Specification".
Wireshark : https://www.wireshark.org/. Accessed 21 July 2023.
ローカル関数
function eCPRIConfig = eAxCIDConfigExpand(eCPRIConfig) % Expands the eCPRIConfig structure for all eAxC IDs % including all combinations of DUPortID, BandSectorID, CCID, and RUPortID % such that every unique eAxC ID has a corresponding structure. eAxCIDFields=fieldnames(eCPRIConfig); % Iterate through each subfield of the eAxC ID for fieldIndex=length(eAxCIDFields):-1:1 ids = eCPRIConfig.(eAxCIDFields{fieldIndex}); % Take IDs in each subfield eAxCIDSubField = num2cell(repmat(ids,length(eCPRIConfig),1)); % Create a cell for the subfield eCPRIConfig = repmat(eCPRIConfig,1,length(ids)); % Expand the array of structures [eCPRIConfig.(eAxCIDFields{fieldIndex})] = eAxCIDSubField{:}; % Assign subfield values across entire eCPRI structure end end