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