From owner-svn-src-projects@FreeBSD.ORG Mon Jun 29 20:12:54 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 7C8A8106564A; Mon, 29 Jun 2009 20:12:54 +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 5184B8FC08; Mon, 29 Jun 2009 20:12:54 +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 n5TKCsfK058185; Mon, 29 Jun 2009 20:12:54 GMT (envelope-from rpaulo@svn.freebsd.org) Received: (from rpaulo@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n5TKCsu7058183; Mon, 29 Jun 2009 20:12:54 GMT (envelope-from rpaulo@svn.freebsd.org) Message-Id: <200906292012.n5TKCsu7058183@svn.freebsd.org> From: Rui Paulo Date: Mon, 29 Jun 2009 20:12:54 +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: r195176 - 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, 29 Jun 2009 20:12:54 -0000 Author: rpaulo Date: Mon Jun 29 20:12:54 2009 New Revision: 195176 URL: http://svn.freebsd.org/changeset/base/195176 Log: Rework the forwarding check a bit. Still a bit expensive. Sponsored by: The FreeBSD Foundation Modified: projects/mesh11s/sys/net80211/ieee80211_mesh.c Modified: projects/mesh11s/sys/net80211/ieee80211_mesh.c ============================================================================== --- projects/mesh11s/sys/net80211/ieee80211_mesh.c Mon Jun 29 19:46:29 2009 (r195175) +++ projects/mesh11s/sys/net80211/ieee80211_mesh.c Mon Jun 29 20:12:54 2009 (r195176) @@ -379,6 +379,7 @@ mesh_forward(struct ieee80211vap *vap, s "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); @@ -388,7 +389,7 @@ mesh_forward(struct ieee80211vap *vap, s IEEE80211_DPRINTF(vap, IEEE80211_MSG_NODE, "ieee80211_ref_node (%s:%u) %p<%s> refcnt %d\n", __func__, __LINE__, - ni, ether_sprintf(nidest->ni_macaddr), + nidest, ether_sprintf(nidest->ni_macaddr), ieee80211_node_refcnt(nidest)+1); #endif ieee80211_ref_node(nidest); @@ -514,16 +515,28 @@ mesh_input(struct ieee80211_node *ni, st } else qos = 0; /* - * 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 + * Check if we can forward the packet. */ - 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 && - (ms->ms_flags & IEEE80211_MESHFLAGS_FWD)) + if (mc->mc_ttl <= 0 || + !(ms->ms_flags & IEEE80211_MESHFLAGS_FWD)) + goto deliver; + /* + * Forward and deliver multicast packets + */ + if (IEEE80211_IS_MULTICAST(wh->i_addr1)) { + mesh_forward(vap, m); + goto deliver; + } + /* + * Forward packets if their final destination is not us. + */ + if (!IEEE80211_ADDR_EQ(vap->iv_myaddr, wh->i_addr3) && + IEEE80211_ADDR_EQ(vap->iv_myaddr, wh->i_addr1)) { mesh_forward(vap, m); + /* NB: don't deliver */ + goto out; + } +deliver: /* * Next up, any fragmentation. */