このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
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 で定義された NR テスト モデル波形を送信します。O-RAN に準拠したこれらのメッセージは、O-DU で生成された分割オプション 7.2x テスト ベクトルとみなされます。この例では、このメッセージを含む PCAP ファイルを生成します。生成されたパケットを使用すると、TS O-RAN.WG4.CONF の適合性テスト仕様に基づいて O-RAN 無線ユニット (O-RU) をテストできます。また、サードパーティのパケット解析ツールを使用し、生成された PCAP ファイルを解析できます。この例では、Wireshark を使用し、CU プレーン メッセージの内容が期待どおりであるかどうかを確認します。
この例では、指定された NR テスト モデル波形を送信するのに必要な CU プレーン メッセージを構築します。この例では、スロットごとの拡張アンテナ キャリア識別子 (eAxC ID) ごとに少なくとも 1 つの C プレーン メッセージを生成します。各 C プレーン メッセージは、イーサネット MTU サイズに応じて、シンボルごとに 1 つ以上の U プレーン メッセージに関連付けられます。C プレーン メッセージは、セクション タイプ 1 (ほとんどの信号の場合) またはセクション タイプ 3 (mixed numerology 信号の場合) として送信できます。U プレーン メッセージは、メッセージごとに 1 つのセクションを使用して IQ データをカプセル化します。次の図は、セクション タイプ 1 の C プレーン メッセージを使用して単一の eAxC ID に対して生成された CU プレーン メッセージの流れを示しています。
構成パラメーターの設定
送信データ フレームは、TS 38.141-1 で定義されているように、全帯域 5G NR テスト モデル波形で構成されます。テスト モデル、チャネル帯域幅、およびテスト波形のサブキャリア間隔を設定できます。この例では FDD デュプレックス モードのみをサポートし、プリコーディングまたはビームフォーミングは適用しません。
生成された PCAP ファイルには、イーサネット、eCPRI、および O-RAN のプロトコルが含まれます。このセクションでは、この 3 つのプロトコルで使用できるパラメーターを構成します。
O-RAN — 圧縮法、および圧縮前後の IQ サンプルのビット幅を設定します。
eCPRI — eAxC ID フィールドを設定します。複数のデータ ストリームを作成するには、ID のベクトルを使用して各 CU プレーン ストリームで波形を複製します。
Ethernet — イーサネット MTU、VLAN タグ、および送信元と送信先の MAC アドレスを設定します。
この例では、マネジメント プレーン (M プレーン) メッセージを生成しません。ただし、この例では、M プレーン パラメーターとして、圧縮モード、バイト順、eAxC ID のフィールドごとのビット数、C プレーン メッセージと U プレーン メッセージの間のタイミング アドバンス (Tcp_adv_dl
)、およびサポートされる numerology の最大値を設定できます。
% Select the NR test model waveform parameters waveConfig = struct(); waveConfig.tm = "NR-FR1-TM1.1"; % Test model (must be full band) waveConfig.bw = "100MHz"; % Channel bandwidth (MHz) waveConfig.scs = "30kHz"; % Subcarrier spacing (kHz) % O-RAN configuration % Set the compression parameters oranConfig = struct(); oranConfig.method = 'BFP'; % U-plane compression method oranConfig.IQWidth = 24; % IQ samples bit-width before or without compression oranConfig.cIQWidth =14; % Compressed IQ samples bit-width (1 to 16) oranConfig.SectionType = 1; % C-plane message Section Type % eCPRI configuration % Set the eAxC ID values to be used, in terms of the DU_Port_ID, BandSector_ID, CC_ID and RU_Port_ID subfields. % The same messages will be sent on all eAxC dataflows specified. % The eAxCIDBits field of the mPlaneConfig structure defines the bit-width of each ID part. % Specify multiple eAxC ID by using vectors of ID values. 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 % Expand any vectors of values in the four eAxC ID subfields % into combinations of individual values where each combination is a single eAxC ID. % Each eAxC ID is returned as a separate element of a structure array. eCPRIConfig = eAxCIDConfigExpand(eCPRIConfig); % Ethernet configuration ethernetConfig = struct(); % Set Ethernet MTU size ethernetConfig.MTU = 1500; % Select the Ethernet VLAN tag 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) % Select the MAC source and destination addresses 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) % Set the M-plane and general parameters 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.Tcp_adv_dl = 0.00012; % C-plane timing advance (secs) mPlaneConfig.MaxNumerology = -1; % Highest supported numerology for mixed numerology using section type 3 C-plane messages % Set the name and format of the PCAP/PCAPNG file 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] = generateWaveform(tmWaveGen); grid = gridSet.ResourceGridBWP; % Get the number of symbols per slot and the number of slots per subframe waveConfig.ModulationInfo = gridSet.Info;
U プレーン データの圧縮
次に、関数nrORANBlockCompress
を使用して、生成されたリソースを圧縮します。圧縮法として、ブロック浮動小数点数 (BFP)、ブロック スケーリング、および μ 則を使用できます。これらは、TS O-RAN.WG4.CUS の Annex A.1.1、A.2.1、および A.3.1 でそれぞれ定義されています。圧縮を適用する前に、oranConfig.IQWidth
で指定されたビット幅に合わせてリソース グリッド内の IQ サンプルをスケーリングします。
% Scale the IQ samples in the resource grid using IQWidth peak = max(abs([real(grid(:)); imag(grid(:))])); scaleFactor = peak / (0.95*(2^(oranConfig.IQWidth-1)-1)); oranConfig.scaledGrid = round(grid/scaleFactor); % Apply compression to the scaled resource grid if selected if ~strcmp(oranConfig.method,'No compression') [oranConfig.cGrid,oranConfig.cParam] = nrORANBlockCompress(oranConfig.scaledGrid, ... oranConfig.method,oranConfig.cIQWidth,oranConfig.IQWidth); % Decompress the resulting grid, if required for comparison 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)); fprintf('Created %s file.',cufilename);
Created CUMessages.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