From owner-svn-src-projects@FreeBSD.ORG Mon Jun 22 14:42:14 2009 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id C5FCF1065676; Mon, 22 Jun 2009 14:42:14 +0000 (UTC) (envelope-from rpaulo@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id B31758FC28; Mon, 22 Jun 2009 14:42:14 +0000 (UTC) (envelope-from rpaulo@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n5MEgEV6043861; Mon, 22 Jun 2009 14:42:14 GMT (envelope-from rpaulo@svn.freebsd.org) Received: (from rpaulo@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n5MEgEsk043859; Mon, 22 Jun 2009 14:42:14 GMT (envelope-from rpaulo@svn.freebsd.org) Message-Id: <200906221442.n5MEgEsk043859@svn.freebsd.org> From: Rui Paulo Date: Mon, 22 Jun 2009 14:42:14 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r194626 - projects/mesh11s/sys/net80211 X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 22 Jun 2009 14:42:15 -0000 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)