Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 24 Oct 2010 21:09:32 +0000 (UTC)
From:      Pyun YongHyeon <yongari@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org
Subject:   svn commit: r214294 - stable/7/sys/dev/alc
Message-ID:  <201010242109.o9OL9WN0040047@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: yongari
Date: Sun Oct 24 21:09:31 2010
New Revision: 214294
URL: http://svn.freebsd.org/changeset/base/214294

Log:
  MFC r213842:
    Backout r204230. TX mbuf parser for VLAN is still required to
    enable TX checksum offloading if VLAN hardware tagging is disabled.

Modified:
  stable/7/sys/dev/alc/if_alc.c
Directory Properties:
  stable/7/sys/   (props changed)
  stable/7/sys/cddl/contrib/opensolaris/   (props changed)
  stable/7/sys/contrib/dev/acpica/   (props changed)
  stable/7/sys/contrib/pf/   (props changed)

Modified: stable/7/sys/dev/alc/if_alc.c
==============================================================================
--- stable/7/sys/dev/alc/if_alc.c	Sun Oct 24 21:07:13 2010	(r214293)
+++ stable/7/sys/dev/alc/if_alc.c	Sun Oct 24 21:09:31 2010	(r214294)
@@ -2019,7 +2019,7 @@ alc_encap(struct alc_softc *sc, struct m
 	struct tcphdr *tcp;
 	bus_dma_segment_t txsegs[ALC_MAXTXSEGS];
 	bus_dmamap_t map;
-	uint32_t cflags, hdrlen, poff, vtag;
+	uint32_t cflags, hdrlen, ip_off, poff, vtag;
 	int error, idx, nsegs, prod;
 
 	ALC_LOCK_ASSERT(sc);
@@ -2029,7 +2029,7 @@ alc_encap(struct alc_softc *sc, struct m
 	m = *m_head;
 	ip = NULL;
 	tcp = NULL;
-	poff = 0;
+	ip_off = poff = 0;
 	if ((m->m_pkthdr.csum_flags & (ALC_CSUM_FEATURES | CSUM_TSO)) != 0) {
 		/*
 		 * AR813x/AR815x requires offset of TCP/UDP header in its
@@ -2039,6 +2039,7 @@ alc_encap(struct alc_softc *sc, struct m
 		 * cycles on FreeBSD so fast host CPU is required to get
 		 * smooth TSO performance.
 		 */
+		struct ether_header *eh;
 
 		if (M_WRITABLE(m) == 0) {
 			/* Get a writable copy. */
@@ -2052,15 +2053,32 @@ alc_encap(struct alc_softc *sc, struct m
 			*m_head = m;
 		}
 
-		m = m_pullup(m, sizeof(struct ether_header) +
-		    sizeof(struct ip));
+		ip_off = sizeof(struct ether_header);
+		m = m_pullup(m, ip_off);
 		if (m == NULL) {
 			*m_head = NULL;
 			return (ENOBUFS);
 		}
-		ip = (struct ip *)(mtod(m, char *) +
-		    sizeof(struct ether_header));
-		poff = sizeof(struct ether_header) + (ip->ip_hl << 2);
+		eh = mtod(m, struct ether_header *);
+		/*
+		 * Check if hardware VLAN insertion is off.
+		 * Additional check for LLC/SNAP frame?
+		 */
+		if (eh->ether_type == htons(ETHERTYPE_VLAN)) {
+			ip_off = sizeof(struct ether_vlan_header);
+			m = m_pullup(m, ip_off);
+			if (m == NULL) {
+				*m_head = NULL;
+				return (ENOBUFS);
+			}
+		}
+		m = m_pullup(m, ip_off + sizeof(struct ip));
+		if (m == NULL) {
+			*m_head = NULL;
+			return (ENOBUFS);
+		}
+		ip = (struct ip *)(mtod(m, char *) + ip_off);
+		poff = ip_off + (ip->ip_hl << 2);
 		if ((m->m_pkthdr.csum_flags & CSUM_TSO) != 0) {
 			m = m_pullup(m, poff + sizeof(struct tcphdr));
 			if (m == NULL) {



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