From owner-freebsd-net@FreeBSD.ORG Fri Feb 22 10:53:23 2013 Return-Path: Delivered-To: freebsd-net@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by hub.freebsd.org (Postfix) with ESMTP id 7AF0331C for ; Fri, 22 Feb 2013 10:53:23 +0000 (UTC) (envelope-from melifaro@FreeBSD.org) Received: from mail.ipfw.ru (unknown [IPv6:2a01:4f8:120:6141::2]) by mx1.freebsd.org (Postfix) with ESMTP id 416E9704 for ; Fri, 22 Feb 2013 10:53:23 +0000 (UTC) Received: from v6.mpls.in ([2a02:978:2::5] helo=ws.su29.net) by mail.ipfw.ru with esmtpsa (TLSv1:CAMELLIA256-SHA:256) (Exim 4.76 (FreeBSD)) (envelope-from ) id 1U8qJA-000J3N-Bd; Fri, 22 Feb 2013 14:56:52 +0400 Message-ID: <51274D99.1070009@FreeBSD.org> Date: Fri, 22 Feb 2013 14:51:05 +0400 From: "Alexander V. Chernikov" User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120121 Thunderbird/9.0 MIME-Version: 1.0 To: Vijay Singh Subject: Re: Possible optimization in ether_output() References: In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: freebsd-net@freebsd.org X-BeenThere: freebsd-net@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: Networking and TCP/IP with FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 22 Feb 2013 10:53:23 -0000 On 20.02.2013 02:05, Vijay Singh wrote: > Hi, this patch gives a modest performance improvement here @work. > Please consider. > > [/u/vijay/bsd/CODE/cur/sys/net]# svn diff if_ethersubr.c > Index: if_ethersubr.c > =================================================================== > --- if_ethersubr.c (revision 247012) > +++ if_ethersubr.c (working copy) > @@ -160,6 +160,7 @@ > struct pf_mtag *t; > int loop_copy = 1; > int hlen; /* link layer header length */ > + int use_lle_directly = 0; > > if (ro != NULL) { > if (!(m->m_flags& (M_BCAST | M_MCAST))) > @@ -184,7 +185,7 @@ > #ifdef INET > case AF_INET: > if (lle != NULL&& (lle->la_flags& LLE_VALID)) > - memcpy(edst,&lle->ll_addr.mac16, sizeof(edst)); > + use_lle_directly = 1; > else > error = arpresolve(ifp, rt0, m, dst, edst,&lle); > if (error) > @@ -222,7 +223,7 @@ > #ifdef INET6 > case AF_INET6: > if (lle != NULL&& (lle->la_flags& LLE_VALID)) > - memcpy(edst,&lle->ll_addr.mac16, sizeof(edst)); > + use_lle_directly = 1; > else > error = nd6_storelladdr(ifp, m, dst, (u_char *)edst,&lle); > if (error) > @@ -317,9 +318,13 @@ > if (m == NULL) > senderr(ENOBUFS); > eh = mtod(m, struct ether_header *); > - (void)memcpy(&eh->ether_type,&type, > - sizeof(eh->ether_type)); > - (void)memcpy(eh->ether_dhost, edst, sizeof (edst)); > + eh->ether_type = type; > + if (use_lle_directly) { > + memcpy(eh->ether_dhost,&lle->ll_addr.mac16, > + sizeof(eh->ether_dhost)); This is use-after-free since lle is returned unlocked by arpresolve(). This probably can be changed by supplying eh directly instead of edst, but this is tricky, too. I'm currently working on new arp stack implementation where such problems are handled more efficient. > + } else { > + (void)memcpy(eh->ether_dhost, edst, sizeof (edst)); > + } > if (hdrcmplt) > (void)memcpy(eh->ether_shost, esrc, > sizeof(eh->ether_shost)); > _______________________________________________ > freebsd-net@freebsd.org mailing list > http://lists.freebsd.org/mailman/listinfo/freebsd-net > To unsubscribe, send any mail to "freebsd-net-unsubscribe@freebsd.org" >