Files
openairinterface5g/targets/PROJECTS/GENERIC-NR-5GC/CONF/run_antenna_muting_test.sh
T
2026-01-08 09:17:26 +00:00

247 lines
6.4 KiB
Bash
Executable File

#!/bin/bash
# O-RAN Antenna Muting Test Script
# Tests MIMO antenna muting with rfsimulator and Open5GS
set -e
OAI_DIR="/home/maki/openairinterface5g"
BUILD_DIR="$OAI_DIR/cmake_targets/ran_build/build"
CONF_DIR="$OAI_DIR/targets/PROJECTS/GENERIC-NR-5GC/CONF"
GNB_CONF="$CONF_DIR/gnb.sa.band78.2x2.rfsim.open5gs.conf"
UE_CONF="$CONF_DIR/ue.open5gs.conf"
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
print_status() {
echo -e "${GREEN}[INFO]${NC} $1"
}
print_warning() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
print_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
check_open5gs() {
print_status "Checking Open5GS services..."
for service in amf upf smf; do
if ! systemctl is-active --quiet open5gs-${service}d; then
print_error "Open5GS $service is not running"
print_status "Starting Open5GS services..."
sudo systemctl start open5gs-amfd open5gs-upfd open5gs-smfd open5gs-nrfd
sleep 2
fi
done
print_status "Open5GS services are running"
}
setup_network() {
print_status "Setting up network routing for UE..."
# Enable IP forwarding
sudo sysctl -w net.ipv4.ip_forward=1 > /dev/null
# Add NAT for UE traffic (if not already added)
if ! sudo iptables -t nat -C POSTROUTING -s 10.45.0.0/16 ! -o ogstun -j MASQUERADE 2>/dev/null; then
sudo iptables -t nat -A POSTROUTING -s 10.45.0.0/16 ! -o ogstun -j MASQUERADE
print_status "Added NAT rule for UE subnet"
fi
}
start_gnb() {
print_status "Starting gNB with 2x2 MIMO configuration..."
print_status "Antenna control server will be available on port 9999"
cd $BUILD_DIR
sudo ./nr-softmodem -O $GNB_CONF --sa --rfsim 2>&1 | tee /tmp/gnb.log &
GNB_PID=$!
print_status "gNB started with PID $GNB_PID"
echo $GNB_PID > /tmp/gnb.pid
# Wait for gNB to initialize
sleep 5
}
start_ue() {
print_status "Starting UE..."
cd $BUILD_DIR
sudo ./nr-uesoftmodem -r 106 --numerology 1 --band 78 -C 3319680000 \
--rfsim --sa -O $UE_CONF 2>&1 | tee /tmp/ue.log &
UE_PID=$!
print_status "UE started with PID $UE_PID"
echo $UE_PID > /tmp/ue.pid
# Wait for UE to attach
sleep 10
}
check_connection() {
print_status "Checking UE connection..."
# Check if oaitun_ue1 interface exists
if ip link show oaitun_ue1 &>/dev/null; then
print_status "UE TUN interface is up"
UE_IP=$(ip addr show oaitun_ue1 | grep 'inet ' | awk '{print $2}' | cut -d/ -f1)
print_status "UE IP: $UE_IP"
return 0
else
print_warning "UE TUN interface not found yet"
return 1
fi
}
run_iperf_test() {
print_status "Running iperf test..."
# Start iperf server on UPF side
iperf3 -s -B 10.45.0.1 -D &>/dev/null &
IPERF_SRV_PID=$!
sleep 1
# Run iperf client from UE
print_status "Testing downlink throughput..."
sudo ip netns exec ue_ns iperf3 -c 10.45.0.1 -t 5 -R 2>/dev/null || \
iperf3 -c 10.45.0.1 -t 5 -R 2>/dev/null || \
print_warning "iperf test failed or UE not fully connected"
kill $IPERF_SRV_PID 2>/dev/null || true
}
test_antenna_muting() {
print_status "Testing antenna muting via control interface..."
# Wait for control server to be ready
sleep 2
# Get initial status
print_status "Initial antenna status:"
echo "STATUS" | nc -w 2 localhost 9999 || print_warning "Control server not responding"
echo ""
print_status "Muting TX antenna 1..."
echo "MUTE TX 1" | nc -w 2 localhost 9999 || true
sleep 1
print_status "Current antenna status after muting:"
echo "STATUS" | nc -w 2 localhost 9999 || true
echo ""
print_status "Statistics:"
echo "STATS" | nc -w 2 localhost 9999 || true
echo ""
print_status "Restoring TX antenna 1..."
echo "UNMUTE TX 1" | nc -w 2 localhost 9999 || true
echo ""
print_status "Final antenna status:"
echo "STATUS" | nc -w 2 localhost 9999 || true
}
cleanup() {
print_status "Cleaning up..."
if [ -f /tmp/gnb.pid ]; then
sudo kill $(cat /tmp/gnb.pid) 2>/dev/null || true
rm /tmp/gnb.pid
fi
if [ -f /tmp/ue.pid ]; then
sudo kill $(cat /tmp/ue.pid) 2>/dev/null || true
rm /tmp/ue.pid
fi
# Kill any remaining processes
sudo pkill -f nr-softmodem 2>/dev/null || true
sudo pkill -f nr-uesoftmodem 2>/dev/null || true
print_status "Cleanup complete"
}
show_usage() {
echo "O-RAN Antenna Muting Test Script"
echo ""
echo "Usage: $0 [command]"
echo ""
echo "Commands:"
echo " all - Run full test (gNB + UE + iperf + antenna muting)"
echo " gnb - Start gNB only"
echo " ue - Start UE only (requires gNB running)"
echo " mute - Test antenna muting (requires gNB running)"
echo " iperf - Run iperf test (requires gNB + UE running)"
echo " status - Check antenna status"
echo " cleanup - Stop all processes"
echo ""
echo "Antenna Control Commands (via nc localhost 9999):"
echo " MUTE TX <id> - Mute TX antenna"
echo " UNMUTE TX <id> - Unmute TX antenna"
echo " SET TX MASK <hex> - Set TX antenna bitmask"
echo " STATUS - Get current status"
echo " STATS - Get statistics"
echo " HELP - Show all commands"
}
# Main
case "${1:-all}" in
all)
trap cleanup EXIT
check_open5gs
setup_network
start_gnb
start_ue
# Wait for connection
for i in {1..30}; do
if check_connection; then
break
fi
sleep 2
done
test_antenna_muting
run_iperf_test
print_status "Test complete. Press Ctrl+C to exit."
wait
;;
gnb)
check_open5gs
setup_network
start_gnb
print_status "gNB running. Press Ctrl+C to stop."
wait
;;
ue)
start_ue
print_status "UE running. Press Ctrl+C to stop."
wait
;;
mute)
test_antenna_muting
;;
iperf)
run_iperf_test
;;
status)
echo "STATUS" | nc -w 2 localhost 9999
;;
cleanup)
cleanup
;;
*)
show_usage
;;
esac