Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 27 Nov 2014 21:29:20 +0000 (UTC)
From:      "Alexander V. Chernikov" <melifaro@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r275195 - head/sys/net
Message-ID:  <201411272129.sARLTK2g064549@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: melifaro
Date: Thu Nov 27 21:29:19 2014
New Revision: 275195
URL: https://svnweb.freebsd.org/changeset/base/275195

Log:
  Do not try to copy header to @dst and than back to ethernet in case of
  pseudo_AF_HDRCMPLT:
  
  we copy media header from mbuf to 'struct sockaddr' @dst in bpf_movein, so
  mbuf already contains valid info.

Modified:
  head/sys/net/if_ethersubr.c

Modified: head/sys/net/if_ethersubr.c
==============================================================================
--- head/sys/net/if_ethersubr.c	Thu Nov 27 20:24:58 2014	(r275194)
+++ head/sys/net/if_ethersubr.c	Thu Nov 27 21:29:19 2014	(r275195)
@@ -147,7 +147,7 @@ ether_output(struct ifnet *ifp, struct m
 {
 	short type;
 	int error = 0, hdrcmplt = 0;
-	u_char esrc[ETHER_ADDR_LEN], edst[ETHER_ADDR_LEN];
+	u_char edst[ETHER_ADDR_LEN];
 	struct llentry *lle = NULL;
 	struct rtentry *rt0 = NULL;
 	struct ether_header *eh;
@@ -226,16 +226,12 @@ ether_output(struct ifnet *ifp, struct m
 #endif
 	case pseudo_AF_HDRCMPLT:
 	    {
-		const struct ether_header *eh;
-		
 		hdrcmplt = 1;
-		eh = (const struct ether_header *)dst->sa_data;
-		(void)memcpy(esrc, eh->ether_shost, sizeof (esrc));
 		/* FALLTHROUGH */
 
 	case AF_UNSPEC:
 		loop_copy = 0; /* if this is for us, don't do it */
-		eh = (const struct ether_header *)dst->sa_data;
+		eh = (struct ether_header *)dst->sa_data;
 		(void)memcpy(edst, eh->ether_dhost, sizeof (edst));
 		type = eh->ether_type;
 		break;
@@ -258,15 +254,11 @@ ether_output(struct ifnet *ifp, struct m
 	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));
-	if (hdrcmplt)
-		(void)memcpy(eh->ether_shost, esrc,
-			sizeof(eh->ether_shost));
-	else
-		(void)memcpy(eh->ether_shost, IF_LLADDR(ifp),
-			sizeof(eh->ether_shost));
+	if (hdrcmplt == 0) {
+		memcpy(&eh->ether_type, &type, sizeof(eh->ether_type));
+		memcpy(eh->ether_dhost, edst, sizeof (edst));
+		memcpy(eh->ether_shost, IF_LLADDR(ifp),sizeof(eh->ether_shost));
+	}
 
 	/*
 	 * If a simplex interface, and the packet is being sent to our



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201411272129.sARLTK2g064549>