# 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 }