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

robert rlanghammer at web.de
Fr Nov 3 10:42:07 CET 2017


Hi,

huch, das ging jetzt aber schnell.

Trotzdem noch ne kleine Anmerkung s. unten


Am 03.11.2017 um 09:30 schrieb Tim Niemeyer:
> 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::)
mir gefällt die Vorgabe 0:0:0:0: nicht so gut. Man muss nen
vollständigen Prefix dann z.B. so mitgeben fd43:5602:29bd:9:/64  , was
keine gültige v6 Notierung ist.

Könnte man vorher noch wegbügeln. z.B. so
sed -e 's,\(\([[:digit:]]*:\)\{4\}\):,\1,' | sed -e 's,/,'$suffix'/,'

Robert
>> +
>> +	[ $# -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 HTML-Daten wurde abgetrennt...
URL: <http://lists.freifunk.net/pipermail/franken-dev-freifunk.net/attachments/20171103/492fefb9/attachment.html>


Mehr Informationen über die Mailingliste franken-dev