svn commit: r194054 - projects/mesh11s/sys/net80211
Rui Paulo
rpaulo at FreeBSD.org
Fri Jun 12 10:56:10 UTC 2009
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,
More information about the svn-src-projects
mailing list