From owner-svn-src-projects@FreeBSD.ORG Fri Jul 10 17:22:41 2009 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 8FC9B106566B; Fri, 10 Jul 2009 17:22:41 +0000 (UTC) (envelope-from sam@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 7E4508FC13; Fri, 10 Jul 2009 17:22:41 +0000 (UTC) (envelope-from sam@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n6AHMf2C026876; Fri, 10 Jul 2009 17:22:41 GMT (envelope-from sam@svn.freebsd.org) Received: (from sam@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n6AHMf0v026873; Fri, 10 Jul 2009 17:22:41 GMT (envelope-from sam@svn.freebsd.org) Message-Id: <200907101722.n6AHMf0v026873@svn.freebsd.org> From: Sam Leffler Date: Fri, 10 Jul 2009 17:22:41 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r195572 - projects/mesh11s/sys/net80211 X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 10 Jul 2009 17:22:41 -0000 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 */