mac80211: clean up mesh code

Various cleanups, reducing the #ifdef mess and other things.

Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
diff --git a/net/mac80211/ieee80211_iface.c b/net/mac80211/ieee80211_iface.c
index c2f92b7..b0f17a2 100644
--- a/net/mac80211/ieee80211_iface.c
+++ b/net/mac80211/ieee80211_iface.c
@@ -15,9 +15,7 @@
 #include "ieee80211_i.h"
 #include "sta_info.h"
 #include "debugfs_netdev.h"
-#ifdef CONFIG_MAC80211_MESH
 #include "mesh.h"
-#endif
 
 void ieee80211_if_sdata_init(struct ieee80211_sub_if_data *sdata)
 {
@@ -82,14 +80,11 @@
 	ieee80211_debugfs_add_netdev(sdata);
 	ieee80211_if_set_type(ndev, type);
 
-#ifdef CONFIG_MAC80211_MESH
-	if (sdata->vif.type == IEEE80211_IF_TYPE_MESH_POINT &&
-	    params && params->mesh_id_len) {
-		sdata->u.sta.mesh_id_len = params->mesh_id_len;
-		memcpy(sdata->u.sta.mesh_id, params->mesh_id,
-		       params->mesh_id_len);
-	}
-#endif
+	if (ieee80211_vif_is_mesh(&sdata->vif) &&
+	    params && params->mesh_id_len)
+		ieee80211_if_sta_set_mesh_id(&sdata->u.sta,
+					     params->mesh_id_len,
+					     params->mesh_id);
 
 	/* we're under RTNL so all this is fine */
 	if (unlikely(local->reg_state == IEEE80211_DEV_UNREGISTERED)) {
@@ -170,47 +165,8 @@
 		msdata = IEEE80211_DEV_TO_SUB_IF(sdata->local->mdev);
 		sdata->bss = &msdata->u.ap;
 
-#ifdef CONFIG_MAC80211_MESH
-		if (type == IEEE80211_IF_TYPE_MESH_POINT) {
-			ifsta->mshcfg.dot11MeshRetryTimeout = MESH_RET_T;
-			ifsta->mshcfg.dot11MeshConfirmTimeout = MESH_CONF_T;
-			ifsta->mshcfg.dot11MeshHoldingTimeout = MESH_HOLD_T;
-			ifsta->mshcfg.dot11MeshMaxRetries = MESH_MAX_RETR;
-			ifsta->mshcfg.dot11MeshTTL = MESH_TTL;
-			ifsta->mshcfg.auto_open_plinks = true;
-			ifsta->mshcfg.dot11MeshMaxPeerLinks =
-				MESH_MAX_ESTAB_PLINKS;
-			ifsta->mshcfg.dot11MeshHWMPactivePathTimeout =
-				MESH_PATH_TIMEOUT;
-			ifsta->mshcfg.dot11MeshHWMPpreqMinInterval =
-				MESH_PREQ_MIN_INT;
-			ifsta->mshcfg.dot11MeshHWMPnetDiameterTraversalTime =
-				MESH_DIAM_TRAVERSAL_TIME;
-			ifsta->mshcfg.dot11MeshHWMPmaxPREQretries =
-				MESH_MAX_PREQ_RETRIES;
-			ifsta->mshcfg.path_refresh_time =
-				MESH_PATH_REFRESH_TIME;
-			ifsta->mshcfg.min_discovery_timeout =
-				MESH_MIN_DISCOVERY_TIMEOUT;
-			ifsta->accepting_plinks = true;
-			ifsta->preq_id = 0;
-			ifsta->dsn = 0;
-			atomic_set(&ifsta->mpaths, 0);
-			mesh_rmc_init(dev);
-			ifsta->last_preq = jiffies;
-			/* Allocate all mesh structures when creating the first
-			 * mesh interface.
-			 */
-			if (!mesh_allocated)
-				ieee80211s_init();
-			mesh_ids_set_default(ifsta);
-			setup_timer(&ifsta->mesh_path_timer,
-				    ieee80211_mesh_path_timer,
-				    (unsigned long) sdata);
-			INIT_LIST_HEAD(&ifsta->preq_queue.list);
-			spin_lock_init(&ifsta->mesh_preq_queue_lock);
-		}
-#endif
+		if (ieee80211_vif_is_mesh(&sdata->vif))
+			ieee80211_mesh_init_sdata(sdata);
 		break;
 	}
 	case IEEE80211_IF_TYPE_MNTR:
@@ -240,6 +196,10 @@
 
 	ieee80211_if_sdata_deinit(sdata);
 
+	/* Need to handle mesh specially to allow eliding the function call */
+	if (ieee80211_vif_is_mesh(&sdata->vif))
+		mesh_rmc_free(dev);
+
 	switch (sdata->vif.type) {
 	case IEEE80211_IF_TYPE_INVALID:
 		/* cannot happen */
@@ -292,10 +252,6 @@
 		}
 		break;
 	case IEEE80211_IF_TYPE_MESH_POINT:
-#ifdef CONFIG_MAC80211_MESH
-		mesh_rmc_free(dev);
-#endif
-		/* fall through */
 	case IEEE80211_IF_TYPE_STA:
 	case IEEE80211_IF_TYPE_IBSS:
 		kfree(sdata->u.sta.extra_ie);