From owner-svn-src-projects@FreeBSD.ORG Fri Jun 12 10:56:10 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 78C0A106566B; Fri, 12 Jun 2009 10:56:10 +0000 (UTC) (envelope-from rpaulo@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 673618FC14; Fri, 12 Jun 2009 10:56:10 +0000 (UTC) (envelope-from rpaulo@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 n5CAuAPQ080104; Fri, 12 Jun 2009 10:56:10 GMT (envelope-from rpaulo@svn.freebsd.org) Received: (from rpaulo@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n5CAuANc080103; Fri, 12 Jun 2009 10:56:10 GMT (envelope-from rpaulo@svn.freebsd.org) Message-Id: <200906121056.n5CAuANc080103@svn.freebsd.org> From: Rui Paulo Date: Fri, 12 Jun 2009 10:56:10 +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: r194054 - 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, 12 Jun 2009 10:56:10 -0000 Author: rpaulo Date: Fri Jun 12 10:56:09 2009 New Revision: 194054 URL: http://svn.freebsd.org/changeset/base/194054 Log: Make sure the generated mesh IDs are unique. Sponsored by: The FreeBSD Foundation Modified: projects/mesh11s/sys/net80211/ieee80211_mesh.c Modified: projects/mesh11s/sys/net80211/ieee80211_mesh.c ============================================================================== --- projects/mesh11s/sys/net80211/ieee80211_mesh.c Fri Jun 12 10:41:00 2009 (r194053) +++ projects/mesh11s/sys/net80211/ieee80211_mesh.c Fri Jun 12 10:56:09 2009 (r194054) @@ -67,6 +67,7 @@ static void mesh_vattach(struct ieee8021 static int mesh_newstate(struct ieee80211vap *, enum ieee80211_state, int); static inline void mesh_linkchange(struct ieee80211_node *, enum ieee80211_mesh_mlstate); +static uint32_t mesh_generateid(struct ieee80211vap *); static int mesh_input(struct ieee80211_node *, struct mbuf *, int, int); static void mesh_recv_mgmt(struct ieee80211_node *, struct mbuf *, int, int, int); @@ -219,7 +220,7 @@ doprint(struct ieee80211vap *vap, int su } /* - * Helper function to nore the Mesh Peer Link FSM change. + * Helper function to note the Mesh Peer Link FSM change. */ static inline void mesh_linkchange(struct ieee80211_node *ni, enum ieee80211_mesh_mlstate state) @@ -242,6 +243,33 @@ mesh_linkchange(struct ieee80211_node *n } +/* + * Helper function to generate a unique local ID required for mesh + * peer establishment. + */ +static void +_mesh_checkid(void *arg, struct ieee80211_node *ni) +{ + uint16_t *r = arg; + + if (*r == ni->ni_mllid) + *(uint16_t *)arg = 0; +} + +static uint32_t +mesh_generateid(struct ieee80211vap *vap) +{ + uint16_t r; + +restart: + get_random_bytes(&r, 2); + ieee80211_iterate_nodes(&vap->iv_ic->ic_sta, _mesh_checkid, &r); + if (r == 0) + goto restart; + + return r; +} + static int mesh_input(struct ieee80211_node *ni, struct mbuf *m, int rssi, int noise) { @@ -539,7 +567,7 @@ mesh_recv_mgmt(struct ieee80211_node *ni vap->iv_meshflags & IEEE80211_MFLAGS_AP && ni->ni_mlstate == IEEE80211_NODE_MESH_IDLE) { union ieee80211_send_action_args vargs; - get_random_bytes(&ni->ni_mlpid, 2); + ni->ni_mlpid = mesh_generateid(vap); mesh_linkchange(ni, IEEE80211_NODE_MESH_OPENSNT); vargs.fixedarg[0] = ni->ni_mlpid; ieee80211_send_action(ni, @@ -763,7 +791,7 @@ mesh_recv_action(struct ieee80211_node * mesh_linkchange(ni, IEEE80211_NODE_MESH_OPENRCV); ni->ni_mllid = meshpeer->peer_llinkid; - get_random_bytes(&ni->ni_mlpid, 2); + ni->ni_mlpid = mesh_generateid(vap); vargs.fixedarg[0] = ni->ni_mlpid; /* Announce we're open too... */ ieee80211_send_action(ni,