diff --git a/Makefile b/Makefile index 2a16a2c..57d159e 100755 --- a/Makefile +++ b/Makefile @@ -7,8 +7,8 @@ include $(TOPDIR)/rules.mk LUCI_TITLE:=LuCI Support for easymesh LUCI_DEPENDS:= +kmod-cfg80211 +batctl-default +kmod-batman-adv +dawn +bash -PKG_VERSION:=2.7 -PKG_RELEASE:=3 +PKG_VERSION:=2.8.0 +PKG_RELEASE:=0 include $(TOPDIR)/feeds/luci/luci.mk diff --git a/luasrc/model/cbi/easymesh.lua b/luasrc/model/cbi/easymesh.lua index 5c156c1..577aa1a 100755 --- a/luasrc/model/cbi/easymesh.lua +++ b/luasrc/model/cbi/easymesh.lua @@ -178,21 +178,21 @@ ctrl.anonymous = true ctrl.addremove = false -btnStop = ctrl:option(Button, "_btn_start", translate("Enable Easy Mesh")) -function btnStop.write() - io.popen("/etc/init.d/easymesh restart") +btnStart = ctrl:option(Button, "_btn_start", translate("Enable Easy Mesh")) +function btnStart.write() + io.popen("/root/easymesh/easymesh.sh") end -btnStart = ctrl:option(Button, "_btn_stop", translate("Disable Easy Mesh")) -function btnStart.write() - io.popen("/etc/init.d/easymesh stop") +btnStop = ctrl:option(Button, "_btn_stop", translate("Disable Easy Mesh")) +function btnStop.write() + io.popen("/root/easymesh/easymesh.sh") end function o.write(self, section, value) Flag.write(self, section, value) -- Run init start - luci.sys.call("uci commit") - luci.sys.call("/etc/init.d/easymesh start &") + -- luci.sys.call("uci commit") + -- luci.sys.call("/etc/init.d/easymesh start &") end return m \ No newline at end of file diff --git a/root/easymesh/easymesh.sh b/root/easymesh/easymesh.sh new file mode 100755 index 0000000..ef7839f --- /dev/null +++ b/root/easymesh/easymesh.sh @@ -0,0 +1,386 @@ +#!/bin/bash + +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) + # Print out all the variables + echo "mesh_nwi_mesh: $mesh_nwi_mesh\nmesh_apRadio: $mesh_apRadio\nmesh_mesh: $mesh_mesh\nmesh_id: $mesh_id\nmobility_domain: $mobility_domain\nkey: $key\nencryption: $encryption" > /root/.newmesh + + + 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.mesh_$apall.disabled='0' + 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 set wireless.wifinet$apnum.disabled=0 + 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.disabled='0' + 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 set wireless.wifinet$apnum.disabled=0 + 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() { + 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 # end [ "$mesh_bat0" != "interface" ] + + # When this is called, the add_wifi_mesh function does not load variables properly + # 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 if your scared + cp /etc/config/wireless /etc/config/wireless.backup + cp /etc/config/network /etc/config/network.backup + cp /etc/config/dhcp /etc/config/dhcp.backup + + # Generate a random IP in the same subnet for fun + ip_base=$(echo "$dns" | cut -d'.' -f1-3) # Get the first three octets of the DNS IP + last_octet=$((RANDOM % 254 + 1)) # Generate a random value for the last octet between 1 and 254 + nodeip="${ip_base}.${last_octet}" # Concatenate the base IP with the new last octet + + # random static IP just in case + #uci set network.lan.ipaddr=$nodeip # Set the randomly chosen IP + + # Do not need these running + for i in firewall dnsmasq odhcpd; do + if /etc/init.d/"$i" enabled; then + /etc/init.d/"$i" disable + /etc/init.d/"$i" stop + fi + done + + # Set LAN interface to DHCP client + uci set network.lan.proto='dhcp' + uci delete network.wan + uci delete network.wan6 + uci delete network.lan.ipaddr + uci delete network.lan.netmask + + # Set netmask and gateway (assuming $netmask and $dns didn't break more stuff) + uci set network.lan.netmask=$netmask + uci set network.lan.gateway=$dns + uci set system.@system[0].hostname=$gateway + + # First, delete the existing interface list from br-lan + uci -q delete network.lan.ifname + + # Configure LAN bridge and add ethernet interfaces to the bridge + uci set network.lan.ifname='eth0 eth1 wan lan1 lan2' # Add ethernet and wan + uci set network.lan.type='bridge' + + # If you also need to configure the wireless network to be part of the bridge: + uci set wireless.default_$apall.network='lan' # Make sure the Wi-Fi is part of the lan network + + # Commit all changes + uci commit network + uci commit system + + # In case of separate wireless config, commit that too + uci commit wireless + + # Restart the network to apply changes + /etc/init.d/network restart + /etc/init.d/system reload + + # restart wifi + wifi reload + wifi up + + # Removing firewall configuration + mv /etc/config/firewall /etc/config/firewall.unused + + else + ap_mode_stop + fi # end if [ "$ap_mode" = 1 ] + + 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 +} # end set_easymesh() + +# Call our functions set above +load_easymesh_config +set_easymesh + +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 + diff --git a/root/etc/init.d/easymesh b/root/etc/init.d/easymesh deleted file mode 100755 index 496daaf..0000000 --- a/root/etc/init.d/easymesh +++ /dev/null @@ -1,391 +0,0 @@ -#!/bin/bash /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.mesh_$apall.disabled='0' - 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 set wireless.wifinet$apnum.disabled=0 - 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.disabled='0' - 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-mixed' - 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 set wireless.wifinet$apnum.disabled=0 - 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 if your scared -cp /etc/config/wireless /etc/config/wireless.backup -cp /etc/config/network /etc/config/network.backup -cp /etc/config/dhcp /etc/config/dhcp.backup - -# Generate a random IP in the same subnet for fun -ip_base=$(echo "$dns" | cut -d'.' -f1-3) # Get the first three octets of the DNS IP -last_octet=$((RANDOM % 254 + 1)) # Generate a random value for the last octet between 1 and 254 -nodeip="${ip_base}.${last_octet}" # Concatenate the base IP with the new last octet - -# random static IP just in case -#uci set network.lan.ipaddr=$nodeip # Set the randomly chosen IP - -# Do not need these running -for i in firewall dnsmasq odhcpd; do - if /etc/init.d/"$i" enabled; then - /etc/init.d/"$i" disable - /etc/init.d/"$i" stop - fi -done - -# Set LAN interface to DHCP client -uci set network.lan.proto='dhcp' -uci delete network.wan -uci delete network.wan6 -uci delete network.lan.ipaddr -uci delete network.lan.netmask - -# Set netmask and gateway (assuming $netmask and $dns didn't break more stuff) -uci set network.lan.netmask=$netmask -uci set network.lan.gateway=$dns -uci set system.@system[0].hostname=$gateway - -# First, delete the existing interface list from br-lan -uci -q delete network.lan.ifname - -# Configure LAN bridge and add ethernet interfaces to the bridge -uci set network.lan.ifname='eth0 eth1 wan lan1 lan2' # Add ethernet and wan -uci set network.lan.type='bridge' - -# If you also need to configure the wireless network to be part of the bridge: -uci set wireless.default_$apall.network='lan' # Make sure the Wi-Fi is part of the lan network - -# Commit all changes -uci commit network -uci commit system - -# In case of separate wireless config, commit that too -uci commit wireless - -# Restart the network to apply changes -/etc/init.d/network restart -/etc/init.d/system reload - -# restart wifi -wifi reload -wifi up - -# Removing firewall configuration -mv /etc/config/firewall /etc/config/firewall.unused - -#fi - - - else - ap_mode_stop - fi - - 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() { - return 0 -} - -stop() { - return 0 -} - -restart() { - set_easymesh - add_wifi_mesh -}