svn commit: r195572 - projects/mesh11s/sys/net80211

Sam Leffler sam at FreeBSD.org
Fri Jul 10 17:22:41 UTC 2009


Author: sam
Date: Fri Jul 10 17:22:41 2009
New Revision: 195572
URL: http://svn.freebsd.org/changeset/base/195572

Log:
  o track the number of established neighbors
  o use the neighbor count when forming the meshconf ie instead of walking
    the sta table
  
  Reviewed by:	rpaulo

Modified:
  projects/mesh11s/sys/net80211/ieee80211_mesh.c
  projects/mesh11s/sys/net80211/ieee80211_mesh.h

Modified: projects/mesh11s/sys/net80211/ieee80211_mesh.c
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211_mesh.c	Fri Jul 10 16:44:19 2009	(r195571)
+++ projects/mesh11s/sys/net80211/ieee80211_mesh.c	Fri Jul 10 17:22:41 2009	(r195572)
@@ -588,7 +588,7 @@ mesh_newstate(struct ieee80211vap *vap, 
 /*
  * Helper function to note the Mesh Peer Link FSM change.
  */
-static __inline void
+static void
 mesh_linkchange(struct ieee80211_node *ni, enum ieee80211_mesh_mlstate state)
 {
 	struct ieee80211vap *vap = ni->ni_vap;
@@ -603,10 +603,21 @@ mesh_linkchange(struct ieee80211_node *n
 		[IEEE80211_NODE_MESH_HOLDING]		= "HOLDING"
 	};
 #endif
-	ni->ni_mlstate = state;
 	IEEE80211_NOTE(vap, IEEE80211_MSG_MESH,
-	    ni, "peer link: switching to state %s",
-	    meshlinkstates[ni->ni_mlstate]);
+	    ni, "peer link: %s -> %s",
+	    meshlinkstates[ni->ni_mlstate], meshlinkstates[state]);
+
+	/* track neighbor count */
+	if (state == IEEE80211_NODE_MESH_ESTABLISHED &&
+	    ni->ni_mlstate != IEEE80211_NODE_MESH_ESTABLISHED) {
+		KASSERT(ms->ms_neighbors < 65535, ("neighbor count overflow"));
+		ms->ms_neighbors++;
+	} else if (ni->ni_mlstate == IEEE80211_NODE_MESH_ESTABLISHED &&
+	    state != IEEE80211_NODE_MESH_ESTABLISHED) {
+		KASSERT(ms->ms_neighbors > 0, ("neighbor count 0"));
+		ms->ms_neighbors--;
+	}
+	ni->ni_mlstate = state;
 	if (state == IEEE80211_NODE_MESH_HOLDING)
 		ms->ms_ppath->mpp_peerdown(ni);
 }
@@ -2152,20 +2163,6 @@ ieee80211_add_meshid(uint8_t *frm, struc
 }
 
 /*
- * Helper function to find the number of mesh neighbors.
- */
-static void
-meshconf_neighbors(void *arg, struct ieee80211_node *ni)
-{
-	uint8_t *neighbors = arg;
-
-	/* NB: avoid overflow */
-	if (*neighbors < 15 &&
-	    ni->ni_mlstate == IEEE80211_NODE_MESH_ESTABLISHED)
-		(*neighbors)++;
-}
-
-/*
  * Add a Mesh Configuration IE to a frame.
  * For now just use HWMP routing, Airtime link metric, Null Congestion
  * Signaling, Null Sync Protocol and Null Authentication.
@@ -2173,7 +2170,6 @@ meshconf_neighbors(void *arg, struct iee
 uint8_t *
 ieee80211_add_meshconf(uint8_t *frm, struct ieee80211vap *vap)
 {
-	uint8_t neighs = 0;
 	const struct ieee80211_mesh_state *ms = vap->iv_mesh;
 	static const uint8_t null[4] = IEEE80211_MESHCONF_NULL;
 
@@ -2193,10 +2189,8 @@ ieee80211_add_meshconf(uint8_t *frm, str
 	frm += 4;
 	memcpy(frm, null, 4);			/* auth */
 	frm += 4;
-	ieee80211_iterate_nodes(&vap->iv_ic->ic_sta, meshconf_neighbors,
-	    &neighs);
 	/* NB: set the number of neighbors before the rest */
-	*frm = neighs << 1;
+	*frm = (ms->ms_neighbors > 15 ? 15 : ms->ms_neighbors) << 1;
 	if (ms->ms_flags & IEEE80211_MESHFLAGS_PORTAL)
 		*frm |= IEEE80211_MESHCONF_FORM_MP;
 	frm += 1;

Modified: projects/mesh11s/sys/net80211/ieee80211_mesh.h
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211_mesh.h	Fri Jul 10 16:44:19 2009	(r195571)
+++ projects/mesh11s/sys/net80211/ieee80211_mesh.h	Fri Jul 10 17:22:41 2009	(r195572)
@@ -447,6 +447,7 @@ struct ieee80211_mesh_state {
 	int				ms_idlen;
 	uint8_t				ms_id[IEEE80211_MESHID_LEN];
 	ieee80211_mesh_seq		ms_seq;	/* seq no for meshcntl */
+	uint16_t			ms_neighbors;
 	uint8_t				ms_ttl;	/* mesh ttl set in packets */
 #define IEEE80211_MESHFLAGS_AP		0x01	/* accept peers */
 #define IEEE80211_MESHFLAGS_PORTAL	0x02	/* mesh portal role */


More information about the svn-src-projects mailing list