PERFORCE change 126441 for review

Kip Macy kmacy at FreeBSD.org
Sat Sep 15 13:04:23 PDT 2007


http://perforce.freebsd.org/chv.cgi?CH=126441

Change 126441 by kmacy at kmacy_home:ethng on 2007/09/15 20:04:04

	put ether_input on a diet for the common case,
	move most error handling to the end of the function

Affected files ...

.. //depot/projects/ethng/src/sys/net/if_ethersubr.c#2 edit

Differences ...

==== //depot/projects/ethng/src/sys/net/if_ethersubr.c#2 (text+ko) ====

@@ -512,58 +512,36 @@
 	struct ether_header *eh;
 	u_short etype;
 
-	if ((ifp->if_flags & IFF_UP) == 0) {
-		m_freem(m);
-		return;
-	}
+	if ((ifp->if_flags & IFF_UP) == 0) 
+		goto out;
+
 #ifdef DIAGNOSTIC
 	if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) {
 		if_printf(ifp, "discard frame at !IFF_DRV_RUNNING\n");
-		m_freem(m);
-		return;
+		goto out;
 	}
 #endif
 	/*
 	 * Do consistency checks to verify assumptions
 	 * made by code past this point.
 	 */
-	if ((m->m_flags & M_PKTHDR) == 0) {
-		if_printf(ifp, "discard frame w/o packet header\n");
-		ifp->if_ierrors++;
-		m_freem(m);
-		return;
-	}
-	if (m->m_len < ETHER_HDR_LEN) {
-		/* XXX maybe should pullup? */
-		if_printf(ifp, "discard frame w/o leading ethernet "
-				"header (len %u pkt len %u)\n",
-				m->m_len, m->m_pkthdr.len);
-		ifp->if_ierrors++;
-		m_freem(m);
-		return;
-	}
+	if ((m->m_flags & M_PKTHDR) == 0) 	
+		goto err_out_print;
+	if (m->m_len < ETHER_HDR_LEN) 
+		goto err_out_print;
+	
 	eh = mtod(m, struct ether_header *);
 	etype = ntohs(eh->ether_type);
 #ifdef DIAGNOSTIC
 	if (m->m_pkthdr.len >
 	    ETHER_MAX_FRAME(ifp, etype, m->m_flags & M_HASFCS) &&
 	    (ifp->if_capenable & IFCAP_LRO) == 0) {
-		if_printf(ifp, "discard oversize frame "
-				"(ether type %x flags %x len %u > max %lu)\n",
-				etype, m->m_flags, m->m_pkthdr.len,
-				ETHER_MAX_FRAME(ifp, etype,
-						m->m_flags & M_HASFCS));
-		ifp->if_ierrors++;
-		m_freem(m);
-		return;
+		goto err_out_print
 	}
 #endif
-	if (m->m_pkthdr.rcvif == NULL) {
-		if_printf(ifp, "discard frame w/o interface pointer\n");
-		ifp->if_ierrors++;
-		m_freem(m);
-		return;
-	}
+	if (m->m_pkthdr.rcvif == NULL)
+		goto err_out_print;
+
 #ifdef DIAGNOSTIC
 	if (m->m_pkthdr.rcvif != ifp) {
 		if_printf(ifp, "Warning, frame marked as received on %s\n",
@@ -605,10 +583,8 @@
 	ifp->if_ibytes += m->m_pkthdr.len;
 
 	/* Allow monitor mode to claim this frame, after stats are updated. */
-	if (ifp->if_flags & IFF_MONITOR) {
-		m_freem(m);
-		return;
-	}
+	if (ifp->if_flags & IFF_MONITOR)
+		goto out;
 
 	/* Handle input from a lagg(4) port */
 	if (ifp->if_type == IFT_IEEE8023ADLAG) {
@@ -635,9 +611,7 @@
 #ifdef DIAGNOSTIC
 			if_printf(ifp, "cannot pullup VLAN header\n");
 #endif
-			ifp->if_ierrors++;
-			m_freem(m);
-			return;
+			goto err_out;
 		}
 
 		evl = mtod(m, struct ether_vlan_header *);
@@ -704,6 +678,33 @@
 		random_harvest(m, 16, 3, 0, RANDOM_NET);
 
 	ether_demux(ifp, m);
+	return;
+err_out_print:
+	eh = mtod(m, struct ether_header *);
+	etype = ntohs(eh->ether_type);
+
+	if ((m->m_flags & M_PKTHDR) == 0) 	
+		if_printf(ifp, "discard frame w/o packet header\n");
+	if (m->m_len < ETHER_HDR_LEN)
+		if_printf(ifp, "discard frame w/o leading ethernet "
+		    "header (len %u pkt len %u)\n",
+		    m->m_len, m->m_pkthdr.len);
+#ifdef DIAGNOSTIC
+	if (m->m_pkthdr.len >
+	    ETHER_MAX_FRAME(ifp, etype, m->m_flags & M_HASFCS) &&
+	    (ifp->if_capenable & IFCAP_LRO) == 0) 
+		if_printf(ifp, "discard oversize frame "
+				"(ether type %x flags %x len %u > max %lu)\n",
+				etype, m->m_flags, m->m_pkthdr.len,
+				ETHER_MAX_FRAME(ifp, etype,
+				    m->m_flags & M_HASFCS));
+#endif
+	if (m->m_pkthdr.rcvif == NULL) 
+		if_printf(ifp, "discard frame w/o interface pointer\n");
+err_out:
+	ifp->if_ierrors++;
+out:
+	m_freem(m);
 }
 
 /*


More information about the p4-projects mailing list