<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <p>Hi,</p>
    <p>huch, das ging jetzt aber schnell.<br>
    </p>
    <p>Trotzdem noch ne kleine Anmerkung s. unten<br>
    </p>
    <br>
    <div class="moz-cite-prefix">Am 03.11.2017 um 09:30 schrieb Tim
      Niemeyer:<br>
    </div>
    <blockquote type="cite" cite="mid:1509697852.2774.65.camel@tn-x.org">
      <pre wrap="">Hi

Danke.

Und applied.

Tim

Am Freitag, den 03.11.2017, 09:18 +0100 schrieb Adrian Schmutzler:
</pre>
      <blockquote type="cite">
        <pre wrap="">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 <a class="moz-txt-link-rfc2396E" href="mailto:freifunk@adrianschmutzler.de"><freifunk@adrianschmutzler.de></a>

Tested-by: Adrian Schmutzler <a class="moz-txt-link-rfc2396E" href="mailto:freifunk@adrianschmutzler.de"><freifunk@adrianschmutzler.de></a>

Reviewed-by: Tim Niemeyer <a class="moz-txt-link-rfc2396E" href="mailto:tim@tn-x.org"><tim@tn-x.org></a>

---

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::)</pre>
      </blockquote>
    </blockquote>
    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.<br>
    <br>
    Könnte man vorher noch wegbügeln. z.B. so<br>
    sed -e 's,\(\([[:digit:]]*:\)\{4\}\):,\1,' | sed -e
    's,/,'$suffix'/,'<br>
    <br>
    Robert<br>
    <blockquote type="cite" cite="mid:1509697852.2774.65.camel@tn-x.org">
      <blockquote type="cite">
        <pre wrap="">
+
+       [ $# -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
</pre>
        <br>
        <fieldset class="mimeAttachmentHeader"></fieldset>
        <br>
      </blockquote>
    </blockquote>
    <br>
  </body>
</html>