Compare commits

...

8 Commits

Author SHA1 Message Date
Andrea Lacava
e3161c1f4c
Fix delivery of indication message - merge pull request #11 from JaykobJ/ns-o-ran
xapp-sm-connector now sends entire indication message to the connected xApp. Previously only first Byte of the message was sent.

Thanks @JaykobJ
2023-12-01 11:32:54 -05:00
JaykobJ
54fee7c1d0
Update setup/xapp-sm-connector/src/agent_connector.cc
Co-authored-by: Andrea Lacava <thecave003@gmail.com>
2023-12-01 08:50:22 +02:00
Andrea Lacava
4f46bbf4b1
Merge pull request #8 from wineslab/e2term_crash
Remove of RIC_INTERFACE lines in ns-O-RAN copy
2023-11-30 19:37:18 -05:00
JaykobJ
b65e2a4a1f Fix delivery of indication message
xApp can now receive entire indication message.
2023-11-30 10:46:49 +00:00
Andrea Lacava
edf7fe9e8d Remove of RIC_INTERFACE lines that may be the cause of unexpected crash in e2term 2023-01-09 20:07:57 +01:00
Andrea Lacava
b2c654518e Update of Dockerfile to build ns-o-ran and to rebuild e2interface 2022-11-02 01:13:25 +01:00
Andrea Lacava
0849c7769a better launch of the x-app
add setup-e2term.sh
2022-11-02 00:39:52 +01:00
Thecave3
e58988f8b9 add ns-o-ran files
new file:   Dockerfile
	new file:   build-ns-o-ran.sh
	new file:   setup-scripts/import-wines-images.sh
	new file:   setup-scripts/setup-ric-bronze.sh
	new file:   setup-scripts/start-xapp-ns-o-ran.sh
	modified:   setup-scripts/start-xapp.sh
	modified:   setup/xapp-sm-connector/src/xapp.cc
	modified:   setup/xapp-sm-connector/src/xapp.hpp
2022-11-01 18:13:33 +01:00
13 changed files with 422 additions and 15 deletions

58
Dockerfile Normal file
View File

@ -0,0 +1,58 @@
#==================================================================================
# Copyright (c) 2022 Northeastern University
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#==================================================================================
FROM wineslab/o-ran-sc-bldr-ubuntu18-c-go:9-u18.04 as buildenv
ARG log_level_e2sim=2
# log_level_e2sim = 0 -> LOG_LEVEL_UNCOND 0
# log_level_e2sim = 1 -> LOG_LEVEL_ERROR 1
# log_level_e2sim = 2 -> LOG_LEVEL_INFO 2
# log_level_e2sim = 3 -> LOG_LEVEL_DEBUG 3
# Install E2sim
RUN mkdir -p /workspace
RUN apt-get update && apt-get install -y build-essential git cmake libsctp-dev autoconf automake libtool bison flex libboost-all-dev
WORKDIR /workspace
RUN git clone -b develop https://github.com/wineslab/ns-o-ran-e2-sim /workspace/e2sim
RUN mkdir /workspace/e2sim/e2sim/build
WORKDIR /workspace/e2sim/e2sim/build
RUN cmake .. -DDEV_PKG=1 -DLOG_LEVEL=${log_level_e2sim}
RUN make package
RUN echo "Going to install e2sim-dev"
RUN dpkg --install ./e2sim-dev_1.0.0_amd64.deb
RUN ldconfig
WORKDIR /workspace
# Install ns-3
RUN apt-get install -y g++ python3 qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools
RUN git clone -b release https://github.com/wineslab/ns-o-ran-ns3-mmwave /workspace/ns3-mmwave-oran
RUN git clone -b master https://github.com/o-ran-sc/sim-ns3-o-ran-e2 /workspace/ns3-mmwave-oran/contrib/oran-interface
WORKDIR /workspace/ns3-mmwave-oran
RUN ./waf configure --enable-tests --enable-examples
RUN ./waf build
WORKDIR /workspace
CMD [ "/bin/sh" ]

22
build-ns-o-ran.sh Executable file
View File

