Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

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 プレーン メッセージの内容が期待どおりであるかどうかを確認します。

workflow5.png

この例では、指定された NR テスト モデル波形を送信するのに必要な CU プレーン メッセージを構築します。この例では、スロットごとの拡張アンテナ キャリア識別子 (eAxC ID) ごとに少なくとも 1 つの C プレーン メッセージを生成します。各 C プレーン メッセージは、イーサネット MTU サイズに応じて、シンボルごとに 1 つ以上の U プレーン メッセージに関連付けられます。C プレーン メッセージは、セクション タイプ 1 (ほとんどの信号の場合) またはセクション タイプ 3 (mixed numerology 信号の場合) として送信できます。U プレーン メッセージは、メッセージごとに 1 つのセクションを使用して IQ データをカプセル化します。次の図は、セクション タイプ 1 の C プレーン メッセージを使用して単一の eAxC ID に対して生成された CU プレーン メッセージの流れを示しています。

GenerateCUPlaneMessagesForORANFronthaulTestPacketGeneration.png

構成パラメーターの設定

送信データ フレームは、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 プレーン メッセージ

参考文献

  1. 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.

  2. TS O-RAN.WG4.CUS. "O-RAN Fronthaul Working Group - Control, User and Synchronization Plane Specification".

  3. TS O-RAN.WG4.CONF. "O-RAN Fronthaul Working Group - Conformance Test Specification".

  4. 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

参考

関数