Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 22 Jun 2008 15:59:10 GMT
From:      Diego Giagio <diego@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 143918 for review
Message-ID:  <200806221559.m5MFxAv6061486@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=143918

Change 143918 by diego@diego_black on 2008/06/22 15:58:59

	IFC

Affected files ...

.. //depot/projects/soc2008/diego-audit/src/sys/amd64/amd64/pmap.c#7 integrate
.. //depot/projects/soc2008/diego-audit/src/sys/dev/gem/if_gem.c#2 integrate
.. //depot/projects/soc2008/diego-audit/src/sys/fs/devfs/devfs_rule.c#2 integrate
.. //depot/projects/soc2008/diego-audit/src/sys/netinet/libalias/alias.c#4 integrate
.. //depot/projects/soc2008/diego-audit/src/sys/netinet/libalias/alias_db.c#3 integrate
.. //depot/projects/soc2008/diego-audit/src/sys/netinet/libalias/alias_ftp.c#2 integrate
.. //depot/projects/soc2008/diego-audit/src/sys/vm/vm_kern.c#4 integrate
.. //depot/projects/soc2008/diego-audit/src/sys/vm/vm_map.c#4 integrate

Differences ...

==== //depot/projects/soc2008/diego-audit/src/sys/amd64/amd64/pmap.c#7 (text+ko) ====

@@ -77,7 +77,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/amd64/pmap.c,v 1.622 2008/06/20 05:22:09 alc Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/amd64/pmap.c,v 1.623 2008/06/21 19:19:09 alc Exp $");
 
 /*
  *	Manages physical address maps.
@@ -441,8 +441,10 @@
 	/* Read-only from zero to physfree */
 	/* XXX not fully used, underneath 2M pages */
 	for (i = 0; (i << PAGE_SHIFT) < *firstaddr; i++) {
-		((pt_entry_t *)KPTphys)[i] = i << PAGE_SHIFT;
-		((pt_entry_t *)KPTphys)[i] |= PG_RW | PG_V | PG_G;
+		((pt_entry_t *)KPTphys)[(KERNBASE - VM_MIN_KERNEL_ADDRESS) /
+		    PAGE_SIZE + i] = i << PAGE_SHIFT;
+		((pt_entry_t *)KPTphys)[(KERNBASE - VM_MIN_KERNEL_ADDRESS) /
+		    PAGE_SIZE + i] |= PG_RW | PG_V | PG_G;
 	}
 
 	/* Now map the page tables at their location within PTmap */
@@ -454,8 +456,10 @@
 	/* Map from zero to end of allocations under 2M pages */
 	/* This replaces some of the KPTphys entries above */
 	for (i = 0; (i << PDRSHIFT) < *firstaddr; i++) {
-		((pd_entry_t *)KPDphys)[i] = i << PDRSHIFT;
-		((pd_entry_t *)KPDphys)[i] |= PG_RW | PG_V | PG_PS | PG_G;
+		((pd_entry_t *)KPDphys)[(KERNBASE - VM_MIN_KERNEL_ADDRESS) /
+		    NBPDR + i] = i << PDRSHIFT;
+		((pd_entry_t *)KPDphys)[(KERNBASE - VM_MIN_KERNEL_ADDRESS) /
+		    NBPDR + i] |= PG_RW | PG_V | PG_PS | PG_G;
 	}
 
 	/* And connect up the PD to the PDP */

==== //depot/projects/soc2008/diego-audit/src/sys/dev/gem/if_gem.c#2 (text+ko) ====

