#!/bin/bash
#
# Udev script to rename SF netdevice
# SF netdevices that aren't used by HBN renamed to conventional name, eg. en3f0pf0sf88

PORT_NAME=$1
IFINDEX=$2

# Names for special SF representors on ECPF0 (function 0)
declare -A SFRMAP=(
    [2]="p0_sf_r"
    [3]="p1_sf_r"
    [1]="pf0dpu0_sf_r"
    [1513]="pf0dpu1_sf_r"
    [1514]="pf0hpf_sf_r"
    [1515]="pf1hpf_sf_r"
)

# SF representor numbers 1001 to 1001+126 on ECPF0 (function 0) are mapped to ECPF0 VFs and follow pattern pf0vfx_sf_r
start=1001
end=$((start+126))
for i in $(seq ${start} ${end});  do
	vf_idx=$((i-${start}))
	SFRMAP[$i]="pf0vf${vf_idx}_sf_r"
done

# SF representor numbers 1257 to 1257+126 on ECPF0 (function 0) are mapped to ECPF1 VFs and follow pattern pf1vfx_sf_r
start=1257
end=$((start+126))
for i in $(seq ${start} ${end});  do
	vf_idx=$((i-${start}))
	SFRMAP[$i]="pf1vf${vf_idx}_sf_r"
done


for rep_ndev in `ls /sys/class/net/`; do
	_ifindex=`cat /sys/class/net/$rep_ndev/ifindex | head -1 2>/dev/null`
	if [ "$_ifindex" != "$IFINDEX" ]; then continue; fi

	_phys_port_name=$(cat /sys/class/net/$rep_ndev/phys_port_name | head -1 2>/dev/null)
	if [[ "$_phys_port_name" != "$PORT_NAME" ]]; then continue; fi

	devpath=`udevadm info /sys/class/net/$rep_ndev | grep "DEVPATH="`
	pcipath=`echo $devpath | awk -F "/net/$rep_ndev" '{print $1}'`
	array=($(echo "$pcipath" | sed 's/\// /g'))
	len=${#array[@]}
	# last element in array is pci parent device
	parent_pdev=${array[$len-1]}
	#pdev is : 0000:03:00.0, so extract them by their index
	b=`echo ${parent_pdev:5:2} | sed 's/^0//'`
	f=${parent_pdev: -1}
	SFNUM=$(($(echo "${PORT_NAME}" | grep -o -E '[0-9]+' | tail -1)))

	if (( $f == 0 )); then
		sfr_name="${SFRMAP[${SFNUM}]}"
	elif (( $f != 1 )) ; then
		echo "Unexpected PCI function: got $f, expected 0 or 1 " > /dev/kmsg
	fi

	# non-HBN SF representor, use conventional name
	[ x$sfr_name == x ] && sfr_name="en${b}f${f}${PORT_NAME}"

	echo "${sfr_name}" >> /tmp/sfr_devices
	echo "NAME=${sfr_name}"
	exit
done
