From owner-svn-src-projects@FreeBSD.ORG Tue Jun 2 21:40:58 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 38329106566B; Tue, 2 Jun 2009 21:40:58 +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 25C168FC16; Tue, 2 Jun 2009 21:40:58 +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 n52LewdT029222; Tue, 2 Jun 2009 21:40:58 GMT (envelope-from rpaulo@svn.freebsd.org) Received: (from rpaulo@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n52LewDb029221; Tue, 2 Jun 2009 21:40:58 GMT (envelope-from rpaulo@svn.freebsd.org) Message-Id: <200906022140.n52LewDb029221@svn.freebsd.org> From: Rui Paulo Date: Tue, 2 Jun 2009 21:40:58 +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: r193353 - 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: Tue, 02 Jun 2009 21:40:58 -0000 Author: rpaulo Date: Tue Jun 2 21:40:57 2009 New Revision: 193353 URL: http://svn.freebsd.org/changeset/base/193353 Log: Fix previous commits. 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 Tue Jun 2 21:17:56 2009 (r193352) +++ projects/mesh11s/sys/net80211/ieee80211_hwmp.c Tue Jun 2 21:40:57 2009 (r193353) @@ -65,7 +65,7 @@ __FBSDID("$FreeBSD$"); static int ieee80211_hwmp_send_action(struct ieee80211_node *, const uint8_t [IEEE80211_ADDR_LEN], const uint8_t [IEEE80211_ADDR_LEN], - const uint8_t *, size_t); + uint8_t *, size_t); static uint8_t *hwmp_add_meshpreq(uint8_t *, const struct ieee80211_meshpreq_ie *); static uint8_t *hwmp_add_meshprep(uint8_t *, @@ -110,7 +110,7 @@ static int ieee80211_hwmp_pathtoroottime static int ieee80211_hmwp_rootint = 2000; static int ieee80211_hwmp_rannint = 1000; #endif -static int ieee80211_hwmp_targetonly = 1; +static int ieee80211_hwmp_targetonly = 0; static int ieee80211_hwmp_replyforward = 1; #ifdef notyet static int ieee80211_hwmp_pathmaintenance = 2000; @@ -281,9 +281,9 @@ ieee80211_hwmp_recv_action(struct ieee80 static int ieee80211_hwmp_send_action(struct ieee80211_node *ni, - const uint8_t addr1[IEEE80211_ADDR_LEN], - const uint8_t addr2[IEEE80211_ADDR_LEN], - const uint8_t *ie, size_t len) + const uint8_t sa[IEEE80211_ADDR_LEN], + const uint8_t da[IEEE80211_ADDR_LEN], + uint8_t *ie, size_t len) { struct ieee80211vap *vap = ni->ni_vap; struct ieee80211com *ic = ni->ni_ic; @@ -325,22 +325,22 @@ ieee80211_hwmp_send_action(struct ieee80 case IEEE80211_ELEMID_MESHPREQ: *frm++ = IEEE80211_ACTION_MESHPATH_REQ; frm = hwmp_add_meshpreq(frm, - (struct ieee80211_meshpreq_ie *)&ie); + (struct ieee80211_meshpreq_ie *)ie); break; case IEEE80211_ELEMID_MESHPREP: *frm++ = IEEE80211_ACTION_MESHPATH_REP; frm = hwmp_add_meshprep(frm, - (struct ieee80211_meshprep_ie *)&ie); + (struct ieee80211_meshprep_ie *)ie); break; case IEEE80211_ELEMID_MESHPERR: *frm++ = IEEE80211_ACTION_MESHPATH_ERR; frm = hwmp_add_meshperr(frm, - (struct ieee80211_meshperr_ie *)&ie); + (struct ieee80211_meshperr_ie *)ie); break; case IEEE80211_ELEMID_MESHRANN: *frm++ = IEEE80211_ACTION_MESHPATH_RANN; frm = hwmp_add_meshrann(frm, - (struct ieee80211_meshrann_ie *)&ie); + (struct ieee80211_meshrann_ie *)ie); break; } @@ -353,7 +353,7 @@ ieee80211_hwmp_send_action(struct ieee80 } ieee80211_send_setup(ni, m, IEEE80211_FC0_TYPE_MGT | IEEE80211_FC0_SUBTYPE_ACTION, - IEEE80211_NONQOS_TID, addr1, addr2, addr2); + IEEE80211_NONQOS_TID, sa, da, sa); m->m_flags |= M_ENCAP; /* mark encapsulated */ IEEE80211_NODE_STAT(ni, tx_mgmt); @@ -476,6 +476,9 @@ hwmp_recv_preq(struct ieee80211vap *vap, struct ieee80211_hwmp_state *hs = vap->iv_hwmp; struct ieee80211_hwmp_fi *fi = NULL; + IEEE80211_NOTE(vap, IEEE80211_MSG_MESH, ni, + "received PREQ, source %s", ether_sprintf(preq->preq_origaddr)); + /* * Acceptance criteria: if the PREQ is not for us and * forwarding is disabled, discard this PREQ. @@ -505,6 +508,9 @@ hwmp_recv_preq(struct ieee80211vap *vap, */ if (IEEE80211_ADDR_EQ(vap->iv_myaddr, PREQ_TADDR(0))) { struct ieee80211_meshprep_ie prep; + + IEEE80211_NOTE(vap, IEEE80211_MSG_MESH, ni, + "replying to %s", ether_sprintf(preq->preq_origaddr)); /* * Build and send a PREP frame. */ @@ -519,7 +525,7 @@ hwmp_recv_preq(struct ieee80211vap *vap, IEEE80211_ADDR_COPY(prep.prep_origaddr, vap->iv_myaddr); prep.prep_origseq = hs->hs_seq++; /* XXX addr1 = next hop */ - hwmp_send_prep(ni, preq->preq_origaddr, vap->iv_myaddr, &prep); + hwmp_send_prep(ni, vap->iv_myaddr, preq->preq_origaddr, &prep); return; } @@ -532,6 +538,7 @@ hwmp_recv_preq(struct ieee80211vap *vap, !(PREQ_TFLAGS(0) & IEEE80211_MESHPREQ_TFLAGS_TO)) { struct ieee80211_meshpreq_ie ppreq; /* propagated PREQ */ + memcpy(&ppreq, preq, sizeof(ppreq)); /* * Can we do an intermediate path reply? @@ -539,6 +546,9 @@ hwmp_recv_preq(struct ieee80211vap *vap, if (fi != NULL) { struct ieee80211_meshprep_ie prep; + IEEE80211_NOTE(vap, IEEE80211_MSG_MESH, ni, + "replying and forwarding PREQ from %s", + ether_sprintf(preq->preq_origaddr)); /* * Propagate the original PREQ. */ @@ -573,6 +583,9 @@ hwmp_recv_preq(struct ieee80211vap *vap, hwmp_send_prep(ni, vap->iv_myaddr, broadcastaddr, &prep); } else { + IEEE80211_NOTE(vap, IEEE80211_MSG_MESH, ni, + "forwarding PREQ from %s", + ether_sprintf(preq->preq_origaddr)); /* * We have no information about this path, * propagate the PREQ. @@ -612,21 +625,23 @@ hwmp_recv_preq(struct ieee80211vap *vap, static inline int hwmp_send_preq(struct ieee80211_node *ni, - const uint8_t addr1[IEEE80211_ADDR_LEN], - const uint8_t addr2[IEEE80211_ADDR_LEN], + const uint8_t sa[IEEE80211_ADDR_LEN], + const uint8_t da[IEEE80211_ADDR_LEN], struct ieee80211_meshpreq_ie *preq) { /* * mesh preq action frame format - * [6] addr1 - * [6] addr2 - * [6] addr3 = addr2 + * [6] da + * [6] sa + * [6] addr3 = sa * [1] action * [1] category * [tlv] mesh path request */ - return ieee80211_hwmp_send_action(ni, addr1, addr2, (uint8_t *)&preq, - sizeof(*preq)); + preq->preq_ie = IEEE80211_ELEMID_MESHPREQ; + + return ieee80211_hwmp_send_action(ni, sa, da, (uint8_t *)preq, + sizeof(struct ieee80211_meshpreq_ie)); } static void @@ -660,8 +675,7 @@ hwmp_recv_prep(struct ieee80211vap *vap, pprep.prep_ttl -= 1; pprep.prep_metric += ieee80211_airtime_calc(ni); IEEE80211_ADDR_COPY(pprep.prep_origaddr, vap->iv_myaddr); - hwmp_send_prep(ni, vap->iv_myaddr, broadcastaddr, - &pprep); + hwmp_send_prep(ni, vap->iv_myaddr, broadcastaddr, &pprep); /* * XXX: Step 5: update the precursor list. */ @@ -683,21 +697,23 @@ hwmp_recv_prep(struct ieee80211vap *vap, static inline int hwmp_send_prep(struct ieee80211_node *ni, - const uint8_t addr1[IEEE80211_ADDR_LEN], - const uint8_t addr2[IEEE80211_ADDR_LEN], + const uint8_t sa[IEEE80211_ADDR_LEN], + const uint8_t da[IEEE80211_ADDR_LEN], struct ieee80211_meshprep_ie *prep) { /* * mesh prep action frame format - * [6] addr1 - * [6] addr2 - * [6] addr3 = addr2 + * [6] da + * [6] sa + * [6] addr3 = sa * [1] action * [1] category * [tlv] mesh path reply */ - return ieee80211_hwmp_send_action(ni, addr1, addr2, (uint8_t *)&prep, - sizeof(*prep)); + prep->prep_ie = IEEE80211_ELEMID_MESHPREP; + + return ieee80211_hwmp_send_action(ni, sa, da, (uint8_t *)prep, + sizeof(struct ieee80211_meshprep_ie)); } #define PERR_DADDR(n) perr->perr_dests[n].dest_addr @@ -737,21 +753,21 @@ hwmp_recv_perr(struct ieee80211vap *vap, static inline int hwmp_send_perr(struct ieee80211_node *ni, - const uint8_t addr1[IEEE80211_ADDR_LEN], - const uint8_t addr2[IEEE80211_ADDR_LEN], + const uint8_t sa[IEEE80211_ADDR_LEN], + const uint8_t da[IEEE80211_ADDR_LEN], struct ieee80211_meshperr_ie *perr) { /* * mesh perr action frame format - * [6] addr1 - * [6] addr2 - * [6] addr3 = addr2 + * [6] da + * [6] sa + * [6] addr3 = sa * [1] action * [1] category * [tlv] mesh path error */ - return ieee80211_hwmp_send_action(ni, addr1, addr2, (uint8_t *)&perr, - sizeof(*perr)); + return ieee80211_hwmp_send_action(ni, sa, da, (uint8_t *)perr, + sizeof(struct ieee80211_meshperr_ie)); } static void @@ -791,8 +807,7 @@ hwmp_recv_rann(struct ieee80211vap *vap, preq.preq_targets[0].target_seq = rann->rann_seq; preq.preq_lifetime = ieee80211_hwmp_roottimeout; preq.preq_metric = IEEE80211_MESHLMETRIC_INITIALVAL; - hwmp_send_preq(ni, vap->iv_myaddr, broadcastaddr, - &preq); + hwmp_send_preq(ni, vap->iv_myaddr, broadcastaddr, &preq); /* * We have a path for this Root Mesh station, so * propagate the RANN if forwarding is enabled. @@ -804,27 +819,27 @@ hwmp_recv_rann(struct ieee80211vap *vap, prann.rann_hopcount += 1; prann.rann_ttl -= 1; prann.rann_metric += ieee80211_airtime_calc(ni); - hwmp_send_rann(ni, broadcastaddr, vap->iv_myaddr, &prann); + hwmp_send_rann(ni, vap->iv_myaddr, broadcastaddr, &prann); } } static inline int hwmp_send_rann(struct ieee80211_node *ni, - const uint8_t addr1[IEEE80211_ADDR_LEN], - const uint8_t addr2[IEEE80211_ADDR_LEN], + const uint8_t sa[IEEE80211_ADDR_LEN], + const uint8_t da[IEEE80211_ADDR_LEN], struct ieee80211_meshrann_ie *rann) { /* * mesh rann action frame format - * [6] addr1 - * [6] addr2 - * [6] addr3 = addr2 + * [6] da + * [6] sa + * [6] addr3 = sa * [1] action * [1] category * [tlv] root annoucement */ - return ieee80211_hwmp_send_action(ni, addr1, addr2, (uint8_t *)&rann, - sizeof(*rann)); + return ieee80211_hwmp_send_action(ni, sa, da, (uint8_t *)rann, + sizeof(struct ieee80211_meshrann_ie)); } #define PREQ_TFLAGS(n) preq.preq_targets[n].target_flags @@ -843,6 +858,12 @@ ieee80211_hwmp_discover(struct ieee80211 KASSERT(vap->iv_opmode == IEEE80211_M_MBSS, ("not a mesh vap, opmode %d", vap->iv_opmode)); + if (IEEE80211_IS_MULTICAST(dest)) + return ieee80211_find_txnode(vap, dest); + + IEEE80211_NOTE_MAC(vap, IEEE80211_MSG_MESH, dest, + "%s", "initiating path discovery"); + mtx_lock(&hs->hs_lock); TAILQ_FOREACH(fi, &hs->hs_head, fi_next) { if (IEEE80211_ADDR_EQ(fi->fi_dest, dest)) { @@ -850,43 +871,54 @@ ieee80211_hwmp_discover(struct ieee80211 /* XXX check preq retries */ sendpreq = 1; unknowndst = 1; - break; } + break; } } mtx_unlock(&hs->hs_lock); + if (fi == NULL) { + fi = malloc(sizeof(struct ieee80211_hwmp_fi), M_80211_VAP, + M_NOWAIT | M_ZERO); + memcpy(fi->fi_dest, dest, IEEE80211_ADDR_LEN); + fi->fi_seq = ++hs->hs_seq; + fi->fi_metric = IEEE80211_MESHLMETRIC_INITIALVAL; + fi->fi_lifetime = ieee80211_hwmp_pathtimeout; + mtx_lock(&hs->hs_lock); + TAILQ_INSERT_TAIL(&hs->hs_head, fi, fi_next); + mtx_unlock(&hs->hs_lock); + sendpreq = 1; + unknowndst = 1; + } + if (sendpreq) { /* - * Try to discover the path for this - * node. + * Try to discover the path for this node. */ + preq.preq_flags = 0; preq.preq_hopcount = 0; preq.preq_ttl = ieee80211_mesh_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 = - ieee80211_hwmp_pathtimeout; - preq.preq_metric = - IEEE80211_MESHLMETRIC_INITIALVAL; + IEEE80211_ADDR_COPY(preq.preq_origaddr, vap->iv_myaddr); + preq.preq_origseq = fi->fi_seq; + preq.preq_lifetime = fi->fi_lifetime; + preq.preq_metric = fi->fi_metric; preq.preq_tcount = 1; IEEE80211_ADDR_COPY(PREQ_TADDR(0), dest); if (ieee80211_hwmp_targetonly) PREQ_TFLAGS(0) |= IEEE80211_MESHPREQ_TFLAGS_TO; if (ieee80211_hwmp_replyforward) PREQ_TFLAGS(0) |= IEEE80211_MESHPREQ_TFLAGS_RF; - if (unknowndst) + if (unknowndst) { PREQ_TFLAGS(0) |= IEEE80211_MESHPREQ_TFLAGS_USN; - else + PREQ_TSEQ(0) = 0; + } else PREQ_TSEQ(0) = fi->fi_seq; hwmp_send_preq(vap->iv_bss, vap->iv_myaddr, broadcastaddr, &preq); } else return ieee80211_find_txnode(vap, fi->fi_nexthop); - /* XXX */ return vap->iv_bss; } #undef PREQ_TFLAGS