dnsmasq: support hostid ipv6 address suffix option
authorKevin Darbyshire-Bryant <kevin@darbyshire-bryant.me.uk>
Mon, 31 Aug 2015 17:11:41 +0000 (18:11 +0100)
committerJo-Philipp Wich <jo@mein.io>
Fri, 10 Jun 2016 16:16:47 +0000 (18:16 +0200)
Add support for hostid dhcp config entry to dnsmasq. This allows
specification of dhcpv6 hostid suffix and works in the same way as
odhcpd.

Entries in auto generated dnsmasq.conf should conform to:

dhcp-host=mm:mm:mm:mm:mm:mm,IPv4addr,[::V6su:ffix],hostname

example based on sample config/dhcp entry:

config host
        option name 'Kermit'
        option mac 'E0:3F:49:A1:D4:AA'
        option ip '192.168.235.4'
        option hostid '4'

dhcp-host=E0:3F:49:A1:D4:AA,192.168.235.4,[::0:4],Kermit

Signed-off-by: Kevin Darbyshire-Bryant <kevin@darbyshire-bryant.me.uk>
package/network/services/dnsmasq/files/dnsmasq.init

index ecf83622be83f729064319e30add0f1022619141..1a9903e50dc8edb2eb11f6d8c23ba12ba81f846b 100644 (file)
@@ -23,6 +23,25 @@ xappend() {
        echo "${value#--}" >> $CONFIGFILE
 }
 
+hex_to_hostid() {
+        local var="$1"
+        local hex="${2#0x}"     # strip optional "0x" prefix
+
+        if [ -n "${hex//[0-9a-fA-F]/}" ]; then
+                # is invalid hex literal
+                return 1
+        fi
+
+        # convert into host id
+        export "$var=$(
+                printf "%0x:%0x"  \
+                        $(((0x$hex >> 16) % 65536)) \
+                        $(( 0x$hex        % 256))
+        )"
+
+        return 0
+}
+
 dhcp_calc() {
        local ip="$1"
        local res=0
@@ -353,12 +372,19 @@ dhcp_host_add() {
 
        config_get tag "$cfg" tag
 
+       if [ "$DHCPv6CAPABLE" -eq 1 ]; then
+               config_get hostid "$cfg" hostid
+               if [ -n "$hostid" ]; then
+                       hex_to_hostid hostid "$hostid"
+               fi
+       fi
+
        config_get_bool broadcast "$cfg" broadcast 0
        [ "$broadcast" = "0" ] && broadcast=
 
        config_get leasetime "$cfg" leasetime
 
-       xappend "--dhcp-host=$macs${networkid:+,net:$networkid}${broadcast:+,set:needs-broadcast}${tag:+,set:$tag}${ip:+,$ip}${name:+,$name}${leasetime:+,$leasetime}"
+       xappend "--dhcp-host=$macs${networkid:+,net:$networkid}${broadcast:+,set:needs-broadcast}${tag:+,set:$tag}${ip:+,$ip${hostid:+,[::$hostid]}}${name:+,$name}${leasetime:+,$leasetime}"
 }
 
 dhcp_tag_add() {
@@ -614,6 +640,8 @@ start_service() {
                xappend "--conf-file=/etc/dnsmasq.conf"
        }
 
+       $PROG --version | grep -osqE "^Compile time options:.* DHCPv6( |$)" && DHCPv6CAPABLE=1 || DHCPv6CAPABLE=0
+
        args=""
        config_foreach dnsmasq dnsmasq
        config_foreach dhcp_host_add host