From owner-p4-projects@FreeBSD.ORG Wed Dec 6 23:22:10 2006 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 15BBF16A503; Wed, 6 Dec 2006 23:22:10 +0000 (UTC) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id E51B516A4A0 for ; Wed, 6 Dec 2006 23:22:09 +0000 (UTC) (envelope-from piso@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [69.147.83.41]) by mx1.FreeBSD.org (Postfix) with ESMTP id E036143CB7 for ; Wed, 6 Dec 2006 23:19:03 +0000 (GMT) (envelope-from piso@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.6/8.13.6) with ESMTP id kB6NJhrO031758 for ; Wed, 6 Dec 2006 23:19:43 GMT (envelope-from piso@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id kB6NJgsq031755 for perforce@freebsd.org; Wed, 6 Dec 2006 23:19:42 GMT (envelope-from piso@freebsd.org) Date: Wed, 6 Dec 2006 23:19:42 GMT Message-Id: <200612062319.kB6NJgsq031755@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to piso@freebsd.org using -f From: Paolo Pisati To: Perforce Change Reviews Cc: Subject: PERFORCE change 111230 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: Wed, 06 Dec 2006 23:22:10 -0000 http://perforce.freebsd.org/chv.cgi?CH=111230 Change 111230 by piso@piso_newluxor on 2006/12/06 23:19:06 To workaround a problem when an mbuf is bigger than MCLBYTES (and thus not handled by m_megapullup()), introduce & use m_jumbo16pullup() that uses 16k jumbo size cluster. This problem only showed up on traffic generated on a box with a nic tso enabled. Affected files ... .. //depot/projects/soc2005/libalias/sys/netinet/ip_fw2.c#30 edit .. //depot/projects/soc2005/libalias/sys/netinet/libalias/alias.c#24 edit .. //depot/projects/soc2005/libalias/sys/netinet/libalias/alias.h#8 edit Differences ... ==== //depot/projects/soc2005/libalias/sys/netinet/ip_fw2.c#30 (text+ko) ==== @@ -3469,8 +3469,10 @@ ((ipfw_insn_nat *)cmd)->nat = t; } - if ((mcl = m_megapullup(m, m->m_pkthdr.len)) == - NULL) + if (m->m_pkthdr.len > MJUM16BYTES) + printf("fat pkt: %d\n", m->m_pkthdr.len); + if ((mcl = m_jumbo16pullup(m, + m->m_pkthdr.len)) == NULL) goto badnat; ip = mtod(mcl, struct ip *); if (args->eh == NULL) { @@ -3534,10 +3536,10 @@ c = mtod(mcl, char *); if (oif == NULL) retval = LibAliasIn(t->lib, c, - MCLBYTES); + MJUM16BYTES); else retval = LibAliasOut(t->lib, c, - MCLBYTES); + MJUM16BYTES); if (retval != PKT_ALIAS_OK) { /* XXX - should i add some logging? */ m_free(mcl); ==== //depot/projects/soc2005/libalias/sys/netinet/libalias/alias.c#24 (text+ko) ==== @@ -1656,4 +1656,29 @@ m_freem(m); return (NULL); } + +struct mbuf * +m_jumbo16pullup(struct mbuf *m, int len) { + struct mbuf *mcl; + caddr_t cp; + + if (len > MJUM16BYTES) + goto bad; + + if ((mcl = m_getjcl(M_DONTWAIT, MT_DATA, M_PKTHDR, + MJUM16BYTES)) == 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_freem(m); + + return (mcl); +bad: + m_freem(m); + return (NULL); +} + #endif ==== //depot/projects/soc2005/libalias/sys/netinet/libalias/alias.h#8 (text+ko) ==== @@ -191,6 +191,7 @@ /* Mbuf helper function. */ struct mbuf *m_megapullup(struct mbuf *, int); +struct mbuf *m_jumbo16pullup(struct mbuf *, int); /* * Mode flags and other constants.