svn commit: r194626 - projects/mesh11s/sys/net80211

Rui Paulo rpaulo at FreeBSD.org
Mon Jun 22 14:42:15 UTC 2009


Author: rpaulo
Date: Mon Jun 22 14:42:14 2009
New Revision: 194626
URL: http://svn.freebsd.org/changeset/base/194626

Log:
  Checkpoint HWMP work. We can now establish paths with mesh nodes in the
  middle.
  
  Sponsored by:	The FreeBSD Foundation

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

Modified: projects/mesh11s/sys/net80211/ieee80211_hwmp.c
==============================================================================
--- projects/mesh11s/sys/net80211/ieee80211_hwmp.c	Mon Jun 22 14:32:47 2009	(r194625)
+++ projects/mesh11s/sys/net80211/ieee80211_hwmp.c	Mon Jun 22 14:42:14 2009	(r194626)
@@ -516,6 +516,13 @@ hwmp_recv_preq(struct ieee80211vap *vap,
 	struct ieee80211_hwmp_state *hs = vap->iv_hwmp;
 	struct ieee80211_hwmp_fi *fi = NULL;
 
+	/*
+	 * Ignore PREQs from us. Could happen because someone forward it
+	 * back to us.
+	 */
+	if (IEEE80211_ADDR_EQ(vap->iv_myaddr, preq->preq_origaddr))
+		return;
+
 	IEEE80211_NOTE(vap, IEEE80211_MSG_MESH, ni,
 	    "received PREQ, source %s", ether_sprintf(preq->preq_origaddr));
 
@@ -532,11 +539,11 @@ hwmp_recv_preq(struct ieee80211vap *vap,
 
 	HWMP_LOCK(hs);
 	TAILQ_FOREACH(fi, &hs->hs_head, fi_next) {
-		if (IEEE80211_ADDR_EQ(preq->preq_origaddr, fi->fi_dest))
+		if (IEEE80211_ADDR_EQ(PREQ_TADDR(0), fi->fi_dest))
 			break;
 	}
 	HWMP_UNLOCK(hs);
-
+#if 0
 	/*
 	 * Record the PREQ ID and the originator MAC address.
 	 */
@@ -544,7 +551,7 @@ hwmp_recv_preq(struct ieee80211vap *vap,
 		fi = malloc(sizeof(struct ieee80211_hwmp_fi), M_80211_HWMP,
 		    M_NOWAIT | M_ZERO);
 		memset(fi, 0, sizeof(*fi));
-		IEEE80211_ADDR_COPY(fi->fi_dest, preq->preq_origaddr);
+		IEEE80211_ADDR_COPY(fi->fi_dest, PREQ_TADDR(0));
 		fi->fi_seq = preq->preq_origseq;
 		fi->fi_metric = preq->preq_metric;
 		fi->fi_lifetime = preq->preq_lifetime;
@@ -553,6 +560,7 @@ hwmp_recv_preq(struct ieee80211vap *vap,
 		HWMP_UNLOCK(hs);
 	}
 	fi->fi_preqid = preq->preq_id;
+#endif
 
 	/*
 	 * Check if the PREQ is addressed to us.
@@ -569,15 +577,13 @@ hwmp_recv_preq(struct ieee80211vap *vap,
 		prep.prep_flags = 0;
 		prep.prep_hopcount = 0;
 		prep.prep_ttl = ieee80211_mesh_ttl;
-		IEEE80211_ADDR_COPY(prep.prep_targetaddr,
-		    preq->preq_targets[0].target_addr);
+		IEEE80211_ADDR_COPY(prep.prep_targetaddr, preq->preq_origaddr);
 		prep.prep_targetseq = preq->preq_origseq;
 		prep.prep_lifetime = preq->preq_lifetime;
 		prep.prep_metric = IEEE80211_MESHLMETRIC_INITIALVAL;
 		IEEE80211_ADDR_COPY(prep.prep_origaddr, vap->iv_myaddr);
 		prep.prep_origseq = hs->hs_seq++;
-		/* XXX addr1 = next hop */
-		hwmp_send_prep(ni, vap->iv_myaddr, preq->preq_origaddr, &prep);
+		hwmp_send_prep(ni, vap->iv_myaddr, wh->i_addr2, &prep);
 #if 0
 		/*
 		 * Build the reverse path, if we don't have it already.
@@ -596,19 +602,18 @@ hwmp_recv_preq(struct ieee80211vap *vap,
 	/*
 	 * Intermediate reply for PREQs with 1 target.
 	 */
-	if (preq->preq_ttl > 1 && preq->preq_tcount == 1 &&
-	    !(PREQ_TFLAGS(0) & IEEE80211_MESHPREQ_TFLAGS_TO)) {
+	if (preq->preq_ttl > 1 && preq->preq_tcount == 1) {
 		struct ieee80211_meshpreq_ie ppreq; /* propagated PREQ */
 
 		memcpy(&ppreq, preq, sizeof(ppreq));
 		/*
-		 * Can we do an intermediate path reply?
+		 * We have a valid route to this node.
 		 */
-		if (fi != NULL) {
-			struct ieee80211_meshprep_ie prep;
+		if (fi != NULL &&
+		    !IEEE80211_ADDR_EQ(fi->fi_nexthop, invalidaddr)) {
 
 			IEEE80211_NOTE(vap, IEEE80211_MSG_MESH, ni,
-			    "replying and forwarding PREQ from %s",
+			    "forwarding PREQ from %s",
 			    ether_sprintf(preq->preq_origaddr));
 			/*
 			 * Propagate the original PREQ.
@@ -626,23 +631,29 @@ hwmp_recv_preq(struct ieee80211vap *vap,
 			    ~IEEE80211_MESHPREQ_TFLAGS_RF;
 			hwmp_send_preq(ni, vap->iv_myaddr, broadcastaddr,
 			    &ppreq);
-
 			/*
-			 * Build and send an intermediate PREP.
+			 * Check if we can send an intermediate Path Reply.
 			 */
-			prep.prep_flags = 0;
-			prep.prep_hopcount = 0;
-			prep.prep_ttl = ieee80211_mesh_ttl;
-			IEEE80211_ADDR_COPY(&prep.prep_targetaddr,
-			    preq->preq_origaddr);
-			prep.prep_targetseq = fi->fi_seq;
-			prep.prep_lifetime = preq->preq_lifetime;
-			prep.prep_metric = fi->fi_metric;
-			IEEE80211_ADDR_COPY(&prep.prep_origaddr,
-			    vap->iv_myaddr);
-			prep.prep_origseq = hs->hs_seq++;
-			hwmp_send_prep(ni, vap->iv_myaddr, broadcastaddr,
-			    &prep);
+	    		if (!(PREQ_TFLAGS(0) & IEEE80211_MESHPREQ_TFLAGS_TO)) {
+				struct ieee80211_meshprep_ie prep;
+
+				IEEE80211_NOTE(vap, IEEE80211_MSG_MESH, ni,
+				    "intermediate reply for PREQ from %s",
+				    ether_sprintf(preq->preq_origaddr));
+				prep.prep_flags = 0;
+				prep.prep_hopcount = 0;
+				prep.prep_ttl = ieee80211_mesh_ttl;
+				IEEE80211_ADDR_COPY(&prep.prep_targetaddr,
+				    preq->preq_origaddr);
+				prep.prep_targetseq = fi->fi_seq;
+				prep.prep_lifetime = preq->preq_lifetime;
+				prep.prep_metric = fi->fi_metric;
+				IEEE80211_ADDR_COPY(&prep.prep_origaddr,
+				    PREQ_TADDR(0));
+				prep.prep_origseq = hs->hs_seq++;
+				hwmp_send_prep(ni, vap->iv_myaddr,
+				    broadcastaddr, &prep);
+			}
 		} else {
 			IEEE80211_NOTE(vap, IEEE80211_MSG_MESH, ni,
 			    "forwarding PREQ from %s",
@@ -732,26 +743,13 @@ hwmp_recv_prep(struct ieee80211vap *vap,
 	IEEE80211_NOTE(vap, IEEE80211_MSG_MESH, ni,
 	    "received PREP from %s", ether_sprintf(prep->prep_origaddr));
 
-	/*
-	 * Find out if this path reply is useful to us.
-	 */
 	HWMP_LOCK(hs);
 	TAILQ_FOREACH(fi, &hs->hs_head, fi_next) {
-		if (IEEE80211_ADDR_EQ(prep->prep_targetaddr, fi->fi_dest))
+		if (IEEE80211_ADDR_EQ(prep->prep_origaddr, fi->fi_dest))
 			break;
 	}
 	HWMP_UNLOCK(hs);
 
-	/* XXX */
-	if (fi == NULL)
-		return;
-
-	/*
-	 * Record the next hop.
-	 * XXX check for SEQ and PREQ ID.
-	 */
-	IEEE80211_ADDR_COPY(fi->fi_nexthop, wh->i_addr2);
-
 	/*
 	 * If it's NOT for us, propagate the PREP if TTL is
 	 * greater than 1.
@@ -760,6 +758,10 @@ hwmp_recv_prep(struct ieee80211vap *vap,
 	    prep->prep_ttl > 1) {
 		struct ieee80211_meshprep_ie pprep; /* propagated PREP */
 
+		IEEE80211_NOTE(vap, IEEE80211_MSG_MESH, ni,
+		    "propagating PREP from %s",
+		    ether_sprintf(prep->prep_origaddr));
+
 		memcpy(&pprep, prep, sizeof(pprep));
 		pprep.prep_hopcount += 1;
 		pprep.prep_ttl -= 1;
@@ -772,6 +774,14 @@ hwmp_recv_prep(struct ieee80211vap *vap,
 		return;
 	}
 
+	if (fi != NULL) {
+		/*
+		 * Record the next hop.
+		 * XXX check for SEQ and PREQ ID.
+		 */
+		IEEE80211_ADDR_COPY(fi->fi_nexthop, wh->i_addr2);
+	}
+
 	/*
 	 * XXX: If it's for us and the AE bit is set, update the
 	 * proxy information table.
@@ -1015,6 +1025,7 @@ ieee80211_hwmp_discover(struct ieee80211
 		preq.preq_metric = fi->fi_metric;
 		preq.preq_tcount = 1;
 		IEEE80211_ADDR_COPY(PREQ_TADDR(0), dest);
+		PREQ_TFLAGS(0) = 0;
 		if (ieee80211_hwmp_targetonly)
 			PREQ_TFLAGS(0) |= IEEE80211_MESHPREQ_TFLAGS_TO;
 		if (ieee80211_hwmp_replyforward)


More information about the svn-src-projects mailing list