[PATCH v2] fff-network/fff-hoods: Create functions for IPv6 rewriting

Tim Niemeyer tim at tn-x.org
Fr Nov 3 09:30:52 CET 2017


Hi

Danke.

Und applied.

Tim

Am Freitag, den 03.11.2017, 09:18 +0100 schrieb Adrian Schmutzler:
> This puts the code for creating IPv6 addresses from MAC
> address and EUI into functions, so it can be reused.
> 
> This should be particularly helpful if code is rewritten later.
> 
> Signed-off-by: Adrian Schmutzler <freifunk at adrianschmutzler.de>
> 
> Tested-by: Adrian Schmutzler <freifunk at adrianschmutzler.de>
> 
> Reviewed-by: Tim Niemeyer <tim at tn-x.org>
> 
> ---
> 
> Changes in v2:
> - Added comments to functions
> 
>  .../fff/fff-hoods/files/usr/sbin/configurehood     | 11 ++-
>  .../fff-network/files/lib/functions/fff/network    | 87
> ++++++++++++++++++++++
>  .../fff-network/files/usr/sbin/configurenetwork    | 11 ++-
>  3 files changed, 97 insertions(+), 12 deletions(-)
>  create mode 100644 src/packages/fff/fff-
> network/files/lib/functions/fff/network
> 
> diff --git a/src/packages/fff/fff-hoods/files/usr/sbin/configurehood
> b/src/packages/fff/fff-hoods/files/usr/sbin/configurehood
> index 3d0afc3..f785b7d 100755
> --- a/src/packages/fff/fff-hoods/files/usr/sbin/configurehood
> +++ b/src/packages/fff/fff-hoods/files/usr/sbin/configurehood
> @@ -2,6 +2,7 @@
>  
>  . /usr/share/libubox/jshn.sh
>  . /lib/functions/fff/keyxchange
> +. /lib/functions/fff/network
>  . /lib/functions/fff/wireless
>  . /lib/functions/fff/timeserver
>  
> @@ -242,12 +243,10 @@ if [ -s "$hoodfile" ]; then
>  	# Set $prefix::MAC as IP
>  	if [ -n "$prefix" ] ; then
>  		prefix="$(echo "$prefix" | sed -e 's,\\,,')"
> -		suffix="$(awk -F: '{ print "0:"$1$2":"$3$4":"$5$6 }'
> /sys/class/net/br-mesh/address)"
> -		suffix_eui="$(awk -F: '{
> printf("%02x%s:%sff:fe%s:%s%s\n", xor(("0x"$1),2), $2, $3, $4, $5,
> $6) }' /sys/class/net/br-mesh/address)"
> -		addr="$(echo "$prefix" | sed -e 's,/,'$suffix'/,')"
> -		echo $addr | grep -q "::" || addr="$(echo "$addr" |
> sed -e 's,:[0:]*:,::,')"
> -		addr_eui="$(echo "$prefix" | sed -e
> 's,/,'$suffix_eui'/,')"
> -		echo $addr_eui | grep -q "::" || addr_eui="$(echo
> "$addr_eui" | sed -e 's,:[0:]*:,::,')"
> +		addr="$(ipMacAssemble "$prefix" "br-mesh")"
> +		addr="$(ipTidyColon "$addr")"
> +		addr_eui="$(ipEUIAssemble "$prefix" "br-mesh")"
> +		addr_eui="$(ipTidyColon "$addr_eui")"
>  		for ip in $(ip -6 addr show dev br-mesh | grep inet6
> | grep -v -e " $addr" -e " $addr_eui" -e " fe80::" -e " fdff::" | cut
> -f6 -d " "); do
>  			ip -6 addr del "$ip" dev br-mesh
>  		done
> diff --git a/src/packages/fff/fff-
> network/files/lib/functions/fff/network b/src/packages/fff/fff-
> network/files/lib/functions/fff/network
> new file mode 100644
> index 0000000..8dd9f77
> --- /dev/null
> +++ b/src/packages/fff/fff-network/files/lib/functions/fff/network
> @@ -0,0 +1,87 @@
> +#!/bin/sh
> +# Copyright 2017 Adrian Schmutzler
> +# License GPLv3
> +
> +ipMacSuffix() {
> +	# Returns the lower 64 bits of an IPv6 address
> (0:aabb:ccdd:eeff)
> +	# based on the mac address (aa:bb:cc:bb:ee:ff) of a
> specified interface
> +	#
> +	# Argument: name of interface (e.g. br-mesh)
> +
> +	[ $# -ne "1" ] && return 1
> +
> +	local iface=$1
> +
> +	awk -F: '{ print "0:"$1$2":"$3$4":"$5$6 }'
> "/sys/class/net/${iface}/address"
> +	return 0
> +}
> +
> +ipEUISuffix() {
> +	# Returns the EUI (interface ID, a8bb:ccff:fedd:eeff)
> +	# based on the mac address (aa:bb:cc:bb:ee:ff) of a
> specified interface
> +	#
> +	# Argument: name of interface (e.g. br-mesh)
> +
> +	[ $# -ne "1" ] && return 1
> +
> +	local iface=$1
> +
> +	awk -F: '{ printf("%02x%s:%sff:fe%s:%s%s\n",
> xor(("0x"$1),2), $2, $3, $4, $5, $6) }'
> "/sys/class/net/${iface}/address"
> +	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 (interface 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 iface=$2
> +
> +	suffix="$(ipMacSuffix "$iface")"
> +	ipAssemble "$prefix" "$suffix"
> +	return 0
> +}
> +
> +ipEUIAssemble() {
> +	# Concatenates a prefix (1st argument) and an EUI-based
> suffix (interface 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 iface=$2
> +
> +	suffix="$(ipEUISuffix "$iface")"
> +	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
> +}
> diff --git a/src/packages/fff/fff-
> network/files/usr/sbin/configurenetwork b/src/packages/fff/fff-
> network/files/usr/sbin/configurenetwork
> index c6b3113..d4866e4 100755
> --- a/src/packages/fff/fff-network/files/usr/sbin/configurenetwork
> +++ b/src/packages/fff/fff-network/files/usr/sbin/configurenetwork
> @@ -9,6 +9,8 @@
>  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>  # GNU General Public License for more details.
>  
> +. /lib/functions/fff/network
> +
>  BOARD="$(uci get board.model.name)"
>  . /etc/network.$BOARD
>  
> @@ -218,8 +220,7 @@ else
>  
>      prefix="fdff:0::/64"
>      # Set $prefix::MAC as IP
> -    suffix=$(awk -F: '{ print $1$2":"$3$4":"$5$6 }'
> /sys/class/net/br-mesh/address)
> -    addr=$(echo $prefix | sed -e 's/\//'$suffix'\//')
> +    addr="$(ipMacAssemble "$prefix" "br-mesh")"
>      ip -6 addr add $addr dev br-mesh
>  
>      uci -q del network.globals
> @@ -229,14 +230,12 @@ else
>      uci -q set network.mesh.proto=static
>  
>      # Set $prefix::1 as IP
> -    suffix="1"
> -    addr=$(echo $prefix | sed -e 's/\//'$suffix'\//')
> +    addr="$(ipAssemble "$prefix" "1")"
>      ip -6 addr add $addr dev br-mesh
>      uci -q add_list network.mesh.ip6addr=$addr
>  
>      # Set $prefix::link-local as IP
> -    suffix=$(awk -F: '{ printf("%02x%s:%sff:fe%s:%s%s\n",
> xor(("0x"$1),2), $2, $3, $4, $5, $6) }' /sys/class/net/br-
> mesh/address)
> -    addr=$(echo $prefix | sed -e 's/\//'$suffix'\//')
> +    addr="$(ipEUIAssemble "$prefix" "br-mesh")"
>      ip -6 addr add $addr dev br-mesh
>      uci -q add_list network.mesh.ip6addr=$addr
>  
> -- 
> 2.7.4
> 
-------------- nächster Teil --------------
Ein Dateianhang mit Binärdaten wurde abgetrennt...
Dateiname   : signature.asc
Dateityp    : application/pgp-signature
Dateigröße  : 488 bytes
Beschreibung: This is a digitally signed message part
URL         : <http://lists.freifunk.net/pipermail/franken-dev-freifunk.net/attachments/20171103/e230c8ba/attachment.sig>


Mehr Informationen über die Mailingliste franken-dev