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