#!/bin/sh

#set -x

IPV6ADDR_SECONDARIES_CLONESTART="3ffe:ffff::1"
IPV6ADDR_SECONDARIES_CLONENUMBER="25"

#IPV6_ADDR_RANGE_MODE="hexadecimal"
IPV6_ADDR_RANGE_MODE="decimal"

IPV6_ADDR_RANGE_LIMIT="256"

if [ -z "$IPV6ADDR_SECONDARIES_CLONESTART" -o -z "$IPV6ADDR_SECONDARIES_CLONENUMBER" ]; then
	echo "ERROR: clonestart or clonenumber empty"
	exit 1
fi

ipv6_addr_range_suffix_start="`echo $IPV6ADDR_SECONDARIES_CLONESTART | awk -F: '{ print $NF }'`"

if [ -z "$ipv6_addr_range_suffix_start" ]; then
	echo "ERROR: start contain not extractable suffix"
	exit 1
fi

ipv6_addr_range_prefix="`echo $IPV6ADDR_SECONDARIES_CLONESTART | sed "s/$ipv6_addr_range_suffix_start$//g"`"

if [ -z "$ipv6_addr_range_prefix" ]; then
	echo "ERROR: prefix cannot be extracted"
	exit 1
fi

echo "Suffix start: $ipv6_addr_range_suffix_start ($IPV6ADDR_SECONDARIES_CLONENUMBER values)"
echo "Prefix: $ipv6_addr_range_prefix"

ipv6_addr_range_counter_start="`printf '%d\n' 0x$ipv6_addr_range_suffix_start`"

ipv6_addr_range_suffix=$ipv6_addr_range_counter_start
counter=0

# Generate address list
while [ $counter -lt $IPV6ADDR_SECONDARIES_CLONENUMBER ]; do
	case "$IPV6_ADDR_RANGE_MODE" in
	    "decimal")
		if [ $ipv6_addr_range_suffix -gt 9999 ]; then
			echo "ERROR: out of range"
			break
		fi
		suffix="$ipv6_addr_range_suffix"
		;;
	    "hexadecimal")
		if [ $ipv6_addr_range_suffix -gt 65535 ]; then
			echo "ERROR: out of range"
			break
		fi
		suffix="`printf '%x' $ipv6_addr_range_suffix`"
		;;
	    *)
		echo "ERROR: mode not supported: $IPV6_ADDR_RANGE_MODE"
		;;
	esac
	ipv6_addr_range_suffix=$[ $ipv6_addr_range_suffix + 1 ]
	counter=$[ $counter + 1 ]
	if [ $counter -gt $IPV6_ADDR_RANGE_LIMIT ]; then
		echo "Limit reached"
		break
	fi
	echo "${ipv6_addr_range_prefix}${suffix}"
done