@ -0,0 +1,22 @@
#!/bin/sh
# Script to import the base images to create the RIC containers from Wineslab Docker Hub
# This shall execute first wineslab images and ns-o-ran after
# import-wines-images.sh
# setup-ric-bronze.sh
# Build image for ns-o-ran
$SUDO docker build -t ns-o-ran -f Dockerfile .
remove_container() {
$SUDO docker inspect $1 >/dev/null 2>&1
if [ $? -eq 0 ]; then
$SUDO docker kill $1
$SUDO docker rm $1
fi
}
remove_container ns-o-ran
$SUDO docker run -d -it --network=ric --name ns-o-ran ns-o-ran

View File

@ -0,0 +1,18 @@
#!/bin/sh
# Script to import the base images to create the RIC containers from Wineslab Docker Hub
# Pull Wines base images
docker pull wineslab/o-ran-sc-bldr-ubuntu18-c-go:9-u18.04
docker pull wineslab/o-ran-sc-bldr-alpine3-go:6-a3.11-rmr3
# Pull Wines RIC images
docker pull wineslab/colo-ran-e2term:bronze
docker pull wineslab/colo-ran-e2mgr:bronze
docker pull wineslab/colo-ran-e2rtmansim:bronze
docker pull wineslab/colo-ran-dbaas:bronze
# Tag images to be used with the setup-ric script
docker tag wineslab/colo-ran-e2term:bronze e2term:bronze
docker tag wineslab/colo-ran-e2mgr:bronze e2mgr:bronze
docker tag wineslab/colo-ran-e2rtmansim:bronze e2rtmansim:bronze
docker tag wineslab/colo-ran-dbaas:bronze dbaas:bronze

103
setup-scripts/setup-e2term.sh Executable file
View File

@ -0,0 +1,103 @@
#!/bin/sh
# Script to setup the E2 termination.
set -x
export SRC=`dirname $0`
. $SRC/setup-lib.sh
OURDIR=../setup
cd $OURDIR
tagvers=`git log --pretty=format:"%h" -n 1`
docker kill e2term
docker rm e2term
docker rmi e2term:bronze
# build e2term
$SUDO docker image inspect e2term:bronze >/dev/null 2>&1
if [ ! $? -eq 0 ]; then
cd e2/RIC-E2-TERMINATION
$SUDO docker image inspect e2term:$tagvers >/dev/null 2>&1
if [ ! $? -eq 0 ]; then
$SUDO docker build -f Dockerfile -t e2term:$tagvers .
fi
$SUDO docker tag e2term:$tagvers e2term:bronze
$SUDO docker rmi e2term:$tagvers
cd ../..
fi
# remove dangling images
docker rmi $(docker images --filter "dangling=true" -q --no-trunc) 2> /dev/null
# Create a route info file to tell the containers where to send various
# messages. This will be mounted on the containers
ROUTERFILE=`pwd`/router.txt
cat << EOF > $ROUTERFILE
newrt|start
rte|10020|$E2MGR_IP:3801
rte|10060|$E2TERM_IP:38000
rte|10061|$E2MGR_IP:3801
rte|10062|$E2MGR_IP:3801
rte|10070|$E2MGR_IP:3801
rte|10071|$E2MGR_IP:3801
rte|10080|$E2MGR_IP:3801
rte|10081|$E2TERM_IP:38000
rte|10082|$E2TERM_IP:38000
rte|10360|$E2TERM_IP:38000
rte|10361|$E2MGR_IP:3801
rte|10362|$E2MGR_IP:3801
rte|10370|$E2MGR_IP:3801
rte|10371|$E2TERM_IP:38000
rte|10372|$E2TERM_IP:38000
rte|1080|$E2MGR_IP:3801
rte|1090|$E2TERM_IP:38000
rte|1100|$E2MGR_IP:3801
rte|12010|$E2MGR_IP:38010
rte|1101|$E2TERM_IP:38000
rte|12002|$E2TERM_IP:38000
rte|12003|$E2TERM_IP:38000
rte|10091|$E2MGR_IP:4801
rte|10092|$E2MGR_IP:4801
rte|1101|$E2TERM_IP:38000
rte|1102|$E2MGR_IP:3801
rte|12001|$E2MGR_IP:3801
mse|12050|$(echo $XAPP_IP | cut -d "." -f 4)|$XAPP_IP:4560
newrt|end
EOF
remove_container() {
$SUDO docker inspect $1 >/dev/null 2>&1
if [ $? -eq 0 ]; then
$SUDO docker kill $1
$SUDO docker rm $1
fi
}
remove_container e2term
E2TERMCONFFILE=`pwd`/e2term_config.conf
if [ ! -e $E2TERMCONFFILE ]; then
cat <<EOF >$E2TERMCONFFILE
nano=38000
loglevel=debug
volume=log
#the key name of the environment holds the local ip address
#ip address of the E2T in the RMR
local-ip=$E2TERM_IP
#trace is start, stop
trace=start
external-fqdn=e2t.com
#put pointer to the key that point to pod name
pod_name=E2TERM_POD_NAME
sctp-port=$E2TERM_SCTP_PORT
EOF
fi
E2TERM_CONFIG_BIND="--mount type=bind,source=$E2TERMCONFFILE,destination=/opt/e2/config/config.conf,ro"
$SUDO docker run -d -it --network=ric --ip $E2TERM_IP --name e2term \
--mount type=bind,source=$ROUTERFILE,destination=/opt/e2/dockerRouter.txt,ro \
$E2TERM_CONFIG_BIND \
e2term:bronze
exit 0

