#!/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='psk2' 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='sae' 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`" # Add WAN to br-lan bridge echo "Adding WAN to br-lan bridge" uci set network.lan.ifname="$(uci get network.lan.ifname) eth1" # assuming eth1 is your WAN interface uci commit network # Delete WAN zone from firewall echo "Deleting the WAN zone from the firewall" wan_zone=$(uci show firewall | grep '=zone' | grep '.name=' | grep 'wan' | cut -d'.' -f2) if [ ! -z "$wan_zone" ]; then uci delete firewall.$wan_zone echo "WAN zone deleted" else echo "No WAN zone found" fi # Commit the changes uci commit firewall uci commit network # Commit Changes and Restart Network uci commit sync /etc/init.d/network restart # Reboot the device #echo "Please reboot 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 }