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