Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/netinet6 re-implement ipv6 tx loopback checksum omission.



details:   https://anonhg.NetBSD.org/src/rev/36ebb6b995fd
branches:  trunk
changeset: 583520:36ebb6b995fd
user:      yamt <yamt%NetBSD.org@localhost>
date:      Wed Aug 10 13:08:11 2005 +0000

description:
re-implement ipv6 tx loopback checksum omission.

diffstat:

 sys/netinet6/ip6_output.c |  21 +++++++++++++++++----
 1 files changed, 17 insertions(+), 4 deletions(-)

diffs (63 lines):

diff -r 85c4ef5bd979 -r 36ebb6b995fd sys/netinet6/ip6_output.c
--- a/sys/netinet6/ip6_output.c Wed Aug 10 13:07:21 2005 +0000
+++ b/sys/netinet6/ip6_output.c Wed Aug 10 13:08:11 2005 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: ip6_output.c,v 1.89 2005/08/10 12:58:37 yamt Exp $     */
+/*     $NetBSD: ip6_output.c,v 1.90 2005/08/10 13:08:11 yamt Exp $     */
 /*     $KAME: ip6_output.c,v 1.172 2001/03/25 09:55:56 itojun Exp $    */
 
 /*
@@ -62,7 +62,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ip6_output.c,v 1.89 2005/08/10 12:58:37 yamt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ip6_output.c,v 1.90 2005/08/10 13:08:11 yamt Exp $");
 
 #include "opt_inet.h"
 #include "opt_ipsec.h"
@@ -88,6 +88,7 @@
 #include <netinet/in_var.h>
 #include <netinet/ip6.h>
 #include <netinet/icmp6.h>
+#include <netinet/in_offload.h>
 #include <netinet6/ip6_var.h>
 #include <netinet6/in6_pcb.h>
 #include <netinet6/nd6.h>
@@ -124,6 +125,11 @@
 static int ip6_getpmtu __P((struct route_in6 *, struct route_in6 *,
        struct ifnet *, struct in6_addr *, u_long *, int *));
 
+#define        IN6_NEED_CHECKSUM(ifp, csum_flags) \
+       (__predict_true(((ifp)->if_flags & IFF_LOOPBACK) == 0 || \
+       (((csum_flags) & M_CSUM_UDPv6) != 0 && udp_do_loopback_cksum) || \
+       (((csum_flags) & M_CSUM_TCPv6) != 0 && tcp_do_loopback_cksum)))
+
 /*
  * IP6 output. The packet in mbuf chain m contains a skeletal IP6
  * header (with pri, len, nxt, hlim, src, dst).
@@ -895,7 +901,10 @@
 
                sw_csum = m->m_pkthdr.csum_flags & ~ifp->if_csum_flags_tx;
                if ((sw_csum & (M_CSUM_UDPv6|M_CSUM_TCPv6)) != 0) {
-                       in6_delayed_cksum(m);
+                       if (IN6_NEED_CHECKSUM(ifp,
+                           sw_csum & (M_CSUM_UDPv6|M_CSUM_TCPv6))) {
+                               in6_delayed_cksum(m);
+                       }
                        m->m_pkthdr.csum_flags &= ~(M_CSUM_UDPv6|M_CSUM_TCPv6);
                }
 
@@ -969,7 +978,11 @@
 
                if ((m->m_pkthdr.csum_flags & (M_CSUM_UDPv6|M_CSUM_TCPv6))
                    != 0) {
-                       in6_delayed_cksum(m);
+                       if (IN6_NEED_CHECKSUM(ifp,
+                           m->m_pkthdr.csum_flags &
+                           (M_CSUM_UDPv6|M_CSUM_TCPv6))) {
+                               in6_delayed_cksum(m);
+                       }
                        m->m_pkthdr.csum_flags &= ~(M_CSUM_UDPv6|M_CSUM_TCPv6);
                }
 



Home | Main Index | Thread Index | Old Index