On Mon, May 08, 2023 at 02:29:12PM +0200, Alexander Bluhm wrote: > Hi, > > The call to in_proto_cksum_out() is only needed before the packet > is passed to ifp->if_output(). The fragment code has its own > checksum calculation and the other paths end in goto bad. > > My TSO tcp_copper() will also do its own checksum handling, so I > have to move the call to in_proto_cksum_out() to avoid calculating > it twice. > > ok?
Looks good to me and makes total sense. OK claudio@ > bluhm > > Index: net/pf.c > =================================================================== > RCS file: /cvs/src/sys/net/pf.c,v > retrieving revision 1.1176 > diff -u -p -r1.1176 pf.c > --- net/pf.c 7 May 2023 16:23:23 -0000 1.1176 > +++ net/pf.c 8 May 2023 12:15:33 -0000 > @@ -6548,8 +6548,6 @@ pf_route(struct pf_pdesc *pd, struct pf_ > ip = mtod(m0, struct ip *); > } > > - in_proto_cksum_out(m0, ifp); > - > if (ntohs(ip->ip_len) <= ifp->if_mtu) { > ip->ip_sum = 0; > if (ifp->if_capabilities & IFCAP_CSUM_IPv4) > @@ -6558,6 +6556,7 @@ pf_route(struct pf_pdesc *pd, struct pf_ > ipstat_inc(ips_outswcsum); > ip->ip_sum = in_cksum(m0, ip->ip_hl << 2); > } > + in_proto_cksum_out(m0, ifp); > ifp->if_output(ifp, m0, sintosa(dst), rt); > goto done; > } > @@ -6677,8 +6676,6 @@ pf_route6(struct pf_pdesc *pd, struct pf > } > } > > - in6_proto_cksum_out(m0, ifp); > - > /* > * If packet has been reassembled by PF earlier, we have to > * use pf_refragment6() here to turn it back to fragments. > @@ -6689,6 +6686,7 @@ pf_route6(struct pf_pdesc *pd, struct pf > } > > if ((u_long)m0->m_pkthdr.len <= ifp->if_mtu) { > + in6_proto_cksum_out(m0, ifp); > ifp->if_output(ifp, m0, sin6tosa(dst), rt); > goto done; > } > Index: netinet/ip_output.c > =================================================================== > RCS file: /cvs/src/sys/netinet/ip_output.c,v > retrieving revision 1.383 > diff -u -p -r1.383 ip_output.c > --- netinet/ip_output.c 7 May 2023 16:23:23 -0000 1.383 > +++ netinet/ip_output.c 8 May 2023 12:15:33 -0000 > @@ -443,7 +443,6 @@ sendit: > goto reroute; > } > #endif > - in_proto_cksum_out(m, ifp); > > #ifdef IPSEC > if (ipsec_in_use && (flags & IP_FORWARDING) && (ipforwarding == 2) && > @@ -464,7 +463,7 @@ sendit: > ipstat_inc(ips_outswcsum); > ip->ip_sum = in_cksum(m, hlen); > } > - > + in_proto_cksum_out(m, ifp); > error = ifp->if_output(ifp, m, sintosa(dst), ro->ro_rt); > goto done; > } > Index: netinet6/ip6_output.c > =================================================================== > RCS file: /cvs/src/sys/netinet6/ip6_output.c,v > retrieving revision 1.273 > diff -u -p -r1.273 ip6_output.c > --- netinet6/ip6_output.c 7 May 2023 16:23:24 -0000 1.273 > +++ netinet6/ip6_output.c 8 May 2023 12:15:33 -0000 > @@ -664,8 +664,6 @@ reroute: > ip6->ip6_dst.s6_addr16[1] = dst_scope; > } > > - in6_proto_cksum_out(m, ifp); > - > /* > * Send the packet to the outgoing interface. > * If necessary, do IPv6 fragmentation before sending. > @@ -701,6 +699,7 @@ reroute: > * transmit packet without fragmentation > */ > if (dontfrag || (tlen <= mtu)) { /* case 1-a and 2-a */ > + in6_proto_cksum_out(m, ifp); > error = ifp->if_output(ifp, m, sin6tosa(dst), ro->ro_rt); > goto done; > } > -- :wq Claudio