summaryrefslogtreecommitdiffstats
path: root/sys/i386/include/in_cksum.h
diff options
context:
space:
mode:
authorjlemon <jlemon@FreeBSD.org>2000-03-27 19:14:27 +0000
committerjlemon <jlemon@FreeBSD.org>2000-03-27 19:14:27 +0000
commit0dcc5bc0d1cca22e0204f9b9da39474b95100992 (patch)
treefdc282a4f19987ce5808bccd77c32b1078a9a4b5 /sys/i386/include/in_cksum.h
parent4fe2aa11ba3f87e4844a6632f6c84b866f178126 (diff)
downloadFreeBSD-src-0dcc5bc0d1cca22e0204f9b9da39474b95100992.zip
FreeBSD-src-0dcc5bc0d1cca22e0204f9b9da39474b95100992.tar.gz
Add support for offloading IP/TCP/UDP checksums to NIC hardware which
supports them.
Diffstat (limited to 'sys/i386/include/in_cksum.h')
-rw-r--r--sys/i386/include/in_cksum.h25
1 files changed, 25 insertions, 0 deletions
diff --git a/sys/i386/include/in_cksum.h b/sys/i386/include/in_cksum.h
index a441959..3c971ef 100644
--- a/sys/i386/include/in_cksum.h
+++ b/sys/i386/include/in_cksum.h
@@ -81,6 +81,30 @@ in_cksum_update(struct ip *ip)
ip->ip_sum = htons(__tmpsum + (__tmpsum >> 16));
}
+static __inline u_short
+in_addword(u_short sum, u_short b)
+{
+
+ __asm("addw %2, %0" : "=r" (sum) : "0" (sum), "r" (b));
+ __asm("adcw $0, %0" : "=r" (sum) : "0" (sum));
+
+ return (sum);
+}
+
+static __inline u_short
+in_pseudo(u_int sum, u_int b, u_int c)
+{
+
+ __asm("addl %2, %0" : "=r" (sum) : "0" (sum), "r" (b));
+ __asm("adcl %2, %0" : "=r" (sum) : "0" (sum), "r" (c));
+ __asm("adcl $0, %0" : "=r" (sum) : "0" (sum));
+
+ sum = (sum & 0xffff) + (sum >> 16);
+ if (sum > 0xffff)
+ sum -= 0xffff;
+ return (sum);
+}
+
#else
u_int in_cksum_hdr __P((const struct ip *));
#define in_cksum_update(ip) \
@@ -94,6 +118,7 @@ u_int in_cksum_hdr __P((const struct ip *));
typedef unsigned in_psum_t;
#ifdef _KERNEL
+u_short in_cksum_skip(struct mbuf *m, int len, int skip);
in_psum_t in_cksum_partial(in_psum_t psum, const u_short *w, int len);
int in_cksum_finalize(in_psum_t psum);
#endif /* _KERNEL */
OpenPOWER on IntegriCloud