Date: Thu, 9 Jul 2009 20:49:56 +0000 (UTC) From: Rui Paulo <rpaulo@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r195516 - projects/mesh11s/sys/net80211 Message-ID: <200907092049.n69KnuEY096839@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: rpaulo Date: Thu Jul 9 20:49:56 2009 New Revision: 195516 URL: http://svn.freebsd.org/changeset/base/195516 Log: Rework mesh_forward() to use if_start instead of raw_xmit. Gives more throughput. Sponsored by: sam Modified: projects/mesh11s/sys/net80211/ieee80211_mesh.c Modified: projects/mesh11s/sys/net80211/ieee80211_mesh.c ============================================================================== --- projects/mesh11s/sys/net80211/ieee80211_mesh.c Thu Jul 9 20:22:05 2009 (r195515) +++ projects/mesh11s/sys/net80211/ieee80211_mesh.c Thu Jul 9 20:49:56 2009 (r195516) @@ -681,13 +681,12 @@ mesh_forward(struct ieee80211vap *vap, s struct ieee80211com *ic = vap->iv_ic; struct ieee80211_mesh_state *ms = vap->iv_mesh; struct ifnet *ifp = vap->iv_ifp; + struct ifnet *parent = ic->ic_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 *ni; int err; @@ -724,16 +723,11 @@ mesh_forward(struct ieee80211vap *vap, s 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)) { - ni = vap->iv_bss; - tp = ni->ni_txparms; - params.ibp_rate0 = tp->mcastrate; - params.ibp_flags |= IEEE80211_BPF_NOACK; - params.ibp_try0 = 1; + ni = ieee80211_ref_node(vap->iv_bss); mcopy->m_flags |= M_MCAST; } else { ni = mesh_find_txnode(vap, whcopy->i_addr3); @@ -744,36 +738,28 @@ mesh_forward(struct ieee80211vap *vap, s m_freem(mcopy); return; } - tp = ni->ni_txparms; - params.ibp_rate0 = tp->ucastrate; - params.ibp_try0 = tp->maxretry; IEEE80211_ADDR_COPY(whcopy->i_addr1, ni->ni_macaddr); } IEEE80211_NOTE(vap, IEEE80211_MSG_MESH, ni, "fwd %s frame from %s ttl %d", IEEE80211_IS_MULTICAST(wh->i_addr1) ? "mcast" : "ucast", ether_sprintf(wh->i_addr3), mccopy->mc_ttl); + KASSERT(mccopy->mc_ttl > 0, ("%s called with wrong ttl", __func__)); 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 = ni->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(ni->ni_macaddr), - ieee80211_node_refcnt(ni)+1); -#endif - ieee80211_ref_node(ni); - err = ic->ic_raw_xmit(ni, mcopy, ¶ms); - if (err) { + + /* XXX do we know m_nextpkt is NULL? */ + mcopy->m_pkthdr.rcvif = (void *) ni; + err = parent->if_transmit(parent, mcopy); + if (err != 0) { /* NB: IFQ_HANDOFF reclaims mbuf */ - ifp->if_oerrors++; ieee80211_free_node(ni); - } else + } else { ifp->if_opackets++; + } } static int
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200907092049.n69KnuEY096839>