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