#!/bin/bash

dev=$1
if [[ -z $dev ]]; then
   echo "Usage: $0 <interface>"
   exit 1
fi

curAddr=$(cat /sys/class/net/$dev/address)
if [[ -z $curAddr ]]; then
   echo "Cannot read $dev address"
   exit 2
fi

kcmd=$(cat /proc/cmdline | tr " " "\n")
while IFS='=' read -r name value; do
   if [[ $name = "hwaddr_$dev" ]]; then
      cmdAddr=$value
      break
   fi
done <<< "$kcmd"

igcDefault=("00:a0:c9:00:00:00")

if [[ -n $cmdAddr &&  ! "${igcDefault[*]}" =~ "${cmdAddr}" ]]; then
   newAddr=$cmdAddr
elif [[ "${igcDefault[*]}" =~ "${curAddr}" ]]; then
   # random address, similar to kernel eth_random_addr()
   newAddr=$(printf "%02x" $((RANDOM & 0xfe | 0x02)))
   for i in 1 2 3 4 5; do
      newAddr="${newAddr}:$(printf "%02x" $((RANDOM & 0xff)))"
   done
fi

if [[ -n $newAddr ]]; then
   /usr/sbin/ip link set dev "$dev" addr "$newAddr"
fi
