Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 1 Jul 2009 23:14:21 +0000 (UTC)
From:      Rui Paulo <rpaulo@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r195270 - projects/mesh11s/sys/net80211
Message-ID:  <200907012314.n61NELwa026879@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: rpaulo
Date: Wed Jul  1 23:14:21 2009
New Revision: 195270
URL: http://svn.freebsd.org/changeset/base/195270

Log:
  First try at implementing HWMP proactive routing.
  
  Sponsored by:	The FreeBSD Foundation

Modified:
  projects/mesh11s/sys/net80211/ieee80211_hwmp.c
  projects/mesh11s/sys/net80211/ieee80211_mesh.h

Modified: projects/mesh11s/sys/net80211/ieee80211_hwmp.c
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211_hwmp.c	Wed Jul  1 23:13:19 2009	(r195269)
+++ projects/mesh11s/sys/net80211/ieee80211_hwmp.c	Wed Jul  1 23:14:21 2009	(r195270)
@@ -553,6 +553,44 @@ hwmp_add_meshrann(uint8_t *frm, const st
 	return frm;
 }
 
+#ifdef notyet
+/*
+ * Send a broadcast Path Request to find all nodes on the mesh. We are
+ * called when the vap is configured as a HWMP root node.
+ */
+#define	PREQ_TFLAGS(n)	preq.preq_targets[n].target_flags
+#define	PREQ_TADDR(n)	preq.preq_targets[n].target_addr
+#define	PREQ_TSEQ(n)	preq.preq_targets[n].target_seq
+static void
+hwmp_rootmode_cb(struct ieee80211vap *vap)
+{
+	struct ieee80211_hwmp_state *hs = vap->iv_hwmp;
+	struct ieee80211_meshpreq_ie preq;
+
+	/* XXX check portal role */
+	preq.preq_flags = 0;
+	preq.preq_flags |= IEEE80211_MESHPREQ_FLAGS_AM;
+	if (hs->hs_rootmode == IEEE80211_HWMP_ROOTMODE_PROACTIVE)
+		preq.preq_flags |= IEEE80211_MESHPREQ_FLAGS_PP;
+	preq.preq_hopcount = 0;
+	preq.preq_ttl = hs->hs_ttl;
+	preq.preq_id = ++hs->hs_preqid;
+	IEEE80211_ADDR_COPY(preq.preq_origaddr, vap->iv_myaddr);
+	preq.preq_origseq = ++hs->hs_seq;
+	preq.preq_lifetime = timeval2msecs(ieee80211_hwmp_roottimeout);
+	preq.preq_metric = IEEE80211_MESHLMETRIC_INITIALVAL;
+	preq.preq_tcount = 1;
+	IEEE80211_ADDR_COPY(PREQ_TADDR(0), broadcastaddr);
+	PREQ_TFLAGS(0) = IEEE80211_MESHPREQ_TFLAGS_TO |
+	    IEEE80211_MESHPREQ_TFLAGS_RF;
+	PREQ_TSEQ(0) = 0;
+	hwmp_send_preq(vap->iv_bss, vap->iv_myaddr, broadcastaddr, &preq);
+}
+#undef	PREQ_TFLAGS
+#undef	PREQ_TADDR
+#undef	PREQ_TSEQ
+#endif
+
 #define	PREQ_TFLAGS(n)	preq->preq_targets[n].target_flags
 #define	PREQ_TADDR(n)	preq->preq_targets[n].target_addr
 #define	PREQ_TSEQ(n)	preq->preq_targets[n].target_seq
