4 .
/lib
/functions
/network.sh
15 local vlans
=$
(bridge vlan show dev
"$port" |
sed -ne 's#^[^ ]* \+\([0-9]\+\).*$#\1#p')
18 for vlan
in $vlans; do
19 bridge vlan del vid
"$vlan" dev
"$port" $self
27 config_get brname
"$cfg" bridge
"switch0"
29 case " $bridge_names " in
30 *" $brname "*) return 1 ;;
33 append bridge_names
"$brname"
35 export -n "bridge=$brname"
42 [1-9]|
[1-9][0-9]|
[1-9][0-9][0-9]|
[1-4][0-9][0-9][0-9])
43 if [ $vid -gt 4096 ]; then
59 add_bridge
"$cfg" ||
return 0
61 # Prevent netifd from picking up our switch bridge just yet
62 network_defer_device
"$bridge"
64 # (Re)create switch bridge device in case it is not yet set up
65 local filtering
=$
(cat "/sys/class/net/$bridge/bridge/vlan_filtering" 2>/dev
/null
)
66 if [ ${filtering:-0} != 1 ]; then
67 ip link
set "$bridge" down
2>/dev
/null
68 ip link delete dev
"$bridge" 2>/dev
/null
69 ip link add name
"$bridge" type bridge
70 echo 1 > "/sys/class/net/$bridge/bridge/vlan_filtering"
73 ip link
set "$bridge" up
75 # Unbridge DSA ports and flush any VLAN filters on them, they're added back later
77 for port
in /sys
/class
/net
/*"/upper_${cfg}"; do
78 if [ -e "$port" ]; then
82 ip link
set "$port" nomaster
84 # Unbridging the port should already clear VLANs, but be safe
85 clear_port_vlans
"$port"
89 # Clear any VLANs on the switch bridge, they're added back later
90 clear_port_vlans
"$bridge" self
95 local bridge vlan ports
97 config_get bridge
"$cfg" bridge
"switch0"
98 config_get vlan
"$cfg" vlan
99 config_get ports
"$cfg" ports
101 validate_vid
"$vlan" ||
{
102 warn
"VLAN section '$cfg' specifies an invalid VLAN ID '$vlan'"
108 for port
in $ports; do
129 # Add the port to the switch bridge and delete the default
130 # VLAN 1 if it is not yet joined to the bridge.
131 if [ ! -e "/sys/class/net/$port/upper_$bridge" ]; then
132 ip link
set dev
"$port" up
133 ip link
set dev
"$port" master
"$bridge"
135 # Get rid of default VLAN 1
136 bridge vlan del vid
1 dev
"$port"
139 # Promote the first untagged VLAN of this port to the PVID
140 if [ "$tag" = untagged
] && ! bridge vlan show dev
"$port" |
grep -qi pvid
; then
144 # Add VLAN filter entry for port
145 bridge vlan add dev
"$port" vid
$vlan $pvid $tag
148 # Make the switch bridge itself handle the VLAN as well
149 bridge vlan add dev
"$bridge" self vid
$vlan tagged
154 config_foreach setup_bridge vlan_filter
155 config_foreach setup_bridge_vlan vlan_filter
157 # Ready switch bridge devices
159 for bridge
in $bridge_names; do
160 network_ready_device
"$bridge"
168 add_bridge
"$cfg" ||
return 0
170 printf "Bridge: %s\n" "$bridge"
174 for port
in "/sys/class/net/$bridge/lower_"*; do
175 [ -e "$port" ] ||
continue
177 port
=${port##*/lower_}
179 printf " | %-5s" "$port"
185 for port
in $ports; do
186 local carrier
=$
(cat "/sys/class/net/$port/carrier")
187 local duplex
=$
(cat "/sys/class/net/$port/duplex")
188 local speed
=$
(cat "/sys/class/net/$port/speed")
190 if [ ${carrier:-0} -eq 0 ]; then
191 printf " | %-5s" "down"
193 [ "$duplex" = "full" ] && duplex
=F || duplex
=H
194 printf " | %4d%s" "$speed" "$duplex"
198 local vlans
=$
(bridge vlan show dev
"$bridge" |
sed -ne 's#^[^ ]* \+\([0-9]\+\).*$#\1#p')
200 for vlan
in $vlans; do
201 printf " |\n%4d " "$vlan"
203 for port
in $ports; do
204 local pvid
="" utag
="" word
205 for word
in $
(bridge vlan show dev
"$port" vid
"$vlan"); do
209 Untagged
) utag
="u" ;;
213 printf " | %-2s " "$utag$pvid"
222 config_foreach show_bridge vlan_filter
228 apply
) apply_config
;;
230 echo "Usage: ${0##*/} show"
231 echo " ${0##*/} apply"