[packages] wide-dhcpv6: fix second instance of endian detection as well (#10648)
[openwrt/svn-archive/archive.git] / ipv6 / wide-dhcpv6 / files / dhcp6c.init
1 #!/bin/sh /etc/rc.common
2
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'
4
5 get_ifname() {
6 local interface=$1
7 local ifname
8 scan_interfaces
9 config_get ifname "$interface" ifname
10 printf '%s\n' "$ifname"
11 return 0
12 }
13
14 get_device() {
15 local interface=$1
16 local ifname=$2
17 local device
18 scan_interfaces
19 config_get device "$interface" device
20 grep -qE "^ *$device:" /proc/net/dev && \
21 printf '%s\n' "$device" || \
22 printf '%s\n' "$ifname"
23 return 0
24 }
25
26 dhcp6c_write_duid() {
27 local mac="${1:-$(ifconfig "$client_device" | sed -ne 's/[[:space:]]*$//; s/.*HWaddr //p')}"
28 local pat="[0-9A-F][0-9A-F]"
29
30 case "$mac" in
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"
34
35 # low endian
36 if [ "$(printf \\1 | hexdump -n1 -ve '8/2 "" "%04x" ""')" = "0001" ]; then
37 printf \\x0a\\x00
38
39 # big endian
40 else
41 printf \\x00\\x0a
42 fi
43
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"
46 ;;
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)) )
52
53 # low endian
54 if [ "$(printf \\1 | hexdump -n1 -ve '8/2 "" "%04x" ""')" = "0001" ]; then
55 printf \\x$len_lo\\x$len_hi
56
57 # big endian
58 else
59 printf \\x$len_hi\\x$len_lo
60 fi
61
62 printf $(echo "$mac" | sed -e 's/^/\\x/; s/:/\\x/g')
63 logger -t dhcp6c "Using user provided DUID $mac"
64 ;;
65 *)
66 logger -t dhcp6c "Unable to derive DUID from interface '$client_device' and no valid user DUID given"
67 ;;
68 esac
69 }
70
71 dhcp6c_write_interface() {
72 local cfg=$1
73 local sla_id
74 local sla_len
75 local enabled
76
77 config_get_bool enabled "$cfg" enabled 0
78
79 if [ $enabled -ne 0 ]; then
80 config_get sla_id "$cfg" sla_id
81 config_get sla_len "$cfg" sla_len
82
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"
86 printf '\t};\n'
87 fi
88 }
89
90 dhcp6c_write_request() {
91 printf '\trequest %s;\n' $1 | sed -e s/_/-/g
92 }
93
94 dhcp6c_write_config() {
95 local pd
96 local na
97 config_get_bool pd basic pd 0
98 config_get_bool na basic na 0
99
100 printf 'interface %s {\n' "$client_ifname"
101
102 if [ $pd -ne 0 ]; then
103 printf '\tsend ia-pd 0;\n'
104 fi
105
106 if [ $na -ne 0 ]; then
107 printf '\tsend ia-na 0;\n'
108 fi
109
110 local rapid_commit
111 config_get_bool rapid_commit basic rapid_commit 0
112 [ $rapid_commit -ne 0 ] && printf '\tsend rapid-commit;\n'
113
114 local script
115 config_get script basic script
116 [ "$script" != "" ] && printf '\tscript "%s";\n' "$script"
117
118 local request
119 local value
120 for request in $DHCP6C_REQUEST_OPTIONS; do
121 config_get_bool value basic "$request" 0
122 [ $value -ne 0 ] && dhcp6c_write_request "$request"
123 done
124
125 printf '};\n\n'
126
127 if [ $pd -ne 0 ]; then
128 printf 'id-assoc pd 0 {\n'
129 config_foreach dhcp6c_write_interface interface
130 printf '};\n\n'
131 fi
132
133 if [ $na -ne 0 ]; then
134 printf 'id-assoc na 0 {\n'
135 printf '};\n\n'
136 fi
137
138 return 0
139 }
140
141 start() {
142 [ ! -e /etc/dhcp6cctlkey ] && `dd if=/dev/urandom count=1 2> /dev/null | md5sum | cut -d" " -f1 > /etc/dhcp6cctlkey`
143
144 [ -e /var/run/dhcp6c.pid ] && return 0
145
146 include /lib/network
147
148 config_load "dhcp6c"
149
150 local enabled
151 config_get_bool enabled basic enabled 0
152 [ $enabled -eq 0 ] && return 0
153
154 local user_duid
155 config_get user_duid basic duid
156
157 logger -t dhcp6c starting dhcp6c
158
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")
163
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
169
170 local debug
171 local debug_option
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
175
176 sleep 3
177 ACTION=start /sbin/hotplug-call dhcp6c
178
179 return 0
180 }
181
182 stop() {
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
187 return 0
188 }
189
190