From 38821210b05c7215a9fef44fcc14f907a4c7997b Mon Sep 17 00:00:00 2001
From: Florian Fainelli <florian@openwrt.org>
Date: Thu, 26 Feb 2009 14:53:03 +0000
Subject: [PATCH] allow mac80211 devices to be configured to do 802.11s,
 requires iw

SVN-Revision: 14669
---
 docs/wireless.tex                           | 10 +++++++++-
 package/mac80211/files/lib/wifi/mac80211.sh | 18 ++++++++++++++++--
 2 files changed, 25 insertions(+), 3 deletions(-)

diff --git a/docs/wireless.tex b/docs/wireless.tex
index dd6ec43dd9..f1725318f8 100644
--- a/docs/wireless.tex
+++ b/docs/wireless.tex
@@ -107,7 +107,7 @@ config wifi-device    wifi device name
 config wifi-iface
     option network  the interface you want wifi to bridge with
     option device   wifi0, wifi1, wifi2, wifiN
-    option mode     ap, sta, adhoc, monitor, or wds
+    option mode     ap, sta, adhoc, monitor, mesh, or wds
     option txpower  (deprecated) transmission power in dBm
     option ssid     ssid name
     option bssid    bssid address
@@ -184,6 +184,9 @@ config wifi-iface
             \item \texttt{monitor} \\
                 Monitor mode
 
+	    \item \texttt{mesh} \\
+		Mesh Point mode (802.11s)
+
             \item \texttt{wds} \\
                 WDS point-to-point link
 
@@ -229,6 +232,11 @@ config wifi-iface
 
 \end{itemize}
 
+\paragraph{Mesh Point}
+
+Mesh Point (802.11s) is only supported by some mac80211 drivers. It requires the iw package
+to be installed to setup mesh links. OpenWrt creates mshN mesh point interfaces.
+
 \paragraph{Wireless Distribution System}
 
 WDS is a non-standard mode which will be working between two Broadcom devices for instance
diff --git a/package/mac80211/files/lib/wifi/mac80211.sh b/package/mac80211/files/lib/wifi/mac80211.sh
index 8f3ed4a25a..77c7976351 100644
--- a/package/mac80211/files/lib/wifi/mac80211.sh
+++ b/package/mac80211/files/lib/wifi/mac80211.sh
@@ -13,14 +13,14 @@ scan_mac80211() {
 
 		config_get mode "$vif" mode
 		case "$mode" in
-			adhoc|sta|ap|monitor)
+			adhoc|sta|ap|monitor|mesh)
 				append $mode "$vif"
 			;;
 			*) echo "$device($vif): Invalid mode, ignored."; continue;;
 		esac
 	done
 
-	config_set "$device" vifs "${ap:+$ap }${adhoc:+$adhoc }${ahdemo:+$ahdemo }${sta:+$sta }${wds:+$wds }${monitor:+$monitor}"
+	config_set "$device" vifs "${ap:+$ap }${adhoc:+$adhoc }${ahdemo:+$ahdemo }${sta:+$sta }${wds:+$wds }${monitor:+$monitor }${mesh:+$mesh}"
 }
 
 
@@ -53,6 +53,7 @@ enable_mac80211() {
 	config_get txpower "$device" txpower
 
 	local first=1
+	local mesh_idx=0
 	for vif in $vifs; do
 		ifconfig "$ifname" down 2>/dev/null
 		config_get ifname "$vif" ifname
@@ -75,6 +76,13 @@ enable_mac80211() {
 				sleep 1
 				iwconfig "$ifname" mode ad-hoc >/dev/null 2>/dev/null
 			fi
+			# mesh interface should be created only for the first interface
+			if [ "$mode" = mesh ]; then
+				config_get mesh_id "$vif" mesh_id
+				if [ -n "$mesh_id" ]; then
+					iw dev "$ifname" interface add msh$mesh_idx type mp mesh_id $mesh_id
+				fi
+			fi
 			sleep 1
 			iwconfig "$ifname" channel "$channel" >/dev/null 2>/dev/null
 		}
@@ -162,8 +170,14 @@ enable_mac80211() {
 					}
 				fi
 			;;
+			mesh)
+				# special case where physical interface should be down for mesh to work
+				ifconfig "$ifname" down
+				ifconfig "msh$mesh_idx" up
+			;;
 		esac
 		first=0
+		mesh_idx=$(expr $mesh_idx + 1)
 	done
 }
 
-- 
GitLab