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