Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 5 Jun 2008 13:12:28 GMT
From:      Paolo Pisati <piso@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 142958 for review
Message-ID:  <200806051312.m55DCSq2017896@repoman.freebsd.org>

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

Change 142958 by piso@piso_ferret on 2008/06/05 13:11:51

	Revert modifications made to m_megapullup().

Affected files ...

.. //depot/projects/soc2005/libalias/sys/netinet/libalias/alias.c#81 edit

Differences ...

==== //depot/projects/soc2005/libalias/sys/netinet/libalias/alias.c#81 (text+ko) ====

@@ -1698,49 +1698,29 @@
  * 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 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.
+ * 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.
  *
- * On success, m_megapullup returns an mbuf (possibly with cluster) containing
- * the input packet, on failure NULL. The input packet is always consumed.
+ * On success, m_megapullup returns an mbuf with cluster containing the input
+ * packet, on failure NULL.  In both cases, the input packet is consumed.
  */
 struct mbuf *
 m_megapullup(struct mbuf *m, int len) {
 	struct mbuf *mcl;
+	caddr_t cp;
 	
-	if (len > m->m_pkthdr.len)
+	if (len > MCLBYTES)
 		goto bad;
 	
-	/* 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)
+	if ((mcl = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR)) == NULL)
 		goto bad;
  
+	cp = mtod(mcl, caddr_t);
+	m_copydata(m, 0, len, cp);
 	m_move_pkthdr(mcl, m);
-	m_copydata(m, 0, len, mtod(mcl, caddr_t));
-	mcl->m_len = mcl->m_pkthdr.len = len;
+	mcl->m_len = mcl->m_pkthdr.len;
 	m_freem(m);
  
 	return (mcl);



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