From owner-p4-projects@FreeBSD.ORG Mon Jun 2 13:23:19 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id EB6561065678; Mon, 2 Jun 2008 13:23:18 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id ABF081065670 for ; Mon, 2 Jun 2008 13:23:18 +0000 (UTC) (envelope-from snagg@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id A95A78FC3E for ; Mon, 2 Jun 2008 13:23:18 +0000 (UTC) (envelope-from snagg@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id m52DNDRZ050289 for ; Mon, 2 Jun 2008 13:23:13 GMT (envelope-from snagg@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id m52DNDU7050287 for perforce@freebsd.org; Mon, 2 Jun 2008 13:23:13 GMT (envelope-from snagg@FreeBSD.org) Date: Mon, 2 Jun 2008 13:23:13 GMT Message-Id: <200806021323.m52DNDU7050287@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to snagg@FreeBSD.org using -f From: Vincenzo Iozzo To: Perforce Change Reviews Cc: Subject: PERFORCE change 142754 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 02 Jun 2008 13:23:19 -0000 http://perforce.freebsd.org/chv.cgi?CH=142754 Change 142754 by snagg@snagg_macosx on 2008/06/02 13:22:21 IFC Affected files ... .. //depot/projects/soc2008/snagg-audit/sys/compat/linux/linux_stats.c#2 integrate .. //depot/projects/soc2008/snagg-audit/sys/compat/linux/linux_util.c#2 integrate .. //depot/projects/soc2008/snagg-audit/sys/dev/pccard/pccard_cis.c#2 integrate .. //depot/projects/soc2008/snagg-audit/sys/netgraph/ng_nat.c#2 integrate .. //depot/projects/soc2008/snagg-audit/sys/netinet/libalias/alias.c#4 integrate .. //depot/projects/soc2008/snagg-audit/sys/netinet/libalias/alias_db.c#2 integrate .. //depot/projects/soc2008/snagg-audit/sys/netinet/libalias/alias_local.h#2 integrate Differences ... ==== //depot/projects/soc2008/snagg-audit/sys/compat/linux/linux_stats.c#2 (text+ko) ==== @@ -27,7 +27,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/compat/linux/linux_stats.c,v 1.91 2008/04/08 09:45:47 kib Exp $"); +__FBSDID("$FreeBSD: src/sys/compat/linux/linux_stats.c,v 1.92 2008/06/02 08:40:06 ed Exp $"); #include "opt_compat.h" #include "opt_mac.h" @@ -178,19 +178,8 @@ #endif error = kern_stat(td, path, UIO_SYSSPACE, &buf); - if (!error) { - if (strlen(path) > strlen("/dev/pts/") && - !strncmp(path, "/dev/pts/", strlen("/dev/pts/")) && - path[9] >= '0' && path[9] <= '9') { - /* - * Linux checks major and minors of the slave device - * to make sure it's a pty device, so let's make him - * believe it is. - */ - buf.st_rdev = (136 << 8); - } else - translate_path_major_minor(td, path, &buf); - } + if (!error) + translate_path_major_minor(td, path, &buf); LFREEPATH(path); if (error) return (error); @@ -528,19 +517,8 @@ #endif error = kern_stat(td, filename, UIO_SYSSPACE, &buf); - if (!error) { - if (strlen(filename) > strlen("/dev/pts/") && - !strncmp(filename, "/dev/pts/", strlen("/dev/pts/")) && - filename[9] >= '0' && filename[9] <= '9') { - /* - * Linux checks major and minors of the slave device - * to make sure it's a pty deivce, so let's make him - * believe it is. - */ - buf.st_rdev = (136 << 8); - } else - translate_path_major_minor(td, filename, &buf); - } + if (!error) + translate_path_major_minor(td, filename, &buf); LFREEPATH(filename); if (error) return (error); ==== //depot/projects/soc2008/snagg-audit/sys/compat/linux/linux_util.c#2 (text+ko) ==== @@ -30,7 +30,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/compat/linux/linux_util.c,v 1.34 2008/04/08 09:45:47 kib Exp $"); +__FBSDID("$FreeBSD: src/sys/compat/linux/linux_util.c,v 1.35 2008/06/02 08:40:06 ed Exp $"); #include "opt_compat.h" @@ -130,6 +130,22 @@ if (node == NULL || major == NULL || minor == NULL) return 1; + + if (strlen(node) > strlen("pts/") && + strncmp(node, "pts/", strlen("pts/")) == 0) { + unsigned long devno; + + /* + * Linux checks major and minors of the slave device + * to make sure it's a pty device, so let's make him + * believe it is. + */ + devno = strtoul(node + strlen("pts/"), NULL, 10); + *major = 136 + (devno / 256); + *minor = devno % 256; + return 0; + } + TAILQ_FOREACH(de, &devices, list) { if (strcmp(node, de->entry.bsd_device_name) == 0) { *major = de->entry.linux_major; ==== //depot/projects/soc2008/snagg-audit/sys/dev/pccard/pccard_cis.c#2 (text+ko) ==== @@ -1,5 +1,5 @@ /* $NetBSD: pcmcia_cis.c,v 1.17 2000/02/10 09:01:52 chopps Exp $ */ -/* $FreeBSD: src/sys/dev/pccard/pccard_cis.c,v 1.40 2007/02/27 17:23:28 jhb Exp $ */ +/* $FreeBSD: src/sys/dev/pccard/pccard_cis.c,v 1.41 2008/06/01 20:55:34 imp Exp $ */ /*- * Copyright (c) 1997 Marc Horowitz. All rights reserved. @@ -898,7 +898,7 @@ break; case CISTPL_CFTABLE_ENTRY: { - int idx, i, j; + int idx, i; u_int reg, reg2; u_int intface, def, num; u_int power, timing, iospace, irq, memspace, misc; @@ -906,8 +906,7 @@ idx = 0; - reg = pccard_tuple_read_1(tuple, idx); - idx++; + reg = pccard_tuple_read_1(tuple, idx++); intface = reg & PCCARD_TPCE_INDX_INTFACE; def = reg & PCCARD_TPCE_INDX_DEFAULT; num = reg & PCCARD_TPCE_INDX_NUM_MASK; @@ -983,8 +982,7 @@ } if (intface) { - reg = pccard_tuple_read_1(tuple, idx); - idx++; + reg = pccard_tuple_read_1(tuple, idx++); cfe->flags &= ~(PCCARD_CFE_MWAIT_REQUIRED | PCCARD_CFE_RDYBSY_ACTIVE | PCCARD_CFE_WP_ACTIVE @@ -999,8 +997,7 @@ cfe->flags |= PCCARD_CFE_BVD_ACTIVE; cfe->iftype = reg & PCCARD_TPCE_IF_IFTYPE; } - reg = pccard_tuple_read_1(tuple, idx); - idx++; + reg = pccard_tuple_read_1(tuple, idx++); power = reg & PCCARD_TPCE_FS_POWER_MASK; timing = reg & PCCARD_TPCE_FS_TIMING; @@ -1013,30 +1010,26 @@ /* skip over power, don't save */ /* for each parameter selection byte */ for (i = 0; i < power; i++) { - reg = pccard_tuple_read_1(tuple, idx); - idx++; - /* for each bit */ - for (j = 0; j < 7; j++) { - /* if the bit is set */ - if ((reg >> j) & 0x01) { - /* skip over bytes */ - do { - reg2 = pccard_tuple_read_1(tuple, idx); - idx++; - /* - * until - * non-extensi - * on byte - */ - } while (reg2 & 0x80); - } + reg = pccard_tuple_read_1(tuple, idx++); + for (; reg; reg >>= 1) + { + /* set bit -> read */ + if ((reg & 1) == 0) + continue; + /* skip over bytes */ + do { + reg2 = pccard_tuple_read_1(tuple, idx++); + /* + * until non-extension + * byte + */ + } while (reg2 & 0x80); } } } if (timing) { /* skip over timing, don't save */ - reg = pccard_tuple_read_1(tuple, idx); - idx++; + reg = pccard_tuple_read_1(tuple, idx++); if ((reg & PCCARD_TPCE_TD_RESERVED_MASK) != PCCARD_TPCE_TD_RESERVED_MASK) @@ -1054,8 +1047,7 @@ goto abort_cfe; } - reg = pccard_tuple_read_1(tuple, idx); - idx++; + reg = pccard_tuple_read_1(tuple, idx++); cfe->flags &= ~(PCCARD_CFE_IO8 | PCCARD_CFE_IO16); if (reg & PCCARD_TPCE_IO_BUSWIDTH_8BIT) @@ -1066,9 +1058,7 @@ reg & PCCARD_TPCE_IO_IOADDRLINES_MASK; if (reg & PCCARD_TPCE_IO_HASRANGE) { - reg = pccard_tuple_read_1(tuple, idx); - idx++; - + reg = pccard_tuple_read_1(tuple, idx++); cfe->num_iospace = 1 + (reg & PCCARD_TPCE_IO_RANGE_COUNT); @@ -1085,8 +1075,7 @@ switch (reg & PCCARD_TPCE_IO_RANGE_ADDRSIZE_MASK) { case PCCARD_TPCE_IO_RANGE_ADDRSIZE_ONE: cfe->iospace[i].start = - pccard_tuple_read_1(tuple, idx); - idx++; + pccard_tuple_read_1(tuple, idx++); break; case PCCARD_TPCE_IO_RANGE_ADDRSIZE_TWO: cfe->iospace[i].start = @@ -1103,8 +1092,7 @@ PCCARD_TPCE_IO_RANGE_LENGTHSIZE_MASK) { case PCCARD_TPCE_IO_RANGE_LENGTHSIZE_ONE: cfe->iospace[i].length = - pccard_tuple_read_1(tuple, idx); - idx++; + pccard_tuple_read_1(tuple, idx++); break; case PCCARD_TPCE_IO_RANGE_LENGTHSIZE_TWO: cfe->iospace[i].length = @@ -1132,8 +1120,7 @@ goto abort_cfe; } - reg = pccard_tuple_read_1(tuple, idx); - idx++; + reg = pccard_tuple_read_1(tuple, idx++); cfe->flags &= ~(PCCARD_CFE_IRQSHARE | PCCARD_CFE_IRQPULSE | PCCARD_CFE_IRQLEVEL); @@ -1186,12 +1173,9 @@ int cardaddrsize; int hostaddrsize; - reg = pccard_tuple_read_1(tuple, idx); - idx++; - + reg = pccard_tuple_read_1(tuple, idx++); cfe->num_memspace = (reg & PCCARD_TPCE_MS_COUNT) + 1; - if (cfe->num_memspace > (sizeof(cfe->memspace) / sizeof(cfe->memspace[0]))) { @@ -1255,8 +1239,7 @@ goto abort_cfe; } - reg = pccard_tuple_read_1(tuple, idx); - idx++; + reg = pccard_tuple_read_1(tuple, idx++); cfe->flags &= ~(PCCARD_CFE_POWERDOWN | PCCARD_CFE_READONLY | PCCARD_CFE_AUDIO); @@ -1269,8 +1252,7 @@ cfe->maxtwins = reg & PCCARD_TPCE_MI_MAXTWINS; while (reg & PCCARD_TPCE_MI_EXT) { - reg = pccard_tuple_read_1(tuple, idx); - idx++; + reg = pccard_tuple_read_1(tuple, idx++); } } /* skip all the subtuples */ ==== //depot/projects/soc2008/snagg-audit/sys/netgraph/ng_nat.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/netgraph/ng_nat.c,v 1.11 2008/03/01 17:14:02 mav Exp $ + * $FreeBSD: src/sys/netgraph/ng_nat.c,v 1.12 2008/06/01 15:13:32 mav Exp $ */ #include @@ -704,14 +704,14 @@ ("ng_nat: ip_len != m_pkthdr.len")); if (hook == priv->in) { - rval = LibAliasIn(priv->lib, c, MCLBYTES); + rval = LibAliasIn(priv->lib, c, m->m_len + M_TRAILINGSPACE(m)); if (rval != PKT_ALIAS_OK && rval != PKT_ALIAS_FOUND_HEADER_FRAGMENT) { NG_FREE_ITEM(item); return (EINVAL); } } else if (hook == priv->out) { - rval = LibAliasOut(priv->lib, c, MCLBYTES); + rval = LibAliasOut(priv->lib, c, m->m_len + M_TRAILINGSPACE(m)); if (rval != PKT_ALIAS_OK) { NG_FREE_ITEM(item); return (EINVAL); ==== //depot/projects/soc2008/snagg-audit/sys/netinet/libalias/alias.c#4 (text+ko) ==== @@ -25,7 +25,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/netinet/libalias/alias.c,v 1.62 2008/06/01 11:47:04 mav Exp $"); +__FBSDID("$FreeBSD: src/sys/netinet/libalias/alias.c,v 1.63 2008/06/01 17:52:40 mav Exp $"); /* Alias.c provides supervisory control for the functions of the @@ -1656,29 +1656,49 @@ * m_megapullup() - this function is a big hack. * Thankfully, it's only used in ng_nat and ipfw+nat. * - * It allocates an mbuf with cluster and copies the whole chain into cluster, - * so that it is all contiguous and the whole packet can be accessed via a - * plain (char *) pointer. This is required, because libalias doesn't know - * how to handle mbuf chains. + * It allocates an mbuf with cluster and copies the specified part of the chain + * into cluster, so that it is all contiguous and can be accessed via a plain + * (char *) pointer. This is required, because libalias doesn't know how to + * handle mbuf chains. * - * On success, m_megapullup returns an mbuf with cluster containing the input - * packet, on failure NULL. In both cases, the input packet is consumed. + * On success, m_megapullup returns an mbuf (possibly with cluster) containing + * the input packet, on failure NULL. The input packet is always consumed. */ struct mbuf * m_megapullup(struct mbuf *m, int len) { struct mbuf *mcl; - caddr_t cp; - if (len > MCLBYTES) + if (len > m->m_pkthdr.len) goto bad; - if ((mcl = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR)) == NULL) + /* Do not reallocate packet if it is sequentional, + * writable and has some extra space for expansion. + * XXX: Constant 100bytes is completely empirical. */ +#define RESERVE 100 + if (m->m_next == NULL && M_WRITABLE(m) && M_TRAILINGSPACE(m) >= RESERVE) + return (m); + + if (len <= MCLBYTES - RESERVE) { + mcl = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR); + } else if (len < MJUM16BYTES) { + int size; + if (len <= MJUMPAGESIZE - RESERVE) { + size = MJUMPAGESIZE; + } else if (len <= MJUM9BYTES - RESERVE) { + size = MJUM9BYTES; + } else { + size = MJUM16BYTES; + }; + mcl = m_getjcl(M_DONTWAIT, MT_DATA, M_PKTHDR, size); + } else { + goto bad; + } + if (mcl == NULL) goto bad; - cp = mtod(mcl, caddr_t); - m_copydata(m, 0, len, cp); m_move_pkthdr(mcl, m); - mcl->m_len = mcl->m_pkthdr.len; + m_copydata(m, 0, len, mtod(mcl, caddr_t)); + mcl->m_len = mcl->m_pkthdr.len = len; m_freem(m); return (mcl); ==== //depot/projects/soc2008/snagg-audit/sys/netinet/libalias/alias_db.c#2 (text+ko) ==== @@ -25,7 +25,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/netinet/libalias/alias_db.c,v 1.72 2008/03/06 21:50:40 piso Exp $"); +__FBSDID("$FreeBSD: src/sys/netinet/libalias/alias_db.c,v 1.73 2008/06/01 18:34:58 mav Exp $"); /* Alias_db.c encapsulates all data structures used for storing @@ -180,8 +180,9 @@ */ /* Parameters used for cleanup of expired links */ -#define ALIAS_CLEANUP_INTERVAL_SECS 60 -#define ALIAS_CLEANUP_MAX_SPOKES 30 +/* NOTE: ALIAS_CLEANUP_INTERVAL_SECS must be less then LINK_TABLE_OUT_SIZE */ +#define ALIAS_CLEANUP_INTERVAL_SECS 64 +#define ALIAS_CLEANUP_MAX_SPOKES (LINK_TABLE_OUT_SIZE/5) /* Timeouts (in seconds) for different link types */ #define ICMP_EXPIRE_TIME 60 @@ -814,20 +815,12 @@ CleanupAliasData(struct libalias *la) { struct alias_link *lnk; - int i, icount; + int i; LIBALIAS_LOCK_ASSERT(la); - icount = 0; for (i = 0; i < LINK_TABLE_OUT_SIZE; i++) { - lnk = LIST_FIRST(&la->linkTableOut[i]); - while (lnk != NULL) { - struct alias_link *link_next; - - link_next = LIST_NEXT(lnk, list_out); - icount++; + while ((lnk = LIST_FIRST(&la->linkTableOut[i])) != NULL) DeleteLink(lnk); - lnk = link_next; - } } la->cleanupIndex = 0; @@ -837,39 +830,13 @@ static void IncrementalCleanup(struct libalias *la) { - int icount; - struct alias_link *lnk; + struct alias_link *lnk, *lnk_tmp; LIBALIAS_LOCK_ASSERT(la); - icount = 0; - lnk = LIST_FIRST(&la->linkTableOut[la->cleanupIndex++]); - while (lnk != NULL) { - int idelta; - struct alias_link *link_next; - - link_next = LIST_NEXT(lnk, list_out); - idelta = la->timeStamp - lnk->timestamp; - switch (lnk->link_type) { - case LINK_TCP: - if (idelta > lnk->expire_time) { - struct tcp_dat *tcp_aux; - - tcp_aux = lnk->data.tcp; - if (tcp_aux->state.in != ALIAS_TCP_STATE_CONNECTED - || tcp_aux->state.out != ALIAS_TCP_STATE_CONNECTED) { - DeleteLink(lnk); - icount++; - } - } - break; - default: - if (idelta > lnk->expire_time) { - DeleteLink(lnk); - icount++; - } - break; - } - lnk = link_next; + LIST_FOREACH_SAFE(lnk, &la->linkTableOut[la->cleanupIndex++], + list_out, lnk_tmp) { + if (la->timeStamp - lnk->timestamp > lnk->expire_time) + DeleteLink(lnk); } if (la->cleanupIndex == LINK_TABLE_OUT_SIZE) @@ -1137,12 +1104,12 @@ LIBALIAS_LOCK_ASSERT(la); i = StartPointOut(src_addr, dst_addr, src_port, dst_port, link_type); LIST_FOREACH(lnk, &la->linkTableOut[i], list_out) { - if (lnk->src_addr.s_addr == src_addr.s_addr - && lnk->server == NULL - && lnk->dst_addr.s_addr == dst_addr.s_addr - && lnk->dst_port == dst_port - && lnk->src_port == src_port - && lnk->link_type == link_type) { + if (lnk->dst_addr.s_addr == dst_addr.s_addr && + lnk->src_addr.s_addr == src_addr.s_addr && + lnk->src_port == src_port && + lnk->dst_port == dst_port && + lnk->link_type == link_type && + lnk->server == NULL) { lnk->timestamp = la->timeStamp; break; } @@ -2189,7 +2156,7 @@ void HouseKeeping(struct libalias *la) { - int i, n, n100; + int i, n; #ifndef _KERNEL struct timeval tv; struct timezone tz; @@ -2209,33 +2176,22 @@ #endif /* Compute number of spokes (output table link chains) to cover */ - n100 = LINK_TABLE_OUT_SIZE * 100 + la->houseKeepingResidual; - n100 *= la->timeStamp - la->lastCleanupTime; - n100 /= ALIAS_CLEANUP_INTERVAL_SECS; + n = LINK_TABLE_OUT_SIZE * (la->timeStamp - la->lastCleanupTime); + n /= ALIAS_CLEANUP_INTERVAL_SECS; - n = n100 / 100; - /* Handle different cases */ - if (n > ALIAS_CLEANUP_MAX_SPOKES) { - n = ALIAS_CLEANUP_MAX_SPOKES; + if (n > 0) { + if (n > ALIAS_CLEANUP_MAX_SPOKES) + n = ALIAS_CLEANUP_MAX_SPOKES; la->lastCleanupTime = la->timeStamp; - la->houseKeepingResidual = 0; - for (i = 0; i < n; i++) IncrementalCleanup(la); - } else if (n > 0) { - la->lastCleanupTime = la->timeStamp; - la->houseKeepingResidual = n100 - 100 * n; - - for (i = 0; i < n; i++) - IncrementalCleanup(la); } else if (n < 0) { #ifdef LIBALIAS_DEBUG fprintf(stderr, "PacketAlias/HouseKeeping(): "); fprintf(stderr, "something unexpected in time values\n"); #endif la->lastCleanupTime = la->timeStamp; - la->houseKeepingResidual = 0; } } @@ -2529,7 +2485,6 @@ la->timeStamp = tv.tv_sec; la->lastCleanupTime = tv.tv_sec; #endif - la->houseKeepingResidual = 0; for (i = 0; i < LINK_TABLE_OUT_SIZE; i++) LIST_INIT(&la->linkTableOut[i]); ==== //depot/projects/soc2008/snagg-audit/sys/netinet/libalias/alias_local.h#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/netinet/libalias/alias_local.h,v 1.35 2008/03/06 21:50:40 piso Exp $ + * $FreeBSD: src/sys/netinet/libalias/alias_local.h,v 1.36 2008/06/01 18:34:58 mav Exp $ */ /* @@ -60,7 +60,7 @@ #endif /* Sizes of input and output link tables */ -#define LINK_TABLE_OUT_SIZE 101 +#define LINK_TABLE_OUT_SIZE 4001 #define LINK_TABLE_IN_SIZE 4001 struct proxy_entry; @@ -110,8 +110,6 @@ * IncrementalCleanup() */ /* was called */ - int houseKeepingResidual; /* used by HouseKeeping() */ - int deleteAllLinks; /* If equal to zero, DeleteLink() */ /* will not remove permanent links */