Implementation of the E3 Agent for dApps and E3AP (no service models)#204
Conversation
|
CI Build: #364 | Failed on the following stages: |
|
CI Build: #423 | Failed on the following stages: |
|
@Thecave3 Are you planning to put a document/tutorial on how to use the E3 agent with the dApps framework? Also, it will be nice if the document covers the definition and explanation of dApps |
|
Also, a CI testing scenario would be good, so we can make sure that the implementation is working consistently. |
a6cf213 to
6334cb8
Compare
Yes sure, I can add a README.md inside the E3AP folder if it helps. There is already a tutorial on deploying and using dApps with OAI at https://openrangym.com/tutorials/dapps-oai that covers the full setup, from installing the dApp library to running a spectrum-sharing example against the gNB. A more focused document specific to the E3 agent configuration (the
The plan is to add a CI stage that installs libe3 (from its repo) before invoking |
00b56a3 to
946600a
Compare
|
I left the TOC to be aligned with other .md files in the repo, but it's not rendered in github. |
|
CI Build: #432 | Failed on the following stages: |
|
Not sure if this is related with the PR Found unhandled hudson.remoting.ProxyException exception:
org.kohsuke.github.HttpException: {
"message": "Bad credentials",
"documentation_url": "https://docs.github.com/rest",
"status": "401"
}
PluginClassLoader for github-api//org.kohsuke.github.GitHubConnectorResponseErrorHandler$1.onError(GitHubConnectorResponseErrorHandler.java:88)
PluginClassLoader for github-api//org.kohsuke.github.GitHubClient.detectKnownErrors(GitHubClient.java:504)
PluginClassLoader for github-api//org.kohsuke.github.GitHubClient.sendRequest(GitHubClient.java:464)
PluginClassLoader for github-api//org.kohsuke.github.GitHubClient.sendRequest(GitHubClient.java:427)
PluginClassLoader for github-api//org.kohsuke.github.Requester.fetch(Requester.java:85)
PluginClassLoader for github-api//org.kohsuke.github.GHRepository.read(GHRepository.java:147)
PluginClassLoader for github-api//org.kohsuke.github.GHPerson.getRepository(GHPerson.java:162)
PluginClassLoader for pipeline-githubnotify-step//org.jenkinsci.plugins.pipeline.githubstatusnotification.GitHubStatusNotificationStep.getRepoIfValid(GitHubStatusNotificationStep.java:270)
PluginClassLoader for pipeline-githubnotify-step//org.jenkinsci.plugins.pipeline.githubstatusnotification.GitHubStatusNotificationStep.access$100(GitHubStatusNotificationStep.java:80)
PluginClassLoader for pipeline-githubnotify-step//org.jenkinsci.plugins.pipeline.githubstatusnotification.GitHubStatusNotificationStep$Execution.run(GitHubStatusNotificationStep.java:383)
PluginClassLoader for pipeline-githubnotify-step//org.jenkinsci.plugins.pipeline.githubstatusnotification.GitHubStatusNotificationStep$Execution.run(GitHubStatusNotificationStep.java:365)
PluginClassLoader for workflow-step-api//org.jenkinsci.plugins.workflow.steps.AbstractSynchronousNonBlockingStepExecution$1$1.call(AbstractSynchronousNonBlockingStepExecution.java:47)
hudson.security.ACL.impersonate2(ACL.java:446)
PluginClassLoader for workflow-step-api//org.jenkinsci.plugins.workflow.steps.AbstractSynchronousNonBlockingStepExecution$1.run(AbstractSynchronousNonBlockingStepExecution.java:44)
java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572)
java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
java.base/java.lang.Thread.run(Thread.java:1583) |
I don't think so, it was on notifying Github. The actual build was/is fine. you can ignore that |
Good, thanks. I left them in case people have links to Gitlab (which is now a mirror), so the TOC would show there. On Github, it automatically renders a TOC which you access by clicking on a button at the top right. |
|
CI Build: #475 | Failed on the following stages: |
|
CI Build: #504 | Failed on the following stages: |
rorsc
left a comment
There was a problem hiding this comment.
please make so that all commits compile, I think it's a small change and would be potentially useful if we need to verify stuff later, or for bisecting
Thanks for the documentation.
Yes, it is fine to do it in another PR. |
Introduce the E3_AGENT CMake option (default OFF) and the matching --build-e3 flag in build_oai so the E3 agent for O-RAN dApps can be compiled opt-in. Gate the E3AP subdirectory and the nr-softmodem linkage behind the option, and register an E3AP log component together with its legacy T-tracer message IDs. The E3 interface (nGRG) lets the gNB exchange real-time reports and controls with external dApps. Keeping it behind a build flag leaves the default CI build unchanged and avoids pulling in the external libe3 dependency unless the agent is explicitly requested. Signed-off-by: Andrea Lacava <thecave003@gmail.com>
Add the E3AP CMake target, which links the external libe3 library discovered via pkg-config, and the E3Configuration parser that reads the link and transport selection from the gNB configuration file and validates the supported link/transport combinations. libe3 is kept external and is only required when E3_AGENT is enabled. Signed-off-by: Andrea Lacava <thecave003@gmail.com>
Add the E3 agent lifecycle on top of libe3: configuration mapping, agent creation/init/start, dApp report and status-change handlers, and xApp control and subscription-query helpers. Wire e3_init() and e3_destroy() into nr-softmodem under the E3_AGENT guard. The agent registers no concrete service models: service models (such as spectrum sensing) live in their own modules and register themselves, keeping the framework decoupled from any specific use case. Signed-off-by: Andrea Lacava <thecave003@gmail.com>
Signed-off-by: Andrea Lacava <thecave003@gmail.com>
142a640 to
602d729
Compare
…ration_2026_w27 Implementation of the E3 Agent for dApps and E3AP (no service models) (#204) These changes introduce an E3 Agent for dApps in the OAI codebase. dApps are real-time microservices designed to operate within the O-RAN ecosystem, enabling sub-10 ms Artificial Intelligence (AI) routines in the Radio Access Network (RAN). The E3 Agent enables spectrum sensing, frequency-domain signal logging, and dynamic PRB (Physical Resource Block) policies through IPC/ZMQ communication with dApps or xApps. The dApps are designed for co-location with the CU/DU, where it can interact directly with user-plane data to enable different network management scenarios such as optimizing network slicing, scheduling, and resource management. A python library for the creation of the dApps is available here [1]. Additional information about dApps: - Paper on the dApp architecture [2] - dApp framework presentation [3] - Tutorial on dApp deployment on OAI [4] As agreed in the original MR [5], this PR includes only the agent lifecycle, configuration parsing, build plumbing, and the nr-softmodem init/destroy hook. It registers zero service models, so it builds and runs as an idle agent. Concrete service models (e.g. spectrum sensing) and the PHY/MAC hooks that drive them follow in later PRs. Opt-in and dependencies - Gated behind the E3_AGENT CMake option (OFF by default) / the --build-e3 build flag. The default build is unaffected — e3ap is only compiled and linked into nr-softmodem when E3_AGENT=ON. - When enabled, requires the external libe3 library [6] (vendor-neutral E3AP C++ lib), discovered via pkg_check_modules(CLIBE3 REQUIRED libe3). It is not vendored. Install libe3 (Debian/Ubuntu): git clone https://github.com/wineslab/libe3 && cd libe3 ./build_libe3 -I # installs deps: build-essential cmake pkg-config libzmq3-dev asn1c nlohmann-json3-dev libsctp-dev ... ./build_libe3 --install # release build + installation Build & test Tested in RFsim: the gNB initializes the E3 agent, opens its setup socket (/tmp/dapps/setup), registers zero service models, and runs without crashing. Configuration The agent reads an optional E3Configuration section from the gNB config file (parsed only when E3_AGENT=ON). If absent, it falls back to built-in defaults (posix/ipc). E3Configuration : { link = "zmq"; # posix | zmq transport = "ipc"; # tcp | sctp | ipc }; The same parameters can be overridden on the command line (no config-file edit required): sudo ./nr-softmodem -O <gnb.conf> ... --E3Configuration.link zmq --E3Configuration.transport ipc Validated link/transport combinations: (zmq,ipc) (zmq,tcp) (posix,tcp) (posix,sctp) (posix,ipc). Notes - I have added a new log component E3AP specific for the ops performed by the E3 Agent. - This PR ships no gNB config file; the E3Configuration block / CLI override above is the documented way to enable the agent. Example configs follow in the next PRs. [1] https://pypi.org/project/dapps/ [2] https://arxiv.org/pdf/2501.16502 [3] https://openrangym.com/o-ran-frameworks/dapps [4] https://openrangym.com/tutorials/dapps-oai [5] https://gitlab.eurecom.fr/oai/openairinterface5g/-/merge_requests/3361 [6] https://github.com/wineslab/libe3 Reviewed-by: Teodora Vladić <teodora.vladic@openairinterface.org> Reviewed-by: Sagar Arora <sagar.arora@openairinterface.org> Reviewed-by: Robert Schmidt <robert.schmidt@openairinterface.org>
|
CI Build: #627 | Failed on the following stages: |
0dab3bb
These changes introduce an E3 Agent for dApps in the OAI codebase. dApps are real-time microservices designed to operate within the O-RAN ecosystem, enabling sub-10 ms Artificial Intelligence (AI) routines in the Radio Access Network (RAN).
The E3 Agent enables spectrum sensing, frequency-domain signal logging, and dynamic PRB (Physical Resource Block) policies through IPC/ZMQ communication with dApps or xApps.
The dApps are designed for co-location with the CU/DU, where it can interact directly with user-plane data to enable different network management scenarios such as optimizing network slicing, scheduling, and resource management.
A python library for the creation of the dApps is available here.
Additional information about dApps:
As agreed in the original MR, this PR includes only the agent lifecycle, configuration parsing, build plumbing, and the
nr-softmodeminit/destroy hook.It registers zero service models, so it builds and runs as an idle agent. Concrete service models (e.g. spectrum sensing) and the PHY/MAC hooks that drive them follow in later PRs.
Opt-in and dependencies
Gated behind the
E3_AGENTCMake option (OFFby default) / the--build-e3build flag.The default build is unaffected —
e3apis only compiled and linked intonr-softmodemwhen
E3_AGENT=ON.When enabled, requires the external
libe3library (vendor-neutral E3AP C++ lib), discovered viapkg_check_modules(CLIBE3 REQUIRED libe3). It is not vendored.Install libe3 (Debian/Ubuntu):
Build & test
Tested in RFsim: the gNB initializes the E3 agent, opens its setup socket (
/tmp/dapps/setup),registers zero service models, and runs without crashing.
Configuration
The agent reads an optional
E3Configurationsection from the gNB config file (parsed only whenE3_AGENT=ON). If absent, it falls back to built-in defaults (posix/ipc).The same parameters can be overridden on the command line (no config-file edit required):
Validated link/transport combinations:
(zmq,ipc)(zmq,tcp)(posix,tcp)(posix,sctp)(posix,ipc).Notes
E3APspecific for the ops performed by the E3 Agent.E3Configurationblock / CLI override above is thedocumented way to enable the agent. Example configs follow in the next PRs.