iopsys-feed/netmode/files/etc/netmodes/bridged/scripts/10-bridged
Mohd Husaam Mehdi ec20da706b netmode: add support for more netmodes
* routed-vlan-per-service
* routed-mac-per-service
* bridged now accepts cvlanid and svlanid for lan and wan
2025-11-24 15:41:33 +05:30

222 lines
6.1 KiB
Bash

#!/bin/sh
. /lib/functions.sh
. /usr/share/libubox/jshn.sh
. /lib/netmode/netmode_helpers.sh
source "/etc/device_info"
l2_mcast_config() {
# configure L2 mcast config for snooping
logger -s -p user.info -t "netmode" "Generating L2 mcast configuration"
# remove proxy sections
uci -q delete mcast.igmp_proxy_1
uci -q delete mcast.mc_proxy_MLD
# add igmp_snooping section
uci -q set mcast.igmp_snooping_1=snooping
uci -q set mcast.igmp_snooping_1.enable='1'
uci -q set mcast.igmp_snooping_1.proto='igmp'
uci -q set mcast.igmp_snooping_1.version='2'
uci -q set mcast.igmp_snooping_1.robustness='2'
uci -q set mcast.igmp_snooping_1.query_interval='125'
uci -q set mcast.igmp_snooping_1.query_response_interval='100'
uci -q set mcast.igmp_snooping_1.last_member_query_interval='10'
uci -q set mcast.igmp_snooping_1.fast_leave='1'
uci -q set mcast.igmp_snooping_1.snooping_mode='2'
uci -q set mcast.igmp_snooping_1.interface='br-lan'
uci -q add_list mcast.igmp_snooping_1.filter='239.0.0.0/8'
# add mld_snooping section
uci -q set mcast.mld_snooping_1=snooping
uci -q set mcast.mld_snooping_1.enable='1'
uci -q set mcast.mld_snooping_1.proto='mld'
uci -q set mcast.mld_snooping_1.version='2'
uci -q set mcast.mld_snooping_1.robustness='2'
uci -q set mcast.mld_snooping_1.query_interval='125'
uci -q set mcast.mld_snooping_1.query_response_interval='100'
uci -q set mcast.mld_snooping_1.last_member_query_interval='10'
uci -q set mcast.mld_snooping_1.fast_leave='1'
uci -q set mcast.mld_snooping_1.snooping_mode='2'
uci -q set mcast.mld_snooping_1.interface='br-lan'
uci -q commit mcast
}
create_vlan_device() {
local ifname="$1"
local vlanid="$2"
local qinq="$3"
local name=""
if uci -q add network device; then
if [ "$qinq" = "1" ]; then
uci -q set network.@device[-1].type="8021ad"
else
uci -q set network.@device[-1].type="8021q"
fi
name="${ifname}.${vlanid}"
uci -q set network.@device[-1].name="$name"
uci -q set network.@device[-1].ifname="$ifname"
uci -q set network.@device[-1].vid="$vlanid"
echo "$name"
fi
}
# if svlanid is present, 8021ad section will be created
# if cvlanid is present, 8021q section will be created
# if both are present, 8021q section will be created on top of 8021ad
# if none are present, ifname will be returned
add_vlan_device() {
local ifname="$1"
local cvlanid="$2"
local svlanid="$3"
local dev_name="$ifname"
[ -n "$ifname" ] || return
if [ -n "$svlanid" ]; then
dev_name="$(create_vlan_device "$ifname" "$svlanid" "1")"
fi
if [ -n "$dev_name" ] && [ -n "$cvlanid" ]; then
dev_name="$(create_vlan_device "$dev_name" "$cvlanid" "0")"
fi
echo "$dev_name"
}
lanlist_to_ifnames() {
local list="$1"
local out=""
local lan ifname
local idx=0
[ -n "$list" ] || { echo ""; return; }
IFS=','
for lan in $list; do
# just to be safe
if [ "$idx" -gt 255 ]; then
break
fi
idx="$((idx + 1))"
ifname="$(uci -q get network.$lan.name)"
[ -n "$ifname" ] || continue
if [ -z "$out" ]; then
out="$ifname"
else
out="$out,$ifname"
fi
done
unset IFS
echo "$out"
}
l2_network_config() {
logger -s -p user.info -t "netmode" "Generating L2 network configuration"
# Configure L2 Network Mode
uci -q set network.lan=interface
uci -q set network.lan.proto='dhcp'
uci -q set network.lan.vendorid="$(uci -q get network.wan.vendorid)"
uci -q set network.lan.clientid="$(uci -q get network.wan.clientid)"
uci -q set network.lan.reqopts="$(uci -q get network.wan.reqopts)"
uci -q set network.lan.sendopts="$(uci -q get network.wan.sendopts)"
uci -q set network.lan.device='br-lan'
uci -q set network.lan.force_link='1'
uci -q set network.lan6=interface
uci -q set network.lan6.proto='dhcpv6'
uci -q set network.lan6.device='@lan'
uci -q set network.lan6.reqprefix='no'
uci -q set network.wan.disabled='1'
uci -q set network.wan6.disabled='1'
uci -q delete network.br_lan.ports
uci -q set network.br_lan.bridge_empty='1'
# delete interfaces apart from lan, lan6, wan, wan6
delete_extra_interfaces
# delete existing vlan and macvlan sections to prevent clashes
delete_vlan_and_macvlan_sections
# convert LAN1,LAN2,LAN3 to eth1,eth2,eth3
converted_port_list="$(lanlist_to_ifnames "$NETMODE_port_list")"
add_port_to_br_lan() {
port="$1"
[ -n "$port" -a -d /sys/class/net/$port ] || continue
if [ -n "$converted_port_list" ]; then
# Check if $port appears as an exact item in comma-separated converted_port_list
case ",$converted_port_list," in
*,"$port",*) ;; # match , do nothing
*) continue ;; # no match , skip this port
esac
fi
# get the vlan device name from port name
device_name="$(add_vlan_device "$port" "$NETMODE_lan_cvlanid" "$NETMODE_lan_svlanid")"
uci add_list network.br_lan.ports="$device_name"
}
if [ -f /etc/board.json ]; then
json_load_file /etc/board.json
json_select network
json_select lan
if json_is_a ports array; then
json_for_each_item add_port_to_br_lan ports
else
json_get_var device device
[ -n "$device" ] && uci add_list network.br_lan.ports="$device"
fi
json_select ..
json_select wan 2>/dev/null
json_get_var device device
# get the vlan device name from port name
device_name="$(add_vlan_device "$device" "$NETMODE_wan_cvlanid" "$NETMODE_wan_svlanid")"
[ -n "$device_name" ] && uci add_list network.br_lan.ports="$device_name"
json_cleanup
fi
uci -q commit network
# Disable DHCP Server
uci -q set dhcp.lan.ignore=1
uci -q commit dhcp
/etc/init.d/odhcpd disable
# Disable SSDPD
uci -q set ssdpd.ssdp.enabled="0"
uci -q commit ssdpd
# Update CWMP Agent WAN Interface
uci -q set cwmp.cpe.default_wan_interface="lan"
uci -q commit cwmp
# Update gateway WAN Interface
uci -q set gateway.global.wan_interface="lan"
uci -q commit gateway
# disable firewall
uci -q set firewall.globals.enabled="0"
uci -q commit firewall
}
l2_network_config
l2_mcast_config
# If device is already boot-up, assume netmode changed during runtime
if [ -f /var/run/boot_complete ]; then
/etc/init.d/odhcpd stop 2>/dev/null
for config in network dhcp ssdpd cwmp gateway firewall mcast; do
ubus call uci commit "{\"config\":\"$config\"}"
sleep 1
done
fi