180
setup-scripts/setup-ric-bronze.sh Executable file
View File

@ -0,0 +1,180 @@
#!/bin/sh
# Script to setup the RIC containers. Call as ./setup-ric.sh [network interface]
set -x
# get flags
for ARGUMENT in "$@"
do
KEY=$(echo $ARGUMENT | cut -f1 -d=)
case "$KEY" in
arena) arena=true;;
import) import=true;;
*)
esac
done
export SRC=`dirname $0`
. $SRC/setup-lib.sh
OURDIR=../setup
# import base RIC images
if [ "$import" = true ] || [ $(docker image ls -q | wc -l) -eq "0" ]; then
echo "Importing base Docker images"
cd $SRC
./import-wines-images.sh
fi
cd $OURDIR
tagvers=`git log --pretty=format:"%h" -n 1`
# build e2term
$SUDO docker image inspect e2term:bronze >/dev/null 2>&1
if [ ! $? -eq 0 ]; then
cd e2/RIC-E2-TERMINATION
$SUDO docker image inspect e2term:$tagvers >/dev/null 2>&1
if [ ! $? -eq 0 ]; then
$SUDO docker build -f Dockerfile -t e2term:$tagvers .
fi
$SUDO docker tag e2term:$tagvers e2term:bronze
$SUDO docker rmi e2term:$tagvers
cd ../..
fi
# build e2mgr
$SUDO docker image inspect e2mgr:bronze >/dev/null 2>&1
if [ ! $? -eq 0 ]; then
cd e2mgr/E2Manager
$SUDO docker image inspect e2mgr:$tagvers >/dev/null 2>&1
if [ ! $? -eq 0 ]; then
$SUDO docker build -f Dockerfile -t e2mgr:$tagvers .
fi
$SUDO docker tag e2mgr:$tagvers e2mgr:bronze
$SUDO docker rmi e2mgr:$tagvers
cd ../..
fi
# build e2rtmansim
$SUDO docker image inspect e2rtmansim:bronze >/dev/null 2>&1
if [ ! $? -eq 0 ]; then
cd e2mgr/tools/RoutingManagerSimulator
$SUDO docker image inspect e2rtmansim:$tagvers >/dev/null 2>&1
if [ ! $? -eq 0 ]; then
$SUDO docker build -f Dockerfile -t e2rtmansim:$tagvers .
fi
$SUDO docker tag e2rtmansim:$tagvers e2rtmansim:bronze
$SUDO docker rmi e2rtmansim:$tagvers
cd ../../..
fi
# build dbaas
$SUDO docker image inspect dbaas:bronze >/dev/null 2>&1
if [ ! $? -eq 0 ]; then
cd dbaas
$SUDO docker build -f docker/Dockerfile.redis -t dbaas:bronze .
cd ..
fi
# remove dangling images
docker rmi $(docker images --filter "dangling=true" -q --no-trunc) 2> /dev/null
# create a private network for near-real-time RIC
$SUDO docker network inspect ric >/dev/null 2>&1
if [ ! $? -eq 0 ]; then
$SUDO brctl addbr brric
$SUDO docker network create --subnet=$RIC_SUBNET -d bridge --attachable -o com.docker.network.bridge.name=brric ric
fi
# Create a route info file to tell the containers where to send various
# messages. This will be mounted on the containers
ROUTERFILE=`pwd`/router.txt
cat << EOF > $ROUTERFILE
newrt|start
rte|10020|$E2MGR_IP:3801
rte|10060|$E2TERM_IP:38000
rte|10061|$E2MGR_IP:3801
rte|10062|$E2MGR_IP:3801
rte|10070|$E2MGR_IP:3801
rte|10071|$E2MGR_IP:3801
rte|10080|$E2MGR_IP:3801
rte|10081|$E2TERM_IP:38000
rte|10082|$E2TERM_IP:38000
rte|10360|$E2TERM_IP:38000
rte|10361|$E2MGR_IP:3801
rte|10362|$E2MGR_IP:3801
rte|10370|$E2MGR_IP:3801
rte|10371|$E2TERM_IP:38000
rte|10372|$E2TERM_IP:38000
rte|1080|$E2MGR_IP:3801
rte|1090|$E2TERM_IP:38000
rte|1100|$E2MGR_IP:3801
rte|12010|$E2MGR_IP:38010
rte|1101|$E2TERM_IP:38000
rte|12002|$E2TERM_IP:38000
rte|12003|$E2TERM_IP:38000
rte|10091|$E2MGR_IP:4801
rte|10092|$E2MGR_IP:4801
rte|1101|$E2TERM_IP:38000
rte|1102|$E2MGR_IP:3801
rte|12001|$E2MGR_IP:3801
mse|12050|$(echo $XAPP_IP | cut -d "." -f 4)|$XAPP_IP:4560
newrt|end
EOF
remove_container() {
$SUDO docker inspect $1 >/dev/null 2>&1
if [ $? -eq 0 ]; then
$SUDO docker kill $1
$SUDO docker rm $1
fi
}
# create RIC various containers. Kill and remove them if they exist.
remove_container db
$SUDO docker run -d --network ric --ip $DBAAS_IP --name db dbaas:bronze
remove_container e2rtmansim
$SUDO docker run -d -it --network ric --ip $E2RTMANSIM_IP --name e2rtmansim e2rtmansim:bronze
remove_container e2mgr
$SUDO docker run -d -it --network ric --ip $E2MGR_IP -e RIC_ID=7b0000-000000/18 \
-e DBAAS_PORT_6379_TCP_ADDR=$DBAAS_IP -e DBAAS_PORT_6379_TCP_PORT="6379" \
-e DBAAS_SERVICE_HOST=$DBAAS_IP -e DBAAS_SERCE_PORT="6379" \
--mount type=bind,source=$ROUTERFILE,destination=/opt/E2Manager/router.txt,ro \
--name e2mgr e2mgr:bronze
remove_container e2term
E2TERMCONFFILE=`pwd`/e2term_config.conf
if [ ! -e $E2TERMCONFFILE ]; then
cat <<EOF >$E2TERMCONFFILE
nano=38000
loglevel=debug
volume=log
#the key name of the environment holds the local ip address
#ip address of the E2T in the RMR
local-ip=$E2TERM_IP
#trace is start, stop
trace=start
external-fqdn=e2t.com
#put pointer to the key that point to pod name
pod_name=E2TERM_POD_NAME
sctp-port=$E2TERM_SCTP_PORT
EOF
fi
E2TERM_CONFIG_BIND="--mount type=bind,source=$E2TERMCONFFILE,destination=/opt/e2/config/config.conf,ro"
if [ "$arena" = true ]; then
echo 'Starting local setup'
# if both RIC and DU are executed on the same machine, do not set Docker NAT rules
$SUDO docker run -d -it --network=ric --ip $E2TERM_IP --name e2term \
--mount type=bind,source=$ROUTERFILE,destination=/opt/e2/dockerRouter.txt,ro \
$E2TERM_CONFIG_BIND \
e2term:bronze
else
$SUDO docker run -d -it --network=ric --ip $E2TERM_IP --name e2term -p ${RIC_IP}:${E2TERM_SCTP_PORT}:${E2TERM_SCTP_PORT}/sctp\
--mount type=bind,source=$ROUTERFILE,destination=/opt/e2/dockerRouter.txt,ro \
$E2TERM_CONFIG_BIND e2term:bronze
fi
exit 0

