Just to let you know, this diff fixes http://marc.info/?l=openbsd-misc&m=132391433319512&w=2 So I've hopes it will work for you.
On Mon, Dec 26, 2011 at 08:41:54PM -0200, Christiano F. Haesbaert wrote: > On Thu, Dec 01, 2011 at 11:51:18PM -0200, Christiano F. Haesbaert wrote: > > I think I've found the problem. > > > > when a packet comes from ral0 ---> 10.0.0.1, the bridge changes the > > received interface to vr0, which has IFCAP_CSUM_IPv4. > > > > So when the icmp layer is about to test the checksum, it assumes the > > output interface is the same one which the packet came in (in our > > case, vr0, and not ral0). So the checksum does not get calculated. > > > > That's why it works when we remove the capabilities from vr0. > > Hi again, > > Could you try the following diff ? > Please remember to undo the modifications of the previous diff. > > The thing is in_proto_cksum_out() correctly escapes hw checksumming if > the interface is a member of a bridge, the same should be done for ip > checksums. > > Index: ip_output.c > =================================================================== > RCS file: /cvs/src/sys/netinet/ip_output.c,v > retrieving revision 1.224 > diff -d -u -p -w -r1.224 ip_output.c > --- ip_output.c 2 Dec 2011 03:15:31 -0000 1.224 > +++ ip_output.c 26 Dec 2011 22:22:34 -0000 > @@ -746,7 +746,8 @@ sendit: > */ > if (ntohs(ip->ip_len) <= mtu) { > ip->ip_sum = 0; > - if ((ifp->if_capabilities & IFCAP_CSUM_IPv4)) { > + if ((ifp->if_capabilities & IFCAP_CSUM_IPv4) && > + (ifp->if_bridge == NULL)) { > m->m_pkthdr.csum_flags |= M_IPV4_CSUM_OUT; > ipstat.ips_outhwcsum++; > } else > @@ -892,7 +893,8 @@ ip_fragment(struct mbuf *m, struct ifnet > mhip->ip_off = htons((u_int16_t)mhip->ip_off); > mhip->ip_sum = 0; > if ((ifp != NULL) && > - (ifp->if_capabilities & IFCAP_CSUM_IPv4)) { > + (ifp->if_capabilities & IFCAP_CSUM_IPv4) && > + (ifp->if_bridge == NULL)) { > m->m_pkthdr.csum_flags |= M_IPV4_CSUM_OUT; > ipstat.ips_outhwcsum++; > } else > @@ -911,7 +913,8 @@ ip_fragment(struct mbuf *m, struct ifnet > ip->ip_off |= htons(IP_MF); > ip->ip_sum = 0; > if ((ifp != NULL) && > - (ifp->if_capabilities & IFCAP_CSUM_IPv4)) { > + (ifp->if_capabilities & IFCAP_CSUM_IPv4) && > + (ifp->if_bridge == NULL)) { > m->m_pkthdr.csum_flags |= M_IPV4_CSUM_OUT; > ipstat.ips_outhwcsum++; > } else