From 1593effbce6822b2db676507cd8ff25b14af445f Mon Sep 17 00:00:00 2001 From: Jo-Philipp Wich Date: Wed, 8 Jun 2011 23:52:28 +0000 Subject: [PATCH] [package] wide-dhcpv6: - fix DUID calculation for virtual interfaces like pppoe-wan (#9503) - add a config option "duid" to allow users to override the DUID - use service_kill to cleanly terminate dhcp6c - bump package revision SVN-Revision: 27140 --- ipv6/wide-dhcpv6/Makefile | 2 +- ipv6/wide-dhcpv6/files/dhcp6c.conf | 4 ++ ipv6/wide-dhcpv6/files/dhcp6c.init | 67 +++++++++++++++++++++--------- 3 files changed, 52 insertions(+), 21 deletions(-) diff --git a/ipv6/wide-dhcpv6/Makefile b/ipv6/wide-dhcpv6/Makefile index ac5234b45e..6e3a3e4332 100644 --- a/ipv6/wide-dhcpv6/Makefile +++ b/ipv6/wide-dhcpv6/Makefile @@ -3,7 +3,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=wide-dhcpv6 PKG_VERSION:=20080615 -PKG_RELEASE:=5 +PKG_RELEASE:=6 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=@SF/$(PKG_NAME) diff --git a/ipv6/wide-dhcpv6/files/dhcp6c.conf b/ipv6/wide-dhcpv6/files/dhcp6c.conf index 4f99046093..04a3ca928b 100644 --- a/ipv6/wide-dhcpv6/files/dhcp6c.conf +++ b/ipv6/wide-dhcpv6/files/dhcp6c.conf @@ -22,6 +22,10 @@ config 'dhcp6c' 'basic' option 'bcmcs_server_address' '0' option 'bcmcs_server_domain_name' '0' + # Override the used DUID, by default it is derived from the interface MAC + # The given value must be uppercase and globally unique! + #option 'duid' '00:03:00:06:D8:5D:4C:A5:03:F2' + # Script to run when a reply is received option 'script' '/usr/bin/dhcp6c-state' diff --git a/ipv6/wide-dhcpv6/files/dhcp6c.init b/ipv6/wide-dhcpv6/files/dhcp6c.init index a1b41d4feb..405e9c6345 100644 --- a/ipv6/wide-dhcpv6/files/dhcp6c.init +++ b/ipv6/wide-dhcpv6/files/dhcp6c.init @@ -11,23 +11,46 @@ get_ifname() { return 0 } -dhcp6c_write_duid() { - local ifname="$1" - local mac=$(ifconfig "$client_ifname" | sed -ne 's/.*HWaddr //p') - local oIFS="$IFS"; IFS=":"; set -- $mac; IFS="$oIFS" - - # low endian - if [ "$(printf \\1 | hexdump -n1 -ve '8/2 "%04x"')" = "0001" ]; then - printf \\x0a\\x00 - - # big endian - else - printf \\x00\\x0a - fi - - printf \\x00\\x03\\x00\\x06\\x$1\\x$2\\x$3\\x$4\\x$5\\x$6 +get_device() { + local interface=$1 + local ifname=$2 + local device + scan_interfaces + config_get device "$interface" device + grep -qE "^ *$device:" /proc/net/dev && \ + printf '%s\n' "$device" || \ + printf '%s\n' "$ifname" + return 0 +} - logger -t dhcp6c "Using DUID 00:03:00:06:$1:$2:$3:$4:$5:$6" +dhcp6c_write_duid() { + local mac="${1:-$(ifconfig "$client_device" | sed -ne 's/[[:space:]]*$//; s/.*HWaddr //p')}" + 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" + ;; + $pat:$pat:$pat:$pat:$pat:$pat) + local oIFS="$IFS"; IFS=":"; set -- $mac; IFS="$oIFS" + + # low endian + if [ "$(printf \\1 | hexdump -n1 -ve '8/2 "%04x"')" = "0001" ]; then + printf \\x0a\\x00 + + # big endian + else + printf \\x00\\x0a + fi + + 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" + ;; + *) + logger -t dhcp6c "Unable to derive DUID from interface '$client_device' and no valid user DUID given" + ;; + esac } dhcp6c_write_interface() { @@ -117,18 +140,22 @@ start() { local enabled config_get_bool enabled basic enabled 0 [ $enabled -eq 0 ] && return 0 - + + local user_duid + 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 > $duid_file + dhcp6c_write_duid "$user_duid" > $duid_file local debug local debug_option @@ -146,8 +173,8 @@ start() { stop() { logger -t dhcp6c stopping dhcp6c - rm -f /var/etc/dhcp6c.conf - kill -TERM `cat /var/run/dhcp6c.pid` + 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 -- 2.30.2