blob: 5dfd1e8803f0a29d1d51fa112ef547da90e7e91c [file] [log] [blame]
#!/bin/bash
#Copyright 2018-present Open Networking Foundation
#
#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.
### BEGIN INIT INFO
# Provides: start_inband_oltservices.sh
# Required-Start: $all
# Required-Stop: $network $local_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Sets up inband management channel and starts device management and Openolt services
# Description:
# This script does the following things
# 1) Extracts bal package and keep the files in appropriate paths.
# 2) Starts svk_init which installs required drivers needed by the MAC devices
# 3) Starts device management daemon which initializes all maple, qumran chip sets
# and brings up access terminal.
# 4) Sets up inband management channel
# 5) Creates inband vlan tagged interface which will be used to communicate to
# Openolt service from vOLTHA via NNI
# 6) Sets up dhcp-client-identifier in "/etc/dhcp/dhclient.conf" for each inband
# tagged interface so that it can obtain IP address from DHCP server
# 7) Sets up DHCP IP configuration in "/etc/network/interfaces" for inband tagged
# interface so that it can initiate DHCPREQUEST to DHCP server once network
# restart triggered.
# 8) Starts openolt service which enables all PON and NNI interfaces and creates
# respective PON and NNI schedulers and Queues.
### END INIT INFO
#------------------------------------------------------------------------------
# GLOBAL VARIABLES
#------------------------------------------------------------------------------
# Root path where required bal directories are located
BRCM_OPT_DIR='/opt/bcm68620'
BRCM_DIR='/broadcom'
# olt service files
SVK_INIT_FILE="${BRCM_OPT_DIR}/svk_init.sh"
# vlan config file
VLAN_CONFIG_FILE="${BRCM_DIR}/vlan.config"
DHCLIENT_CONF="/etc/dhcp/dhclient.conf"
# olt serial number
SERIAL_NUMBER="/sys/devices/virtual/dmi/id/product_serial"
OLT_MODEL=$(cat /sys/devices/virtual/dmi/id/board_name)
NETWORK_INTERFACE="/etc/network/interfaces"
BAL_OPENOLT_DEB_16="/openolt_asfvolt16.deb"
BAL_OPENOLT_DEB_64="/openolt_asgvolt64.deb"
DEV_MGMT_DAEMON="dev_mgmt_daemon -d -pcie"
OPENOLT="openolt"
ASFVOLT16="asfvolt16"
ASGVOLT64="asgvolt64"
ASF16_MODEL="ASXvOLT16"
# vlan id for asfvolt16
ASFVOLT16_VLAN_ID_ETH2=
# vlan id for asgvolt64
ASGVOLT64_VLAN_ID_ETH1=
# File used to set/get argument to openolt service
OPENOLT_ARG_INPUT_FILE=/etc/default/openolt
# Wait time for BAL to get ready
WAIT_TIME_BAL_READY=120
#------------------------------------------------------------------------------
# Function Name: does_logger_exist
# Description:
# This function check if logger exist and executable.
#
# Globals:
# None
#
# Arguments:
# None
#
# Returns:
# returns 0 if exist and executable else 1
#------------------------------------------------------------------------------
does_logger_exist() {
cmd=/usr/bin/logger
if [ -x ${cmd} ]; then
return 0
else
return 1
fi
}
#------------------------------------------------------------------------------
# Function Name: info_message
# Description:
# This function print the info message information to the console
#
# Globals:
# None
#
# Arguments:
# string message
#
# Returns:
# None
#------------------------------------------------------------------------------
info_message() {
echo "INFO: $1"
logger -p user.info "$1"
}
#------------------------------------------------------------------------------
# Function Name: error_message
# Description:
# This function print the error message information to the console
#
# Globals:
# None
#
# Arguments:
# string message
#
# Returns:
# returns 1
#------------------------------------------------------------------------------
error_message() {
echo "ERROR: $1"
logger -p user.err "$1"
return 1
}
#------------------------------------------------------------------------------
# Function Name: get_vlan_ids
# Description:
# This function facilitates to fetch vlan id from vlan configuration file
# located at /broadcom/vlan.config
#
# Globals:
# VLAN_CONFIG_FILE, ASFVOLT16_VLAN_ID_ETH2, ASFVOLT16_VLAN_ID_ETH3,
# ASGVOLT64_VLAN_ID_ETH1, ASGVOLT64_VLAN_ID_ETH2
#
# Arguments:
# None
#
# Returns:
# None
#------------------------------------------------------------------------------
get_vlan_ids() {
# Read vlan.config file to fetch vlan id information
if [ -f ${VLAN_CONFIG_FILE} ]; then
ASFVOLT16_VLAN_ID_ETH2=$(awk '/asfvolt16_vlan_id_eth2/{print $0}' ${VLAN_CONFIG_FILE} | awk -F "=" '{print $2}')
ASGVOLT64_VLAN_ID_ETH1=$(awk '/asgvolt64_vlan_id_eth1/{print $0}' ${VLAN_CONFIG_FILE} | awk -F "=" '{print $2}')
if [ -z ${ASFVOLT16_VLAN_ID_ETH2} ] || [ -z ${ASGVOLT64_VLAN_ID_ETH1} ]; then
error_message "ERROR: vlan ids not valid"
exit 1
fi
else
error_message "ERROR: ${VLAN_CONFIG_FILE} not found, using default value 4093"
fi
}
#------------------------------------------------------------------------------
# Function Name: setup_nw_configuration
# Description:
# This function read the "/broadcom/vlan.config" file to get VLAND IDs
# for the interface eth1 and eth2 based on the OLT model and update
# these VLAN ID to /etc/network/interfaces file for dhcp request.
# Globals:
# VLAN_CONFIG_FILE, ASFVOLT16_VLAN_ID_ETH2, ASGVOLT64_VLAN_ID_ETH1
#
# Arguments:
# None
#
# Returns:
# None
#------------------------------------------------------------------------------
setup_nw_configuration() {
# Dynamic vlan entry in /etc/network/interfaces file
# Should have only one entry in the file in case of multiple reboot
if [ "${OLT_MODEL}" = ${ASF16_MODEL} ]; then
set_dhcp_ip_configuration eth2 ${ASFVOLT16_VLAN_ID_ETH2}
else
set_dhcp_ip_configuration eth1 ${ASGVOLT64_VLAN_ID_ETH1}
fi
# Restart the networking services
/etc/init.d/networking restart
}
#------------------------------------------------------------------------------
# Function Name: set_dhcp_ip_configuration
# Description:
# This function facilitates setup_nw_configuration function and accepts interface
# vlan id as an argumnet to modify network interfaces file
#
# Globals:
# None
#
# Arguments:
# None
#
# Returns:
# None
#------------------------------------------------------------------------------
set_dhcp_ip_configuration() {
interface=$1
vlan_id=$2
grep -q "iface ${interface}.${vlan_id}" $NETWORK_INTERFACE
if [ $? -ne 0 ]; then
echo "auto ${interface}.${vlan_id}" >>${NETWORK_INTERFACE}
echo "iface ${interface}.${vlan_id} inet dhcp" >>${NETWORK_INTERFACE}
fi
}
#------------------------------------------------------------------------------
# Function Name: start_dev_mgmt_service
# Description:
# This function starts svk_init.sh script and device management service.
# Device management service initializes all maple, qumran chip sets and
# brings up access terminal.
#
# Globals:
# SVK_INIT_FILE, BRCM_DIR, DEV_MGMT_DAEMON
#
# Arguments:
# None
#
# Returns:
# None
#------------------------------------------------------------------------------
start_dev_mgmt_service() {
info_message "Starting device management service"
chmod +x ${SVK_INIT_FILE}
${SVK_INIT_FILE}
# starts the device_management deamon and openolt services
service dev_mgmt_daemon start
service dev_mgmt_daemon status
if [ $? -eq 0 ]; then
info_message "${DEV_MGMT_DAEMON} service is running"
setup_inband_mgmt_channel
else
error_message "${DEV_MGMT_DAEMON} is not running"
exit 1
fi
}
#------------------------------------------------------------------------------
# Function Name: setup_inband_mgmt_channel
# Description:
# This function sets up inband management channel.
#
# Globals:
# BRCM_DIR, ASFVOLT16_VLAN_ID_ETH2, ASGVOLT64_VLAN_ID_ETH1
#
# Arguments:
# None
#
# Returns:
# None
#------------------------------------------------------------------------------
setup_inband_mgmt_channel() {
local interface_type="inband"
# Extracting vlan ids from file
get_vlan_ids
cd ${BRCM_DIR}
if [ "${OLT_MODEL}" = ${ASF16_MODEL} ]; then
# Waiting till interface eth2 get initialized & RUNNING state
check_interface_is_up eth2 $interface_type
# wait for BAL to get ready
sleep $WAIT_TIME_BAL_READY
# enabling in-band communication through broadcom API on NIC interface id 14 for eth2 interface
echo "/Api/Set object=inband_mgmt_channel id=0 nni_intf={intf_type=nni intf_id=0} nic_intf_id=14 \
vlan_id=${ASFVOLT16_VLAN_ID_ETH2} action=none" | ./example_user_appl
if [ $? -ne 0 ]; then
error_message "Failed to enable in-band channel on NIC interface id 14 with vlan ${ASFVOLT16_VLAN_ID_ETH2}"
fi
else
# Waiting till interface eth1 get initialized & RUNNING state
check_interface_is_up eth1 $interface_type
# wait for BAL to get ready
sleep $WAIT_TIME_BAL_READY
# enabling in-band communication through broadcom API on NIC interface id 14 for eth1 interface
echo "/Api/Set object=inband_mgmt_channel id=0 nni_intf={intf_type=nni intf_id=0} nic_intf_id=14 \
vlan_id=${ASGVOLT64_VLAN_ID_ETH1} action=none" | ./example_user_appl
if [ $? -ne 0 ]; then
error_message "Failed to enable in-band channel on NIC interface id 14 with vlan ${ASGVOLT64_VLAN_ID_ETH1}"
fi
fi
}
#------------------------------------------------------------------------------
# Function Name: create_vlan_tagged_Iface
# Description:
# This function create the VLAN interfaces and brings them UP.
#
# Globals:
# ASFVOLT16_VLAN_ID_ETH2, ASGVOLT64_VLAN_ID_ETH1
#
# Arguments:
# None
#
# Returns:
# None
#------------------------------------------------------------------------------
create_vlan_tagged_Iface() {
if [ "${OLT_MODEL}" = ${ASF16_MODEL} ]; then
# Adding vlan to the interface eth2
ip link add link eth2 name eth2.${ASFVOLT16_VLAN_ID_ETH2} type vlan id ${ASFVOLT16_VLAN_ID_ETH2}
ifconfig eth2.${ASFVOLT16_VLAN_ID_ETH2} up
else
# Adding vlan to the interface eth1
ip link add link eth1 name eth1.${ASGVOLT64_VLAN_ID_ETH1} type vlan id ${ASGVOLT64_VLAN_ID_ETH1}
ifconfig eth1.${ASGVOLT64_VLAN_ID_ETH1} up
fi
info_message "Inband tagged interfaces created succesfully"
}
#------------------------------------------------------------------------------
# Function Name: setup_dhcpd_configuration
# Description:
# This function updates /etc/dhcp/dhclient.conf file for dhcp
# request for eth2.ASFVOLT16_VLAN_ID_ETH2, eth3.ASFVOLT16_VLAN_ID_ETH3,
# eth1.ASGVOLT64_VLAN_ID_ETH1 and eth2.ASGVOLT64_VLAN_ID_ETH2 interfaces
#
# Globals:
# ASFVOLT16_VLAN_ID_ETH2, ASFVOLT16_VLAN_ID_ETH3, ASGVOLT64_VLAN_ID_ETH1,
# ASGVOLT64_VLAN_ID_ETH2, DHCLIENT_CONF
#
# Arguments:
# None
#
# Returns:
# None
#------------------------------------------------------------------------------
setup_dhcpd_configuration() {
if [ -f ${DHCLIENT_CONF} ]; then
if [ -f ${SERIAL_NUMBER} ]; then
serial_num=$(cat ${SERIAL_NUMBER})
if [ "${OLT_MODEL}" = ${ASF16_MODEL} ]; then
# dhcient.conf file should have only one entry for eth2.<ASFVOLT16_VLAN_ID_ETH2> interface
set_dhclient_configuration eth2 ${ASFVOLT16_VLAN_ID_ETH2}
else
# dhcient.conf file should have only one entry for eth1.<ASGVOLT64_VLAN_ID_ETH1> interface
set_dhclient_configuration eth1 ${ASGVOLT64_VLAN_ID_ETH1}
fi
else
error_message "ERROR: serial number of olt not found"
fi
else
error_message "ERROR: DHCP config file not found"
fi
}
#------------------------------------------------------------------------------
# Function Name: set_dhclient_configuration
# Description:
# This function updates dhclient conf file with in-band interfaces.
#
# Globals:
# None
#
# Arguments:
# None
#
# Returns:
# None
#------------------------------------------------------------------------------
set_dhclient_configuration() {
interface=$1
vlan_id=$2
grep -q "interface \"${interface}.${vlan_id}\"" $DHCLIENT_CONF
if [ $? -ne 0 ]; then
echo "interface \"${interface}.${vlan_id}\" {" >>$DHCLIENT_CONF
echo " send dhcp-client-identifier \"${serial_num}.${vlan_id}\";" >>$DHCLIENT_CONF
echo "}" >>$DHCLIENT_CONF
fi
}
#------------------------------------------------------------------------------
# Function Name: check_interface_is_up
# Description:
# This function checks if provided inband interface is up and running
#
# Globals:
# None
#
# Arguments:
# None
#
# Returns:
# None
#------------------------------------------------------------------------------
check_interface_is_up()
{
interface=$1
interface_type=$2
count=0
while true; do
if [ $interface_type = "inband" ]; then
ifconfig ${interface} | grep 'RUNNING' &>/dev/null
if [ $? -eq 0 ]; then
info_message "${interface} is up and running"
break
fi
elif [ $interface_type = "inband-tagged" ]; then
while true; do
ifconfig ${interface} | grep 'RUNNING' &>/dev/null
if [ $? -eq 0 ]; then
ip=$(ifconfig $interface | grep "inet addr" | cut -d ':' -f 2 | cut -d ' ' -f 1)
if [ ! -z "$ip" ]; then
info_message "${interface} is up and running with valid IP address"
return 0
else
info_message "Inband interface ${interface} is not up, continuously retrying for DHCP IP assignment"
info_message "Inband interface ${interface} is not up with valid IP hence not starting openolt service"
sleep 10
continue
fi
fi
done
fi
done
}
#------------------------------------------------------------------------------
# Function Name: stop_olt_services
# Description:
# This function informs about inband interface error status and stops device management service.
#
# Globals:
# None
#
# Arguments:
# None
#
# Returns:
# None
#------------------------------------------------------------------------------
stop_olt_services()
{
error_message "Inband tagged interface $1 is not up with valid IP address"
info_message "Not starting openolt service and stopping device menagement service"
service dev_mgmt_daemon stop
exit 1
}
#------------------------------------------------------------------------------
# Function Name: start_openolt_service
# Description:
# This function checks whether inband interfaces are up with IP address, then
# appends inband interface name to a file which later will be used by openolt
# service as command line option then starts openolt service.
# Openolt service enables all PON and NNI interfaces and creates respective PON
# and NNI schedulers and Queues.
#
# Globals:
# None
#
# Arguments:
# None
#
# Returns:
# None
#------------------------------------------------------------------------------
start_openolt_service()
{
info_message "Starting openolt service"
local interface_type="inband-tagged"
if [ "${OLT_MODEL}" = ${ASF16_MODEL} ]; then
check_interface_is_up eth2.${ASFVOLT16_VLAN_ID_ETH2} $interface_type
if [ $? -ne 0 ]; then stop_olt_services eth2.${ASFVOLT16_VLAN_ID_ETH2}; fi
openolt_grpc_interface=eth2.${ASFVOLT16_VLAN_ID_ETH2}
else
check_interface_is_up eth1.${ASGVOLT64_VLAN_ID_ETH1} $interface_type
if [ $? -ne 0 ]; then stop_olt_services eth1.${ASGVOLT64_VLAN_ID_ETH1}; fi
openolt_grpc_interface=eth1.${ASGVOLT64_VLAN_ID_ETH1}
fi
# Inband interface name appended to this file. Interface name will be
# used as command line argument by openolt service while running the binary.
if [ -f "$OPENOLT_ARG_INPUT_FILE" ]; then
info_message "$OPENOLT_ARG_INPUT_FILE exist"
echo "gRPC_interface=$openolt_grpc_interface" > $OPENOLT_ARG_INPUT_FILE
else
info_message "$OPENOLT_ARG_INPUT_FILE does not exist, creating it"
touch $OPENOLT_ARG_INPUT_FILE
echo "gRPC_interface=$openolt_grpc_interface" > $OPENOLT_ARG_INPUT_FILE
fi
service openolt start
service openolt status
if [ $? -eq 0 ]; then
info_message "${OPENOLT} service is running"
else
error_message "${OPENOLT} is not running"
exit 1
fi
}
#------------------------------------------------------------------------------
# Function Name: start_olt_services
# Description:
# This function triggers services to create vlan interfaces, to run BAL services
# and to trigger DHCP requets on eth2.VLAN_ID_1 and eth3.VLAN_ID_2 interfaces.
#
# Globals:
# None
#
# Arguments:
# None
#
# Returns:
# None
#------------------------------------------------------------------------------
start_olt_services() {
start_dev_mgmt_service
create_vlan_tagged_Iface
setup_dhcpd_configuration
setup_nw_configuration
start_openolt_service
}
#------------------------------------------------------------------------------
# Function Name: copy_config_files
# Description:
# This function copy config files to /broadcom directory
#
# Globals:
# BRCM_DIR
#
# Arguments:
# None
#
# Returns:
# None
#------------------------------------------------------------------------------
copy_config_files() {
info_message "copying config files to ${BRCM_DIR}"
# if [ "${OLT_MODEL}" != ${ASF16_MODEL} ]; then
# [ -f /qax.soc ] && cp "/qax.soc" "${BRCM_DIR}/"
# fi
# [ -f /config.bcm ] && cp "/config.bcm" "${BRCM_DIR}/"
[ -f /vlan.config ] && cp "/vlan.config" "${BRCM_DIR}/"
}
# Execution starts from here
does_logger_exist
if [ $? -eq 0 ]; then
if [ "${OLT_MODEL}" = ${ASF16_MODEL} ]; then
# check if debian package is already installed.
dpkg -l | grep ${ASFVOLT16}
if [ $? -ne 0 ]; then
# installs openolt debian package for asfvolt16 model
dpkg -i ${BAL_OPENOLT_DEB_16}
fi
else
dpkg -l | grep ${ASGVOLT64}
if [ $? -ne 0 ]; then
# installs openolt debian package for asgvolt64 model
dpkg -i ${BAL_OPENOLT_DEB_64}
fi
fi
copy_config_files
start_olt_services
else
error_message "logger does not exist"
exit 1
fi