247 lines
6.4 KiB
Bash
Executable File
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
|
|
|