source: packages/ipv6/wide-dhcpv6/files/dhcp6c.init @ 25461

Last change on this file since 25461 was 25461, checked in by jow, 5 years ago

[packages] wide-dhcpv6: generate used DUID from interface mac address before starting the client

File size: 3.2 KB
Line 
1#!/bin/sh /etc/rc.common
2
3DHCP6C_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
5get_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
14dhcp6c_write_duid() {
15        local ifname="$1"
16        local mac=$(ifconfig "$client_ifname" | sed -ne 's/.*HWaddr //p')
17        local oIFS="$IFS"; IFS=":"; set -- $mac; IFS="$oIFS"
18
19        # low endian
20        if [ "$(printf \\1 | hexdump -n1 -ve '8/2 "%04x"')" = "0001" ]; then
21                printf \\x0a\\x00
22
23        # big endian
24        else
25                printf \\x00\\x0a
26        fi
27
28        printf \\x00\\x03\\x00\\x06\\x$1\\x$2\\x$3\\x$4\\x$5\\x$6
29
30        logger -t dhcp6c "Using DUID 00:03:00:06:$1:$2:$3:$4:$5:$6"
31}
32
33dhcp6c_write_interface() {
34        local cfg=$1
35        local sla_id
36        local sla_len
37        local enabled
38       
39        config_get_bool enabled "$cfg" enabled 0
40         
41        if [ $enabled -ne 0 ]; then
42       
43                config_get sla_id "$cfg" sla_id
44                config_get sla_len "$cfg" sla_len
45
46                printf '\tprefix-interface %s {\n' "$(get_ifname $cfg)"
47                printf '\t\tsla-id %s;\n' "$sla_id"
48                printf '\t\tsla-len %s;\n' "$sla_len"
49                printf '\t};\n'
50       
51        fi
52       
53}
54
55dhcp6c_write_request() {
56        printf '\trequest %s;\n' $1 | sed -e s/_/-/g
57}
58
59dhcp6c_write_config() {
60
61        local pd
62        local na
63        config_get_bool pd basic pd 0
64        config_get_bool na basic na 0
65       
66        printf 'interface %s {\n' "$client_ifname"
67       
68        if [ $pd -ne 0 ]; then
69                printf '\tsend ia-pd 0;\n'
70        fi
71       
72        if [ $na -ne 0 ]; then
73                printf '\tsend ia-na 0;\n'
74        fi
75       
76        local rapid_commit
77        config_get_bool rapid_commit basic rapid_commit 0
78        [ $rapid_commit -ne 0 ] && printf '\tsend rapid-commit;\n'
79       
80        local script
81        config_get script basic script
82        [ "$script" != "" ] && printf '\tscript "%s";\n' "$script"
83       
84        local request
85        local value
86        for request in $DHCP6C_REQUEST_OPTIONS; do
87                config_get_bool value basic "$request" 0
88                [ $value -ne 0 ] && dhcp6c_write_request "$request"
89        done
90
91        printf '};\n\n'
92       
93        if [ $pd -ne 0 ]; then
94                printf 'id-assoc pd 0 {\n'
95                config_foreach dhcp6c_write_interface interface
96                printf '};\n\n'
97        fi
98       
99        if [ $na -ne 0 ]; then
100                printf 'id-assoc na 0 {\n'
101                printf '};\n\n'
102        fi
103       
104        return 0
105}
106
107start() {
108
109        [ ! -e /etc/dhcp6cctlkey ] && `dd if=/dev/urandom count=1 2> /dev/null | md5sum | cut -d" " -f1 > /etc/dhcp6cctlkey`
110
111        [ -e /var/run/dhcp6c.pid ] && return 0
112
113        include /lib/network
114
115        config_load "dhcp6c"
116       
117        local enabled
118        config_get_bool enabled basic enabled 0
119        [ $enabled -eq 0 ] && return 0
120       
121        logger -t dhcp6c starting dhcp6c
122       
123        local client_interface
124        config_get client_interface basic interface
125        local client_ifname=$(get_ifname "$client_interface")
126       
127        local config_file="/var/etc/dhcp6c.conf"
128        local duid_file="/var/dhcp6c_duid"
129        mkdir -m 755 -p /var/etc
130        dhcp6c_write_config > $config_file
131        dhcp6c_write_duid > $duid_file
132       
133        local debug
134        local debug_option
135        config_get_bool debug basic debug 0
136        [ $debug -eq 1 ] && debug_option="-D"
137        /usr/sbin/dhcp6c -c $config_file $debug_option $client_ifname
138       
139        sleep 3
140        ACTION=start /sbin/hotplug-call dhcp6c
141       
142        return 0
143       
144}
145
146stop() {
147
148        logger -t dhcp6c stopping dhcp6c
149        rm -f /var/etc/dhcp6c.conf
150        kill -TERM `cat /var/run/dhcp6c.pid`
151        ACTION=stop /sbin/hotplug-call dhcp6c
152        return 0
153       
154}
155
156
Note: See TracBrowser for help on using the repository browser.