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

Reply via email to