#!/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' uci commit network 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 }