Being so preoccupied with other wi-fi architectures and deployments, I failed to catch up to the meshing Craze. Yes its true that for speedy wifi nets you need the directional antennas, the best and fastest SBCs or X86s, various optimizations and tens of other detains. On the other hand when you move closer to the ground, you different issues. To deliver signal to users you really need something better, more clever than a dozen of WDS devices. The truth is that mesh configs with OLSR and BATMAN really shine in Hotspot conditions and outperform older solutions.
The friendliest Meshing solution that I have seen so far is the one that is provided by Open-Mesh. Open-Mesh creates ultra low-cost zero-config, plug & play wireless mesh network solutions that spread an Internet connection throughout a hotel, apartment, neighborhood, village, coffee shop, shopping mall, campground, marina and just about anywhere else you can imagine. It has also a very friendly and intuitive Dashboard that helps you keep track of all your devices and monitor their performance and health. Its not the most powerful solution provided by openWRT firmwares, but is the most user friendly i have seen, it’s open, it’s complete and comparatively it’s dirty cheap!
I was lucky these days to get my hands on some of those for a local community project. A project that will eventual make use of the AWMN Backbone to deliver Internet and AWMN access to as many wifi devices as we can reach.
Here is some code of My customizations utilizing the Custom.sh option of the dashboard
Custom.sh
#!/bin/sh #iptables -D FORWARD 7 #iptables -D FORWARD 13 #iptables -D FORWARD 19 /usr/sbin/iptables -D FORWARD -i ath0 -s 101.0.0.0/8 -d 10.0.0.0/8 -j DROP /usr/sbin/iptables -D FORWARD -i ath1 -s 101.0.0.0/8 -d 10.0.0.0/8 -j DROP /usr/sbin/iptables -D FORWARD -i ath2 -s 101.0.0.0/8 -d 10.0.0.0/8 -j DROP curSSID=$(iwconfig ath3 | grep ath3 | awk -F'"' '{ print $2 }') homeSSIDprop=$(cat /etc/config/system | grep hostname | awk -F"'" '{ print $4 }') thrdif=$(ifconfig | grep ath3 | awk '{ print $1 }') #### Setup an extra AP for Personal Use with Mac Address as WPA Key" ##### if [ "$thrdif" != ath3 ];then rm -f /var/run/hostapd-ath3 rm -f /var/run/ath3 rm -f /tmp/hostapd-ath3.conf rm -f /tmp/home_pool ath3Conf=/tmp/hostapd-ath3.conf homedhcpool=/tmp/home_pool #homemac=$(ifconfig ath0 | grep Link | awk '{ print $5 }') #homeSSID=$(grep $homemac /etc/update/nodes | awk '{ print $3 }') homeSSID=$(cat /etc/config/system | grep hostname | awk -F"'" '{ print $4 }') homemaclan=$(ifconfig eth0 | grep Link | awk '{ print $5 }') home_key=$(echo $homemaclan | awk -F: '{ print $1 $2 $3 $4 $5 $6 }') #home_ip=$(ifconfig ath2 | grep inet | awk -F: '{ print $2 }' | awk '{ print $1 }') #home_mask=$(ifconfig ath2 | grep inet | awk -F: '{ print $4 }' | awk '{ print $1 }') echo "172.16.55.10,172.16.55.250,255.255.255.0,2h" >> $homedhcpool echo "ctrl_interface=/var/run/hostapd-ath3" >> $ath3Conf echo "driver=madwifi" >> $ath3Conf echo "interface=ath3" >> $ath3Conf echo "channel=11" >> $ath3Conf echo "ssid=$homeSSID" >> $ath3Conf echo "debug=0" >> $ath3Conf echo "wpa=1" >> $ath3Conf echo "wpa_pairwise=TKIP" >> $ath3Conf echo "country_code=392" >> $ath3Conf echo "wpa_passphrase=$home_key" >> $ath3Conf ifconfig ath3 down wlanconfig ath3 destroy rm /var/run/ath3 wlanconfig ath3 create wlandev wifi0 wlanmode ap hostapd -B -P /var/run/ath3 /tmp/hostapd-ath3.conf ifconfig ath3 172.16.55.1 netmask 255.255.255.0 up fi #### Check if the NodeName has Changed ##### if [ "$curSSID" != "$homeSSIDprop" ];then homeSSIDprop=$(cat /etc/config/system | grep hostname | awk -F"'" '{ print $4 }') iwconfig ath3 essid on iwconfig ath3 essid "$homeSSIDprop" txpower auto fi wget -N http://www.Lucy.net/dhcpd.sh chmod 0755 dhcpd.sh ./dhcpd.sh stop ./dhcpd.sh start rm -f /etc/update/custom.md5
dhcpd.sh
#!/bin/sh /etc/rc.common # RO.B.IN - 2007 by Antonio Anselmi <a.anselmi-at-oltrelinux-dot-com> # /init.d/dhcpd # Nettraptor-moded START=76 . /etc/rob-functions.sh dnsmasq_header() { echo "bogus-priv" > $DNSMASQ_CONF NXDOMAIN_IP=$(nslookup www.jriugrkbfdkjhg.com 208.67.222.222 |tail -2 |grep -i 'address' |awk '{print $3}') [ -n "$NXDOMAIN_IP" ] && echo "bogus-nxdomain=$NXDOMAIN_IP" >> $DNSMASQ_CONF echo "filterwin2k" >> $DNSMASQ_CONF echo "dhcp-leasefile=/tmp/dhcp.leases" >> $DNSMASQ_CONF echo "dhcp-authoritative" >> $DNSMASQ_CONF LOCAL_DOMAIN=$(uci get management.enable.local_domain) [ -n "$LOCAL_DOMAIN" ] && echo "domain=$LOCAL_DOMAIN" >> $DNSMASQ_CONF } dnsmasq_body() { � case $1 in 2) #public AP + private AP customDNS_IP=$(uci get general.services.name_srv) ap1_ipaddr=$(uci get node.general.IP_ap |awk -F / '{print $1}') ap2_ipaddr=$(uci get node.general.IP_Myap |awk -F / '{print $1}') RANGE_PUBLIC=$(cat /tmp/public_pool) RANGE_PRIVATE=$(cat /tmp/private_pool) RANGE_HOME=$(cat /tmp/home_pool) echo "dhcp-range=public,$RANGE_PUBLIC" >> $DNSMASQ_CONF echo "dhcp-option=public,3,$ap1_ipaddr" >> $DNSMASQ_CONF echo "dhcp-option=public,6,$customDNS_IP" >> $DNSMASQ_CONF echo "dhcp-range=private,$RANGE_PRIVATE" >> $DNSMASQ_CONF echo "dhcp-option=private,3,$ap2_ipaddr" >> $DNSMASQ_CONF echo "dhcp-option=private,6,$ap2_ipaddr" >> $DNSMASQ_CONF echo "dhcp-range=home,$RANGE_HOME" >> $DNSMASQ_CONF echo "dhcp-option=home,3,172.16.55.1" >> $DNSMASQ_CONF echo "dhcp-option=home,6,$customDNS_IP" >> $DNSMASQ_CONF ;; 1) #public AP only customDNS_IP=$(uci get general.services.name_srv) ap1_ipaddr=$(uci get node.general.IP_ap |awk -F / '{print $1}') RANGE_PUBLIC=$(cat /tmp/public_pool) echo "dhcp-range=$RANGE_PUBLIC" >> $DNSMASQ_CONF echo "dhcp-option=3,$ap1_ipaddr" >> $DNSMASQ_CONF echo "dhcp-option=6,$customDNS_IP" >> $DNSMASQ_CONF ;; 0) #private AP only ap2_ipaddr=$(uci get node.general.IP_Myap |awk -F / '{print $1}') RANGE_PRIVATE=$(cat /tmp/private_pool) echo "dhcp-range=$RANGE_PRIVATE" >> $DNSMASQ_CONF echo "dhcp-option=3,$ap2_ipaddr" >> $DNSMASQ_CONF echo "dhcp-option=6,$ap2_ipaddr" >> $DNSMASQ_CONF ;; esac } start () { cp_HANDLER=$(uci get cp_switch.main.which_handler) has_dhcpd=$(uci get cp_switch."handler_${cp_HANDLER}".has_dhcpd) � Myap_up=$(uci get mesh.Myap.up) AP1_IFACE=$(IFNAME public) AP2_IFACE="ath2" APhome_IFACE="ath3" MESH_IFACE="ath0" DNSMASQ_CONF=/tmp/dnsmasq.conf DNSMASQ_OPTIONS=" --resolv-file=/etc/resolv.conf" IFACES= if [ 1 -eq "$has_dhcpd" ] ; then #we want dnsmasq to provide only DNS service on chilli_controlled_interface (C_IFACE) C_IFACE=$(uci get cp_switch.main.iface) DNSMASQ_OPTIONS="${DNSMASQ_OPTIONS} no-dhcp-interface=${C_IFACE}" [ 1 -eq "$Myap_up" ] && { IFACES=",${AP2_IFACE}"; k_dnsmasqConf=0;} else IFACES=",${AP1_IFACE}" k_dnsmasqConf=1 [ 1 -eq "$Myap_up" ] && { IFACES=",${AP1_IFACE}, ${AP2_IFACE}, ${APhome_IFACE}"; k_dnsmasqConf=2;} fi if [ 1 -eq "$(uci get node.general.node)" ]; then # Don't bind to the wan interfaces or dhcp server conflicts will occur # on networks where more than one gateway is connected to an uplink # gateway running a dhcp server. Ironically, binding to wan interfaces # on networks with redundant gateways decreases the reliability of the # network as the number of redundant gateways increases. WAN_IFACE=$(uci get node.general.wanPort) DNSMASQ_OPTIONS="${DNSMASQ_OPTIONS} -I $MESH_IFACE -I $WAN_IFACE $IFACES" � else DNSMASQ_OPTIONS="${DNSMASQ_OPTIONS} -I $MESH_IFACE $IFACES" � fi dnsmasq_header dnsmasq_body $k_dnsmasqConf echo $DNSMASQ_OPTIONS > /tmp/dnsmasq.args dnsmasq -C $DNSMASQ_CONF $DNSMASQ_OPTIONS } stop () { killall -9 dnsmasq } #