#!/usr/bin/env bash

#set -xeo pipefail

# Useful constants
COLOR_RED="\033[0;31m"
COLOR_GREEN="\033[0;32m"
COLOR_OFF="\033[0m"

OVS_BRIDGE0=${OVS_BRIDGE1:-"ovsbr0"}
OVS_BRIDGE0_PORTS=${OVS_BRIDGE0_PORTS:-"p0 pf0vf0 pf0sf0 pf0vf1"}
OVS_BRIDGE1=${OVS_BRIDGE2:-"ovsbr1"}
OVS_BRIDGE1_PORTS=${OVS_BRIDGE1_PORTS:-"p1 pf1vf0"}
GRPC_IP_MASK=169.254.33.51/24

usage()
{
cat 1>&2 <<EOF
Usage ${0##*/} [-h|?]
    -p NUM_HUGEPAGE: Number of 2MB hugepages, default 2048
    -g GRPC_PORT:    GRPC port name, default pf0vf1
    -h|?             Show this help message
EOF
}

while getopts ":h:p:g:" arg; do
	case $arg in
		p)
			NUM_HUGEPAGE="${OPTARG}"
			;;
		g)
			GRPC_PORT="${OPTARG}"
			;;
		h | *) # Display help.
			usage
			exit 0
			;;
	esac
done

if [ -z "${NUM_HUGEPAGE-}" ] ; then
	echo -e "${COLOR_RED}[ INFO ] No num of hugepages specified, use 2048 ${COLOR_OFF}"
	NUM_HUGEPAGE=2048
fi

if [ -z "${GRPC_PORT-}" ] ; then
	echo -e "${COLOR_RED}[ INFO ] No gRPC port specified, use p0m0${COLOR_OFF}"
	GRPC_PORT=p0m0
fi

pre_check()
{
	for port in $OVS_BRIDGE0_PORTS $OVS_BRIDGE1_PORTS $GRPC_PORT
	do
		if [ ! -d /sys/class/net/$port ]; then
			echo -e "${COLOR_RED}$port is missing ${COLOR_OFF}"
			echo -e "${COLOR_RED}2 VFs on PF0, 1VF on PF1 are needed on x86 ${COLOR_OFF}"
			exit 1
		fi
	done
}

configure_ovs_fallback()
{
	for bri in $(ovs-vsctl list-br)
	do
		ovs-vsctl --if-exist del-br $bri
	done

	ovs-vsctl --may-exist add-br $OVS_BRIDGE0
	for port in $OVS_BRIDGE0_PORTS
	do
		ovs-vsctl add-port $OVS_BRIDGE0 $port
	done

	ovs-vsctl --may-exist add-br $OVS_BRIDGE1
	for port in $OVS_BRIDGE1_PORTS
	do
		ovs-vsctl add-port $OVS_BRIDGE1 $port
	done
	echo -e "${COLOR_GREEN}Configure ovs fallback ${COLOR_OFF}"
}

configure_grpc_interface()
{
	ip addr flush dev $GRPC_PORT
	ip addr add dev $GRPC_PORT $GRPC_IP_MASK
	echo -e "${COLOR_GREEN}Configure grpc for $GRPC_PORT ${COLOR_OFF}"
}

reserve_hugepages()
{
	mkdir -p /dev/hugepages
	mountpoint -q /dev/hugepages || mount -t hugetlbfs nodev /dev/hugepages
	echo $NUM_HUGEPAGE > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
	echo -e "${COLOR_GREEN}Reserved $NUM_HUGEPAGE*2MB hugepages ${COLOR_OFF}"
}

pre_check
configure_ovs_fallback
configure_grpc_interface
reserve_hugepages
