ZeroMQでsrsRAN_Project 5G RANを構築

srsRAN_Projectソフトウェアスイートには、ZeroMQネットワークライブラリを使用してアプリケーション間で無線サンプルを転送する仮想無線が含まれています。そこで、5GCの機能を確認するために、実際のデバイスの代わりに仮想gNodeBを構築する簡単な手順について説明します。本記事では、Virtualbox VMでsrsRAN_Projectを構築する方法について説明します。

ZeroMQでsrsRAN_Project 5G RANを構築するには以下を参照してください。
- Installation Guide - https://docs.srsran.com/projects/project/en/latest/user_manuals/source/installation.html
- ZeroMQ-based Setup - https://docs.srsran.com/projects/project/en/latest/tutorials/source/srsUE/source/index.html#zeromq-based-setup
- Configuration Reference - https://docs.srsran.com/projects/project/en/latest/user_manuals/source/config_ref.html

動作確認したVMの仕様は以下の通りです。

| OS | CPU (Min) | Memory (Min) | HDD (Min) |
| --- | --- | --- | --- |
| Ubuntu 24.04 | 2 | 4GB | 10GB |

ビルドには4GB以上のメモリが必要です。また、実行には2つ以上のCPUコアが必要です。  
また、ZeroMQを使用して5G NR-UEで接続する場合、このRFシミュレートされたUEの構築および構成方法については、[こちら](https://github.com/s5uishida/build_srsran_4g_zmq_disable_rf_plugins)を参照して下さい。

## ZeroMQを含む必要なライブラリをインストール

```
apt install cmake make gcc g++ pkg-config libfftw3-dev libmbedtls-dev libsctp-dev libyaml-cpp-dev libgtest-dev libzmq3-dev
```

## Git clone srsRAN_Project

```
git clone https://github.com/srsran/srsRAN_Project.git
```

## Virtualbox VMにsrsRAN_Project 5G RANを構築

[こちら](https://github.com/srsran/srsRAN_Project/discussions/151#discussioncomment-6576652)によると、Virtualbox VMでビルドする場合、リアルタイムでの実行を気にしないのであれば、cmakeオプションに `-DAUTO_DETECT_ISA=OFF` を追加することができます。

```
cd srsRAN_Project
mkdir build
cd build
cmake ../ -DENABLE_EXPORT=ON -DENABLE_ZEROMQ=ON -DAUTO_DETECT_ISA=OFF
make -j`nproc`
```

## gNodeBの設定ファイルを作成

[ZeroMQ-based Setup](https://docs.srsran.com/projects/project/en/latest/tutorials/source/srsUE/source/index.html#zeromq-based-setup)の`gNB config`を雛型のファイルとして取得します。

```
cd srsRAN_Project/build/apps/gnb
wget <link of "gNB config">
```

参考までに、2024.04.23の`gnb_zmq.yaml`は以下の通りです。環境に応じて編集して下さい。

```yaml
# This configuration file example shows how to configure the srsRAN Project gNB to allow srsUE to connect to it. 
# This specific example uses ZMQ in place of a USRP for the RF-frontend, and creates an FDD cell with 10 MHz bandwidth. 
# To run the srsRAN Project gNB with this config, use the following command: 
#   sudo ./gnb -c gnb_zmq.yaml

amf:
  addr: 10.53.1.2                  # The address or hostname of the AMF.
  bind_addr: 10.53.1.1             # A local IP that the gNB binds to for traffic from the AMF.

ru_sdr:
  device_driver: zmq                # The RF driver name.
  device_args: tx_port=tcp://127.0.0.1:2000,rx_port=tcp://127.0.0.1:2001,base_srate=23.04e6 # Optionally pass arguments to the selected RF driver.
  srate: 23.04                      # RF sample rate might need to be adjusted according to selected bandwidth.
  tx_gain: 75                       # Transmit gain of the RF might need to adjusted to the given situation.
  rx_gain: 75                       # Receive gain of the RF might need to adjusted to the given situation.

cell_cfg:
  dl_arfcn: 368500                  # ARFCN of the downlink carrier (center frequency).
  band: 3                           # The NR band.
  channel_bandwidth_MHz: 20         # Bandwith in MHz. Number of PRBs will be automatically derived.
  common_scs: 15                    # Subcarrier spacing in kHz used for data.
  plmn: "00101"                     # PLMN broadcasted by the gNB.
  tac: 7                            # Tracking area code (needs to match the core configuration).
  pdcch:
    common:
      ss0_index: 0                  # Set search space zero index to match srsUE capabilities
      coreset0_index: 12            # Set search CORESET Zero index to match srsUE capabilities
    dedicated:
      ss2_type: common              # Search Space type, has to be set to common
      dci_format_0_1_and_1_1: false # Set correct DCI format (fallback)
  prach:
    prach_config_index: 1           # Sets PRACH config to match what is expected by srsUE

cu_cp:
  inactivity_timer: 7200            # Sets the UE/PDU Session/DRB inactivity timer to 7200 seconds. Supported: [1 - 7200].

log:
  filename: /tmp/gnb.log            # Path of the log file.
  all_level: info                   # Logging level applied to all layers.
  hex_max_size: 0

pcap:
  mac_enable: false                 # Set to true to enable MAC-layer PCAPs.
  mac_filename: /tmp/gnb_mac.pcap   # Path where the MAC PCAP is stored.
  ngap_enable: false                # Set to true to enable NGAP PCAPs.
  ngap_filename: /tmp/gnb_ngap.pcap # Path where the NGAP PCAP is stored.
```

## 問題点

最新の`main`ブランチが機能しない場合は、最新の`release`バージョンを試して下さい。

1. Virtualbox VM上の`gnb`が`NGSetup`を実行できない場合は、[こちら](https://github.com/srsran/srsRAN_Project/issues/172#issuecomment-1681908406) が解決に役立つ可能性があります。
2. [これ](https://github.com/srsran/srsRAN_4G/issues/1213)によると、ZeroMQ経由でsrsueとsrsgnbの間でダウンリンクパケットの流れが止まるという問題があります。修正プログラムは[こちら](https://github.com/srsran/srsRAN_4G/issues/1213#issuecomment-1703512937)にあります。
3. [これ](https://github.com/srsran/srsRAN_Project/issues/241#issuecomment-1756599022)によると、実行するには2つ以上のCPUコアが必要です。
4. [これ](https://github.com/srsran/srsRAN_Project/issues/263)によると、UE(`ue_zmq.conf`)はsrsRAN_Project 23.10のgNodeB経由でOpen5GSに接続できませんでしたが、[こちら](https://github.com/srsran/srsRAN_Project/issues/263#issuecomment-1773756230)で解決しました。

## 動作確認済みバージョン一覧

以下のバージョンの動作を簡単に確認しました。

| Version | Commit | Date | Issues |
| --- | --- | --- | -- |
| 24.04+ | `4ac5300d4927b5199af69e6bc2e55d061fc33652` | 2024.07.31 | 3 |
| 24.04+ | `c33cacba7d940e734ac7bad08935cbc35578fad9` | 2024.06.10 | 3 |
| 24.04+ | `78238fd15e4cd82a6324d6dbbb612ac5584b13ea` | 2024.05.13 | 3 |
| 24.04 | `1483bda3091420cf7270eacdf31de932865c6294` | 2024.04.22 | 3 |
| 23.10.1+ | `2f90c8b60e9396a7aed59645c98dbcbccda2bf7c` | 2024.03.25 | 3 |
| 23.10.1 | `374200deefd8e1b96fab7328525fd593a808a641` | 2023.10.23 | 3 |
| 23.10 | `e38e418bda8432397b2fa7dc399cb7afde3c3b95` | 2023.10.20 | 3, 4 |
| 23.5+ | `5e6f50a202c6efa671d5b231d7c911dc6c3d86ed` | 2023.09.20 | 3 |
| 23.5+ | `1afd7240f2b5e2061ab4158e8fcdacb15961813a` | 2023.08.07 | 1, 2 |

## 5GC連携の設定例

- [Open5GS 5GC & srsRAN 5G with ZeroMQ UE / RAN Sample Configuration](https://github.com/s5uishida/open5gs_5gc_srsran_sample_config)
- [free5GC 5GC & srsRAN 5G with ZeroMQ UE / RAN Sample Configuration](https://github.com/s5uishida/free5gc_srsran_sample_config)

## 最後に

srsRAN_Projectは、SRSが開発したORANネイティブなCU/DUを特徴とする完全な5G RANソリューションです。ここでは、5Gコア機能を検証する際のRANとして使用するため、ZeroMQベースのRFドライバーでgNodeBとsrsUEを接続する構成を想定し、仮想環境で組む時のsrsRAN_Projectのビルド方法について説明しました。これにより、実機のgNodeBとUEが無くても、取り敢えず、5Gコアの機能を幾らか検証することができると思います。
また、srsRAN_ProjectのgNodeBのE2インターフェースを用いて、サードパーティーのRIC(RANインテリジェント・コントローラー)フレームワークのFlexRICと連携できるそうです。

最後に、元記事は[Github](https://github.com/s5uishida/build_srsran_5g_zmq)に書いたものです。

## 主な変更履歴

- [2024.09.12] 初版。