--- src/sys/net/pf/pf_norm.c 2006/12/22 23:44:57 1.7 +++ src/sys/net/pf/pf_norm.c 2007/08/11 18:52:31 1.7.4.1 @@ -495,9 +495,23 @@ pf_reassemble(struct mbuf **m0, struct p m2 = frent->fr_m; pool_put(&pf_frent_pl, frent); pf_nfrents--; + m->m_pkthdr.csum_flags &= m2->m_pkthdr.csum_flags; + m->m_pkthdr.csum_data += m2->m_pkthdr.csum_data; m_cat(m, m2); } + /* + * Note: this 1's complement optimization with <= 65535 fragments. + * + * Handle 1's complement carry for the 16 bit result. This can + * result in another carry which must also be handled. + */ + m->m_pkthdr.csum_data = (m->m_pkthdr.csum_data & 0xffff) + + (m->m_pkthdr.csum_data >> 16); + if (m->m_pkthdr.csum_data > 0xFFFF) + m->m_pkthdr.csum_data -= 0xFFFF; + + ip->ip_src = (*frag)->fr_src; ip->ip_dst = (*frag)->fr_dst;