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