#!/bin/sh PATH=/bin:/usr/bin:/sbin:/usr/sbin MESH_INTERFACE='mesh0' BRIDGE_INTERFACE='br0' ETHER_INTERFACE='wlan0' HOSTAP_CONFIG='/etc/mesh/hostapd.conf' MESH_CHANNEL='161' MESH_ID='meshnet' WLAN_INTERFACE=$3 ROLE=$1 usage() { /bin/echo "$0 [interface] [mesh_id]" /bin/echo "ex) Mesh Gate :" /bin/echo " $0 gate start" /bin/echo " $0 gate start wlan0 mesh-area" /bin/echo "ex) Mesh Station :" /bin/echo " $0 station start" /bin/echo " $0 station start wlan1 mesh-area" exit 1 } start() { # Verify interface if [ -a "/sys/class/net/$WLAN_INTERFACE" ] then /bin/echo "Use interface [$WLAN_INTERFACE]." else /bin/echo "Interface [$WLAN_INTERFACE] is not valid." exit 1 fi case $ROLE in "gate") /bin/echo "Setting mesh gate..." /bin/echo " setting mesh interface.." ## Enable mesh # Add virtual interface @SBIN_DIR@/iw dev $WLAN_INTERFACE set type managed @SBIN_DIR@/ifconfig $WLAN_INTERFACE up @SBIN_DIR@/iw dev $WLAN_INTERFACE interface add $MESH_INTERFACE type mp @SBIN_DIR@/ifconfig $WLAN_INTERFACE down @SBIN_DIR@/ifconfig $MESH_INTERFACE up # Create bridge with mesh network /bin/echo " setting bridge.." @SBIN_DIR@/brctl addbr $BRIDGE_INTERFACE @SBIN_DIR@/brctl stp $BRIDGE_INTERFACE on #@SBIN_DIR@/brctl setfd $BRIDGE_INTERFACE 0 @SBIN_DIR@/brctl addif $BRIDGE_INTERFACE $MESH_INTERFACE @SBIN_DIR@/ifconfig $MESH_INTERFACE down @SBIN_DIR@/ifconfig $MESH_INTERFACE 0.0.0.0 up @SBIN_DIR@/ifconfig $BRIDGE_INTERFACE up ## Join mesh # Join(create) specific mesh network # NOTICE: [iw dev ## set channel] should be performed before join @SBIN_DIR@/iw dev $MESH_INTERFACE set channel $MESH_CHANNEL @SBIN_DIR@/iw dev $MESH_INTERFACE mesh join $MESH_ID ## Set gate # Add external network into bridge @SBIN_DIR@/brctl addif $BRIDGE_INTERFACE $ETHER_INTERFACE @SBIN_DIR@/ifconfig $ETHER_INTERFACE down @SBIN_DIR@/ifconfig $ETHER_INTERFACE 0.0.0.0 up # Announce mesh gate /bin/echo " announce mesh gate.." @SBIN_DIR@/iw $MESH_INTERFACE set mesh_param mesh_hwmp_rootmode=4 @SBIN_DIR@/iw $MESH_INTERFACE set mesh_param mesh_gate_announcements=1 # Get MAC address from eth0 #ETH_MAC_ADDR=`@SBIN_DIR@/ifconfig $ETHER_INTERFACE | /usr/bin/sed -n '/ether/p' | /usr/bin/awk "{print \\$2}"` #echo "========================" #echo $ETH_MAC_ADDR #@SBIN_DIR@/ifconfig $BRIDGE_INTERFACE hw ether $ETH_MAC_ADDR # Do scan @SBIN_DIR@/iw $MESH_INTERFACE scan > /dev/null # Set IP into bridge interface /bin/echo " Get IP address with DHCP.." #/usr/bin/dhcp -v -i $BRIDGE_INTERFACE DHCP_IP=`/usr/bin/dhcp -i br0 | grep 'obtained' | /usr/bin/awk "{print \\$3}"` /bin/echo " IP [$DHCP_IP] obtained" @SBIN_DIR@/ifconfig $BRIDGE_INTERFACE $DHCP_IP ;; "station") /bin/echo "Setting mesh station..." # Add virtual interface /bin/echo " setting mesh interface.." @SBIN_DIR@/iw dev $WLAN_INTERFACE set type managed @SBIN_DIR@/ifconfig $WLAN_INTERFACE up @SBIN_DIR@/iw dev $WLAN_INTERFACE interface add $MESH_INTERFACE type mp @SBIN_DIR@/ifconfig $WLAN_INTERFACE down @SBIN_DIR@/ifconfig $MESH_INTERFACE up # Create bridge with mesh network /bin/echo " setting bridge.." @SBIN_DIR@/brctl addbr $BRIDGE_INTERFACE @SBIN_DIR@/brctl stp $BRIDGE_INTERFACE on @SBIN_DIR@/brctl setfd $BRIDGE_INTERFACE 0 @SBIN_DIR@/brctl addif $BRIDGE_INTERFACE $MESH_INTERFACE @SBIN_DIR@/ifconfig $MESH_INTERFACE down @SBIN_DIR@/ifconfig $MESH_INTERFACE 0.0.0.0 up @SBIN_DIR@/ifconfig $BRIDGE_INTERFACE up # Join(create) specific mesh network # NOTICE: [iw dev ## set channel] should be performed before join @SBIN_DIR@/iw dev $MESH_INTERFACE set channel $MESH_CHANNEL @SBIN_DIR@/iw dev $MESH_INTERFACE mesh join $MESH_ID # Set Soft AP interface if [ "wlan0" == "$WLAN_INTERFACE" ]; then # Use wlan0 as mesh interface sed -i 's/wlan0/wlan1/' $HOSTAP_CONFIG else # Use wlan1 as mesh interface sed -i 's/wlan1/wlan0/' $HOSTAP_CONFIG fi # Change interface mode with wlan script (for artik) if [ -a "/usr/bin/wlan.sh" ]; then if [ "wlan0" == "$WLAN_INTERFACE" ]; then sed -i 's/wlan0/wlan1/' /usr/bin/wlan.sh fi @BIN_DIR@/wlan.sh stop @BIN_DIR@/wlan.sh softap if [ "wlan0" == "$WLAN_INTERFACE" ]; then sed -i 's/wlan1/wlan0/' /usr/bin/wlan.sh fi fi @SBIN_DIR@/iw $MESH_INTERFACE scan > /dev/null # Launch hostapd /bin/echo " launching soft ap.." @SBIN_DIR@/hostapd -e /opt/var/lib/misc/hostapd.bin $HOSTAP_CONFIG -f /var/log/hostapd_mesh.log -dd & # Set IP into bridge interface /bin/echo " Get IP address with DHCP.." #/usr/bin/dhcp -v -i $BRIDGE_INTERFACE DHCP_IP=`/usr/bin/dhcp -v -i br0 | grep 'obtained' | /usr/bin/awk "{print \\$3}"` /bin/echo " IP [$DHCP_IP] obtained" @SBIN_DIR@/ifconfig $BRIDGE_INTERFACE $DHCP_IP ;; *) /bin/echo "Role [$ROLE] is not valid." ;; esac } stop() { case $ROLE in "station") @BIN_DIR@/pkill -x hostapd ;; esac # Remove interfaces if [ -a "/sys/class/net/$BRIDGE_INTERFACE" ] then @SBIN_DIR@/ifconfig $BRIDGE_INTERFACE down @SBIN_DIR@/brctl delbr $BRIDGE_INTERFACE fi if [ -a "/sys/class/net/$MESH_INTERFACE" ] then @SBIN_DIR@/iw dev $MESH_INTERFACE del fi # Revert wlan interface @SBIN_DIR@/ifconfig $WLAN_INTERFACE up } if [ $# -lt 2 ]; then usage fi if [ -n "$4" ] then /bin/echo "Use mesh id [$MESH_ID]" MESH_ID="$4" fi if [ -z "$WLAN_INTERFACE" ] then case $ROLE in "gate") WLAN_INTERFACE='wlan0' ;; "station") WLAN_INTERFACE='wlan1' ;; *) WLAN_INTERFACE='' usage ;; esac fi case $2 in "start") start ;; "stop") stop ;; *) usage ;; esac