diff options
author | jlemon <jlemon@FreeBSD.org> | 2000-03-27 19:14:27 +0000 |
---|---|---|
committer | jlemon <jlemon@FreeBSD.org> | 2000-03-27 19:14:27 +0000 |
commit | 0dcc5bc0d1cca22e0204f9b9da39474b95100992 (patch) | |
tree | fdc282a4f19987ce5808bccd77c32b1078a9a4b5 /sys/i386/include/in_cksum.h | |
parent | 4fe2aa11ba3f87e4844a6632f6c84b866f178126 (diff) | |
download | FreeBSD-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.h | 25 |
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 */ |