From d55f7135de9b7cd4345305e70cc30d143f9e37e6 Mon Sep 17 00:00:00 2001 From: Manuel Munz Date: Sat, 18 May 2013 11:58:54 +0000 Subject: [PATCH] contrib/meshwizard: Also setup a dhcp server on the adhoc interface if VAP is used. In this case split the DHCP Network in two halves, one for the adhoc, one for the managed network. --- contrib/package/meshwizard/Makefile | 2 +- .../usr/bin/meshwizard/helpers/ipcalc-cidr.sh | 1 + .../usr/bin/meshwizard/helpers/setup_dhcp.sh | 16 +++++-- .../helpers/setup_firewall_interface.sh | 39 ++++++++++++--- .../bin/meshwizard/helpers/setup_network.sh | 47 ++++++++++++++----- .../bin/meshwizard/helpers/setup_splash.sh | 17 +++++-- 6 files changed, 96 insertions(+), 26 deletions(-) diff --git a/contrib/package/meshwizard/Makefile b/contrib/package/meshwizard/Makefile index 91979b74e..47f0c60f8 100644 --- a/contrib/package/meshwizard/Makefile +++ b/contrib/package/meshwizard/Makefile @@ -4,7 +4,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=meshwizard -PKG_RELEASE:=0.0.9-1 +PKG_RELEASE:=0.0.10-1 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) diff --git a/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/ipcalc-cidr.sh b/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/ipcalc-cidr.sh index 39d051ec1..6d7a1fb56 100755 --- a/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/ipcalc-cidr.sh +++ b/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/ipcalc-cidr.sh @@ -28,6 +28,7 @@ BEGIN { print "NETMASK="int2ip(netmask) print "BROADCAST="int2ip(broadcast) print "NETWORK="int2ip(network) + print "NEXTNET="int2ip(broadcast + 1) print "PREFIX="32-bitcount(compl(netmask)) # range calculations: diff --git a/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_dhcp.sh b/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_dhcp.sh index 5c8863e36..a6f16b32e 100755 --- a/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_dhcp.sh +++ b/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_dhcp.sh @@ -5,6 +5,7 @@ . $dir/functions.sh net="$1" +vap="$(uci -q get meshwizard.netconfig.${net}_vap)" handle_dnsmasq() { config_get interface "$1" interface @@ -19,12 +20,21 @@ config_foreach handle_dnsmasq dhcp [ "$net" == "lan" ] && uci -q delete dhcp.lan +if [ "$vap" == 1 ]; then + uci batch <<- EOF + set dhcp.${netrenamed}dhcp="dhcp" + set dhcp.${netrenamed}dhcp.interface="${netrenamed}dhcp" + EOF + set_defaults "dhcp_" dhcp.${netrenamed}dhcp +fi + uci batch << EOF - set dhcp.${netrenamed}dhcp="dhcp" - set dhcp.${netrenamed}dhcp.interface="${netrenamed}dhcp" + set dhcp.${netrenamed}ahdhcp="dhcp" + set dhcp.${netrenamed}ahdhcp.interface="${netrenamed}ahdhcp" EOF -set_defaults "dhcp_" dhcp.${netrenamed}dhcp +set_defaults "dhcp_" dhcp.${netrenamed}ahdhcp uci_commitverbose "Setup DHCP for $netrenamed" dhcp + diff --git a/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_firewall_interface.sh b/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_firewall_interface.sh index 11c351b0d..893aed452 100755 --- a/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_firewall_interface.sh +++ b/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_firewall_interface.sh @@ -61,17 +61,41 @@ currms=$(uci -q get firewall.zone_freifunk.masq_src) # If interfaces are outside of the mesh network they should be natted -# Get dhcprange and meshnet -if_ip="$(uci -q get network.${netrenamed}dhcp.ipaddr)" -if_mask="$(uci -q get network.${netrenamed}dhcp.netmask)" +if [ "$vap" == 1 ]; then + # Get dhcprange and meshnet for the dhcp interface + if_ip="$(uci -q get network.${netrenamed}dhcp.ipaddr)" + if_mask="$(uci -q get network.${netrenamed}dhcp.netmask)" + + [ -n "$if_ip" -a "$if_mask" ] && export $(ipcalc.sh $if_ip $if_mask) + [ -n "$NETWORK" -a "$PREFIX" ] && dhcprange="$NETWORK/$PREFIX" + + if [ -n "$dhcprange" ]; then + meshnet="$(uci get profile_$community.profile.mesh_network)" + # check if the dhcprange is inside meshnet + dhcpinmesh="$($dir/helpers/check-range-in-range.sh $dhcprange $meshnet)" + if [ "$dhcpinmesh" == 1 ]; then + # needed or splash will not work + if [ "$has_luci_splash" == TRUE ]; then + uci set firewall.zone_freifunk.contrack="1" + fi + else + uci set firewall.zone_freifunk.masq=1 + [ -z "$(echo $currms |grep ${netrenamed}dhcp)" ] && uci add_list firewall.zone_freifunk.masq_src="${netrenamed}dhcp" + fi + fi +fi + +# Get dhcprange and meshnet for the adhoc dhcp interface +if_ip="$(uci -q get network.${netrenamed}ahdhcp.ipaddr)" +if_mask="$(uci -q get network.${netrenamed}ahdhcp.netmask)" [ -n "$if_ip" -a "$if_mask" ] && export $(ipcalc.sh $if_ip $if_mask) -[ -n "$NETWORK" -a "$PREFIX" ] && dhcprange="$NETWORK/$PREFIX" +[ -n "$NETWORK" -a "$PREFIX" ] && dhcprangeah="$NETWORK/$PREFIX" -if [ -n "$dhcprange" ]; then +if [ -n "$dhcprangeah" ]; then meshnet="$(uci get profile_$community.profile.mesh_network)" # check if the dhcprange is inside meshnet - dhcpinmesh="$($dir/helpers/check-range-in-range.sh $dhcprange $meshnet)" + dhcpinmesh="$($dir/helpers/check-range-in-range.sh $dhcprangeah $meshnet)" if [ "$dhcpinmesh" == 1 ]; then # needed or splash will not work if [ "$has_luci_splash" == TRUE ]; then @@ -79,10 +103,11 @@ if [ -n "$dhcprange" ]; then fi else uci set firewall.zone_freifunk.masq=1 - [ -z "$(echo $currms |grep ${netrenamed}dhcp)" ] && uci add_list firewall.zone_freifunk.masq_src="${netrenamed}dhcp" + [ -z "$(echo $currms |grep ${netrenamed}ahdhcp)" ] && uci add_list firewall.zone_freifunk.masq_src="${netrenamed}ahdhcp" fi fi + for i in IP NETMASK BROADCAST NETWORK PREFIX; do unset $i done diff --git a/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_network.sh b/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_network.sh index 70f82fe2a..f0ed0e7f8 100755 --- a/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_network.sh +++ b/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_network.sh @@ -67,23 +67,48 @@ if [ "$net_dhcp" == 1 ]; then dhcprange="$($dir/helpers/gen_dhcp_ip.sh $interface_ip)/24" uci set meshwizard.netconfig.${net}_dhcprange="$dhcprange" fi - eval $(sh $dir/helpers/ipcalc-cidr.sh $dhcprange 1 0) - # setup wifi-dhcp interface or alias (using interface notation) - - # Setup alias for $net + # If we use VAP then cut the dhcp range in two halves + # one for the adhoc, one for the managed VAP interface if [ "$vap" == 1 ]; then - uci set network.${netrenamed}dhcp=interface + local network + local mask + network=${dhcprange%%/*} + mask=${dhcprange##*/} + # Divide network size by adding 1 to the netmask + mask=$(($mask + 1)) + # Get first ip and netmask for the adhoc dhcp network + eval $(sh $dir/helpers/ipcalc-cidr.sh ${network}/${mask} 1 0) + STARTADHOC=$START + NETMASKADHOC=$NETMASK + # Get first ip and netmask for the managed dhcp network + eval $(sh $dir/helpers/ipcalc-cidr.sh ${NEXTNET}/${mask} 1 0) + STARTVAP=$START + NETMASKVAP=$NETMASK + # Add dhcp interface + uci batch <<- EOF + set network.${netrenamed}dhcp=interface + set network.${netrenamed}dhcp.proto=static + set network.${netrenamed}dhcp.ipaddr="$STARTVAP" + set network.${netrenamed}dhcp.netmask="$NETMASKVAP" + EOF + uci_commitverbose "Setup interface for ${netrenamed}dhcp" network + else - uci set network.${netrenamed}dhcp=interface - uci set network.${netrenamed}dhcp.ifname="@${netrenamed}" + eval $(sh $dir/helpers/ipcalc-cidr.sh $dhcprange 1 0) + STARTADHOC=$START + NETMASKADHOC=$NETMASK fi + # Setup alias for $net adhoc interface + uci batch <<- EOF - set network.${netrenamed}dhcp.proto=static - set network.${netrenamed}dhcp.ipaddr="$START" - set network.${netrenamed}dhcp.netmask="$NETMASK" + set network.${netrenamed}ahdhcp=interface + set network.${netrenamed}ahdhcp.ifname="@${netrenamed}" + set network.${netrenamed}ahdhcp.proto=static + set network.${netrenamed}ahdhcp.ipaddr="$STARTADHOC" + set network.${netrenamed}ahdhcp.netmask="$NETMASKADHOC" EOF - uci_commitverbose "Setup interface for ${netrenamed}dhcp" network + uci_commitverbose "Setup interface for ${netrenamed}ahdhcp" network fi diff --git a/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_splash.sh b/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_splash.sh index 974111125..722567e81 100755 --- a/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_splash.sh +++ b/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_splash.sh @@ -5,6 +5,7 @@ . $dir/functions.sh net=$1 +vap=$(uci -q get meshwizard.netconfig.${net}_vap) if [ ! "$has_luci_splash" == TRUE ]; then echo " Luci Splash is not installed, skipping setup of it." @@ -28,13 +29,21 @@ if [ "$(uci -q get meshwizard.netconfig.$net\_dhcp)" == 1 ] && [ -n "$dhcprange" config_load luci_splash config_foreach handle_splash iface + if [ "$vap" == 1 ]; then + uci batch <<- EOF + set luci_splash.${netrenamed}dhcp="iface" + set luci_splash.${netrenamed}dhcp.network="${netrenamed}dhcp" + set luci_splash.${netrenamed}dhcp.zone="freifunk" + EOF + uci_commitverbose "Setup dhcpsplash for ${netrenamed}dhcp" luci_splash + fi uci batch <<- EOF - set luci_splash.${netrenamed}dhcp="iface" - set luci_splash.${netrenamed}dhcp.network="${netrenamed}dhcp" - set luci_splash.${netrenamed}dhcp.zone="freifunk" + set luci_splash.${netrenamed}ahdhcp="iface" + set luci_splash.${netrenamed}ahdhcp.network="${netrenamed}ahdhcp" + set luci_splash.${netrenamed}ahdhcp.zone="freifunk" EOF + uci_commitverbose "Setup dhcpsplash for ${netrenamed}ahdhcp" luci_splash - uci_commitverbose "Setup dhcpsplash for ${netrenamed}dhcp" luci_splash /etc/init.d/luci_splash enable fi -- 2.25.1