View File

@ -0,0 +1,7 @@
#!/bin/bash
docker kill sample-xapp-24
docker rm sample-xapp-24
docker rmi sample-xapp:latest
./setup-sample-xapp.sh ns-o-ran
docker exec -it sample-xapp-24 bash

View File

@ -1,2 +1,2 @@
#!/bin/bash #!/bin/bash
./setup-sample-xapp.sh gnb:311-048-01000501 ./setup-sample-xapp.sh gnb:131-133-31000000

View File

@ -20,7 +20,7 @@
# This source code is part of the near-RT RIC (RAN Intelligent Controller) # This source code is part of the near-RT RIC (RAN Intelligent Controller)
# platform project (RICP). # platform project (RICP).
# #
FROM nexus3.o-ran-sc.org:10004/o-ran-sc/bldr-ubuntu18-c-go:9-u18.04 as ubuntu FROM wineslab/o-ran-sc-bldr-ubuntu18-c-go:9-u18.04 as ubuntu
WORKDIR /opt/e2/ WORKDIR /opt/e2/

View File

@ -104,7 +104,7 @@ std::string find_agent_ip_from_gnb(unsigned char* gnb_id_trans) {
// send through socket // send through socket
int send_socket(char* buf, std::string dest_ip) { int send_socket(char* buf, size_t payload_size, std::string dest_ip) {
int control_sckfd = -1; int control_sckfd = -1;
@ -126,8 +126,7 @@ int send_socket(char* buf, std::string dest_ip) {
// const size_t max_size = 512; // const size_t max_size = 512;
// char buf[max_size] = "Hello, Server!"; // store the data in a buffer // char buf[max_size] = "Hello, Server!"; // store the data in a buffer
size_t data_size = strlen(buf); int sent_size = send(control_sckfd, buf, payload_size, 0);
int sent_size = send(control_sckfd ,buf, data_size, 0);
if(sent_size < 0) { // the send returns a size of -1 in case of errors if(sent_size < 0) { // the send returns a size of -1 in case of errors
std::cout << "ERROR: SEND to agent " << dest_ip << std::endl; std::cout << "ERROR: SEND to agent " << dest_ip << std::endl;

View File

@ -27,6 +27,6 @@ extern std::map<std::string, std::string> agentIp_gnbId;
int open_control_socket_agent(const char* dest_ip, const int dest_port); int open_control_socket_agent(const char* dest_ip, const int dest_port);
void close_control_socket_agent(void); void close_control_socket_agent(void);
std::string find_agent_ip_from_gnb(unsigned char* gnb_id); std::string find_agent_ip_from_gnb(unsigned char* gnb_id);
int send_socket(char* buf, std::string dest_ip); int send_socket(char* buf, size_t payload_size, std::string dest_ip);
#endif #endif

View File

@ -271,7 +271,7 @@ uint8_t procRicIndication(E2AP_PDU_t *e2apMsg, transaction_identifier gnb_id)
} }
case 26: // RIC indication message case 26: // RIC indication message
{ {
int payload_size = ricIndication->protocolIEs.list.array[idx]-> \ size_t payload_size = ricIndication->protocolIEs.list.array[idx]-> \
value.choice.RICindicationMessage.size; value.choice.RICindicationMessage.size;
@ -283,7 +283,7 @@ uint8_t procRicIndication(E2AP_PDU_t *e2apMsg, transaction_identifier gnb_id)
// send payload to agent // send payload to agent
std::string agent_ip = find_agent_ip_from_gnb(gnb_id); std::string agent_ip = find_agent_ip_from_gnb(gnb_id);
send_socket(payload, agent_ip); send_socket(payload, payload_size, agent_ip);
break; break;
} }

View File

@ -93,8 +93,27 @@ void Xapp::startup(SubscriptionHandler &sub_ref) {
// get list of gnbs from ric // get list of gnbs from ric
std::cout << "Getting gNB list from RIC" << std::endl; std::cout << "Getting gNB list from RIC" << std::endl;
set_rnib_gnblist(); set_rnib_gnblist();
} } else if (strcmp(GNB_ID, "file") == 0) {
else { // Get gNB list from file
std::cout << "Getting gNB list from file" << std::endl;
std::ifstream id_file("gnb_list.txt", ios_base::in);
if(!id_file) {
std::cerr << "Error in opening file, gonna crash!" << std::endl;
exit(-1);
}
std::string id_gnb;
while(getline(id_file,id_gnb)){
std::cout << "gNB read: " << id_gnb << std::endl;
rnib_gnblist.push_back(id_gnb);
}
} else if (strcmp(GNB_ID, "ns-o-ran") == 0) {
std::vector <std::string> gnb_ids{"gnb:131-133-31000000", "gnb:131-133-32000000", "gnb:131-133-33000000",
"gnb:131-133-34000000", "gnb:131-133-35000000"};
for (vector<string>::iterator it = gnb_ids.begin(); it != gnb_ids.end(); it++) {
std::cout << "gNB read: " << *it << std::endl;
rnib_gnblist.push_back(*it);
}
} else {
// only insert target gnb // only insert target gnb
std::cout << "Querying target gNB" << std::endl; std::cout << "Querying target gNB" << std::endl;
rnib_gnblist.push_back(GNB_ID); rnib_gnblist.push_back(GNB_ID);
@ -270,7 +289,7 @@ void Xapp::handle_external_control_message(int port) {
while (true) { while (true) {
auto addrlen = sizeof(sockaddr); auto addrlen = sizeof(sockaddr);
int connection = accept(sockfd, (struct sockaddr*)&sockaddr, (socklen_t*)&addrlen); int connection = accept(sockfd, (struct sockaddr*)&sockaddr, (socklen_t*)&addrlen);
if (connection < 0) { if (connection < 0) {
continue; continue;
} }
@ -279,7 +298,7 @@ void Xapp::handle_external_control_message(int port) {
const size_t max_size = 256; const size_t max_size = 256;
char buffer[max_size] = {0}; char buffer[max_size] = {0};
auto bytes_read = read(connection, buffer, 100); auto bytes_read = read(connection, buffer, 100);
if (bytes_read > 0) { if (bytes_read > 0) {
std::cout << "External control socket. Message received: " << buffer << std::endl; std::cout << "External control socket. Message received: " << buffer << std::endl;
@ -326,7 +345,7 @@ void Xapp::terminate_du_reporting(void) {
} }
void Xapp::send_ric_control_request(char* payload, std::string gnb_id) { void Xapp::send_ric_control_request(char* payload, std::string gnb_id) {
std::cout << "Sending RIC Control Request" << std::endl; std::cout << "Sending RIC Control Request" << std::endl;
bool res; bool res;
@ -436,7 +455,7 @@ void Xapp::startup_subscribe_requests(void ){
//Random Data for request //Random Data for request
int request_id = XAPP_REQ_ID; int request_id = XAPP_REQ_ID;
int function_id = 0; int function_id = 200;
// DU report timer in ms // DU report timer in ms
std::string event_def = "250"; std::string event_def = "250";
@ -533,7 +552,7 @@ void Xapp::set_rnib_gnblist(void) {
std::string name = gnbobj["inventory_name"].GetString(); std::string name = gnbobj["inventory_name"].GetString();
rnib_gnblist.push_back(name); rnib_gnblist.push_back(name);
} }
closeSdl(); closeSdl();
return; return;
} }

View File

@ -28,6 +28,7 @@
#define SRC_XAPP_HPP_ #define SRC_XAPP_HPP_
#include <iostream> #include <iostream>
#include <fstream>
#include <string> #include <string>
#include <memory> #include <memory>
#include <csignal> #include <csignal>