mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-26 17:01:14 +00:00
f017f617ae
current preinit code in base-files doesn't config switch when there are no port roles defined. But this kind of configuration exists on single port devices where switch vlan is simply disabled. configure reset and enable_vlan property when a switch node exist. Signed-off-by: Chuanhong Guo <gch981213@gmail.com>
157 lines
2.8 KiB
Bash
157 lines
2.8 KiB
Bash
#!/bin/sh
|
|
# Copyright (C) 2006 OpenWrt.org
|
|
# Copyright (C) 2010 Vertical Communications
|
|
|
|
preinit_ip_config() {
|
|
local netdev vid
|
|
|
|
netdev=${1%\.*}
|
|
vid=${1#*\.}
|
|
|
|
if [ "$vid" = "$netdev" ]; then
|
|
vid=
|
|
fi
|
|
|
|
grep -q "$netdev" /proc/net/dev || return
|
|
|
|
if [ -n "$vid" ]; then
|
|
ip link add link $netdev name $1 type vlan id $vid
|
|
fi
|
|
|
|
ip link set dev $netdev up
|
|
ip -4 address add $pi_ip/$pi_netmask broadcast $pi_broadcast dev $1
|
|
}
|
|
|
|
preinit_config_switch() {
|
|
local role roles ports device enable reset
|
|
|
|
local name=$1
|
|
local lan_if=$2
|
|
|
|
json_select switch
|
|
json_select $name
|
|
|
|
json_get_vars enable reset
|
|
|
|
if [ "$reset" -eq "1" ]; then
|
|
swconfig dev $name set reset
|
|
fi
|
|
swconfig dev $name set enable_vlan $enable
|
|
|
|
if json_is_a roles array; then
|
|
json_get_keys roles roles
|
|
json_select roles
|
|
|
|
for role in $roles; do
|
|
json_select "$role"
|
|
json_get_vars ports device
|
|
json_select ..
|
|
|
|
if [ "$device" = "$lan_if" ]; then
|
|
swconfig dev $name vlan $role set ports "$ports"
|
|
fi
|
|
done
|
|
|
|
json_select ..
|
|
fi
|
|
|
|
swconfig dev $name set apply
|
|
|
|
json_select ..
|
|
json_select ..
|
|
}
|
|
|
|
preinit_config_board() {
|
|
/bin/board_detect /tmp/board.json
|
|
|
|
[ -f "/tmp/board.json" ] || return
|
|
|
|
. /usr/share/libubox/jshn.sh
|
|
|
|
json_init
|
|
json_load "$(cat /tmp/board.json)"
|
|
|
|
json_select network
|
|
json_select "lan"
|
|
json_get_vars ifname
|
|
json_select ..
|
|
json_select ..
|
|
|
|
[ -n "$ifname" ] || return
|
|
|
|
# only use the first one
|
|
ifname=${ifname%% *}
|
|
|
|
if [ -x /sbin/swconfig ]; then
|
|
# configure the switch, if present
|
|
|
|
json_get_keys keys switch
|
|
for key in $keys; do
|
|
preinit_config_switch $key $ifname
|
|
done
|
|
else
|
|
# trim any vlan ids
|
|
ifname=${ifname%\.*}
|
|
fi
|
|
|
|
pi_ifname=$ifname
|
|
|
|
preinit_ip_config $pi_ifname
|
|
}
|
|
|
|
preinit_ip() {
|
|
[ "$pi_preinit_no_failsafe" = "y" ] && return
|
|
|
|
# if the preinit interface isn't specified and ifname is set in
|
|
# preinit.arch use that interface
|
|
if [ -z "$pi_ifname" ]; then
|
|
pi_ifname=$ifname
|
|
fi
|
|
|
|
if [ -n "$pi_ifname" ]; then
|
|
preinit_ip_config $pi_ifname
|
|
elif [ -d "/etc/board.d/" ]; then
|
|
preinit_config_board
|
|
fi
|
|
|
|
preinit_net_echo "Doing OpenWrt Preinit\n"
|
|
}
|
|
|
|
preinit_ip_deconfig() {
|
|
[ -n "$pi_ifname" ] && grep -q "$pi_ifname" /proc/net/dev && {
|
|
local netdev vid
|
|
|
|
netdev=${pi_ifname%\.*}
|
|
vid=${pi_ifname#*\.}
|
|
|
|
if [ "$vid" = "$netdev" ]; then
|
|
vid=
|
|
fi
|
|
|
|
ip -4 address flush dev $pi_ifname
|
|
ip link set dev $netdev down
|
|
|
|
if [ -n "$vid" ]; then
|
|
ip link delete $pi_ifname
|
|
fi
|
|
}
|
|
}
|
|
|
|
preinit_net_echo() {
|
|
[ -n "$pi_ifname" ] && grep -q "$pi_ifname" /proc/net/dev && {
|
|
{
|
|
[ "$pi_preinit_net_messages" = "y" ] || {
|
|
[ "$pi_failsafe_net_message" = "true" ] &&
|
|
[ "$pi_preinit_no_failsafe_netmsg" != "y" ]
|
|
}
|
|
} && netmsg $pi_broadcast "$1"
|
|
}
|
|
}
|
|
|
|
pi_indicate_preinit() {
|
|
set_state preinit
|
|
}
|
|
|
|
boot_hook_add preinit_main preinit_ip
|
|
boot_hook_add preinit_main pi_indicate_preinit
|