You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

355 lines
11 KiB
Bash

#!/bin/sh /etc/rc.common
START=99
STOP=70
load_easymesh_config() {
enable=$(uci -q get easymesh.config.enabled)
mesh_bat0=$(uci -q get network.bat0)
ap_mode=$(uci -q get easymesh.config.ap_mode)
lan=$(uci -q get network.lan.ifname)
ipaddr=$(uci -q get easymesh.config.ipaddr)
netmask=$(uci -q get easymesh.config.netmask)
gateway=$(uci -q get easymesh.config.gateway)
dns=$(uci -q get easymesh.config.dns)
ap_ipaddr=$(uci -q get network.lan.ipaddr)
ap_ipaddr1=$(sed -n '1p' /etc/easymesh 2>/dev/null)
apRadio=$(uci -q get easymesh.config.apRadio)
kvr=$(uci -q get easymesh.config.kvr)
iapp=$(uci -q get easymesh.config.iapp)
brlan=$(uci -q get network.@device[0].name)
role=$(uci -q get easymesh.config.role)
backbone=$(uci get easymesh.@easymesh[0].backbone)
apname=$(uci get easymesh.@easymesh[0].apname)
appass=$(uci get easymesh.@easymesh[0].appass)
}
ap_mode_stop() {
ap_ipaddr=$(uci -q get network.lan.ipaddr)
ap_ipaddr1=$(sed -n '1p' /etc/easymesh 2>/dev/null)
dns1=$(sed -n '2p' /etc/easymesh 2>/dev/null)
if [ "$ap_ipaddr" = "$ap_ipaddr1" ]; then
uci -q delete network.lan.gateway
uci -q del_list network.lan.dns=$dns1
uci commit network
echo "" >/etc/easymesh
uci -q delete dhcp.lan.dynamicdhcp
uci -q delete dhcp.lan.ignore
uci commit dhcp
/etc/init.d/odhcpd enable && /etc/init.d/odhcpd start
/etc/init.d/firewall enable && /etc/init.d/firewall start >/dev/null 2>&1
fi
}
add_wifi_mesh() {
mesh_nwi_mesh=$(uci -q get network.nwi_mesh_${apall})
mesh_apRadio=$(uci -q get wireless.mesh_${apall}.device)
mesh_mesh=$(uci -q get wireless.mesh_${apall})
mesh_id=$(uci -q get easymesh.config.mesh_id)
mobility_domain=$(uci -q get easymesh.config.mobility_domain)
key=$(uci -q get easymesh.config.key)
encryption=$(uci -q get easymesh.config.encryption)
if [ "$mesh_nwi_mesh" != "interface" ]; then
uci set network.nwi_mesh_$apall=interface
uci set network.nwi_mesh_$apall.proto='batadv_hardif'
uci set network.nwi_mesh_$apall.master='bat0'
uci set network.nwi_mesh_$apall.mtu='1536'
# adding batman to the 'lan' zone in fw
uci del_list firewall.lan.network="bat0"
uci add_list firewall.lan.network='bat0'
uci del_list firewall.lan.network="nwi_mesh_$apall"
uci add_list firewall.lan.network="nwi_mesh_$apall"
uci commit network
uci commit firewall
/etc/init.d/firewall restart
fi
if [ "$mesh_mesh" != "wifi-iface" ]; then
uci set wireless.mesh_$apall=wifi-iface
uci set wireless.mesh_$apall.device=$apall
uci set wireless.mesh_$apall.ifname=mesh_${apall}
uci set wireless.mesh_$apall.network=nwi_mesh_${apall}
uci set wireless.mesh_$apall.mode='mesh'
uci set wireless.mesh_$apall.mesh_id=$mesh_id
uci set wireless.mesh_$apall.mesh_fwding='1'
uci set wireless.mesh_$apall.mesh_ttl='1'
uci set wireless.mesh_$apall.mcast_rate='24000'
uci set wireless.mesh_$apall.disabled='0'
uci commit wireless
fi
if [ "$mesh_mesh" = "wifi-iface" ]; then
if [ "$mesh_apRadio" != "$apall" ]; then
uci set wireless.mesh_$apall.device=$apall
uci commit wireless
fi
fi
if [ "$encryption" != 1 ]; then
apnum="${mesh_apRadio#radio}"
apnum=$((apnum + 1))
found=0
# Check all existing wifinetX and remove if SSID matches with $mesh_id and mode is 'ap'
while uci get wireless.wifinet$apnum > /dev/null 2>&1; do
existing_ssid=$(uci get wireless.wifinet$apnum.ssid 2> /dev/null)
existing_mode=$(uci get wireless.wifinet$apnum.mode 2> /dev/null)
if [ "$existing_ssid" = "$mesh_id" ] && [ "$existing_mode" = "ap" ]; then
if [ $found -eq 0 ]; then
found=1
else
uci delete wireless.wifinet$apnum
fi
fi
apnum=$((apnum + 1))
done
uci commit wireless
if [ $found -eq 0 ]; then
uci set wireless.mesh_$apall.encryption='none'
uci set wireless.wifinet$apnum=wifi-iface
uci set wireless.wifinet$apnum.device=$mesh_apRadio
uci set wireless.wifinet$apnum.mode='ap'
uci set wireless.wifinet$apnum.ssid=$mesh_id
uci set wireless.wifinet$apnum.encryption='none'
uci set wireless.wifinet$apnum.key=$key
uci set wireless.wifinet$apnum.ieee80211r='1'
uci set wireless.wifinet$apnum.mobility_domain=$mobility_domain
uci set wireless.wifinet$apnum.ft_over_ds='0'
uci set wireless.wifinet$apnum.ft_psk_generate_local='1'
uci set wireless.wifinet$apnum.network='lan'
uci commit wireless
fi
else
apnum="${mesh_apRadio#radio}"
apnum=$((apnum + 1))
found=0
# Check all existing wifinetX and remove if SSID matches with $mesh_id and mode is 'ap'
while uci get wireless.wifinet$apnum > /dev/null 2>&1; do
existing_ssid=$(uci get wireless.wifinet$apnum.ssid 2> /dev/null)
existing_mode=$(uci get wireless.wifinet$apnum.mode 2> /dev/null)
if [ "$existing_ssid" = "$mesh_id" ] && [ "$existing_mode" = "ap" ]; then
if [ $found -eq 0 ]; then
found=1
else
uci delete wireless.wifinet$apnum
fi
fi
apnum=$((apnum + 1))
done
uci commit wireless
if [ $found -eq 0 ]; then
uci set wireless.mesh_$apall.encryption='sae'
uci set wireless.mesh_$apall.key=$key
uci set wireless.wifinet$apnum=wifi-iface
uci set wireless.wifinet$apnum.device=$apall
uci set wireless.wifinet$apnum.mode='ap'
uci set wireless.wifinet$apnum.ssid=$mesh_id
uci set wireless.wifinet$apnum.encryption='sae'
uci set wireless.wifinet$apnum.key=$key
uci set wireless.wifinet$apnum.ieee80211r='1'
uci set wireless.wifinet$apnum.mobility_domain=$mobility_domain
uci set wireless.wifinet$apnum.ft_over_ds='0'
uci set wireless.wifinet$apnum.ft_psk_generate_local='1'
uci set wireless.wifinet$apnum.network='lan'
uci commit wireless
fi
fi
}
add_kvr() {
kvr=$(uci -q get easymesh.config.kvr)
mobility_domain=$(uci -q get easymesh.config.mobility_domain)
iapp=$(uci -q get easymesh.config.iapp)
for apall in $(uci -X show wireless | grep wifi-device | awk -F'[.=]' '{print $2}'); do
if [ "$kvr" = 1 ]; then
uci set wireless.default_$apall.ieee80211k='1'
uci set wireless.default_$apall.rrm_neighbor_report='1'
uci set wireless.default_$apall.rrm_beacon_report='1'
uci set wireless.default_$apall.ieee80211v='1'
uci set wireless.default_$apall.bss_transition='1'
uci set wireless.default_$apall.ieee80211r='1'
uci set wireless.default_$apall.encryption='psk2+ccmp'
uci set wireless.default_$apall.mobility_domain=$mobility_domain
uci set wireless.default_$apall.ft_over_ds='1'
uci set wireless.default_$apall.ft_psk_generate_local='1'
uci commit wireless
else
uci -q delete wireless.default_$apall.ieee80211k
uci -q delete wireless.default_$apall.ieee80211v
uci -q delete wireless.default_$apall.ieee80211r
uci commit wireless
fi
if [ "$iapp" = 1 ]; then
uci set wireless.default_$apall.iapp_interface='br-lan'
uci commit wireless
else
uci -q delete wireless.default_$apall.iapp_interface
uci commit wireless
fi
done
}
add_dawn() {
kvr=$(uci -q get easymesh.config.kvr)
rssi_val=$(uci -q get easymesh.config.rssi_val)
low_rssi_val=$(uci -q get easymesh.config.low_rssi_val)
if [ "$kvr" = 1 ]; then
uci set dawn.@metric[0].rssi_val=$rssi_val
uci set dawn.@metric[0].low_rssi_val=$low_rssi_val
uci commit dawn
/etc/init.d/dawn enable && /etc/init.d/dawn start
else
/etc/init.d/dawn stop && /etc/init.d/dawn disable
fi
}
set_easymesh() {
load_easymesh_config
if [ "$enable" = 1 ]; then
if [ "$mesh_bat0" != "interface" ]; then
uci set network.bat0=interface
uci set network.bat0.proto='batadv'
uci set network.bat0.routing_algo='BATMAN_IV'
uci set network.bat0.aggregated_ogms='1'
uci set network.bat0.ap_isolation='0'
uci set network.bat0.bonding='1'
uci set network.bat0.bridge_loop_avoidance='1'
uci set network.bat0.distributed_arp_table='1'
uci set network.bat0.fragmentation='1'
# uci set network.bat0.gw_bandwidth='10000/2000'
# uci set network.bat0.gw_sel_class='20'
uci set network.bat0.hop_penalty='30'
uci set network.bat0.isolation_mark='0x00000000/0x00000000'
uci set network.bat0.log_level='0'
uci set network.bat0.multicast_fanout='16'
uci set network.bat0.multicast_mode='1'
uci set network.bat0.network_coding='0'
uci set network.bat0.orig_interval='1000'
if [ "$role" = "server" ]; then
uci set network.bat0.gw_mode='server'
elif [ "$role" = "client" ]; then
uci set network.bat0.gw_mode='client'
else
uci set network.bat0.gw_mode='off'
fi
if [ "$brlan" = "br-lan" ]; then
uci add_list network.@device[0].ports='bat0'
else
uci set network.lan.ifname="${lan} bat0"
fi
uci commit network
fi
if [ "$apRadio" = "all" ]; then
for apall in $(uci -X show wireless | grep wifi-device | awk -F'[.=]' '{print $2}'); do
add_wifi_mesh
done
else
apall=$apRadio
add_wifi_mesh
fi
add_kvr
add_dawn
if [ "$ap_mode" = 1 ]; then
# Backup Configurations
cp /etc/config/wireless /etc/config/wireless.backup
cp /etc/config/network /etc/config/network.backup
cp /etc/config/dhcp /etc/config/dhcp.backup
# Configure Bridge and Interfaces
uci set network.lan.type='bridge'
uci set network.lan.ifname="$(uci get network.lan.ifname) $(uci get network.wan.ifname)"
uci del network.wan.ifname
uci set wireless.mesh_$apall.mesh_fwding='1'
# Disable dnsmasq
uci commit dhcp; echo '' > /etc/config/dhcp
/etc/init.d/dnsmasq disable
/etc/init.d/dnsmasq stop
# Switch LAN to DHCP Client
echo "Switching the LAN interface to DHCP client"
uci del network.lan.broadcast
uci del network.lan.dns
uci del network.lan.gateway
uci del network.lan.ipaddr
uci del network.lan.netmask
uci set network.lan.proto='dhcp'
uci set system.@system[0].hostname=$gateway
uci set network.lan.hostname="`uci get system.@system[0].hostname`"
# Commit Changes and Restart Network
uci commit
sync
/etc/init.d/network restart
# Reboot the device
echo "Rebooting the device..."
reboot
fi
else
ap_mode_stop
if [ "$mesh_bat0" = "interface" ]; then
uci -q delete network.bat0
if [ "$brlan" = "br-lan" ]; then
uci -q del_list network.@device[0].ports='bat0'
else
sed -i 's/ bat0//' /etc/config/network
fi
uci commit network
fi
for apall in $(uci -X show wireless | grep wifi-device | awk -F'[.=]' '{print $2}'); do
mesh_nwi_mesh=$(uci -q get network.nwi_mesh_${apall})
mesh_mesh=$(uci -q get wireless.mesh_${apall})
if [ "$mesh_nwi_mesh" = "interface" ]; then
uci -q delete network.nwi_mesh_$apall
uci commit network
fi
if [ "$mesh_mesh" = "wifi-iface" ]; then
uci -q delete wireless.mesh_$apall
uci commit wireless
fi
done
add_kvr
add_dawn
if [ "$ap_mode" = 1 ]; then
ap_mode_stop
fi
fi
/etc/init.d/network restart
}
start() {
set_easymesh
}
stop() {
ap_mode_stop
}
restart() {
set_easymesh
}