#!/bin/sh

#set -x

IPV6_ADDR_RANGE_START="3ffe:ffff::f"
#IPV6_ADDR_RANGE_START="3ffe:fffe::1"
#IPV6_ADDR_RANGE_STOP="3ffe:ffff::f"
#IPV6_ADDR_RANGE_START="3ffe:ffff::2700"
IPV6_ADDR_RANGE_STOP="3ffe:ffff::ffff"

IPV6_ADDR_RANGE_MODE="hexadecimal"
#IPV6_ADDR_RANGE_MODE="decimal"

IPV6_ADDR_RANGE_LIMIT="256"

if [ -z "$IPV6_ADDR_RANGE_START" -o -z "$IPV6_ADDR_RANGE_STOP" ]; then
	echo "ERROR: start or stop empty"
	exit 1
fi

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

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_start="`echo $IPV6_ADDR_RANGE_START | sed "s/$ipv6_addr_range_suffix_start$//g"`"
ipv6_addr_range_prefix_stop="`echo $IPV6_ADDR_RANGE_STOP | sed "s/$ipv6_addr_range_suffix_stop$//g"`"

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

if [ "$ipv6_addr_range_prefix_start" != "$ipv6_addr_range_prefix_stop" ]; then
	echo "ERROR: prefix of start and stop not equal - currently not supported"
	exit 1
fi

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

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_start}${suffix}"
done



