#!/bin/bash

set -e

devices=${DEVICES:-$1}
vf_number=${VF_NUM:-$2}
mac_start=${MAC_START:-$3}
# mac_start=${MAC_START:-00:50:56:00:00}

echo "Start mst"
mst start

echo "Enable SR-IOV and set vf number"
for dev in $(echo "${devices}"); do
    mst_dev=`mst status | grep -B 1 ${dev} | grep "/dev/mst" | awk '{print $1}'`
    if [[ "$mst_dev" = "" ]]; then
      continue
    fi
    mlxconfig -y -d ${mst_dev} set SRIOV_EN=1 NUM_OF_VFS=${vf_number}
done

echo "Check and set rdma system mode to exclusive"
if [[ "`rdma system | (grep exclusive || true)`" = "" ]]; then
    echo "options ib_core netns_mode=0" >> /etc/modprobe.d/ib_core.conf
fi

echo "Set sr-iov vf enable on boot"
cat << EOF > /usr/lib/systemd/system/sr-iov.service
[Unit]
Description=Enable SR-IOV
After=network.target
openibd.service

[Install]
WantedBy=multi-user.target

[Service]
Type=oneshot
Restart=on-failure
EOF
for item in $(echo "$devices"); do
    if_dev=`ibdev2netdev -v | grep "${item}" | awk -F "==>" '{print $2}' | awk '{print $1}'`
    if [[ "$if_dev" = "" ]]; then
      continue
    fi
    echo "ExecStart=/usr/bin/bash -c '/usr/bin/echo ${vf_number} > /sys/class/net/${if_dev}/device/sriov_numvfs'" >> /usr/lib/systemd/system/sr-iov.service
    for i in $(seq 0 $vf_number); do
	if [[ $i -eq $vf_number ]]; then
	    continue
	fi
        end_mac=`echo "obase=16; $i" | bc`
        end_mac=`echo $end_mac | awk '{printf "%02d\n", $0}'`
        if_mac="${mac_start}:$end_mac"
        echo "ExecStart=/usr/bin/bash -c '/usr/bin/ip link set dev ${if_dev} vf $i mac ${if_mac}'" >> /usr/lib/systemd/system/sr-iov.service
    done
    echo "ExecStart=/usr/bin/bash -c '/usr/bin/revfmac'" >> /usr/lib/systemd/system/sr-iov.service
done

systemctl enable sr-iov.service
systemctl daemon-reload

echo "Please restart host to enable sr-iov config"