@@ -29,7 +29,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/gem/if_gem.c,v 1.49 2008/03/24 17:23:53 marius Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/gem/if_gem.c,v 1.50 2008/06/22 13:54:51 marius Exp $");
 
 /*
  * Driver for Apple GMAC, Sun ERI and Sun GEM Ethernet controllers
@@ -127,8 +127,6 @@
 static void	gem_stop(struct ifnet *ifp, int disable);
 static void	gem_tick(void *arg);
 static void	gem_tint(struct gem_softc *sc);
-static __inline void gem_txcksum(struct gem_softc *sc, struct mbuf *m,
-		    uint64_t *cflags);
 static int	gem_watchdog(struct gem_softc *sc);
 
 devclass_t gem_devclass;
@@ -422,8 +420,7 @@
 		if (sc->sc_txsoft[i].txs_dmamap != NULL)
 			bus_dmamap_destroy(sc->sc_tdmatag,
 			    sc->sc_txsoft[i].txs_dmamap);
-	GEM_CDSYNC(sc, BUS_DMASYNC_POSTREAD);
-	GEM_CDSYNC(sc, BUS_DMASYNC_POSTWRITE);
+	GEM_CDSYNC(sc, BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
 	bus_dmamap_unload(sc->sc_cdmatag, sc->sc_cddmamap);
 	bus_dmamem_free(sc->sc_cdmatag, sc->sc_control_data,
 	    sc->sc_cddmamap);
@@ -460,55 +457,6 @@
 }
 
 static __inline void
-gem_txcksum(struct gem_softc *sc, struct mbuf *m, uint64_t *cflags)
-{
-	char *p;
-	struct ip *ip;
-	struct mbuf *m0;
-	uint64_t offset, offset2;
-
-	m0 = m;
-	offset = sizeof(struct ip) + ETHER_HDR_LEN;
-	for(; m && m->m_len == 0; m = m->m_next)
-		;
-	if (m == NULL || m->m_len < ETHER_HDR_LEN) {
-		device_printf(sc->sc_dev, "%s: m_len < ETHER_HDR_LEN\n",
-		    __func__);
-		/* Checksum will be corrupted. */
-		m = m0;
-		goto sendit;
-	}
-	if (m->m_len < ETHER_HDR_LEN + sizeof(uint32_t)) {
-		if (m->m_len != ETHER_HDR_LEN) {
-			device_printf(sc->sc_dev,
-			    "%s: m_len != ETHER_HDR_LEN\n", __func__);
-			/* Checksum will be corrupted. */
-			m = m0;
-			goto sendit;
-		}
-		for(m = m->m_next; m && m->m_len == 0; m = m->m_next)
-			;
-		if (m == NULL) {
-			/* Checksum will be corrupted. */
-			m = m0;
-			goto sendit;
-		}
-		ip = mtod(m, struct ip *);
-	} else {
-		p = mtod(m, uint8_t *);
-		p += ETHER_HDR_LEN;
-		ip = (struct ip *)p;
-	}
-	offset = (ip->ip_hl << 2) + ETHER_HDR_LEN;
-
- sendit:
-	offset2 = m->m_pkthdr.csum_data;
-	*cflags = offset << GEM_TD_CXSUM_STARTSHFT;
-	*cflags |= ((offset + offset2) << GEM_TD_CXSUM_STUFFSHFT);
-	*cflags |= GEM_TD_CXSUM_ENABLE;
-}
-
-static __inline void
 gem_rxcksum(struct mbuf *m, uint64_t flags)
 {
 	struct ether_header *eh;
@@ -645,7 +593,8 @@
 
 	/* Do a full reset. */
 	GEM_BANK2_WRITE_4(sc, GEM_RESET, GEM_RESET_RX | GEM_RESET_TX);
-	GEM_BANK2_BARRIER(sc, GEM_RESET, 4, BUS_SPACE_BARRIER_WRITE);
+	GEM_BANK2_BARRIER(sc, GEM_RESET, 4,
+	    BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
 	if (!GEM_BANK2_BITWAIT(sc, GEM_RESET, GEM_RESET_RX | GEM_RESET_TX, 0))
 		device_printf(sc->sc_dev, "cannot reset device\n");
 }
@@ -725,13 +674,15 @@
 	 */
 	gem_disable_rx(sc);
 	GEM_BANK1_WRITE_4(sc, GEM_RX_CONFIG, 0);
-	GEM_BANK1_BARRIER(sc, GEM_RX_CONFIG, 4, BUS_SPACE_BARRIER_WRITE);
+	GEM_BANK1_BARRIER(sc, GEM_RX_CONFIG, 4,
+	    BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
 	if (!GEM_BANK1_BITWAIT(sc, GEM_RX_CONFIG, GEM_RX_CONFIG_RXDMA_EN, 0))
 		device_printf(sc->sc_dev, "cannot disable RX DMA\n");
 
 	/* Finally, reset the ERX. */
 	GEM_BANK2_WRITE_4(sc, GEM_RESET, GEM_RESET_RX);
-	GEM_BANK2_BARRIER(sc, GEM_RESET, 4, BUS_SPACE_BARRIER_WRITE);
+	GEM_BANK2_BARRIER(sc, GEM_RESET, 4,
+	    BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
 	if (!GEM_BANK2_BITWAIT(sc, GEM_RESET, GEM_RESET_RX | GEM_RESET_TX,
 	    0)) {
 		device_printf(sc->sc_dev, "cannot reset receiver\n");
@@ -758,8 +709,7 @@
 		if (sc->sc_rxsoft[i].rxs_mbuf != NULL)
 			GEM_UPDATE_RXDESC(sc, i);
 	sc->sc_rxptr = 0;
-	GEM_CDSYNC(sc, BUS_DMASYNC_PREWRITE);
-	GEM_CDSYNC(sc, BUS_DMASYNC_PREREAD);
+	GEM_CDSYNC(sc, BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD);
 
 	/* NOTE: we use only 32-bit DMA addresses here. */
 	GEM_BANK1_WRITE_4(sc, GEM_RX_RING_PTR_HI, 0);
@@ -794,13 +744,15 @@
 	 */
 	gem_disable_tx(sc);
 	GEM_BANK1_WRITE_4(sc, GEM_TX_CONFIG, 0);
-	GEM_BANK1_BARRIER(sc, GEM_TX_CONFIG, 4, BUS_SPACE_BARRIER_WRITE);
+	GEM_BANK1_BARRIER(sc, GEM_TX_CONFIG, 4,
+	    BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
 	if (!GEM_BANK1_BITWAIT(sc, GEM_TX_CONFIG, GEM_TX_CONFIG_TXDMA_EN, 0))
 		device_printf(sc->sc_dev, "cannot disable TX DMA\n");
 
 	/* Finally, reset the ETX. */
 	GEM_BANK2_WRITE_4(sc, GEM_RESET, GEM_RESET_TX);
-	GEM_BANK2_BARRIER(sc, GEM_RESET, 4, BUS_SPACE_BARRIER_WRITE);
+	GEM_BANK2_BARRIER(sc, GEM_RESET, 4,
+	    BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
 	if (!GEM_BANK2_BITWAIT(sc, GEM_RESET, GEM_RESET_RX | GEM_RESET_TX,
 	    0)) {
 		device_printf(sc->sc_dev, "cannot reset transmitter\n");
@@ -815,7 +767,8 @@
 
 	GEM_BANK1_WRITE_4(sc, GEM_MAC_RX_CONFIG,
 	    GEM_BANK1_READ_4(sc, GEM_MAC_RX_CONFIG) & ~GEM_MAC_RX_ENABLE);
-	GEM_BANK1_BARRIER(sc, GEM_MAC_RX_CONFIG, 4, BUS_SPACE_BARRIER_WRITE);
+	GEM_BANK1_BARRIER(sc, GEM_MAC_RX_CONFIG, 4,
+	    BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
 	return (GEM_BANK1_BITWAIT(sc, GEM_MAC_RX_CONFIG, GEM_MAC_RX_ENABLE,
 	    0));
 }
@@ -826,7 +779,8 @@
 
 	GEM_BANK1_WRITE_4(sc, GEM_MAC_TX_CONFIG,
 	    GEM_BANK1_READ_4(sc, GEM_MAC_TX_CONFIG) & ~GEM_MAC_TX_ENABLE);
-	GEM_BANK1_BARRIER(sc, GEM_MAC_TX_CONFIG, 4, BUS_SPACE_BARRIER_WRITE);
+	GEM_BANK1_BARRIER(sc, GEM_MAC_TX_CONFIG, 4,
+	    BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
 	return (GEM_BANK1_BITWAIT(sc, GEM_MAC_TX_CONFIG, GEM_MAC_TX_ENABLE,
 	    0));
 }
@@ -871,8 +825,7 @@
 			GEM_INIT_RXDESC(sc, i);
 	}
 	sc->sc_rxptr = 0;
-	GEM_CDSYNC(sc, BUS_DMASYNC_PREWRITE);
-	GEM_CDSYNC(sc, BUS_DMASYNC_PREREAD);
+	GEM_CDSYNC(sc, BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD);
 
 	return (0);
 }
@@ -940,7 +893,7 @@
 	 */
 
 	/* step 1 & 2.  Reset the Ethernet Channel. */
-	gem_stop(sc->sc_ifp, 0);
+	gem_stop(ifp, 0);
 	gem_reset(sc);
 #ifdef GEM_DEBUG
 	CTR2(KTR_GEM, "%s: %s: restarting", device_get_name(sc->sc_dev),
@@ -997,9 +950,9 @@
 
 	/* Enable DMA. */
 	v = gem_ringsize(GEM_NTXDESC /* XXX */);
-	GEM_BANK1_WRITE_4(sc, GEM_TX_CONFIG,
-	    v | GEM_TX_CONFIG_TXDMA_EN |
-	    ((0x400 << 10) & GEM_TX_CONFIG_TXFIFO_TH));
+	v |= ((sc->sc_variant == GEM_SUN_ERI ? 0x100 : 0x4ff) << 10) &
+	    GEM_TX_CONFIG_TXFIFO_TH;
+	GEM_BANK1_WRITE_4(sc, GEM_TX_CONFIG, v | GEM_TX_CONFIG_TXDMA_EN);
 
 	/* step 10.  ERX Configuration */
 
@@ -1029,13 +982,24 @@
 
 	/* step 12.  RX_MAC Configuration Register */
 	v = GEM_BANK1_READ_4(sc, GEM_MAC_RX_CONFIG);
-	v |= GEM_MAC_RX_STRIP_CRC;
+	v |= GEM_MAC_RX_ENABLE | GEM_MAC_RX_STRIP_CRC;
 	GEM_BANK1_WRITE_4(sc, GEM_MAC_RX_CONFIG, 0);
-	GEM_BANK1_BARRIER(sc, GEM_MAC_RX_CONFIG, 4, BUS_SPACE_BARRIER_WRITE);
+	GEM_BANK1_BARRIER(sc, GEM_MAC_RX_CONFIG, 4,
+	    BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
 	if (!GEM_BANK1_BITWAIT(sc, GEM_MAC_RX_CONFIG, GEM_MAC_RX_ENABLE, 0))
-		device_printf(sc->sc_dev, "cannot disable RX MAC\n");
+		device_printf(sc->sc_dev, "cannot configure RX MAC\n");
 	GEM_BANK1_WRITE_4(sc, GEM_MAC_RX_CONFIG, v);
 
+	/* step 13. TX_MAC Configuration Register */
+	v = GEM_BANK1_READ_4(sc, GEM_MAC_TX_CONFIG);
+	v |= GEM_MAC_TX_ENABLE;
+	GEM_BANK1_WRITE_4(sc, GEM_MAC_TX_CONFIG, 0);
+	GEM_BANK1_BARRIER(sc, GEM_MAC_TX_CONFIG, 4,
+	    BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
+	if (!GEM_BANK1_BITWAIT(sc, GEM_MAC_TX_CONFIG, GEM_MAC_TX_ENABLE, 0))
+		device_printf(sc->sc_dev, "cannot configure TX MAC\n");
+	GEM_BANK1_WRITE_4(sc, GEM_MAC_TX_CONFIG, v);
+
 	/* step 14.  Issue Transmit Pending command. */
 
 	/* step 15.  Give the reciever a swift kick. */
@@ -1043,9 +1007,7 @@
 
 	ifp->if_drv_flags |= IFF_DRV_RUNNING;
 	ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
-	sc->sc_ifflags = ifp->if_flags;
 
-	sc->sc_flags &= ~GEM_LINK;
 	mii_mediachg(sc->sc_mii);
 
 	/* Start the one second timer. */
@@ -1058,15 +1020,40 @@
 {
 	bus_dma_segment_t txsegs[GEM_NTXSEGS];
 	struct gem_txsoft *txs;
+	struct ip *ip;
 	struct mbuf *m;
 	uint64_t cflags, flags;
-	int error, nexttx, nsegs, seg;
+	int error, nexttx, nsegs, offset, seg;
 
 	/* Get a work queue entry. */
 	if ((txs = STAILQ_FIRST(&sc->sc_txfreeq)) == NULL) {
 		/* Ran out of descriptors. */
 		return (ENOBUFS);
 	}
+
+	cflags = 0;
+	if (((*m_head)->m_pkthdr.csum_flags & sc->sc_csum_features) != 0) {
+		if (M_WRITABLE(*m_head) == 0) {
+			m = m_dup(*m_head, M_DONTWAIT);
+			m_freem(*m_head);
+			*m_head = m;
+			if (m == NULL)
+				return (ENOBUFS);
+		}
+		offset = sizeof(struct ether_header);
+		m = m_pullup(*m_head, offset + sizeof(struct ip));
+		if (m == NULL) {
+			*m_head = NULL;
+			return (ENOBUFS);
+		}
+		ip = (struct ip *)(mtod(m, caddr_t) + offset);
+		offset += (ip->ip_hl << 2);
+		cflags = offset << GEM_TD_CXSUM_STARTSHFT |
+		    ((offset + m->m_pkthdr.csum_data) <<
+		    GEM_TD_CXSUM_STUFFSHFT) | GEM_TD_CXSUM_ENABLE;
+		*m_head = m;
+	}
+
 	error = bus_dmamap_load_mbuf_sg(sc->sc_tdmatag, txs->txs_dmamap,
 	    *m_head, txsegs, &nsegs, BUS_DMA_NOWAIT);
 	if (error == EFBIG) {
@@ -1108,10 +1095,6 @@
 		return (ENOBUFS);
 	}
 
-	flags = cflags = 0;
-	if (((*m_head)->m_pkthdr.csum_flags & sc->sc_csum_features) != 0)
-		gem_txcksum(sc, *m_head, &cflags);
-
 	txs->txs_ndescs = nsegs;
 	txs->txs_firstdesc = sc->sc_txnext;
 	nexttx = txs->txs_firstdesc;
@@ -1302,7 +1285,7 @@
 		CTR3(KTR_GEM, "%s: %s: kicking TX %d",
 		    device_get_name(sc->sc_dev), __func__, sc->sc_txnext);
 #endif
-		GEM_CDSYNC(sc, BUS_DMASYNC_PREWRITE);
+		GEM_CDSYNC(sc, BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
 		GEM_BANK1_WRITE_4(sc, GEM_TX_KICK, sc->sc_txnext);
 
 		BPF_MTAP(ifp, m);
@@ -1426,9 +1409,7 @@
 		ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
 		sc->sc_wdog_timer = STAILQ_EMPTY(&sc->sc_txdirtyq) ? 0 : 5;
 
-		if (ifp->if_drv_flags & IFF_DRV_RUNNING &&
-		    !IFQ_DRV_IS_EMPTY(&ifp->if_snd))
-			gem_start_locked(ifp);
+		gem_start_locked(ifp);
 	}
 
 #ifdef GEM_DEBUG
@@ -1538,7 +1519,8 @@
 		 */
 		sc->sc_rxptr = GEM_NEXTRX(sc->sc_rxptr);
 		if ((sc->sc_rxptr % 4) == 0) {
-			GEM_CDSYNC(sc, BUS_DMASYNC_PREWRITE);
+			GEM_CDSYNC(sc,
+			    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
 			GEM_BANK1_WRITE_4(sc, GEM_RX_KICK,
 			    (sc->sc_rxptr + GEM_NRXDESC - 4) &
 			    GEM_NRXDESC_MASK);
@@ -1713,6 +1695,7 @@
 static int
 gem_watchdog(struct gem_softc *sc)
 {
+	struct ifnet *ifp = sc->sc_ifp;
 
 	GEM_LOCK_ASSERT(sc, MA_OWNED);
 
@@ -1736,10 +1719,11 @@
 		device_printf(sc->sc_dev, "device timeout\n");
 	else if (bootverbose)
 		device_printf(sc->sc_dev, "device timeout (no link)\n");
-	++sc->sc_ifp->if_oerrors;
+	++ifp->if_oerrors;
 
 	/* Try to get more packets going. */
 	gem_init_locked(sc);
+	gem_start_locked(ifp);
 	return (EJUSTRETURN);
 }
 
@@ -1814,6 +1798,8 @@
 	    (reg << GEM_MIF_REG_SHIFT);
 
 	GEM_BANK1_WRITE_4(sc, GEM_MIF_FRAME, v);
+	GEM_BANK1_BARRIER(sc, GEM_MIF_FRAME, 4,
+	    BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
 	for (n = 0; n < 100; n++) {
 		DELAY(1);
 		v = GEM_BANK1_READ_4(sc, GEM_MIF_FRAME);
@@ -1842,12 +1828,21 @@
 
 	if ((sc->sc_flags & GEM_SERDES) != 0) {
 		switch (reg) {
-		case MII_BMCR:
-			reg = GEM_MII_CONTROL;
-			break;
 		case MII_BMSR:
 			reg = GEM_MII_STATUS;
 			break;
+		case MII_BMCR:
+			reg = GEM_MII_CONTROL;
+			if ((val & GEM_MII_CONTROL_RESET) == 0)
+				break;
+			GEM_BANK1_WRITE_4(sc, GEM_MII_CONTROL, val);
+			GEM_BANK1_BARRIER(sc, GEM_MII_CONTROL, 4,
+			    BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
+			if (!GEM_BANK1_BITWAIT(sc, GEM_MII_CONTROL,
+			    GEM_MII_CONTROL_RESET, 0))
+				device_printf(sc->sc_dev,
+				    "cannot reset PCS\n");
+			/* FALLTHROUGH */
 		case MII_ANAR:
 			GEM_BANK1_WRITE_4(sc, GEM_MII_CONFIG, 0);
 			GEM_BANK1_BARRIER(sc, GEM_MII_CONFIG, 4,
@@ -1877,6 +1872,8 @@
 	    (val & GEM_MIF_FRAME_DATA);
 
 	GEM_BANK1_WRITE_4(sc, GEM_MIF_FRAME, v);
+	GEM_BANK1_BARRIER(sc, GEM_MIF_FRAME, 4,
+	    BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
 	for (n = 0; n < 100; n++) {
 		DELAY(1);
 		v = GEM_BANK1_READ_4(sc, GEM_MIF_FRAME);
@@ -1937,12 +1934,14 @@
 		txcfg |= GEM_MAC_TX_CARR_EXTEND;
 	}
 	GEM_BANK1_WRITE_4(sc, GEM_MAC_TX_CONFIG, 0);
-	GEM_BANK1_BARRIER(sc, GEM_MAC_TX_CONFIG, 4, BUS_SPACE_BARRIER_WRITE);
+	GEM_BANK1_BARRIER(sc, GEM_MAC_TX_CONFIG, 4,
+	    BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
 	if (!GEM_BANK1_BITWAIT(sc, GEM_MAC_TX_CONFIG, GEM_MAC_TX_ENABLE, 0))
 		device_printf(sc->sc_dev, "cannot disable TX MAC\n");
 	GEM_BANK1_WRITE_4(sc, GEM_MAC_TX_CONFIG, txcfg);
 	GEM_BANK1_WRITE_4(sc, GEM_MAC_RX_CONFIG, 0);
-	GEM_BANK1_BARRIER(sc, GEM_MAC_RX_CONFIG, 4, BUS_SPACE_BARRIER_WRITE);
+	GEM_BANK1_BARRIER(sc, GEM_MAC_RX_CONFIG, 4,
+	    BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
 	if (!GEM_BANK1_BITWAIT(sc, GEM_MAC_RX_CONFIG, GEM_MAC_RX_ENABLE, 0))
 		device_printf(sc->sc_dev, "cannot disable RX MAC\n");
 	GEM_BANK1_WRITE_4(sc, GEM_MAC_RX_CONFIG, rxcfg);
@@ -2110,7 +2109,8 @@
 	    GEM_MAC_RX_PROMISC_GRP);
 
 	GEM_BANK1_WRITE_4(sc, GEM_MAC_RX_CONFIG, v);
-	GEM_BANK1_BARRIER(sc, GEM_MAC_RX_CONFIG, 4, BUS_SPACE_BARRIER_WRITE);
+	GEM_BANK1_BARRIER(sc, GEM_MAC_RX_CONFIG, 4,
+	    BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
 	if (!GEM_BANK1_BITWAIT(sc, GEM_MAC_RX_CONFIG, GEM_MAC_RX_HASH_FILTER,
 	    0))
 		device_printf(sc->sc_dev, "cannot disable RX hash filter\n");

==== //depot/projects/soc2008/diego-audit/src/sys/fs/devfs/devfs_rule.c#2 (text+ko) ====

@@ -23,7 +23,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/fs/devfs/devfs_rule.c,v 1.24 2008/03/20 16:08:42 kib Exp $
+ * $FreeBSD: src/sys/fs/devfs/devfs_rule.c,v 1.25 2008/06/22 14:34:38 gonzo Exp $
  */
 
 /*
@@ -735,15 +735,15 @@
 {
 	struct devfs_ruleset *cds, *ds;
 
-	ds = devfs_ruleset_bynum(rsnum);
-	if (ds == NULL)
-		ds = devfs_ruleset_create(rsnum);
 	if (dm->dm_ruleset != 0) {
 		cds = devfs_ruleset_bynum(dm->dm_ruleset);
 		--cds->ds_refcount;
 		devfs_ruleset_reap(cds);
 	}
 
+	ds = devfs_ruleset_bynum(rsnum);
+	if (ds == NULL)
+		ds = devfs_ruleset_create(rsnum);
 	/* These should probably be made atomic somehow. */
 	++ds->ds_refcount;
 	dm->dm_ruleset = rsnum;

==== //depot/projects/soc2008/diego-audit/src/sys/netinet/libalias/alias.c#4 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/netinet/libalias/alias.c,v 1.63 2008/06/01 17:52:40 mav Exp $");
+__FBSDID("$FreeBSD: src/sys/netinet/libalias/alias.c,v 1.64 2008/06/21 20:18:57 mav Exp $");
 
 /*
     Alias.c provides supervisory control for the functions of the
@@ -271,7 +271,7 @@
 		    int create);
 
 static int	UdpAliasIn(struct libalias *, struct ip *);
-static int	UdpAliasOut(struct libalias *, struct ip *, int create);
+static int	UdpAliasOut(struct libalias *, struct ip *, int, int create);
 
 static int	TcpAliasIn(struct libalias *, struct ip *);
 static int	TcpAliasOut(struct libalias *, struct ip *, int, int create);
@@ -717,19 +717,18 @@
 	struct alias_link *lnk;
 
 	LIBALIAS_LOCK_ASSERT(la);
-/* Return if proxy-only mode is enabled */
-	if (la->packetAliasMode & PKT_ALIAS_PROXY_ONLY)
-		return (PKT_ALIAS_OK);
 
 	ud = (struct udphdr *)ip_next(pip);
 
 	lnk = FindUdpTcpIn(la, pip->ip_src, pip->ip_dst,
 	    ud->uh_sport, ud->uh_dport,
-	    IPPROTO_UDP, 1);
+	    IPPROTO_UDP, !(la->packetAliasMode & PKT_ALIAS_PROXY_ONLY));
 	if (lnk != NULL) {
 		struct in_addr alias_address;
 		struct in_addr original_address;
+		struct in_addr proxy_address;
 		u_short alias_port;
+		u_short proxy_port;
 		int accumulate;
 		int r = 0, error;
 		struct alias_data ad = {
@@ -744,8 +743,10 @@
 
 		alias_address = GetAliasAddress(lnk);
 		original_address = GetOriginalAddress(lnk);
+		proxy_address = GetProxyAddress(lnk);
 		alias_port = ud->uh_dport;
 		ud->uh_dport = GetOriginalPort(lnk);
+		proxy_port = GetProxyPort(lnk);
 
 		/* Walk out chain. */		
 		error = find_handler(IN, UDP, la, pip, &ad);
@@ -757,8 +758,32 @@
 			accumulate -= ud->uh_dport;
 			accumulate += twowords(&alias_address);
 			accumulate -= twowords(&original_address);
+
+/* If this is a proxy packet, modify checksum because of source change.*/
+        		if (proxy_port != 0) {
+		                accumulate += ud->uh_sport;
+		                accumulate -= proxy_port;
+	                }
+
+	                if (proxy_address.s_addr != 0) {
+				accumulate += twowords(&pip->ip_src);
+				accumulate -= twowords(&proxy_address);
+	                }
+
 			ADJUST_CHECKSUM(accumulate, ud->uh_sum);
 		}
+/* XXX: Could the two if's below be concatenated to one ? */
+/* Restore source port and/or address in case of proxying*/
+
+    		if (proxy_port != 0)
+        		ud->uh_sport = proxy_port;
+
+    		if (proxy_address.s_addr != 0) {
+        		DifferentialChecksum(&pip->ip_sum,
+                	    &proxy_address, &pip->ip_src, 2);
+	        	pip->ip_src = proxy_address;
+    		}
+
 /* Restore original IP address */
 		DifferentialChecksum(&pip->ip_sum,
 		    &original_address, &pip->ip_dst, 2);
@@ -776,19 +801,50 @@
 }
 
 static int
-UdpAliasOut(struct libalias *la, struct ip *pip, int create)
+UdpAliasOut(struct libalias *la, struct ip *pip, int maxpacketsize, int create)
 {
 	struct udphdr *ud;
 	struct alias_link *lnk;
+	struct in_addr dest_address;
+	struct in_addr proxy_server_address;
+	u_short dest_port;
+	u_short proxy_server_port;
+	int proxy_type;
 	int error;
 
 	LIBALIAS_LOCK_ASSERT(la);
-/* Return if proxy-only mode is enabled */
-	if (la->packetAliasMode & PKT_ALIAS_PROXY_ONLY)
+
+/* Return if proxy-only mode is enabled and not proxyrule found.*/
+	ud = (struct udphdr *)ip_next(pip);
+	proxy_type = ProxyCheck(la, &proxy_server_address, 
+		&proxy_server_port, pip->ip_src, pip->ip_dst, 
+		ud->uh_dport, pip->ip_p);
+	if (proxy_type == 0 && (la->packetAliasMode & PKT_ALIAS_PROXY_ONLY))
 		return (PKT_ALIAS_OK);
 
-	ud = (struct udphdr *)ip_next(pip);
+/* If this is a transparent proxy, save original destination,
+ * then alter the destination and adjust checksums */
+	dest_port = ud->uh_dport;
+	dest_address = pip->ip_dst;
+
+	if (proxy_type != 0) {
+	        int accumulate;
+
+		accumulate = twowords(&pip->ip_dst);
+		accumulate -= twowords(&proxy_server_address);
+
+	        ADJUST_CHECKSUM(accumulate, pip->ip_sum);
 
+		if (ud->uh_sum != 0) {
+			accumulate = twowords(&pip->ip_dst);
+			accumulate -= twowords(&proxy_server_address);
+    			accumulate += ud->uh_dport;
+	        	accumulate -= proxy_server_port;
+	    		ADJUST_CHECKSUM(accumulate, ud->uh_sum);
+		}
+	        pip->ip_dst = proxy_server_address;
+	        ud->uh_dport = proxy_server_port;
+	}
 	lnk = FindUdpTcpOut(la, pip->ip_src, pip->ip_dst,
 	    ud->uh_sport, ud->uh_dport,
 	    IPPROTO_UDP, create);
@@ -805,6 +861,16 @@
 			.maxpktsize = 0
 		};
 
+/* Save original destination address, if this is a proxy packet.
+ * Also modify packet to include destination encoding.  This may
+ * change the size of IP header. */
+		if (proxy_type != 0) {
+	                SetProxyPort(lnk, dest_port);
+	                SetProxyAddress(lnk, dest_address);
+	                ProxyModify(la, lnk, pip, maxpacketsize, proxy_type);
+	                ud = (struct udphdr *)ip_next(pip);
+	        }
+
 		alias_address = GetAliasAddress(lnk);
 		alias_port = GetAliasPort(lnk);
 
@@ -1409,7 +1475,7 @@
 			iresult = IcmpAliasOut(la, pip, create);
 			break;
 		case IPPROTO_UDP:
-			iresult = UdpAliasOut(la, pip, create);
+			iresult = UdpAliasOut(la, pip, maxpacketsize, create);
 			break;
 			case IPPROTO_TCP:
 			iresult = TcpAliasOut(la, pip, maxpacketsize, create);

==== //depot/projects/soc2008/diego-audit/src/sys/netinet/libalias/alias_db.c#3 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/netinet/libalias/alias_db.c,v 1.73 2008/06/01 18:34:58 mav Exp $");
+__FBSDID("$FreeBSD: src/sys/netinet/libalias/alias_db.c,v 1.74 2008/06/22 11:39:42 mav Exp $");
 
 /*
     Alias_db.c encapsulates all data structures used for storing
@@ -819,8 +819,12 @@
 
 	LIBALIAS_LOCK_ASSERT(la);
 	for (i = 0; i < LINK_TABLE_OUT_SIZE; i++) {
-		while ((lnk = LIST_FIRST(&la->linkTableOut[i])) != NULL)
+		lnk = LIST_FIRST(&la->linkTableOut[i]);
+		while (lnk != NULL) {
+			struct alias_link *link_next = LIST_NEXT(lnk, list_out);
 			DeleteLink(lnk);
+			lnk = link_next;
+		}
 	}
 
 	la->cleanupIndex = 0;

==== //depot/projects/soc2008/diego-audit/src/sys/netinet/libalias/alias_ftp.c#2 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/netinet/libalias/alias_ftp.c,v 1.30 2008/03/06 21:50:40 piso Exp $");
+__FBSDID("$FreeBSD: src/sys/netinet/libalias/alias_ftp.c,v 1.31 2008/06/21 16:22:56 mav Exp $");
 
 /*
     Alias_ftp.c performs special processing for FTP sessions under
@@ -270,36 +270,14 @@
 	if (dlen < 18)
 		return (0);
 
+	if (strncasecmp("PORT ", sptr, 5))
+		return (0);
+
 	addr = port = octet = 0;
-	state = -4;
-	for (i = 0; i < dlen; i++) {
+	state = 0;
+	for (i = 5; i < dlen; i++) {
 		ch = sptr[i];
 		switch (state) {
-		case -4:
-			if (ch == 'P')
-				state++;
-			else
-				return (0);
-			break;
-		case -3:
-			if (ch == 'O')
-				state++;
-			else
-				return (0);
-			break;
-		case -2:
-			if (ch == 'R')
-				state++;
-			else
-				return (0);
-			break;
-		case -1:
-			if (ch == 'T')
-				state++;
-			else
-				return (0);
-			break;
-
 		case 0:
 			if (isspace(ch))
 				break;
@@ -365,37 +343,15 @@
 	if (dlen < 18)
 		return (0);
 
+	if (strncasecmp("EPRT ", sptr, 5))
+		return (0);
+
 	addr = port = octet = 0;
 	delim = '|';		/* XXX gcc -Wuninitialized */
-	state = -4;
-	for (i = 0; i < dlen; i++) {
+	state = 0;
+	for (i = 5; i < dlen; i++) {
 		ch = sptr[i];
 		switch (state) {
-		case -4:
-			if (ch == 'E')
-				state++;
-			else
-				return (0);
-			break;
-		case -3:
-			if (ch == 'P')
-				state++;
-			else
-				return (0);
-			break;
-		case -2:
-			if (ch == 'R')
-				state++;
-			else
-				return (0);
-			break;
-		case -1:
-			if (ch == 'T')
-				state++;
-			else
-				return (0);
-			break;
-
 		case 0:
 			if (!isspace(ch)) {
 				delim = ch;
@@ -477,31 +433,15 @@
 	if (dlen < 17)
 		return (0);
 
+	if (strncmp("227 ", sptr, 4))
+		return (0);
+
 	addr = port = octet = 0;
 
-	state = -3;
-	for (i = 0; i < dlen; i++) {
+	state = 0;
+	for (i = 4; i < dlen; i++) {
 		ch = sptr[i];
 		switch (state) {
-		case -3:
-			if (ch == '2')
-				state++;
-			else
-				return (0);
-			break;
-		case -2:
-			if (ch == '2')
-				state++;
-			else
-				return (0);
-			break;
-		case -1:
-			if (ch == '7')
-				state++;
-			else
-				return (0);
-			break;
-
 		case 0:
 			if (ch == '(')
 				state++;
@@ -564,32 +504,16 @@
 	if (dlen < 11)
 		return (0);
 
+	if (strncmp("229 ", sptr, 4))
+		return (0);
+
 	port = 0;
 	delim = '|';		/* XXX gcc -Wuninitialized */
 
-	state = -3;
-	for (i = 0; i < dlen; i++) {
+	state = 0;
+	for (i = 4; i < dlen; i++) {
 		ch = sptr[i];
 		switch (state) {
-		case -3:
-			if (ch == '2')
-				state++;
-			else
-				return (0);
-			break;
-		case -2:
-			if (ch == '2')
-				state++;
-			else
-				return (0);
-			break;
-		case -1:
-			if (ch == '9')
-				state++;
-			else
-				return (0);
-			break;
-
 		case 0:
 			if (ch == '(')
 				state++;
@@ -689,6 +613,7 @@
 
 			alias_port = GetAliasPort(ftp_lnk);
 
+/* Prepare new command */
 			switch (ftp_message_type) {
 			case FTP_PORT_COMMAND:
 			case FTP_227_REPLY:

==== //depot/projects/soc2008/diego-audit/src/sys/vm/vm_kern.c#4 (text+ko) ====

@@ -63,7 +63,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/vm/vm_kern.c,v 1.134 2008/05/10 21:46:20 alc Exp $");
+__FBSDID("$FreeBSD: src/sys/vm/vm_kern.c,v 1.135 2008/06/22 04:54:27 alc Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -497,8 +497,12 @@
 	/* N.B.: cannot use kgdb to debug, starting with this assignment ... */
 	kernel_map = m;
 	(void) vm_map_insert(m, NULL, (vm_ooffset_t) 0,
-	    VM_MIN_KERNEL_ADDRESS, start, VM_PROT_ALL, VM_PROT_ALL,
-	    MAP_NOFAULT);
+#ifdef __amd64__
+	    KERNBASE,
+#else		     
+	    VM_MIN_KERNEL_ADDRESS,
+#endif
+	    start, VM_PROT_ALL, VM_PROT_ALL, MAP_NOFAULT);
 	/* ... and ending with the completion of the above `insert' */
 	vm_map_unlock(m);
 }

==== //depot/projects/soc2008/diego-audit/src/sys/vm/vm_map.c#4 (text+ko) ====

@@ -63,7 +63,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/vm/vm_map.c,v 1.396 2008/05/10 18:55:35 alc Exp $");
+__FBSDID("$FreeBSD: src/sys/vm/vm_map.c,v 1.397 2008/06/21 21:02:13 alc Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -294,7 +294,7 @@
 vm_init2(void)
 {
 	uma_zone_set_obj(kmapentzone, &kmapentobj, lmin(cnt.v_page_count,
-	    (VM_MAX_KERNEL_ADDRESS - KERNBASE) / PAGE_SIZE) / 8 +
+	    (VM_MAX_KERNEL_ADDRESS - VM_MIN_KERNEL_ADDRESS) / PAGE_SIZE) / 8 +
 	     maxproc * 2 + maxfiles);
 	vmspace_zone = uma_zcreate("VMSPACE", sizeof(struct vmspace), NULL,
 #ifdef INVARIANTS



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