From owner-svn-src-projects@FreeBSD.ORG Wed Jun 24 18:02:35 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 123551065696; Wed, 24 Jun 2009 18:02:35 +0000 (UTC) (envelope-from sam@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id EA52C8FC1D; Wed, 24 Jun 2009 18:02:34 +0000 (UTC) (envelope-from sam@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 n5OI2YiD022935; Wed, 24 Jun 2009 18:02:34 GMT (envelope-from sam@svn.freebsd.org) Received: (from sam@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n5OI2Yjb022933; Wed, 24 Jun 2009 18:02:34 GMT (envelope-from sam@svn.freebsd.org) Message-Id: <200906241802.n5OI2Yjb022933@svn.freebsd.org> From: Sam Leffler Date: Wed, 24 Jun 2009 18:02:34 +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: r194867 - 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: Wed, 24 Jun 2009 18:02:35 -0000 Author: sam Date: Wed Jun 24 18:02:34 2009 New Revision: 194867 URL: http://svn.freebsd.org/changeset/base/194867 Log: Forwarding fixups/cleanups: o pull code into new mesh_forward function o correct multiple mcast/ucast issues o take tx parms from the dest node in case they are operating w/ different channel characteristics (may need to revisi mcast case) o on raw xmit error free the correct node ref Reviewed by: rpaulo Modified: projects/mesh11s/sys/net80211/ieee80211_mesh.c Modified: projects/mesh11s/sys/net80211/ieee80211_mesh.c ============================================================================== --- projects/mesh11s/sys/net80211/ieee80211_mesh.c Wed Jun 24 18:00:34 2009 (r194866) +++ projects/mesh11s/sys/net80211/ieee80211_mesh.c Wed Jun 24 18:02:34 2009 (r194867) @@ -281,6 +281,91 @@ restart: return r; } +/* + * Forward the specified frame. + * Decrement the TTL and set TA to our MAC address. + */ +static void +mesh_forward(struct ieee80211vap *vap, struct mbuf *m) +{ + struct ieee80211com *ic = vap->iv_ic; + struct ifnet *ifp = vap->iv_ifp; + const struct ieee80211_frame *wh = + mtod(m, const struct ieee80211_frame *); + struct mbuf *mcopy; + struct ieee80211_meshcntl *mccopy; + struct ieee80211_frame *whcopy; + const struct ieee80211_txparam *tp; + struct ieee80211_bpf_params params; + struct ieee80211_node *nidest; + int err; + + mcopy = m_dup(m, M_DONTWAIT); + if (mcopy == NULL) { + /* XXX stat+msg? */ + ifp->if_oerrors++; + return; + } + mcopy = m_pullup(mcopy, ieee80211_hdrspace(ic, wh) + + sizeof(struct ieee80211_meshcntl)); + if (mcopy == NULL) { + /* XXX stat+msg? */ + ifp->if_oerrors++; + m_freem(mcopy); + return; + } + whcopy = mtod(mcopy, struct ieee80211_frame *); + mccopy = (struct ieee80211_meshcntl *) + (mtod(mcopy, uint8_t *) + ieee80211_hdrspace(ic, wh)); + memset(¶ms, 0, sizeof(params)); + /* XXX clear other bits? */ + whcopy->i_fc[1] &= ~IEEE80211_FC1_RETRY; + IEEE80211_ADDR_COPY(whcopy->i_addr2, vap->iv_myaddr); + if (IEEE80211_IS_MULTICAST(wh->i_addr1)) { + nidest = vap->iv_bss; + tp = nidest->ni_txparms; + params.ibp_rate0 = tp->mcastrate; + params.ibp_flags |= IEEE80211_BPF_NOACK; + params.ibp_try0 = 1; + mcopy->m_flags |= M_MCAST; + } else { + nidest = ieee80211_hwmp_find_txnode(vap, whcopy->i_addr3); + if (nidest == NULL) { + /* XXX stat+msg? */ + m_freem(mcopy); + return; + } + tp = nidest->ni_txparms; + params.ibp_rate0 = tp->ucastrate; + params.ibp_try0 = tp->maxretry; + IEEE80211_ADDR_COPY(whcopy->i_addr1, nidest->ni_macaddr); + } + IEEE80211_NOTE(vap, IEEE80211_MSG_MESH, nidest, + "fwd %s frame from %s ttl %d", + IEEE80211_IS_MULTICAST(wh->i_addr1) ? "mcast" : "ucast", + ether_sprintf(wh->i_addr3), mccopy->mc_ttl); + mccopy->mc_ttl--; + /* XXX calculate priority so drivers can find the tx queue */ + M_WME_SETAC(mcopy, WME_AC_BE); + params.ibp_pri = M_WME_GETAC(mcopy); + params.ibp_power = nidest->ni_txpower; +#ifdef IEEE80211_DEBUG_REFCNT + IEEE80211_DPRINTF(vap, IEEE80211_MSG_NODE, + "ieee80211_ref_node (%s:%u) %p<%s> refcnt %d\n", + __func__, __LINE__, + ni, ether_sprintf(nidest->ni_macaddr), + ieee80211_node_refcnt(nidest)+1); +#endif + ieee80211_ref_node(nidest); + err = ic->ic_raw_xmit(nidest, mcopy, ¶ms); + if (err) { + /* NB: IFQ_HANDOFF reclaims mbuf */ + ifp->if_oerrors++; + ieee80211_free_node(nidest); + } else + ifp->if_opackets++; +} + static int mesh_input(struct ieee80211_node *ni, struct mbuf *m, int rssi, int noise) { @@ -341,8 +426,10 @@ mesh_input(struct ieee80211_node *ni, st case IEEE80211_FC0_TYPE_DATA: if (ni == vap->iv_bss) goto out; +#if 0 IEEE80211_NOTE(vap, IEEE80211_MSG_MESH, ni, "received data frame, dir 0x%x", dir); +#endif if (ni->ni_mlstate != IEEE80211_NODE_MESH_ESTABLISHED) { IEEE80211_DISCARD_MAC(vap, IEEE80211_MSG_MESH, ni->ni_macaddr, NULL, @@ -389,84 +476,14 @@ mesh_input(struct ieee80211_node *ni, st /* * Forward packets if they are not destined to us. * We just decrement the TTL and set TA to our MAC address. + * XXX make this check cheaper */ if (!IEEE80211_ADDR_EQ(vap->iv_myaddr, wh->i_addr2) && !IEEE80211_ADDR_EQ(vap->iv_myaddr, wh->i_addr3) && !IEEE80211_ADDR_EQ(wh->i_addr1, wh->i_addr3) && mc->mc_ttl > 0 && - (vap->iv_meshflags & IEEE80211_MFLAGS_FWRD)) { - struct mbuf *mcopy; - struct ieee80211_meshcntl *mccopy; - struct ieee80211_frame *whcopy; - const struct ieee80211_txparam *tp; - struct ieee80211_bpf_params params; - struct ieee80211_node *nidest; - int err; - - mcopy = m_dup(m, M_DONTWAIT); - if (mcopy == NULL) { - ifp->if_oerrors++; - goto deliver; - } - mcopy = m_pullup(mcopy, ieee80211_hdrspace(ic, wh) + - sizeof(struct ieee80211_meshcntl)); - if (mcopy == NULL) { - ifp->if_oerrors++; - m_freem(mcopy); - goto deliver; - } - whcopy = mtod(mcopy, struct ieee80211_frame *); - mccopy = (struct ieee80211_meshcntl *) - (mtod(mcopy, uint8_t *) + - ieee80211_hdrspace(ic, wh)); - memset(¶ms, 0, sizeof(params)); - tp = &vap->iv_txparms[ieee80211_chan2mode(ic->ic_curchan)]; - /* XXX clear other bits? */ - whcopy->i_fc[1] &= ~IEEE80211_FC1_RETRY; - IEEE80211_ADDR_COPY(whcopy->i_addr2, vap->iv_myaddr); - if (IEEE80211_IS_MULTICAST(wh->i_addr1)) { - IEEE80211_NOTE(vap, IEEE80211_MSG_MESH, ni, - "forwarding multicast frame from %s ttl %d", - ether_sprintf(wh->i_addr3), mc->mc_ttl); - nidest = vap->iv_bss; - params.ibp_rate0 = tp->mcastrate; - } else { - IEEE80211_NOTE(vap, IEEE80211_MSG_MESH, ni, - "forwarding unicast frame from %s ttl %d", - ether_sprintf(wh->i_addr3), mc->mc_ttl); - params.ibp_rate0 = tp->ucastrate; - nidest = ieee80211_hwmp_find_txnode(vap, - whcopy->i_addr3); - if (nidest == NULL) { - m_freem(mcopy); - goto deliver; - } - IEEE80211_ADDR_COPY(whcopy->i_addr1, - nidest->ni_macaddr); - } - mccopy->mc_ttl--; - /* XXX calculate priority so drivers can find the tx queue */ - mcopy->m_flags |= M_MCAST; - M_WME_SETAC(mcopy, WME_AC_BE); - params.ibp_pri = M_WME_GETAC(mcopy); - params.ibp_power = nidest->ni_txpower; - params.ibp_flags |= IEEE80211_BPF_NOACK; - params.ibp_try0 = 1; - IEEE80211_DPRINTF(vap, IEEE80211_MSG_NODE, - "ieee80211_ref_node (%s:%u) %p<%s> refcnt %d\n", - __func__, __LINE__, - ni, ether_sprintf(nidest->ni_macaddr), - ieee80211_node_refcnt(nidest)+1); - ieee80211_ref_node(nidest); - err = ic->ic_raw_xmit(nidest, mcopy, ¶ms); - if (err) { - /* NB: IFQ_HANDOFF reclaims mbuf */ - ifp->if_oerrors++; - ieee80211_free_node(vap->iv_bss); - } else - ifp->if_opackets++; - } -deliver: + (vap->iv_meshflags & IEEE80211_MFLAGS_FWRD)) + mesh_forward(vap, m); /* * Next up, any fragmentation. */