#!/bin/sh

#set -x

IPV6_ADDR_RANGE="3ffe:ffff::f-90"

IPV6_ADDR_RANGE_MODE="hexadecimal"
#IPV6_ADDR_RANGE_MODE="decimal"

IPV6_ADDR_RANGE_LIMIT="256"

if [ -z "$IPV6_ADDR_RANGE" ]; then
	echo "ERROR: range value empty"
	exit 1
fi

ipv6_addr_range_value="`echo $IPV6_ADDR_RANGE | awk -F: '{ print $NF }'`"
ipv6_addr_range_suffix_start="`echo $ipv6_addr_range_value | awk -F- '{ print $1 }'`"
ipv6_addr_range_suffix_stop="`echo $ipv6_addr_range_value | awk -F- '{ print $2 }'`"

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

ipv6_addr_range_prefix="`echo $IPV6_ADDR_RANGE | sed "s/$ipv6_addr_range_value$//g"`"

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

echo "Suffix range: $ipv6_addr_range_suffix_start - $ipv6_addr_range_suffix_stop"
echo "Prefix: $ipv6_addr_range_prefix"

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

echo "Counter range: $ipv6_addr_range_counter_start - $ipv6_addr_range_counter_stop"

ipv6_addr_range_suffix=$ipv6_addr_range_counter_start
counter=0

# Generate address list
while [ $ipv6_addr_range_suffix -le $ipv6_addr_range_counter_stop ]; 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



