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