[package] wide-dhcpv6: improve user DUID handling
authorjow <jow@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Mon, 22 Aug 2011 22:50:16 +0000 (22:50 +0000)
committerjow <jow@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Mon, 22 Aug 2011 22:50:16 +0000 (22:50 +0000)
- values containing exactly six octets are treated as type 3 (DUID-LL)
- values containing seven and more octets get the length tag added in native endianess
- all other values are treated as invalid

git-svn-id: svn://svn.openwrt.org/openwrt/packages@28079 3c298f89-4303-0410-b956-a3cf2f4a3e73

ipv6/wide-dhcpv6/Makefile
ipv6/wide-dhcpv6/files/dhcp6c.init

index 6e3a3e4..051ed38 100644 (file)
@@ -3,7 +3,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=wide-dhcpv6
 PKG_VERSION:=20080615
-PKG_RELEASE:=6
+PKG_RELEASE:=7
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=@SF/$(PKG_NAME)
index 405e9c6..e272001 100644 (file)
@@ -1,4 +1,4 @@
-#!/bin/sh /etc/rc.common 
+#!/bin/sh /etc/rc.common
 
 DHCP6C_REQUEST_OPTIONS='domain_name_servers domain_name ntp_servers sip_server_address sip_domain_name nis_server_address nis_domain_name nisp_server_address nisp_domain_name bcmcs_server_address bcmcs_domain_name'
 
@@ -28,10 +28,7 @@ dhcp6c_write_duid() {
        local pat="[0-9A-F][0-9A-F]"
 
        case "$mac" in
-               $pat:$pat:$pat:$pat:$pat:$pat:$pat:$pat:$pat:$pat)
-                       printf $(echo "$mac" | sed -e 's/^/\\x/; s/:/\\x/g')
-                       logger -t dhcp6c "Using user provided DUID $mac"
-               ;;
+               # exactly 6 octets -> assume type 3 (DUID-LL - RFC3315, 9.4)
                $pat:$pat:$pat:$pat:$pat:$pat)
                        local oIFS="$IFS"; IFS=":"; set -- $mac; IFS="$oIFS"
 
@@ -47,6 +44,24 @@ dhcp6c_write_duid() {
                        printf \\x00\\x03\\x00\\x06\\x$1\\x$2\\x$3\\x$4\\x$5\\x$6
                        logger -t dhcp6c "Using MAC address DUID 00:03:00:06:$1:$2:$3:$4:$5:$6"
                ;;
+               # at least 7 octets -> could be type 1 or type 2
+               $pat:$pat:$pat:$pat:$pat:$pat:*)
+                       local len_id=":$(echo "$mac" | sed -e 's/[^:]//g')"
+                       local len_hi=$(printf "%02x" $((${#len_id} / 0xFF)) )
+                       local len_lo=$(printf "%02x" $((${#len_id} % 0xFF)) )
+
+                       # low endian
+                       if [ "$(printf \\1 | hexdump -n1 -ve '8/2 "%04x"')" = "0001" ]; then
+                               printf \\x$len_lo\\x$len_hi
+
+                       # big endian
+                       else
+                               printf \\x$len_hi\\x$len_lo
+                       fi
+
+                       printf $(echo "$mac" | sed -e 's/^/\\x/; s/:/\\x/g')
+                       logger -t dhcp6c "Using user provided DUID $mac"
+               ;;
                *)
                        logger -t dhcp6c "Unable to derive DUID from interface '$client_device' and no valid user DUID given"
                ;;
@@ -58,11 +73,10 @@ dhcp6c_write_interface() {
        local sla_id
        local sla_len
        local enabled
-       
+
        config_get_bool enabled "$cfg" enabled 0
-        
+
        if [ $enabled -ne 0 ]; then
-       
                config_get sla_id "$cfg" sla_id
                config_get sla_len "$cfg" sla_len
 
@@ -70,9 +84,7 @@ dhcp6c_write_interface() {
                printf '\t\tsla-id %s;\n' "$sla_id"
                printf '\t\tsla-len %s;\n' "$sla_len"
                printf '\t};\n'
-       
        fi
-       
 }
 
 dhcp6c_write_request() {
@@ -80,30 +92,29 @@ dhcp6c_write_request() {
 }
 
 dhcp6c_write_config() {
-
        local pd
        local na
        config_get_bool pd basic pd 0
        config_get_bool na basic na 0
-       
+
        printf 'interface %s {\n' "$client_ifname"
-       
+
        if [ $pd -ne 0 ]; then
                printf '\tsend ia-pd 0;\n'
        fi
-       
+
        if [ $na -ne 0 ]; then
                printf '\tsend ia-na 0;\n'
        fi
-       
+
        local rapid_commit
        config_get_bool rapid_commit basic rapid_commit 0
        [ $rapid_commit -ne 0 ] && printf '\tsend rapid-commit;\n'
-       
+
        local script
        config_get script basic script
        [ "$script" != "" ] && printf '\tscript "%s";\n' "$script"
-       
+
        local request
        local value
        for request in $DHCP6C_REQUEST_OPTIONS; do
@@ -112,23 +123,22 @@ dhcp6c_write_config() {
        done
 
        printf '};\n\n'
-       
+
        if [ $pd -ne 0 ]; then
                printf 'id-assoc pd 0 {\n'
                config_foreach dhcp6c_write_interface interface
                printf '};\n\n'
        fi
-       
+
        if [ $na -ne 0 ]; then
                printf 'id-assoc na 0 {\n'
                printf '};\n\n'
        fi
-       
+
        return 0
 }
 
 start() {
-
        [ ! -e /etc/dhcp6cctlkey ] && `dd if=/dev/urandom count=1 2> /dev/null | md5sum | cut -d" " -f1 > /etc/dhcp6cctlkey`
 
        [ -e /var/run/dhcp6c.pid ] && return 0
@@ -136,7 +146,7 @@ start() {
        include /lib/network
 
        config_load "dhcp6c"
-       
+
        local enabled
        config_get_bool enabled basic enabled 0
        [ $enabled -eq 0 ] && return 0
@@ -145,39 +155,36 @@ start() {
        config_get user_duid basic duid
 
        logger -t dhcp6c starting dhcp6c
-       
+
        local client_interface
        config_get client_interface basic interface
        local client_ifname=$(get_ifname "$client_interface")
        local client_device=$(get_device "$client_interface" "$client_ifname")
-       
+
        local config_file="/var/etc/dhcp6c.conf"
        local duid_file="/var/dhcp6c_duid"
        mkdir -m 755 -p /var/etc
        dhcp6c_write_config > $config_file
        dhcp6c_write_duid "$user_duid" > $duid_file
-       
+
        local debug
        local debug_option
        config_get_bool debug basic debug 0
        [ $debug -eq 1 ] && debug_option="-D"
        /usr/sbin/dhcp6c -c $config_file $debug_option $client_ifname
-       
+
        sleep 3
        ACTION=start /sbin/hotplug-call dhcp6c
-       
+
        return 0
-       
 }
 
 stop() {
-
        logger -t dhcp6c stopping dhcp6c
        service_kill dhcp6c /var/run/dhcp6c.pid
        rm -f /var/etc/dhcp6c.conf /var/run/dhcp6c.pid
        ACTION=stop /sbin/hotplug-call dhcp6c
        return 0
-       
 }