# Copyright 2017 Adrian Schmutzler
# License GPLv3

ipMacSuffix() {
	# Returns the lower 64 bits of an IPv6 address (0:aabb:ccdd:eeff)
	# based on the provided MAC address (aa:bb:cc:bb:ee:ff)
	#
	# Argument: MAC address (with colons)

	[ $# -ne "1" ] && return 1

	local mac=$1

	echo "$mac" | awk -F: '{ print "0:"$1$2":"$3$4":"$5$6 }'
	return 0
}

ipEUISuffix() {
	# Returns the EUI (interface ID, a8bb:ccff:fedd:eeff)
	# based on the provided MAC address (aa:bb:cc:bb:ee:ff)
	#
	# Argument: MAC address (with colons)

	[ $# -ne "1" ] && return 1

	local mac=$1

	echo "$mac" | awk -F: '{ printf("%02x%s:%sff:fe%s:%s%s\n", xor(("0x"$1),2), $2, $3, $4, $5, $6) }'
	return 0
}

ipAssemble() {
	# Concatenates a prefix (1st argument) and a suffix (2nd argument) to a merged IPv6 address
	# (The prefix has to bear the subnet: fdff::/64)
	# (The prefix must only contain the higher 64 bits (correct: 0:0:0:0: or 0:: - wrong: 0:0:0:0::)

	[ $# -ne "2" ] && return 1

	local prefix=$1
	local suffix=$2

	echo "$prefix" | sed -e 's,/,'$suffix'/,'
	return 0
}

ipMacAssemble() {
	# Concatenates a prefix (1st argument) and a MAC-based suffix (MAC address as 2nd argument) to a merged IPv6 address
	# (Details on prefix: Check ipAssemble(), details on suffix: Check ipMacSuffix())

	[ $# -ne "2" ] && return 1

	local prefix=$1
	local mac=$2

	suffix="$(ipMacSuffix "$mac")"
	ipAssemble "$prefix" "$suffix"
	return 0
}

ipEUIAssemble() {
	# Concatenates a prefix (1st argument) and an EUI-based suffix (MAC address as 2nd argument) to a merged IPv6 address
	# (Details on prefix: Check ipAssemble(), details on suffix: Check ipEUISuffix())

	[ $# -ne "2" ] && return 1

	local prefix=$1
	local mac=$2

	suffix="$(ipEUISuffix "$mac")"
	ipAssemble "$prefix" "$suffix"
	return 0
}

ipTidyColon() {
	# Collapses zeros to :: to yield short but valid IPv6 addresses
	#
	# Argument: IPv6 address to be shortened

	[ $# -ne "1" ] && return 1

	local addr=$1

	echo "$addr" | grep -q "::" || addr="$(echo "$addr" | sed -e 's,:[0:]*:,::,')"
	echo "$addr"
	return 0
}

macFlipLocalBit() {
	# Returns given MAC-address with locally administered bit flipped
	#
	# Argument: MAC-address

	local mac=$1

	echo "$mac" | awk -F: '{ printf("%02x:%s:%s:%s:%s:%s\n", xor(("0x"$1),2), $2, $3, $4, $5, $6) }'
	return 0
}
