1 #!/bin/sh /etc/rc.common
3 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'
9 config_get ifname
"$interface" ifname
10 printf '%s\n' "$ifname"
19 config_get device
"$interface" device
20 grep -qE "^ *$device:" /proc
/net
/dev
&& \
21 printf '%s\n' "$device" || \
22 printf '%s\n' "$ifname"
27 local mac
="${1:-$(ifconfig "$client_device" | sed -ne 's/[[:space:]]*$//; s/.*HWaddr //p')}"
28 local pat
="[0-9A-F][0-9A-F]"
31 # exactly 6 octets -> assume type 3 (DUID-LL - RFC3315, 9.4)
32 $pat:$pat:$pat:$pat:$pat:$pat)
33 local oIFS
="$IFS"; IFS
=":"; set -- $mac; IFS
="$oIFS"
36 if [ "$(printf \\1 | hexdump -n1 -ve '8/2 "" "%04x
" ""')" = "0001" ]; then
44 printf \\x00
\\x03
\\x00
\\x06
\\x
$1\\x
$2\\x
$3\\x
$4\\x
$5\\x
$6
45 logger
-t dhcp6c
"Using MAC address DUID 00:03:00:06:$1:$2:$3:$4:$5:$6"
47 # at least 7 octets -> could be type 1 or type 2
48 $pat:$pat:$pat:$pat:$pat:$pat:*)
49 local len_id
=":$(echo "$mac" | sed -e 's/[^:]//g')"
50 local len_hi
=$
(printf "%02x" $
((${#len_id} / 0xFF)) )
51 local len_lo
=$
(printf "%02x" $
((${#len_id} % 0xFF)) )
54 if [ "$(printf \\1 | hexdump -n1 -ve '8/2 "" "%04x
" ""')" = "0001" ]; then
55 printf \\x
$len_lo\\x
$len_hi
59 printf \\x
$len_hi\\x
$len_lo
62 printf $
(echo "$mac" |
sed -e 's/^/\\x/; s/:/\\x/g')
63 logger
-t dhcp6c
"Using user provided DUID $mac"
66 logger
-t dhcp6c
"Unable to derive DUID from interface '$client_device' and no valid user DUID given"
71 dhcp6c_write_interface
() {
77 config_get_bool enabled
"$cfg" enabled
0
79 if [ $enabled -ne 0 ]; then
80 config_get sla_id
"$cfg" sla_id
81 config_get sla_len
"$cfg" sla_len
83 printf '\tprefix-interface %s {\n' "$(get_ifname $cfg)"
84 printf '\t\tsla-id %s;\n' "$sla_id"
85 printf '\t\tsla-len %s;\n' "$sla_len"
90 dhcp6c_write_request
() {
91 printf '\trequest %s;\n' $1 |
sed -e s
/_
/-/g
94 dhcp6c_write_config
() {
97 config_get_bool pd basic pd
0
98 config_get_bool na basic na
0
100 printf 'interface %s {\n' "$client_ifname"
102 if [ $pd -ne 0 ]; then
103 printf '\tsend ia-pd 0;\n'
106 if [ $na -ne 0 ]; then
107 printf '\tsend ia-na 0;\n'
111 config_get_bool rapid_commit basic rapid_commit
0
112 [ $rapid_commit -ne 0 ] && printf '\tsend rapid-commit;\n'
115 config_get
script basic
script
116 [ "$script" != "" ] && printf '\tscript "%s";\n' "$script"
120 for request
in $DHCP6C_REQUEST_OPTIONS; do
121 config_get_bool value basic
"$request" 0
122 [ $value -ne 0 ] && dhcp6c_write_request
"$request"
127 if [ $pd -ne 0 ]; then
128 printf 'id-assoc pd 0 {\n'
129 config_foreach dhcp6c_write_interface interface
133 if [ $na -ne 0 ]; then
134 printf 'id-assoc na 0 {\n'
142 [ ! -e /etc
/dhcp6cctlkey
] && `dd if=/dev/urandom count=1 2> /dev/null | md5sum | cut -d" " -f1 > /etc/dhcp6cctlkey`
144 [ -e /var
/run
/dhcp6c.pid
] && return 0
151 config_get_bool enabled basic enabled
0
152 [ $enabled -eq 0 ] && return 0
155 config_get user_duid basic duid
157 logger
-t dhcp6c starting dhcp6c
159 local client_interface
160 config_get client_interface basic interface
161 local client_ifname
=$
(get_ifname
"$client_interface")
162 local client_device
=$
(get_device
"$client_interface" "$client_ifname")
164 local config_file
="/var/etc/dhcp6c.conf"
165 local duid_file
="/var/dhcp6c_duid"
166 mkdir
-m 755 -p /var
/etc
167 dhcp6c_write_config
> $config_file
168 dhcp6c_write_duid
"$user_duid" > $duid_file
172 config_get_bool debug basic debug
0
173 [ $debug -eq 1 ] && debug_option
="-D"
174 /usr
/sbin
/dhcp6c
-c $config_file $debug_option $client_ifname
177 ACTION
=start
/sbin
/hotplug-call dhcp6c
183 logger
-t dhcp6c stopping dhcp6c
184 service_kill dhcp6c
/var
/run
/dhcp6c.pid
185 rm -f /var
/etc
/dhcp6c.conf
/var
/run
/dhcp6c.pid
186 ACTION
=stop
/sbin
/hotplug-call dhcp6c