PERFORCE change 143918 for review
Diego Giagio
diego at FreeBSD.org
Sun Jun 22 15:59:11 UTC 2008
http://perforce.freebsd.org/chv.cgi?CH=143918
Change 143918 by diego at 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
More information about the p4-projects
mailing list