56e96c63baabc0c320da9b3db3d4c5c916d6bb97
[openwrt/openwrt.git] / package / base-files / files / lib / preinit / 10_indicate_preinit
1 # Copyright (C) 2006 OpenWrt.org
2 # Copyright (C) 2010 Vertical Communications
3
4 preinit_ip_config() {
5 local netdev vid
6
7 netdev=${1%\.*}
8 vid=${1#*\.}
9
10 if [ "$vid" = "$netdev" ]; then
11 vid=
12 fi
13
14 grep -q "$netdev" /proc/net/dev || return
15
16 if [ -n "$vid" ]; then
17 ip link add link $netdev name $1 type vlan id $vid
18 fi
19
20 ip link set dev $netdev up
21 ip -4 address add $pi_ip/$pi_netmask broadcast $pi_broadcast dev $1
22 }
23
24 preinit_config_switch() {
25 local role roles ports device enable reset
26
27 local name=$1
28 local lan_if=$2
29
30 json_select switch
31 json_select $name
32
33 json_get_vars enable reset
34
35 if [ "$reset" -eq "1" ]; then
36 swconfig dev $name set reset
37 fi
38 swconfig dev $name set enable_vlan $enable
39
40 if json_is_a roles array; then
41 json_get_keys roles roles
42 json_select roles
43
44 for role in $roles; do
45 json_select "$role"
46 json_get_vars ports device
47 json_select ..
48
49 if [ "$device" = "$lan_if" ]; then
50 swconfig dev $name vlan $role set ports "$ports"
51 fi
52 done
53
54 json_select ..
55 fi
56
57 swconfig dev $name set apply
58
59 json_select ..
60 json_select ..
61 }
62
63 preinit_config_board() {
64 /bin/board_detect /tmp/board.json
65
66 [ -f "/tmp/board.json" ] || return
67
68 . /usr/share/libubox/jshn.sh
69
70 json_init
71 json_load "$(cat /tmp/board.json)"
72
73 json_select network
74 json_select "lan"
75 json_get_vars device
76 json_get_values ports ports
77 json_select ..
78 json_select ..
79
80 [ -n "$device" -o -n "$ports" ] || return
81
82 # swconfig uses $device and DSA uses ports
83 [ -z "$ports" ] && {
84 ports="$device"
85 }
86
87 # only use the first one
88 ifname=${ports%% *}
89
90 if [ -x /sbin/swconfig ]; then
91 # configure the switch, if present
92
93 json_get_keys keys switch
94 for key in $keys; do
95 preinit_config_switch $key $ifname
96 done
97 else
98 # trim any vlan ids
99 ifname=${ifname%\.*}
100 fi
101
102 pi_ifname=$ifname
103
104 preinit_ip_config $pi_ifname
105 }
106
107 preinit_ip() {
108 [ "$pi_preinit_no_failsafe" = "y" ] && return
109
110 # if the preinit interface isn't specified and ifname is set in
111 # preinit.arch use that interface
112 if [ -z "$pi_ifname" ]; then
113 pi_ifname=$ifname
114 fi
115
116 if [ -n "$pi_ifname" ]; then
117 preinit_ip_config $pi_ifname
118 elif [ -d "/etc/board.d/" ]; then
119 preinit_config_board
120 fi
121
122 preinit_net_echo "Doing OpenWrt Preinit\n"
123 }
124
125 preinit_ip_deconfig() {
126 [ -n "$pi_ifname" ] && grep -q "$pi_ifname" /proc/net/dev && {
127 local netdev vid
128
129 netdev=${pi_ifname%\.*}
130 vid=${pi_ifname#*\.}
131
132 if [ "$vid" = "$netdev" ]; then
133 vid=
134 fi
135
136 ip -4 address flush dev $pi_ifname
137 ip link set dev $netdev down
138
139 if [ -n "$vid" ]; then
140 ip link delete $pi_ifname
141 fi
142 }
143 }
144
145 preinit_net_echo() {
146 [ -n "$pi_ifname" ] && grep -q "$pi_ifname" /proc/net/dev && {
147 {
148 [ "$pi_preinit_net_messages" = "y" ] || {
149 [ "$pi_failsafe_net_message" = "true" ] &&
150 [ "$pi_preinit_no_failsafe_netmsg" != "y" ]
151 }
152 } && netmsg $pi_broadcast "$1"
153 }
154 }
155
156 pi_indicate_preinit() {
157 set_state preinit
158 }
159
160 boot_hook_add preinit_main preinit_ip
161 boot_hook_add preinit_main pi_indicate_preinit