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