@@ -563,6 +601,7 @@ hwmp_recv_preq(struct ieee80211vap *vap,
 	struct ieee80211_mesh_state *ms = vap->iv_mesh;
 	struct ieee80211_hwmp_state *hs = vap->iv_hwmp;
 	struct ieee80211_hwmp_route *rt = NULL;
+	struct ieee80211_meshprep_ie prep;
 
 	/*
 	 * Ignore PREQs from us. Could happen because someone forward it
@@ -589,8 +628,6 @@ hwmp_recv_preq(struct ieee80211vap *vap,
 	 * XXX: check if this is part of a proxy address.
 	 */
 	if (IEEE80211_ADDR_EQ(vap->iv_myaddr, PREQ_TADDR(0))) {
-		struct ieee80211_meshprep_ie prep;
-
 		IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, ni,
 		    "replying to %s", ether_sprintf(preq->preq_origaddr));
 		/*
@@ -706,25 +743,38 @@ hwmp_recv_preq(struct ieee80211vap *vap,
 			hwmp_send_preq(ni, vap->iv_myaddr, broadcastaddr,
 			    &ppreq);
 		}
-		/*
-		 * XXX: Update the percursor table
-		 */
-		return;
 	}
 
 	/*
-	 * XXX: Proactive PREQ: reply with a proactive PREP to the
+	 * Proactive PREQ: reply with a proactive PREP to the
 	 * root STA if requested.
 	 */
 	if (IEEE80211_ADDR_EQ(PREQ_TADDR(0), broadcastaddr) &&
 	    (PREQ_TFLAGS(0) &
 	    ((IEEE80211_MESHPREQ_TFLAGS_TO|IEEE80211_MESHPREQ_TFLAGS_RF) ==
 	    (IEEE80211_MESHPREQ_TFLAGS_TO|IEEE80211_MESHPREQ_TFLAGS_RF)))) {
+		rt = hwmp_rt_find(vap, preq->preq_origaddr);
+		if (rt == NULL)
+			rt = hwmp_rt_add(vap, preq->preq_origaddr);
 		/*
-		 * Does the root want a proactive PREP ?
+		 * Reply with a PREP if we don't have a path to the root
+		 * or if the root sent us a proactive PREQ.
 		 */
-		if (preq->preq_flags & IEEE80211_MESHPREQ_FLAGS_PP) {
-
+		if (IEEE80211_ADDR_EQ(rt->rt_nexthop, invalidaddr) ||
+		    (preq->preq_flags & IEEE80211_MESHPREQ_FLAGS_PP)) {
+			prep.prep_flags = 0;
+			prep.prep_hopcount = 0;
+			prep.prep_ttl = hs->hs_ttl;
+			IEEE80211_ADDR_COPY(prep.prep_targetaddr,
+			    vap->iv_myaddr);
+			prep.prep_targetseq = ++hs->hs_seq;
+			prep.prep_lifetime = preq->preq_lifetime;
+			prep.prep_metric = IEEE80211_MESHLMETRIC_INITIALVAL;
+			IEEE80211_ADDR_COPY(prep.prep_origaddr,
+			    preq->preq_origaddr);
+			prep.prep_origseq = preq->preq_origseq;
+			hwmp_send_prep(vap->iv_bss, vap->iv_myaddr,
+			    broadcastaddr, &prep);
 		}
 	}
 }

Modified: projects/mesh11s/sys/net80211/ieee80211_mesh.h
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211_mesh.h	Wed Jul  1 23:13:19 2009	(r195269)
+++ projects/mesh11s/sys/net80211/ieee80211_mesh.h	Wed Jul  1 23:14:21 2009	(r195270)
@@ -211,8 +211,9 @@ struct ieee80211_meshpreq_ie {
 	uint8_t		preq_len;
 	uint8_t		preq_flags;
 #define	IEEE80211_MESHPREQ_FLAGS_PR	0x01	/* Portal Role */
-#define	IEEE80211_MESHPREQ_FLAGS_AE	0x02	/* Address Extension */
+#define	IEEE80211_MESHPREQ_FLAGS_AM	0x02	/* 0 = ucast / 1 = bcast */
 #define	IEEE80211_MESHPREQ_FLAGS_PP	0x04	/* Proactive PREP */
+#define	IEEE80211_MESHPREQ_FLAGS_AE	0x40	/* Address Extension */
 	uint8_t		preq_hopcount;
 	uint8_t		preq_ttl;
 	uint32_t	preq_id;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200907012314.n61NELwa026879>