Here's a patch that doesn't crash and tries not to break TSO.

Index: sys/netpfil/pf/pf_ioctl.c
===================================================================
--- sys/netpfil/pf/pf_ioctl.c   (revision 274791)
+++ sys/netpfil/pf/pf_ioctl.c   (working copy)
@@ -3576,9 +3576,10 @@
        int chk;
 
        /* We need a proper CSUM befor we start (s. OpenBSD ip_output) */
-       if ((*m)->m_pkthdr.csum_flags & CSUM_DELAY_DATA) {
+       if ((*m)->m_pkthdr.csum_flags &
+           ((CSUM_DELAY_IP|CSUM_DELAY_DATA) & ~ifp->if_hwassist)) {
                in_delayed_cksum(*m);
-               (*m)->m_pkthdr.csum_flags &= ~CSUM_DELAY_DATA;
+               (*m)->m_pkthdr.csum_flags &= ~(CSUM_DELAY_IP|CSUM_DELAY_DATA);
        }
 
        chk = pf_test(PF_OUT, ifp, m, inp);
@@ -3620,12 +3621,14 @@
        int chk;
 
        /* We need a proper CSUM before we start (s. OpenBSD ip_output) */
-       if ((*m)->m_pkthdr.csum_flags & CSUM_DELAY_DATA_IPV6) {
+       if ((*m)->m_pkthdr.csum_flags &
+           (CSUM_DELAY_DATA_IPV6 & ~ifp->if_hwassist)) {
                in6_delayed_cksum(*m,
                    (*m)->m_pkthdr.len - sizeof(struct ip6_hdr),
                    sizeof(struct ip6_hdr));
                (*m)->m_pkthdr.csum_flags &= ~CSUM_DELAY_DATA_IPV6;
        }
+
        CURVNET_SET(ifp->if_vnet);
        chk = pf_test6(PF_OUT, ifp, m, inp);
        CURVNET_RESTORE();

DES
-- 
Dag-Erling Smørgrav - d...@des.no
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to