<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>FAPI Split on OCUDU India</title><link>https://docs.ocuduindia.org/docs/fapi-split/</link><description>Recent content in FAPI Split on OCUDU India</description><generator>Hugo</generator><language>en</language><atom:link href="https://docs.ocuduindia.org/docs/fapi-split/index.xml" rel="self" type="application/rss+xml"/><item><title>OCUDU RAN Disaggregated FAPI Split</title><link>https://docs.ocuduindia.org/docs/fapi-split/xfapi-bridge/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.ocuduindia.org/docs/fapi-split/xfapi-bridge/</guid><description>&lt;p&gt;Split the gNB into two processes - &lt;code&gt;odu_low&lt;/code&gt; (L1/PHY) and &lt;code&gt;odu_high&lt;/code&gt; (L2/MAC) - and connect them through an xFAPI translator-bridge over an xSM (DPDK shared-memory) transport. The split lets L1 and L2 run in different DPDK domains on the same host, or on different servers connected by a dedicated DPDK-Ethernet link.&lt;/p&gt;
&lt;figure class="doc-figure doc-figure--wide"&gt;
 &lt;img src="https://docs.ocuduindia.org/images/fapi-split/fapi_split_architecture.png"
 alt="OCUDU FAPI split architecture. odu_low (L1/PHY) on the left and odu_high (L2/MAC) on the right communicate through an xFAPI translator-bridge over an xSM DPDK shared-memory transport, with two slot pairs (pair 0 and pair 1) over the shared xsm_bridge memzone. The same architecture supports a single-host topology with all three processes co-located and a two-host topology where xFAPI-L1 and xFAPI-L2 are connected by a DPDK-Ethernet link."
 loading="lazy"&gt;
 &lt;figcaption&gt;FAPI split architecture. &lt;code&gt;odu_low&lt;/code&gt; creates the shared xSM memzone with two slot pairs; xFAPI attaches to both, and &lt;code&gt;odu_high&lt;/code&gt; attaches to pair 1. The two-host xFAPI split places L1 and L2 on different machines connected by a DPDK-Ethernet link between two xFAPI instances.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="highlights"&gt;Highlights&lt;a class="td-heading-self-link" href="#highlights" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Process-level FAPI split&lt;/strong&gt; - &lt;code&gt;odu_high&lt;/code&gt; (L2/MAC, F1, scheduler) and &lt;code&gt;odu_low&lt;/code&gt; (L1/PHY, OFH, radio) run as independent binaries; FAPI P5/P7 messages are serialised over an xSM ring buffer between them.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;xFAPI translator-bridge&lt;/strong&gt; - a separate process owns the FAPI translation and message dispatch, decoupling L1 and L2 DPDK domains and enabling cross-host deployments without code changes on either side.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Two supported topologies&lt;/strong&gt; - single-host (all three processes on one server, one shared &lt;code&gt;xsm_bridge&lt;/code&gt; memzone) and two-host xFAPI split (xFAPI-L1 and xFAPI-L2 connected over DPDK-Ethernet, each host has its own local memzone).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;xSM shared-memory transport&lt;/strong&gt; - DPDK-backed SPSC ring with hugepage memzones, pair-indexed slot allocation, and a precompiled &lt;code&gt;libxsm.so&lt;/code&gt; exposing a small C API.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Configuration-driven activation&lt;/strong&gt; - &lt;code&gt;fapi_split_l1&lt;/code&gt; (odu_low) and &lt;code&gt;fapi_split_l2&lt;/code&gt; (odu_high) YAML blocks control device names, pair indices, DPDK proc-type, and file-prefix. The same binary serves both monolithic and split deployments.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;FAPI stats recorder&lt;/strong&gt; - optional in-memory ring buffer captures every FAPI message (P5 + P7) with direction and PDU summary, dumped as JSON at shutdown for offline analysis.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="1-prerequisites"&gt;1. Prerequisites&lt;a class="td-heading-self-link" href="#1-prerequisites" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="11-hardware"&gt;1.1 Hardware&lt;a class="td-heading-self-link" href="#11-hardware" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;x86-64 host with DPDK-capable NIC for the OFH front-haul (single-host topology) or two such hosts connected by a dedicated 25G link (two-host topology).&lt;/li&gt;
&lt;li&gt;For the two-host topology, an additional DPDK-Ethernet-capable NIC (Intel XXV710 / E810 or equivalent) bound to &lt;code&gt;vfio-pci&lt;/code&gt; on each host.&lt;/li&gt;
&lt;li&gt;≥ &lt;strong&gt;2 GB of 1 GiB hugepages&lt;/strong&gt; on each host (xSM memzones use 1 GiB pages by default).&lt;/li&gt;
&lt;li&gt;The DPDK-Ethernet link NIC (two-host only) and the OFH NIC must be on the &lt;strong&gt;same NUMA node&lt;/strong&gt; as the upper-PHY / cell_rt worker cores.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="12-software"&gt;1.2 Software&lt;a class="td-heading-self-link" href="#12-software" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Component&lt;/th&gt;
 &lt;th&gt;Minimum version&lt;/th&gt;
 &lt;th&gt;Notes&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;DPDK&lt;/td&gt;
 &lt;td&gt;22.11&lt;/td&gt;
 &lt;td&gt;Tested with 25.11. Both xFAPI and OCUDU must build against the same DPDK ABI.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Linux kernel&lt;/td&gt;
 &lt;td&gt;5.15+&lt;/td&gt;
 &lt;td&gt;IOMMU enabled (&lt;code&gt;intel_iommu=on iommu=pt&lt;/code&gt;).&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;GCC / Clang&lt;/td&gt;
 &lt;td&gt;C++17 capable&lt;/td&gt;
 &lt;td&gt;Standard Ubuntu 22.04 toolchain.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;CMake&lt;/td&gt;
 &lt;td&gt;3.18+&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;xFAPI source tree&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;coranlabs/xfapi&lt;/code&gt;, branch &lt;code&gt;main&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Provides &lt;code&gt;libxsm.so&lt;/code&gt; and &lt;code&gt;xsm/xsm.h&lt;/code&gt; that OCUDU links against.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;OCUDU build flags&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;ENABLE_DPDK=True&lt;/code&gt;, &lt;code&gt;ENABLE_XSM_FAPI_SPLIT=ON&lt;/code&gt; (default ON)&lt;/td&gt;
 &lt;td&gt;See Section 5.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="13-kernel-and-hugepage-setup"&gt;1.3 Kernel and hugepage setup&lt;a class="td-heading-self-link" href="#13-kernel-and-hugepage-setup" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Kernel boot parameters (then update-grub + reboot):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;intel_iommu&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;on &lt;span class="nv"&gt;iommu&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;pt &lt;span class="nv"&gt;default_hugepagesz&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1G &lt;span class="nv"&gt;hugepagesz&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1G &lt;span class="nv"&gt;hugepages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Mount hugetlbfs if not done by distro:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mkdir -p /mnt/huge
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mount -t hugetlbfs -o &lt;span class="nv"&gt;pagesize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1G none /mnt/huge
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Confirm 1 GiB pages are available:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grep Huge /proc/meminfo
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Load VFIO modules (needed for any DPDK-bound NIC):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo modprobe vfio-pci
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For the two-host topology, also bind the inter-host link NIC to &lt;code&gt;vfio-pci&lt;/code&gt;:&lt;/p&gt;</description></item></channel></rss>