Possible optimization in ether_output()
Vijay Singh
vijju.singh at gmail.com
Tue Feb 19 22:05:58 UTC 2013
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));
+ } else {
+ (void)memcpy(eh->ether_dhost, edst, sizeof (edst));
+ }
if (hdrcmplt)
(void)memcpy(eh->ether_shost, esrc,
sizeof(eh->ether_shost));
More information about the freebsd-net
mailing list